All-in-One WP Migration - Version 5.35

Version Description

  • Add OneDrive to export/import pages
  • Fix a bug when WordPress was used without a db prefix
  • Fix a problem when downloading wpress files
  • Improve the log system
Download this release

Release Info

Developer bangelov
Plugin Icon 128x128 All-in-One WP Migration
Version 5.35
Comparing to
See all releases

Code changes from version 4.19 to 5.35

Files changed (93) hide show
  1. all-in-one-wp-migration.php +5 -2
  2. constants.php +59 -17
  3. lib/exception/class-ai1wm-backup-exception.php → deprecated.php +2 -4
  4. functions.php +489 -11
  5. lib/controller/{class-ai1wm-backup-controller.php → class-ai1wm-backups-controller.php} +10 -10
  6. lib/controller/class-ai1wm-export-controller.php +57 -86
  7. lib/controller/class-ai1wm-feedback-controller.php +12 -11
  8. lib/controller/class-ai1wm-import-controller.php +59 -95
  9. lib/controller/class-ai1wm-main-controller.php +217 -173
  10. lib/controller/class-ai1wm-report-controller.php +10 -9
  11. lib/controller/class-ai1wm-resolve-controller.php +13 -16
  12. lib/controller/class-ai1wm-updater-controller.php +1 -1
  13. lib/{controller/class-ai1wm-message-controller.php → exception/class-ai1wm-archive-exception.php} +2 -19
  14. lib/exception/class-ai1wm-backups-exception.php +26 -0
  15. lib/exception/class-ai1wm-export-exception.php +2 -4
  16. lib/exception/class-ai1wm-http-exception.php +2 -4
  17. lib/exception/class-ai1wm-import-exception.php +2 -56
  18. lib/exception/class-ai1wm-not-accessible-exception.php +2 -4
  19. lib/exception/class-ai1wm-not-found-exception.php +3 -4
  20. lib/exception/class-ai1wm-not-readable-exception.php +2 -4
  21. lib/exception/class-ai1wm-not-writable-exception.php +2 -4
  22. lib/exception/class-ai1wm-storage-exception.php +2 -4
  23. lib/model/{class-ai1wm-backup.php → class-ai1wm-backups.php} +4 -4
  24. lib/model/class-ai1wm-config.php +26 -0
  25. lib/model/{service/class-ai1wm-service-interface.php → class-ai1wm-deprecated.php} +3 -6
  26. lib/model/class-ai1wm-export-abstract.php +0 -507
  27. lib/model/class-ai1wm-feedback.php +10 -8
  28. lib/model/class-ai1wm-handler.php +45 -0
  29. lib/model/class-ai1wm-http.php +6 -1
  30. lib/model/class-ai1wm-import-abstract.php +0 -437
  31. lib/model/class-ai1wm-log.php +48 -91
  32. lib/model/class-ai1wm-report.php +8 -7
  33. lib/model/class-ai1wm-status.php +22 -108
  34. lib/model/class-ai1wm-storage.php +0 -157
  35. lib/model/class-ai1wm-template.php +1 -1
  36. lib/model/class-ai1wm-updater.php +1 -1
  37. lib/model/export/class-ai1wm-export-archive.php +42 -0
  38. lib/{vendor/mysqldump-factory/mysqldump-factory/lib/MysqlDumpFactory.php → model/export/class-ai1wm-export-clean.php} +28 -20
  39. lib/model/{class-ai1wm-logger.php → export/class-ai1wm-export-config.php} +46 -37
  40. lib/model/export/class-ai1wm-export-content.php +149 -0
  41. lib/model/export/class-ai1wm-export-database.php +122 -0
  42. lib/model/{class-ai1wm-export-file.php → export/class-ai1wm-export-download.php} +21 -24
  43. lib/model/{class-ai1wm-message.php → export/class-ai1wm-export-enumerate.php} +55 -56
  44. lib/model/export/class-ai1wm-export-resolve.php +51 -0
  45. lib/model/import/class-ai1wm-import-blogs.php +94 -0
  46. lib/model/import/class-ai1wm-import-clean.php +58 -0
  47. lib/model/import/class-ai1wm-import-confirm.php +66 -0
  48. lib/model/import/class-ai1wm-import-content.php +166 -0
  49. lib/model/import/class-ai1wm-import-database.php +396 -0
  50. lib/model/import/class-ai1wm-import-done.php +49 -0
  51. lib/model/import/class-ai1wm-import-enumerate.php +50 -0
  52. lib/model/import/class-ai1wm-import-resolve.php +41 -0
  53. lib/model/{class-ai1wm-import-file.php → import/class-ai1wm-import-upload.php} +13 -14
  54. lib/model/import/class-ai1wm-import-validate.php +58 -0
  55. lib/model/service/class-ai1wm-service-database.php +0 -307
  56. lib/model/service/class-ai1wm-service-package.php +0 -142
  57. lib/vendor/mysqldump-factory/mysqldump-factory/LICENSE +0 -20
  58. lib/vendor/mysqldump-factory/mysqldump-factory/lib/MysqlDumpInterface.php +0 -196
  59. lib/vendor/mysqldump-factory/mysqldump-factory/lib/MysqlDumpPDO.php +0 -974
  60. lib/vendor/mysqldump-factory/mysqldump-factory/lib/MysqlDumpSQL.php +0 -924
  61. lib/vendor/servmask/archiver/class-ai1wm-archiver.php +2 -3
  62. lib/vendor/servmask/archiver/class-ai1wm-compressor.php +3 -3
  63. lib/vendor/servmask/archiver/class-ai1wm-extractor.php +11 -3
  64. lib/vendor/servmask/cron/class-ai1wm-cron.php +2 -2
  65. lib/{model/class-ai1wm-maintenance.php → vendor/servmask/database/class-ai1wm-database-mysql.php} +54 -27
  66. lib/{model/class-ai1wm-error.php → vendor/servmask/database/class-ai1wm-database-mysqli.php} +56 -46
  67. lib/vendor/{mysqldump-factory/mysqldump-factory/lib/MysqlDumpUtility.php → servmask/database/class-ai1wm-database-utility.php} +38 -39
  68. lib/vendor/servmask/database/class-ai1wm-database.php +864 -0
  69. lib/vendor/servmask/filesystem/class-ai1wm-file-index.php +43 -15
  70. lib/vendor/servmask/filter/class-ai1wm-extension-filter.php +2 -2
  71. lib/vendor/servmask/filter/class-ai1wm-recursive-exclude-filter.php +2 -2
  72. lib/vendor/servmask/iterator/class-ai1wm-recursive-directory-iterator.php +2 -2
  73. lib/view/assets/css/{backup.min.css → backups.min.css} +1 -1
  74. lib/view/assets/css/export.min.css +1 -1
  75. lib/view/assets/css/import.min.css +1 -1
  76. lib/view/assets/css/updater.min.css +1 -1
  77. lib/view/assets/javascript/backup.min.js +0 -1
  78. lib/view/assets/javascript/backups.min.js +1 -0
  79. lib/view/assets/javascript/export.min.js +1 -1
  80. lib/view/assets/javascript/import.min.js +1 -1
  81. lib/view/{backup → backups}/index.php +4 -6
  82. lib/view/common/maintenance-mode.php +0 -11
  83. lib/view/export/advanced-settings.php +0 -5
  84. lib/view/export/button-onedrive.php +1 -0
  85. lib/view/export/export-buttons.php +17 -32
  86. lib/view/export/index.php +2 -18
  87. lib/view/import/button-onedrive.php +1 -0
  88. lib/view/import/index.php +1 -3
  89. lib/view/main/admin-head.php +2 -3
  90. lib/view/main/backups-notice.php +1 -1
  91. loader.php +110 -52
  92. readme.txt +8 -3
  93. uninstall.php +1 -1
all-in-one-wp-migration.php CHANGED
@@ -5,12 +5,12 @@
5
  * Description: Migration tool for all your blog data. Import or Export your blog content with a single click.
6
  * Author: ServMask
7
  * Author URI: https://servmask.com/
8
- * Version: 4.19
9
  * Text Domain: all-in-one-wp-migration
10
  * Domain Path: /languages
11
  * Network: True
12
  *
13
- * Copyright (C) 2014 ServMask Inc.
14
  *
15
  * This program is free software: you can redistribute it and/or modify
16
  * it under the terms of the GNU General Public License as published by
@@ -63,6 +63,9 @@ define( 'AI1WM_THEMES_PATH', get_theme_root() );
63
  // Include constants
64
  require_once dirname( __FILE__ ) . DIRECTORY_SEPARATOR . 'constants.php';
65
 
 
 
 
66
  // Include functions
67
  require_once dirname( __FILE__ ) . DIRECTORY_SEPARATOR . 'functions.php';
68
 
5
  * Description: Migration tool for all your blog data. Import or Export your blog content with a single click.
6
  * Author: ServMask
7
  * Author URI: https://servmask.com/
8
+ * Version: 5.35
9
  * Text Domain: all-in-one-wp-migration
10
  * Domain Path: /languages
11
  * Network: True
12
  *
13
+ * Copyright (C) 2014-2016 ServMask Inc.
14
  *
15
  * This program is free software: you can redistribute it and/or modify
16
  * it under the terms of the GNU General Public License as published by
63
  // Include constants
64
  require_once dirname( __FILE__ ) . DIRECTORY_SEPARATOR . 'constants.php';
65
 
66
+ // Include deprecated
67
+ require_once dirname( __FILE__ ) . DIRECTORY_SEPARATOR . 'deprecated.php';
68
+
69
  // Include functions
70
  require_once dirname( __FILE__ ) . DIRECTORY_SEPARATOR . 'functions.php';
71
 
constants.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -25,8 +25,9 @@
25
 
26
  $local = array(
27
  'iliev.local',
28
- 'dev.servmask.com',
29
  'Borislav-MacBook-Pro.local',
 
30
  );
31
 
32
  if ( function_exists( 'gethostname' ) && in_array( gethostname(), $local ) ) {
@@ -38,7 +39,7 @@ if ( function_exists( 'gethostname' ) && in_array( gethostname(), $local ) ) {
38
  // ==================
39
  // = Plugin Version =
40
  // ==================
41
- define( 'AI1WM_VERSION', '4.19' );
42
 
43
  // ===============
44
  // = Plugin Name =
@@ -58,7 +59,7 @@ define( 'AI1WM_STORAGE_PATH', AI1WM_PATH . DIRECTORY_SEPARATOR . 'storage' );
58
  // ==================
59
  // = Error Log Path =
60
  // ==================
61
- define( 'AI1WM_LOG_FILE', AI1WM_STORAGE_PATH . DIRECTORY_SEPARATOR . 'error.log' );
62
 
63
  // ===============
64
  // = Status Path =
@@ -80,10 +81,15 @@ define( 'AI1WM_CONTROLLER_PATH', AI1WM_LIB_PATH . DIRECTORY_SEPARATOR . 'control
80
  // ==============
81
  define( 'AI1WM_MODEL_PATH', AI1WM_LIB_PATH . DIRECTORY_SEPARATOR . 'model' );
82
 
83
- // ================
84
- // = Service Path =
85
- // ================
86
- define( 'AI1WM_SERVICE_PATH', AI1WM_MODEL_PATH . DIRECTORY_SEPARATOR . 'service' );
 
 
 
 
 
87
 
88
  // =============
89
  // = View Path =
@@ -135,6 +141,16 @@ define( 'AI1WM_DATABASE_NAME', 'database.sql' );
135
  // ========================
136
  define( 'AI1WM_PACKAGE_NAME', 'package.json' );
137
 
 
 
 
 
 
 
 
 
 
 
138
  // ========================
139
  // = Archive Status Name =
140
  // ========================
@@ -145,6 +161,21 @@ define( 'AI1WM_STATUS_NAME', 'status.js' );
145
  // ========================
146
  define( 'AI1WM_FILEMAP_NAME', 'filemap.list' );
147
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
148
  // ======================
149
  // = Export Options Key =
150
  // ======================
@@ -160,11 +191,6 @@ define( 'AI1WM_ERROR_HANDLER', 'ai1wm_error_handler' );
160
  // =========================
161
  define( 'AI1WM_EXCEPTION_HANDLER', 'ai1wm_exception_handler' );
162
 
163
- // ========================
164
- // = Maintenance Mode Key =
165
- // ========================
166
- define( 'AI1WM_MAINTENANCE_MODE', 'ai1wm_maintenance_mode' );
167
-
168
  // ==========
169
  // = URL IP =
170
  // ==========
@@ -195,10 +221,10 @@ define( 'AI1WM_AUTH_PASSWORD', 'ai1wm_auth_password' );
195
  // ==================
196
  define( 'AI1WM_ACTIVE_PLUGINS', 'active_plugins' );
197
 
198
- // ================
199
- // = Messages Key =
200
- // ================
201
- define( 'AI1WM_MESSAGES', 'ai1wm_messages' );
202
 
203
  // ===============
204
  // = Updater Key =
@@ -232,6 +258,16 @@ if ( ! defined( 'WP_CONTENT_DIR' ) ) {
232
  define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' );
233
  }
234
 
 
 
 
 
 
 
 
 
 
 
235
  // ================
236
  // = Backups Path =
237
  // ================
@@ -247,6 +283,11 @@ define( 'AI1WM_STORAGE_INDEX', AI1WM_STORAGE_PATH . DIRECTORY_SEPARATOR . 'index
247
  // ======================
248
  define( 'AI1WM_BACKUPS_INDEX', AI1WM_BACKUPS_PATH . DIRECTORY_SEPARATOR . 'index.php' );
249
 
 
 
 
 
 
250
  // ====================================
251
  // = WP Migration Plugin Base Dir =
252
  // ====================================
@@ -439,3 +480,4 @@ if ( ! defined( 'AI1WMOE_PLUGIN_ABOUT' ) ) {
439
  if ( ! defined( 'AI1WMOE_PLUGIN_KEY' ) ) {
440
  define( 'AI1WMOE_PLUGIN_KEY', 'ai1wmoe_plugin_key' );
441
  }
 
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
25
 
26
  $local = array(
27
  'iliev.local',
28
+ 'develop.servmask.com',
29
  'Borislav-MacBook-Pro.local',
30
+ 'Simeon-PC',
31
  );
32
 
33
  if ( function_exists( 'gethostname' ) && in_array( gethostname(), $local ) ) {
39
  // ==================
40
  // = Plugin Version =
41
  // ==================
42
+ define( 'AI1WM_VERSION', '5.35' );
43
 
44
  // ===============
45
  // = Plugin Name =
59
  // ==================
60
  // = Error Log Path =
61
  // ==================
62
+ define( 'AI1WM_ERROR_FILE', AI1WM_STORAGE_PATH . DIRECTORY_SEPARATOR . 'error.log' );
63
 
64
  // ===============
65
  // = Status Path =
81
  // ==============
82
  define( 'AI1WM_MODEL_PATH', AI1WM_LIB_PATH . DIRECTORY_SEPARATOR . 'model' );
83
 
84
+ // ===============
85
+ // = Export Path =
86
+ // ===============
87
+ define( 'AI1WM_EXPORT_PATH', AI1WM_MODEL_PATH . DIRECTORY_SEPARATOR . 'export' );
88
+
89
+ // ===============
90
+ // = Import Path =
91
+ // ===============
92
+ define( 'AI1WM_IMPORT_PATH', AI1WM_MODEL_PATH . DIRECTORY_SEPARATOR . 'import' );
93
 
94
  // =============
95
  // = View Path =
141
  // ========================
142
  define( 'AI1WM_PACKAGE_NAME', 'package.json' );
143
 
144
+ // ==========================
145
+ // = Archive Multisite Name =
146
+ // ==========================
147
+ define( 'AI1WM_MULTISITE_NAME', 'multisite.json' );
148
+
149
+ // ======================
150
+ // = Archive Blogs Name =
151
+ // ======================
152
+ define( 'AI1WM_BLOGS_NAME', 'blogs.json' );
153
+
154
  // ========================
155
  // = Archive Status Name =
156
  // ========================
161
  // ========================
162
  define( 'AI1WM_FILEMAP_NAME', 'filemap.list' );
163
 
164
+ // ===================
165
+ // = Export Log Name =
166
+ // ===================
167
+ define( 'AI1WM_EXPORT_NAME', 'export.log' );
168
+
169
+ // ===================
170
+ // = Import Log Name =
171
+ // ===================
172
+ define( 'AI1WM_IMPORT_NAME', 'import.log' );
173
+
174
+ // ==================
175
+ // = Error Log Name =
176
+ // ==================
177
+ define( 'AI1WM_ERROR_NAME', 'error.log' );
178
+
179
  // ======================
180
  // = Export Options Key =
181
  // ======================
191
  // =========================
192
  define( 'AI1WM_EXCEPTION_HANDLER', 'ai1wm_exception_handler' );
193
 
 
 
 
 
 
194
  // ==========
195
  // = URL IP =
196
  // ==========
221
  // ==================
222
  define( 'AI1WM_ACTIVE_PLUGINS', 'active_plugins' );
223
 
224
+ // ===========================
225
+ // = Active Sitewide Plugins =
226
+ // ===========================
227
+ define( 'AI1WM_ACTIVE_SITEWIDE_PLUGINS', 'active_sitewide_plugins' );
228
 
229
  // ===============
230
  // = Updater Key =
258
  define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' );
259
  }
260
 
261
+ // ================
262
+ // = Uploads Path =
263
+ // ================
264
+ define( 'AI1WM_UPLOADS_PATH', 'uploads' );
265
+
266
+ // ==============
267
+ // = Sites Path =
268
+ // ==============
269
+ define( 'AI1WM_SITES_PATH', AI1WM_UPLOADS_PATH . DIRECTORY_SEPARATOR . 'sites' );
270
+
271
  // ================
272
  // = Backups Path =
273
  // ================
283
  // ======================
284
  define( 'AI1WM_BACKUPS_INDEX', AI1WM_BACKUPS_PATH . DIRECTORY_SEPARATOR . 'index.php' );
285
 
286
+ // ======================
287
+ // = Backups Htaccess File =
288
+ // ======================
289
+ define( 'AI1WM_BACKUPS_HTACCESS', AI1WM_BACKUPS_PATH . DIRECTORY_SEPARATOR . '.htaccess' );
290
+
291
  // ====================================
292
  // = WP Migration Plugin Base Dir =
293
  // ====================================
480
  if ( ! defined( 'AI1WMOE_PLUGIN_KEY' ) ) {
481
  define( 'AI1WMOE_PLUGIN_KEY', 'ai1wmoe_plugin_key' );
482
  }
483
+
lib/exception/class-ai1wm-backup-exception.php → deprecated.php RENAMED
@@ -1,7 +1,6 @@
1
  <?php
2
-
3
  /**
4
- * Copyright (C) 2014 ServMask Inc.
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License as published by
@@ -23,6 +22,5 @@
23
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
24
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
25
  */
26
- class Ai1wm_Backup_Exception extends Exception {
27
 
28
- }
1
  <?php
 
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
22
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
 
25
 
26
+ function ai1wm_progress_path( $params ) {}
functions.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -24,23 +24,481 @@
24
  */
25
 
26
  /**
27
- * URL encode
28
  *
29
- * @param mixed $value Value to encode
30
- * @return mixed
31
  */
32
- function ai1wm_urlencode( $value ) {
33
- return is_array( $value ) ? array_map( 'ai1wm_urlencode', $value ) : urlencode( $value );
 
 
 
 
 
 
 
 
 
 
34
  }
35
 
36
  /**
37
- * URL decode
38
  *
39
- * @param mixed $value Value to decode
40
- * @return mixed
41
  */
42
- function ai1wm_urldecode( $value ) {
43
- return is_array( $value ) ? array_map( 'ai1wm_urldecode', $value ) : urldecode( stripslashes( $value ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  }
45
 
46
  /**
@@ -97,3 +555,23 @@ function ai1wm_active_plugins( $plugins = array() ) {
97
 
98
  return $plugins;
99
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
24
  */
25
 
26
  /**
27
+ * Get storage absolute path
28
  *
29
+ * @param array $params Request parameters
30
+ * @return string
31
  */
32
+ function ai1wm_storage_path( $params ) {
33
+ if ( empty( $params['storage'] ) ) {
34
+ throw new Ai1wm_Storage_Exception( 'Unable to locate storage path' );
35
+ }
36
+
37
+ // Get storage path
38
+ $storage = AI1WM_STORAGE_PATH . DIRECTORY_SEPARATOR . basename( $params['storage'] );
39
+ if ( ! is_dir( $storage ) ) {
40
+ mkdir( $storage );
41
+ }
42
+
43
+ return $storage;
44
  }
45
 
46
  /**
47
+ * Get backups absolute path
48
  *
49
+ * @param array $params Request parameters
50
+ * @return string
51
  */
52
+ function ai1wm_backups_path( $params ) {
53
+ if ( empty( $params['archive'] ) ) {
54
+ throw new Ai1wm_Archive_Exception( 'Unable to locate archive path' );
55
+ }
56
+
57
+ return AI1WM_BACKUPS_PATH;
58
+ }
59
+
60
+ /**
61
+ * Get archive absolute path
62
+ *
63
+ * @param array $params Request parameters
64
+ * @return string
65
+ */
66
+ function ai1wm_archive_path( $params ) {
67
+ if ( empty( $params['archive'] ) ) {
68
+ throw new Ai1wm_Storage_Exception( 'Unable to locate archive path' );
69
+ }
70
+
71
+ // Get archive path
72
+ if ( empty( $params['backups'] ) ) {
73
+ return ai1wm_storage_path( $params ) . DIRECTORY_SEPARATOR . basename( $params['archive'] );
74
+ }
75
+
76
+ return ai1wm_backups_path( $params ) . DIRECTORY_SEPARATOR . basename( $params['archive'] );
77
+ }
78
+
79
+ /**
80
+ * Get download absolute path
81
+ *
82
+ * @param array $params Request parameters
83
+ * @return string
84
+ */
85
+ function ai1wm_download_path( $params ) {
86
+ return ai1wm_backups_path( $params ) . DIRECTORY_SEPARATOR . basename( $params['archive'] );
87
+ }
88
+
89
+ /**
90
+ * Get export log absolute path
91
+ *
92
+ * @param array $params Request parameters
93
+ * @return string
94
+ */
95
+ function ai1wm_export_path( $params ) {
96
+ return ai1wm_storage_path( $params ) . DIRECTORY_SEPARATOR . AI1WM_EXPORT_NAME;
97
+ }
98
+
99
+ /**
100
+ * Get import log absolute path
101
+ *
102
+ * @param array $params Request parameters
103
+ * @return string
104
+ */
105
+ function ai1wm_import_path( $params ) {
106
+ return ai1wm_storage_path( $params ) . DIRECTORY_SEPARATOR . AI1WM_IMPORT_NAME;
107
+ }
108
+
109
+ /**
110
+ * Get filemap.list absolute path
111
+ *
112
+ * @param array $params Request parameters
113
+ * @return string
114
+ */
115
+ function ai1wm_filemap_path( $params ) {
116
+ return ai1wm_storage_path( $params ) . DIRECTORY_SEPARATOR . AI1WM_FILEMAP_NAME;
117
+ }
118
+
119
+ /**
120
+ * Get package.json absolute path
121
+ *
122
+ * @param array $params Request parameters
123
+ * @return string
124
+ */
125
+ function ai1wm_package_path( $params ) {
126
+ return ai1wm_storage_path( $params ) . DIRECTORY_SEPARATOR . AI1WM_PACKAGE_NAME;
127
+ }
128
+
129
+ /**
130
+ * Get multisite.json absolute path
131
+ *
132
+ * @param array $params Request parameters
133
+ * @return string
134
+ */
135
+ function ai1wm_multisite_path( $params ) {
136
+ return ai1wm_storage_path( $params ) . DIRECTORY_SEPARATOR . AI1WM_MULTISITE_NAME;
137
+ }
138
+
139
+ /**
140
+ * Get blogs.json absolute path
141
+ *
142
+ * @param array $params Request parameters
143
+ * @return string
144
+ */
145
+ function ai1wm_blogs_path( $params ) {
146
+ return ai1wm_storage_path( $params ) . DIRECTORY_SEPARATOR . AI1WM_BLOGS_NAME;
147
+ }
148
+
149
+ /**
150
+ * Get database.sql absolute path
151
+ *
152
+ * @param array $params Request parameters
153
+ * @return string
154
+ */
155
+ function ai1wm_database_path( $params ) {
156
+ return ai1wm_storage_path( $params ) . DIRECTORY_SEPARATOR . AI1WM_DATABASE_NAME;
157
+ }
158
+
159
+ /**
160
+ * Get error log absolute path
161
+ *
162
+ * @return string
163
+ */
164
+ function ai1wm_error_path() {
165
+ return AI1WM_STORAGE_PATH . DIRECTORY_SEPARATOR . AI1WM_ERROR_NAME;
166
+ }
167
+
168
+ /**
169
+ * Get status.js absolute path
170
+ *
171
+ * @return string
172
+ */
173
+ function ai1wm_status_path() {
174
+ return AI1WM_STORAGE_PATH . DIRECTORY_SEPARATOR . AI1WM_STATUS_NAME;
175
+ }
176
+
177
+ /**
178
+ * Get archive name
179
+ *
180
+ * @param array $params Request parameters
181
+ * @return string
182
+ */
183
+ function ai1wm_archive_name( $params ) {
184
+ return basename( $params['archive'] );
185
+ }
186
+
187
+ /**
188
+ * Get backups URL address
189
+ *
190
+ * @param array $params Request parameters
191
+ * @return string
192
+ */
193
+ function ai1wm_backups_url( $params ) {
194
+ return AI1WM_BACKUPS_URL . '/' . ai1wm_archive_name( $params );
195
+ }
196
+
197
+ /**
198
+ * Get archive size in bytes
199
+ *
200
+ * @param array $params Request parameters
201
+ * @return integer
202
+ */
203
+ function ai1wm_archive_bytes( $params ) {
204
+ return filesize( ai1wm_archive_path( $params ) );
205
+ }
206
+
207
+ /**
208
+ * Get download size in bytes
209
+ *
210
+ * @param array $params Request parameters
211
+ * @return integer
212
+ */
213
+ function ai1wm_download_bytes( $params ) {
214
+ return filesize( ai1wm_download_path( $params ) );
215
+ }
216
+
217
+ /**
218
+ * Get archive size as text
219
+ *
220
+ * @param array $params Request parameters
221
+ * @return string
222
+ */
223
+ function ai1wm_archive_size( $params ) {
224
+ return size_format( filesize( ai1wm_archive_path( $params ) ) );
225
+ }
226
+
227
+ /**
228
+ * Get download size as text
229
+ *
230
+ * @param array $params Request parameters
231
+ * @return string
232
+ */
233
+ function ai1wm_download_size( $params ) {
234
+ return size_format( filesize( ai1wm_download_path( $params ) ) );
235
+ }
236
+
237
+ /**
238
+ * Parse file size
239
+ *
240
+ * @param string $size File size
241
+ * @param string $default Default size
242
+ * @return string
243
+ */
244
+ function ai1wm_parse_size( $size, $default = null ) {
245
+ $suffixes = array(
246
+ '' => 1,
247
+ 'k' => 1000,
248
+ 'm' => 1000000,
249
+ 'g' => 1000000000,
250
+ );
251
+
252
+ // Parse size format
253
+ if ( preg_match( '/([0-9]+)\s*(k|m|g)?(b?(ytes?)?)/i', $size, $match ) ) {
254
+ return $match[1] * $suffixes[strtolower( $match[2] )];
255
+ }
256
+
257
+ return $default;
258
+ }
259
+
260
+ /**
261
+ * Get current site name
262
+ *
263
+ * @return string
264
+ */
265
+ function ai1wm_site_name() {
266
+ return parse_url( site_url(), PHP_URL_HOST );
267
+ }
268
+
269
+ /**
270
+ * Get archive file name
271
+ *
272
+ * @return string
273
+ */
274
+ function ai1wm_archive_file() {
275
+ $site = parse_url( site_url() );
276
+ $name = array();
277
+
278
+ // Add domain
279
+ if ( isset( $site['host'] ) ) {
280
+ $name[] = $site['host'];
281
+ }
282
+
283
+ // Add path
284
+ if ( isset( $site['path'] ) ) {
285
+ $name[] = trim( $site['path'], '/' );
286
+ }
287
+
288
+ // Add year, month and day
289
+ $name[] = date( 'Ymd' );
290
+
291
+ // Add hours, minutes and seconds
292
+ $name[] = date( 'His' );
293
+
294
+ // Add unique identifier
295
+ $name[] = rand( 100, 999 );
296
+
297
+ return sprintf( '%s.wpress', implode( '-', $name ) );
298
+ }
299
+
300
+ /**
301
+ * Get archive folder name
302
+ *
303
+ * @return string
304
+ */
305
+ function ai1wm_archive_folder() {
306
+ $site = parse_url( site_url() );
307
+ $name = array();
308
+
309
+ // Add domain
310
+ if ( isset( $site['host'] ) ) {
311
+ $name[] = $site['host'];
312
+ }
313
+
314
+ // Add path
315
+ if ( isset( $site['path'] ) ) {
316
+ $name[] = trim( $site['path'] , '/' );
317
+ }
318
+
319
+ return implode( '-', $name );
320
+ }
321
+
322
+ /**
323
+ * Get storage folder name
324
+ *
325
+ * @return string
326
+ */
327
+ function ai1wm_storage_folder() {
328
+ return uniqid();
329
+ }
330
+
331
+ /**
332
+ * Check whether blog ID is main site
333
+ *
334
+ * @param integer $blog_id Blog ID
335
+ * @return boolean
336
+ */
337
+ function ai1wm_main_site( $blog_id = null) {
338
+ return $blog_id === null || $blog_id === 0 || $blog_id === 1;
339
+ }
340
+
341
+ /**
342
+ * Get sites absolute path by blog ID
343
+ *
344
+ * @param integer $blog_id Blog ID
345
+ * @return string
346
+ */
347
+ function ai1wm_sites_path( $blog_id = null ) {
348
+ if ( ai1wm_main_site( $blog_id ) ) {
349
+ return AI1WM_UPLOADS_PATH;
350
+ }
351
+
352
+ return AI1WM_SITES_PATH . DIRECTORY_SEPARATOR . $blog_id;
353
+ }
354
+
355
+ /**
356
+ * Get uploads absolute path by blog ID
357
+ *
358
+ * @param integer $blog_id Blog ID
359
+ * @return string
360
+ */
361
+ function ai1wm_uploads_path( $blog_id = null ) {
362
+ if ( ai1wm_main_site( $blog_id ) ) {
363
+ return "/wp-content/uploads/";
364
+ }
365
+
366
+ return "/wp-content/uploads/sites/{$blog_id}/";
367
+ }
368
+
369
+ /**
370
+ * Get uploads URL by blog ID
371
+ *
372
+ * @param integer $blog_id Blog ID
373
+ * @return string
374
+ */
375
+ function ai1wm_uploads_url( $blog_id = null ) {
376
+ if ( ai1wm_main_site( $blog_id ) ) {
377
+ return get_site_url( $blog_id, "/wp-content/uploads/" );
378
+ }
379
+
380
+ return get_site_url( $blog_id, "/wp-content/uploads/sites/{$blog_id}/" );
381
+ }
382
+
383
+ /**
384
+ * Get ServMask table prefix by blog ID
385
+ *
386
+ * @param integer $blog_id Blog ID
387
+ * @return string
388
+ */
389
+ function ai1wm_servmask_prefix( $blog_id = null ) {
390
+ // Set base table prefix
391
+ if ( ai1wm_main_site( $blog_id ) ) {
392
+ return AI1WM_TABLE_PREFIX;
393
+ }
394
+
395
+ return AI1WM_TABLE_PREFIX . $blog_id . '_';
396
+ }
397
+
398
+ /**
399
+ * Get WordPress table prefix by blog ID
400
+ *
401
+ * @param integer $blog_id Blog ID
402
+ * @return string
403
+ */
404
+ function ai1wm_table_prefix( $blog_id = null ) {
405
+ global $wpdb;
406
+
407
+ // Set base table prefix
408
+ if ( ai1wm_main_site( $blog_id ) ) {
409
+ return $wpdb->base_prefix;
410
+ }
411
+
412
+ return $wpdb->base_prefix . $blog_id . '_';
413
+ }
414
+
415
+ /**
416
+ * Get default content filters
417
+ *
418
+ * @param array $filters List of files and directories
419
+ * @return array
420
+ */
421
+ function ai1wm_content_filters( $filters = array() ) {
422
+ return array_merge( $filters, array(
423
+ 'index.php',
424
+ 'ai1wm-backups',
425
+ 'themes' . DIRECTORY_SEPARATOR . 'index.php',
426
+ 'plugins' . DIRECTORY_SEPARATOR . 'index.php',
427
+ 'uploads' . DIRECTORY_SEPARATOR . 'index.php',
428
+ ) );
429
+ }
430
+
431
+ /**
432
+ * Get default plugin filters
433
+ *
434
+ * @param array $filters List of plugins
435
+ * @return array
436
+ */
437
+ function ai1wm_plugin_filters( $filters = array() ) {
438
+ // WP Migration Plugin
439
+ if ( defined( 'AI1WM_PLUGIN_BASENAME' ) ) {
440
+ $filters[] = 'plugins' . DIRECTORY_SEPARATOR . dirname( AI1WM_PLUGIN_BASENAME );
441
+ } else {
442
+ $filters[] = 'plugins' . DIRECTORY_SEPARATOR . 'all-in-one-wp-migration';
443
+ }
444
+
445
+ // Dropbox Extension
446
+ if ( defined( 'AI1WMDE_PLUGIN_BASENAME' ) ) {
447
+ $filters[] = 'plugins' . DIRECTORY_SEPARATOR . dirname( AI1WMDE_PLUGIN_BASENAME );
448
+ } else {
449
+ $filters[] = 'plugins' . DIRECTORY_SEPARATOR . 'all-in-one-wp-migration-dropbox-extension';
450
+ }
451
+
452
+ // Google Drive Extension
453
+ if ( defined( 'AI1WMGE_PLUGIN_BASENAME' ) ) {
454
+ $filters[] = 'plugins' . DIRECTORY_SEPARATOR . dirname( AI1WMGE_PLUGIN_BASENAME );
455
+ } else {
456
+ $filters[] = 'plugins' . DIRECTORY_SEPARATOR . 'all-in-one-wp-migration-gdrive-extension';
457
+ }
458
+
459
+ // Amazon S3 Extension
460
+ if ( defined( 'AI1WMSE_PLUGIN_BASENAME' ) ) {
461
+ $filters[] = 'plugins' . DIRECTORY_SEPARATOR . dirname( AI1WMSE_PLUGIN_BASENAME );
462
+ } else {
463
+ $filters[] = 'plugins' . DIRECTORY_SEPARATOR . 'all-in-one-wp-migration-s3-extension';
464
+ }
465
+
466
+ // Multisite Extension
467
+ if ( defined( 'AI1WMME_PLUGIN_BASENAME' ) ) {
468
+ $filters[] = 'plugins' . DIRECTORY_SEPARATOR . dirname( AI1WMME_PLUGIN_BASENAME );
469
+ } else {
470
+ $filters[] = 'plugins' . DIRECTORY_SEPARATOR . 'all-in-one-wp-migration-multisite-extension';
471
+ }
472
+
473
+ // Unlimited Extension
474
+ if ( defined( 'AI1WMUE_PLUGIN_BASENAME' ) ) {
475
+ $filters[] = 'plugins' . DIRECTORY_SEPARATOR . dirname( AI1WMUE_PLUGIN_BASENAME );
476
+ } else {
477
+ $filters[] = 'plugins' . DIRECTORY_SEPARATOR . 'all-in-one-wp-migration-unlimited-extension';
478
+ }
479
+
480
+ // FTP Extension
481
+ if ( defined( 'AI1WMFE_PLUGIN_BASENAME' ) ) {
482
+ $filters[] = 'plugins' . DIRECTORY_SEPARATOR . dirname( AI1WMFE_PLUGIN_BASENAME );
483
+ } else {
484
+ $filters[] = 'plugins' . DIRECTORY_SEPARATOR . 'all-in-one-wp-migration-ftp-extension';
485
+ }
486
+
487
+ // URL Extension
488
+ if ( defined( 'AI1WMLE_PLUGIN_BASENAME' ) ) {
489
+ $filters[] = 'plugins' . DIRECTORY_SEPARATOR . dirname( AI1WMLE_PLUGIN_BASENAME );
490
+ } else {
491
+ $filters[] = 'plugins' . DIRECTORY_SEPARATOR . 'all-in-one-wp-migration-url-extension';
492
+ }
493
+
494
+ // OneDrive Extension
495
+ if ( defined( 'AI1WMOE_PLUGIN_BASENAME' ) ) {
496
+ $filters[] = 'plugins' . DIRECTORY_SEPARATOR . dirname( AI1WMOE_PLUGIN_BASENAME );
497
+ } else {
498
+ $filters[] = 'plugins' . DIRECTORY_SEPARATOR . 'all-in-one-wp-migration-onedrive-extension';
499
+ }
500
+
501
+ return $filters;
502
  }
503
 
504
  /**
555
 
556
  return $plugins;
557
  }
558
+
559
+ /**
560
+ * URL encode
561
+ *
562
+ * @param mixed $value Value to encode
563
+ * @return mixed
564
+ */
565
+ function ai1wm_urlencode( $value ) {
566
+ return is_array( $value ) ? array_map( 'ai1wm_urlencode', $value ) : urlencode( $value );
567
+ }
568
+
569
+ /**
570
+ * URL decode
571
+ *
572
+ * @param mixed $value Value to decode
573
+ * @return mixed
574
+ */
575
+ function ai1wm_urldecode( $value ) {
576
+ return is_array( $value ) ? array_map( 'ai1wm_urldecode', $value ) : urldecode( stripslashes( $value ) );
577
+ }
lib/controller/{class-ai1wm-backup-controller.php → class-ai1wm-backups-controller.php} RENAMED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -23,10 +23,10 @@
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
 
26
- class Ai1wm_Backup_Controller {
27
 
28
  public static function index() {
29
- $model = new Ai1wm_Backup;
30
 
31
  // Username
32
  if ( isset( $_POST['ai1wm-username'] ) ) {
@@ -39,7 +39,7 @@ class Ai1wm_Backup_Controller {
39
  }
40
 
41
  Ai1wm_Template::render(
42
- 'backup/index',
43
  array(
44
  'backups' => $model->get_files(),
45
  'free_space' => $model->get_free_space(),
@@ -53,17 +53,17 @@ class Ai1wm_Backup_Controller {
53
  public static function delete() {
54
  $response = array( 'errors' => array() );
55
 
56
- // Set file
57
- $file = null;
58
- if ( isset( $_POST['file'] ) ) {
59
- $file = trim( $_POST['file'] );
60
  }
61
 
62
- $model = new Ai1wm_Backup;
63
 
64
  try {
65
  // Delete file
66
- $model->delete_file( $file );
67
  } catch ( Exception $e ) {
68
  $response['errors'][] = $e->getMessage();
69
  }
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
 
26
+ class Ai1wm_Backups_Controller {
27
 
28
  public static function index() {
29
+ $model = new Ai1wm_Backups;
30
 
31
  // Username
32
  if ( isset( $_POST['ai1wm-username'] ) ) {
39
  }
40
 
41
  Ai1wm_Template::render(
42
+ 'backups/index',
43
  array(
44
  'backups' => $model->get_files(),
45
  'free_space' => $model->get_free_space(),
53
  public static function delete() {
54
  $response = array( 'errors' => array() );
55
 
56
+ // Set archive
57
+ $archive = null;
58
+ if ( isset( $_POST['archive'] ) ) {
59
+ $archive = trim( $_POST['archive'] );
60
  }
61
 
62
+ $model = new Ai1wm_Backups;
63
 
64
  try {
65
  // Delete file
66
+ $model->delete_file( $archive );
67
  } catch ( Exception $e ) {
68
  $response['errors'][] = $e->getMessage();
69
  }
lib/controller/class-ai1wm-export-controller.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -26,101 +26,71 @@
26
  class Ai1wm_Export_Controller {
27
 
28
  public static function index() {
29
- // Get message model
30
- $model = new Ai1wm_Message;
31
-
32
- Ai1wm_Template::render(
33
- 'export/index',
34
- array(
35
- 'messages' => $model->get_messages(),
36
- )
37
- );
38
  }
39
 
40
- public static function export( $args = array() ) {
 
41
 
42
  // Set error handler
43
- @set_error_handler( 'Ai1wm_Log::error_handler' );
44
-
45
- try {
46
-
47
- // Set arguments
48
- if ( empty( $args ) ) {
49
- $args = ai1wm_urldecode( $_REQUEST );
50
- }
51
-
52
- // Set storage path
53
- if ( empty( $args['storage'] ) ) {
54
- $args['storage'] = uniqid();
55
- }
56
-
57
- // Set secret key
58
- $secret_key = null;
59
- if ( isset( $args['secret_key'] ) ) {
60
- $secret_key = $args['secret_key'];
61
- }
62
-
63
- // Verify secret key by using the value in the database, not in cache
64
- if ( $secret_key !== get_site_option( AI1WM_SECRET_KEY, false, false ) ) {
65
- throw new Ai1wm_Export_Exception(
66
- sprintf(
67
- __( 'Unable to authenticate your request with secret_key = %s', AI1WM_PLUGIN_NAME ),
68
- $secret_key
69
- )
70
- );
71
- }
72
-
73
- // Set provider
74
- $provider = null;
75
- if ( isset( $args['provider'] ) ) {
76
- $provider = $args['provider'];
77
- }
78
-
79
- $class = "Ai1wm_Export_$provider";
80
- if ( ! class_exists( $class ) ) {
81
- throw new Ai1wm_Export_Exception(
82
- sprintf(
83
- __( 'Unknown provider: <strong>"%s"</strong>', AI1WM_PLUGIN_NAME ),
84
- $class
85
- )
86
- );
87
- }
88
 
89
- // Set method
90
- $method = null;
91
- if ( isset( $args['method'] ) ) {
92
- $method = $args['method'];
93
- }
94
 
95
- // Initialize provider
96
- $provider = new $class( $args );
97
- if ( ! method_exists( $provider, $method ) ) {
98
- throw new Ai1wm_Export_Exception(
99
- sprintf(
100
- __( 'Unknown method: <strong>"%s"</strong>', AI1WM_PLUGIN_NAME ),
101
- $method
102
- )
103
- );
104
- }
105
 
106
- // Invoke method
107
- echo json_encode( $provider->$method() );
108
- exit;
109
- } catch ( Exception $e ) {
110
- // Log the error
111
- Ai1wm_Log::error( 'Exception while exporting: ' . $e->getMessage() );
112
 
113
- // Set the status to failed
114
- Ai1wm_Status::set(
115
- array(
116
- 'type' => 'error',
117
- 'title' => __( 'Unable to export', AI1WM_PLUGIN_NAME ),
118
- 'message' => $e->getMessage(),
119
- )
120
  );
 
 
121
 
122
- // End the process
123
- wp_die( 'Exception while exporting: ' . $e->getMessage() );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
  }
125
  }
126
 
@@ -131,6 +101,7 @@ class Ai1wm_Export_Controller {
131
  apply_filters( 'ai1wm_export_dropbox', Ai1wm_Template::get_content( 'export/button-dropbox' ) ),
132
  apply_filters( 'ai1wm_export_gdrive', Ai1wm_Template::get_content( 'export/button-gdrive' ) ),
133
  apply_filters( 'ai1wm_export_s3', Ai1wm_Template::get_content( 'export/button-s3' ) ),
 
134
  );
135
  }
136
  }
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
26
  class Ai1wm_Export_Controller {
27
 
28
  public static function index() {
29
+ Ai1wm_Template::render( 'export/index' );
 
 
 
 
 
 
 
 
30
  }
31
 
32
+ public static function export( $params = array() ) {
33
+ global $wp_filter;
34
 
35
  // Set error handler
36
+ @set_error_handler( 'Ai1wm_Handler::error' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
 
38
+ // Set params
39
+ if ( empty( $params ) ) {
40
+ $params = ai1wm_urldecode( $_REQUEST );
41
+ }
 
42
 
43
+ // Set priority
44
+ $priority = 5;
45
+ if ( isset( $params['priority'] ) ) {
46
+ $priority = (int) $params['priority'];
47
+ }
 
 
 
 
 
48
 
49
+ // Set secret key
50
+ $secret_key = null;
51
+ if ( isset( $params['secret_key'] ) ) {
52
+ $secret_key = $params['secret_key'];
53
+ }
 
54
 
55
+ // Verify secret key by using the value in the database, not in cache
56
+ if ( $secret_key !== get_site_option( AI1WM_SECRET_KEY, false, false ) ) {
57
+ Ai1wm_Status::error(
58
+ __( "Unable to authenticate your request with secret_key = \"{$secret_key}\"", AI1WM_PLUGIN_NAME ),
59
+ __( "Unable to export", AI1WM_PLUGIN_NAME )
 
 
60
  );
61
+ exit;
62
+ }
63
 
64
+ // Get hook
65
+ if ( isset( $wp_filter['ai1wm_export'] ) && ( $filters = $wp_filter['ai1wm_export'] ) && ksort( $filters ) ) {
66
+ while ( $hooks = current( $filters ) ) {
67
+ if ( $priority == key( $filters ) ) {
68
+ foreach ( $hooks as $hook ) {
69
+ try {
70
+ $params = call_user_func_array( $hook['function'], array( $params ) );
71
+ } catch ( Exception $e ) {
72
+ Ai1wm_Status::error( $e->getMessage(), __( 'Unable to export', AI1WM_PLUGIN_NAME ) );
73
+ exit;
74
+ }
75
+ }
76
+
77
+ // Set completed
78
+ $completed = true;
79
+ if ( isset( $params['completed'] ) ) {
80
+ $completed = (bool) $params['completed'];
81
+ }
82
+
83
+ // Log request
84
+ Ai1wm_Log::export( $params );
85
+
86
+ // Do request
87
+ if ( $completed === false || ( $next = next( $filters ) ) && ( $params['priority'] = key( $filters ) ) ) {
88
+ return Ai1wm_Http::get( admin_url( 'admin-ajax.php?action=ai1wm_export' ), $params );
89
+ }
90
+ }
91
+
92
+ next( $filters );
93
+ }
94
  }
95
  }
96
 
101
  apply_filters( 'ai1wm_export_dropbox', Ai1wm_Template::get_content( 'export/button-dropbox' ) ),
102
  apply_filters( 'ai1wm_export_gdrive', Ai1wm_Template::get_content( 'export/button-gdrive' ) ),
103
  apply_filters( 'ai1wm_export_s3', Ai1wm_Template::get_content( 'export/button-s3' ) ),
104
+ apply_filters( 'ai1wm_export_onedrive', Ai1wm_Template::get_content( 'export/button-onedrive' ) ),
105
  );
106
  }
107
  }
lib/controller/class-ai1wm-feedback-controller.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -25,34 +25,35 @@
25
 
26
  class Ai1wm_Feedback_Controller {
27
 
28
- public static function leave_feedback() {
 
29
  // Set Type
30
  $type = null;
31
- if ( isset( $_POST['type'] ) ) {
32
- $type = trim( $_POST['type'] );
33
  }
34
 
35
  // Set E-mail
36
  $email = null;
37
- if ( isset( $_POST['email'] ) ) {
38
- $email = trim( $_POST['email'] );
39
  }
40
 
41
  // Set Message
42
  $message = null;
43
- if ( isset( $_POST['message'] ) ) {
44
- $message = trim( $_POST['message'] );
45
  }
46
 
47
  // Set Terms
48
  $terms = false;
49
- if ( isset( $_POST['terms'] ) ) {
50
- $terms = (bool) $_POST['terms'];
51
  }
52
 
53
  // Send Feedback
54
  $model = new Ai1wm_Feedback;
55
- $result = $model->leave_feedback( $type, $email, $message, $terms );
56
 
57
  echo json_encode( $result );
58
  exit;
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
25
 
26
  class Ai1wm_Feedback_Controller {
27
 
28
+ public static function feedback() {
29
+
30
  // Set Type
31
  $type = null;
32
+ if ( isset( $_POST['ai1wm-type'] ) ) {
33
+ $type = trim( $_POST['ai1wm-type'] );
34
  }
35
 
36
  // Set E-mail
37
  $email = null;
38
+ if ( isset( $_POST['ai1wm-email'] ) ) {
39
+ $email = trim( $_POST['ai1wm-email'] );
40
  }
41
 
42
  // Set Message
43
  $message = null;
44
+ if ( isset( $_POST['ai1wm-message'] ) ) {
45
+ $message = trim( $_POST['ai1wm-message'] );
46
  }
47
 
48
  // Set Terms
49
  $terms = false;
50
+ if ( isset( $_POST['ai1wm-terms'] ) ) {
51
+ $terms = (bool) $_POST['ai1wm-terms'];
52
  }
53
 
54
  // Send Feedback
55
  $model = new Ai1wm_Feedback;
56
+ $result = $model->add( $type, $email, $message, $terms );
57
 
58
  echo json_encode( $result );
59
  exit;
lib/controller/class-ai1wm-import-controller.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -29,90 +29,68 @@ class Ai1wm_Import_Controller {
29
  Ai1wm_Template::render( 'import/index' );
30
  }
31
 
32
- public static function import( $args = array() ) {
 
33
 
34
  // Set error handler
35
- @set_error_handler( 'Ai1wm_Log::error_handler' );
36
 
37
- try {
38
-
39
- // Set arguments
40
- if ( empty( $args ) ) {
41
- $args = ai1wm_urldecode( $_REQUEST );
42
- }
43
-
44
- // Set storage path
45
- if ( empty( $args['storage'] ) ) {
46
- $args['storage'] = uniqid();
47
- }
48
-
49
- // Set secret key
50
- $secret_key = null;
51
- if ( isset( $args['secret_key'] ) ) {
52
- $secret_key = $args['secret_key'];
53
- }
54
-
55
- // Verify secret key by using the value in the database, not in cache
56
- if ( $secret_key !== get_site_option( AI1WM_SECRET_KEY, false, false ) ) {
57
- throw new Ai1wm_Import_Exception(
58
- sprintf(
59
- __( 'Unable to authenticate your request with secret_key = <strong>"%s"</strong>', AI1WM_PLUGIN_NAME ),
60
- $secret_key
61
- )
62
- );
63
- }
64
-
65
- // Set provider
66
- $provider = null;
67
- if ( isset( $args['provider'] ) ) {
68
- $provider = $args['provider'];
69
- }
70
-
71
- $class = "Ai1wm_Import_$provider";
72
- if ( ! class_exists( $class ) ) {
73
- throw new Ai1wm_Import_Exception(
74
- sprintf(
75
- __( 'Unknown provider: <strong>"%s"</strong>', AI1WM_PLUGIN_NAME ),
76
- $class
77
- )
78
- );
79
- }
80
-
81
- // Set method
82
- $method = null;
83
- if ( isset( $args['method'] ) ) {
84
- $method = $args['method'];
85
- }
86
 
87
- // Initialize provider
88
- $provider = new $class( $args );
89
- if ( ! method_exists( $provider, $method ) ) {
90
- throw new Ai1wm_Import_Exception(
91
- sprintf(
92
- __( 'Unknown method: <strong>"%s"</strong>', AI1WM_PLUGIN_NAME ),
93
- $method
94
- )
95
- );
96
- }
97
 
98
- // Invoke method
99
- echo json_encode( $provider->$method() );
100
- exit;
101
- } catch ( Exception $e ) {
102
- // Log the error
103
- Ai1wm_Log::error( 'Exception while importing: ' . $e->getMessage() );
104
 
105
- // Set the status to failed
106
- Ai1wm_Status::set(
107
- array(
108
- 'type' => 'error',
109
- 'title' => __( 'Unable to import', AI1WM_PLUGIN_NAME ),
110
- 'message' => $e->getMessage(),
111
- )
112
  );
 
 
113
 
114
- // End the process
115
- wp_die( 'Exception while importing: ' . $e->getMessage() );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
  }
117
  }
118
 
@@ -124,29 +102,15 @@ class Ai1wm_Import_Controller {
124
  apply_filters( 'ai1wm_import_dropbox', Ai1wm_Template::get_content( 'import/button-dropbox' ) ),
125
  apply_filters( 'ai1wm_import_gdrive', Ai1wm_Template::get_content( 'import/button-gdrive' ) ),
126
  apply_filters( 'ai1wm_import_s3', Ai1wm_Template::get_content( 'import/button-s3' ) ),
 
127
  );
128
  }
129
 
130
  public static function max_chunk_size() {
131
  return min(
132
- self::parse_size( ini_get( 'post_max_size' ) ),
133
- self::parse_size( ini_get( 'upload_max_filesize' ) ),
134
- self::parse_size( AI1WM_MAX_CHUNK_SIZE )
135
- );
136
- }
137
-
138
- protected static function parse_size( $size ) {
139
- $suffixes = array(
140
- '' => 1,
141
- 'k' => 1000,
142
- 'm' => 1000000,
143
- 'g' => 1000000000,
144
  );
145
-
146
- if ( preg_match( '/([0-9]+)\s*(k|m|g)?(b?(ytes?)?)/i', $size, $match ) ) {
147
- return $match[1] * $suffixes[strtolower( $match[2] )];
148
- }
149
-
150
- return AI1WM_MAX_CHUNK_SIZE;
151
  }
152
  }
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
29
  Ai1wm_Template::render( 'import/index' );
30
  }
31
 
32
+ public static function import( $params = array() ) {
33
+ global $wp_filter;
34
 
35
  // Set error handler
36
+ @set_error_handler( 'Ai1wm_Handler::error' );
37
 
38
+ // Set params
39
+ if ( empty( $params ) ) {
40
+ $params = ai1wm_urldecode( $_REQUEST );
41
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
 
43
+ // Set priority
44
+ $priority = 10;
45
+ if ( isset( $params['priority'] ) ) {
46
+ $priority = (int) $params['priority'];
47
+ }
 
 
 
 
 
48
 
49
+ // Set secret key
50
+ $secret_key = null;
51
+ if ( isset( $params['secret_key'] ) ) {
52
+ $secret_key = $params['secret_key'];
53
+ }
 
54
 
55
+ // Verify secret key by using the value in the database, not in cache
56
+ if ( $secret_key !== get_site_option( AI1WM_SECRET_KEY, false, false ) ) {
57
+ Ai1wm_Status::error(
58
+ __( "Unable to authenticate your request with secret_key = \"{$secret_key}\"", AI1WM_PLUGIN_NAME ),
59
+ __( "Unable to import", AI1WM_PLUGIN_NAME )
 
 
60
  );
61
+ exit;
62
+ }
63
 
64
+ // Get hook
65
+ if ( isset( $wp_filter['ai1wm_import'] ) && ( $filters = $wp_filter['ai1wm_import'] ) && ksort( $filters ) ) {
66
+ while ( $hooks = current( $filters ) ) {
67
+ if ( $priority == key( $filters ) ) {
68
+ foreach ( $hooks as $hook ) {
69
+ try {
70
+ $params = call_user_func_array( $hook['function'], array( $params ) );
71
+ } catch ( Exception $e ) {
72
+ Ai1wm_Status::error( $e->getMessage(), __( 'Unable to import', AI1WM_PLUGIN_NAME ) );
73
+ exit;
74
+ }
75
+ }
76
+
77
+ // Set completed
78
+ $completed = true;
79
+ if ( isset( $params['completed'] ) ) {
80
+ $completed = (bool) $params['completed'];
81
+ }
82
+
83
+ // Log request
84
+ Ai1wm_Log::import( $params );
85
+
86
+ // Do request
87
+ if ( $completed === false || ( $next = next( $filters ) ) && ( $params['priority'] = key( $filters ) ) ) {
88
+ return Ai1wm_Http::get( admin_url( 'admin-ajax.php?action=ai1wm_import' ), $params );
89
+ }
90
+ }
91
+
92
+ next( $filters );
93
+ }
94
  }
95
  }
96
 
102
  apply_filters( 'ai1wm_import_dropbox', Ai1wm_Template::get_content( 'import/button-dropbox' ) ),
103
  apply_filters( 'ai1wm_import_gdrive', Ai1wm_Template::get_content( 'import/button-gdrive' ) ),
104
  apply_filters( 'ai1wm_import_s3', Ai1wm_Template::get_content( 'import/button-s3' ) ),
105
+ apply_filters( 'ai1wm_import_onedrive', Ai1wm_Template::get_content( 'import/button-onedrive' ) ),
106
  );
107
  }
108
 
109
  public static function max_chunk_size() {
110
  return min(
111
+ ai1wm_parse_size( ini_get( 'post_max_size' ), AI1WM_MAX_CHUNK_SIZE ),
112
+ ai1wm_parse_size( ini_get( 'upload_max_filesize' ), AI1WM_MAX_CHUNK_SIZE ),
113
+ ai1wm_parse_size( AI1WM_MAX_CHUNK_SIZE )
 
 
 
 
 
 
 
 
 
114
  );
 
 
 
 
 
 
115
  }
116
  }
lib/controller/class-ai1wm-main-controller.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -65,24 +65,26 @@ class Ai1wm_Main_Controller {
65
  * @return Object Instance of this class
66
  */
67
  private function activate_actions() {
68
- if ( is_multisite() ) {
69
- if ( apply_filters( 'ai1wm_multisite_menu', false ) ) {
70
- add_action( 'network_admin_menu', array( $this, 'admin_menu' ) );
71
- } else {
72
- add_action( 'network_admin_notices', array( $this, 'multisite_notice' ) );
73
- }
74
- } else {
75
- add_action( 'admin_menu', array( $this, 'admin_menu' ) );
76
- }
77
-
78
  add_action( 'admin_init', array( $this, 'init' ) );
 
 
79
  add_action( 'admin_init', array( $this, 'router' ) );
80
- add_action( 'admin_init', array( $this, 'create_folders' ) );
 
81
  add_action( 'admin_head', array( $this, 'admin_head' ) );
82
- add_action( 'get_header', array( $this, 'get_header' ) );
83
 
84
- // Add automatic plugins updates
85
- add_action( 'wp_maybe_auto_update', 'Ai1wm_Updater_Controller::check_for_updates' );
 
 
 
 
 
 
 
 
 
86
 
87
  // Add updater scripts and styles
88
  add_action( 'admin_enqueue_scripts', array( $this, 'register_updater_scripts_and_styles' ) );
@@ -99,11 +101,69 @@ class Ai1wm_Main_Controller {
99
  // Add a links to plugin list page
100
  add_filter( 'plugin_row_meta', array( $this, 'plugin_row_meta' ), 10, 2 );
101
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
102
  // Add export buttons
103
  add_filter( 'ai1wm_export_buttons', 'Ai1wm_Export_Controller::buttons' );
104
 
105
  // Add import buttons
106
  add_filter( 'ai1wm_import_buttons', 'Ai1wm_Import_Controller::buttons' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
107
 
108
  // Add chunk size limit
109
  add_filter( 'ai1wm_max_chunk_size', 'Ai1wm_Import_Controller::max_chunk_size' );
@@ -119,8 +179,6 @@ class Ai1wm_Main_Controller {
119
 
120
  // Add "Check for updates" link to plugin list page
121
  add_filter( 'plugin_row_meta', 'Ai1wm_Updater_Controller::plugin_row_meta', 10, 2 );
122
-
123
- return $this;
124
  }
125
 
126
  /**
@@ -172,83 +230,6 @@ class Ai1wm_Main_Controller {
172
  return $links;
173
  }
174
 
175
- /**
176
- * Show maintenance page
177
- *
178
- * @return void
179
- */
180
- public function get_header() {
181
- Ai1wm_Maintenance::display();
182
- }
183
-
184
- /**
185
- * Register initial parameters
186
- *
187
- * @return void
188
- */
189
- public function init() {
190
- // Set secret key
191
- if ( ! get_site_option( AI1WM_SECRET_KEY, false, false ) ) {
192
- update_site_option( AI1WM_SECRET_KEY, wp_generate_password( 12, false ) );
193
- }
194
-
195
- // Set username
196
- if ( isset( $_SERVER['PHP_AUTH_USER'] ) ) {
197
- update_site_option( AI1WM_AUTH_USER, $_SERVER['PHP_AUTH_USER'] );
198
- } else if ( isset( $_SERVER['REMOTE_USER'] ) ) {
199
- update_site_option( AI1WM_AUTH_USER, $_SERVER['REMOTE_USER'] );
200
- }
201
-
202
- // Set password
203
- if ( isset( $_SERVER['PHP_AUTH_PW'] ) ) {
204
- update_site_option( AI1WM_AUTH_PASSWORD, $_SERVER['PHP_AUTH_PW'] );
205
- }
206
-
207
- // Check for updates
208
- if ( isset( $_GET['ai1wm_updater'] ) ) {
209
- if ( current_user_can( 'update_plugins' ) && check_admin_referer( 'ai1wm_updater_nonce' ) ) {
210
- Ai1wm_Updater::check_for_updates();
211
- }
212
- }
213
- }
214
-
215
- /**
216
- * Register initial router
217
- *
218
- * @return void
219
- */
220
- public function router() {
221
- // Public
222
- add_action( 'wp_ajax_nopriv_ai1wm_export', 'Ai1wm_Export_Controller::export' );
223
- add_action( 'wp_ajax_nopriv_ai1wm_import', 'Ai1wm_Import_Controller::import' );
224
- add_action( 'wp_ajax_nopriv_ai1wm_resolve', 'Ai1wm_Resolve_Controller::resolve' );
225
-
226
- // Update
227
- if ( current_user_can( 'update_plugins' ) ) {
228
- add_action( 'wp_ajax_ai1wm_updater', 'Ai1wm_Updater_Controller::updater' );
229
- }
230
-
231
- // Export
232
- if ( current_user_can( 'export' ) ) {
233
- add_action( 'wp_ajax_ai1wm_export', 'Ai1wm_Export_Controller::export' );
234
- }
235
-
236
- // Import
237
- if ( current_user_can( 'import' ) ) {
238
- add_action( 'wp_ajax_ai1wm_import', 'Ai1wm_Import_Controller::import' );
239
- }
240
-
241
- // Both
242
- if ( current_user_can( 'export' ) || current_user_can( 'import' ) ) {
243
- add_action( 'wp_ajax_ai1wm_backup_delete', 'Ai1wm_Backup_Controller::delete' );
244
- add_action( 'wp_ajax_ai1wm_leave_feedback', 'Ai1wm_Feedback_Controller::leave_feedback' );
245
- add_action( 'wp_ajax_ai1wm_report_problem', 'Ai1wm_Report_Controller::report_problem' );
246
- add_action( 'wp_ajax_ai1wm_close_message', 'Ai1wm_Message_Controller::close_message' );
247
- add_action( 'wp_ajax_ai1wm_disable_maintenance', 'Ai1wm_Maintenance::disable' );
248
- add_action( 'wp_ajax_ai1wm_resolve', 'Ai1wm_Resolve_Controller::resolve' );
249
- }
250
- }
251
-
252
  /**
253
  * Create folders needed for plugin operation, if they don't exist
254
  *
@@ -256,7 +237,7 @@ class Ai1wm_Main_Controller {
256
  */
257
  public function create_folders() {
258
  // Check if storage folder exist
259
- if ( ! file_exists( AI1WM_STORAGE_PATH ) ) {
260
 
261
  // Folder doesn't exist, attempt to create it
262
  if ( ! mkdir( AI1WM_STORAGE_PATH ) ) {
@@ -274,7 +255,7 @@ class Ai1wm_Main_Controller {
274
  Ai1wm_File_Index::create( AI1WM_STORAGE_INDEX );
275
 
276
  // Check if backups folder exist
277
- if ( ! file_exists( AI1WM_BACKUPS_PATH ) ) {
278
 
279
  // Folder doesn't exist, attempt to create it
280
  if ( ! mkdir( AI1WM_BACKUPS_PATH ) ) {
@@ -290,6 +271,9 @@ class Ai1wm_Main_Controller {
290
 
291
  // Create index.php in backups folder
292
  Ai1wm_File_Index::create( AI1WM_BACKUPS_INDEX );
 
 
 
293
  }
294
 
295
  /**
@@ -307,7 +291,7 @@ class Ai1wm_Main_Controller {
307
  $file = $path . DIRECTORY_SEPARATOR . AI1WM_DIRECTORY_INDEX;
308
 
309
  // Check if the file exists
310
- if ( ! file_exists( $file ) ) {
311
 
312
  // File doesn't exist attempt to create ti
313
  $handle = fopen( $file, 'w' );
@@ -344,6 +328,7 @@ class Ai1wm_Main_Controller {
344
  '',
345
  '76.295'
346
  );
 
347
  // sublevel Export menu
348
  $export_page_hook_suffix = add_submenu_page(
349
  'site-migration-export',
@@ -357,6 +342,7 @@ class Ai1wm_Main_Controller {
357
  'admin_print_scripts-' . $export_page_hook_suffix,
358
  array( $this, 'register_export_scripts_and_styles' )
359
  );
 
360
  // sublevel Import menu
361
  $import_page_hook_suffix = add_submenu_page(
362
  'site-migration-export',
@@ -370,32 +356,22 @@ class Ai1wm_Main_Controller {
370
  'admin_print_scripts-' . $import_page_hook_suffix,
371
  array( $this, 'register_import_scripts_and_styles' )
372
  );
 
373
  // sublevel Backups menu
374
- $backup_page_hook_suffix = add_submenu_page(
375
  'site-migration-export',
376
  __( 'Backups', AI1WM_PLUGIN_NAME ),
377
  __( 'Backups', AI1WM_PLUGIN_NAME ),
378
- 'export',
379
- 'site-migration-backup',
380
- 'Ai1wm_Backup_Controller::index'
381
  );
382
  add_action(
383
- 'admin_print_scripts-' . $backup_page_hook_suffix,
384
- array( $this, 'register_backup_scripts_and_styles' )
385
  );
386
  }
387
 
388
- /**
389
- * Outputs menu icon between head tags
390
- *
391
- * @return void
392
- */
393
- public function admin_head() {
394
- global $wp_version;
395
-
396
- Ai1wm_Template::render( 'main/admin-head', array( 'version' => $wp_version ) );
397
- }
398
-
399
  /**
400
  * Register scripts and styles for Export Controller
401
  *
@@ -418,22 +394,12 @@ class Ai1wm_Main_Controller {
418
  );
419
  wp_localize_script( 'ai1wm-js-export', 'ai1wm_feedback', array(
420
  'ajax' => array(
421
- 'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_leave_feedback' ) ),
422
  ),
423
  ) );
424
  wp_localize_script( 'ai1wm-js-export', 'ai1wm_report', array(
425
  'ajax' => array(
426
- 'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_report_problem' ) ),
427
- ),
428
- ) );
429
- wp_localize_script( 'ai1wm-js-export', 'ai1wm_message', array(
430
- 'ajax' => array(
431
- 'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_close_message' ) ),
432
- ),
433
- ) );
434
- wp_localize_script( 'ai1wm-js-export', 'ai1wm_maintenance', array(
435
- 'ajax' => array(
436
- 'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_disable_maintenance' ) ),
437
  ),
438
  ) );
439
  wp_localize_script( 'ai1wm-js-export', 'ai1wm_export', array(
@@ -448,44 +414,6 @@ class Ai1wm_Main_Controller {
448
  ) );
449
  }
450
 
451
- /**
452
- * Register scripts and styles for Backup Controller
453
- *
454
- * @return void
455
- */
456
- public function register_backup_scripts_and_styles() {
457
- do_action( 'ai1mw-register-backup-scripts-and-styles' );
458
- wp_enqueue_script(
459
- 'ai1wm-js-backup',
460
- Ai1wm_Template::asset_link( 'javascript/backup.min.js' ),
461
- array( 'jquery' )
462
- );
463
- wp_enqueue_style(
464
- 'ai1wm-css-backup',
465
- Ai1wm_Template::asset_link( 'css/backup.min.css' )
466
- );
467
- wp_localize_script( 'ai1wm-js-backup', 'ai1wm_feedback', array(
468
- 'ajax' => array(
469
- 'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_leave_feedback' ) ),
470
- ),
471
- ) );
472
- wp_localize_script( 'ai1wm-js-backup', 'ai1wm_report', array(
473
- 'ajax' => array(
474
- 'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_report_problem' ) ),
475
- ),
476
- ) );
477
- wp_localize_script( 'ai1wm-js-backup', 'ai1wm_maintenance', array(
478
- 'ajax' => array(
479
- 'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_disable_maintenance' ) ),
480
- ),
481
- ) );
482
- wp_localize_script( 'ai1wm-js-backup', 'ai1wm_backup', array(
483
- 'ajax' => array(
484
- 'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_backup_delete' ) ),
485
- ),
486
- ) );
487
- }
488
-
489
  /**
490
  * Register scripts and styles for Import Controller
491
  *
@@ -523,8 +451,7 @@ class Ai1wm_Main_Controller {
523
  'unique_names' => true,
524
  'multipart' => true,
525
  'multipart_params' => array(
526
- 'provider' => 'file',
527
- 'method' => 'import',
528
  'secret_key' => get_site_option( AI1WM_SECRET_KEY, false, false ),
529
  ),
530
  'filters' => array(
@@ -534,17 +461,12 @@ class Ai1wm_Main_Controller {
534
  ) );
535
  wp_localize_script( 'ai1wm-js-import', 'ai1wm_feedback', array(
536
  'ajax' => array(
537
- 'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_leave_feedback' ) ),
538
  ),
539
  ) );
540
  wp_localize_script( 'ai1wm-js-import', 'ai1wm_report', array(
541
  'ajax' => array(
542
- 'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_report_problem' ) ),
543
- ),
544
- ) );
545
- wp_localize_script( 'ai1wm-js-import', 'ai1wm_maintenance', array(
546
- 'ajax' => array(
547
- 'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_disable_maintenance' ) ),
548
  ),
549
  ) );
550
  wp_localize_script( 'ai1wm-js-import', 'ai1wm_import', array(
@@ -582,6 +504,50 @@ class Ai1wm_Main_Controller {
582
  ) );
583
  }
584
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
585
  /**
586
  * Register scripts and styles for Updater Controller
587
  *
@@ -609,4 +575,82 @@ class Ai1wm_Main_Controller {
609
  ),
610
  ) );
611
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
612
  }
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
65
  * @return Object Instance of this class
66
  */
67
  private function activate_actions() {
68
+ // Init
 
 
 
 
 
 
 
 
 
69
  add_action( 'admin_init', array( $this, 'init' ) );
70
+
71
+ // Router
72
  add_action( 'admin_init', array( $this, 'router' ) );
73
+
74
+ // Admin header
75
  add_action( 'admin_head', array( $this, 'admin_head' ) );
 
76
 
77
+ // Create initial folders
78
+ add_action( 'admin_init', array( $this, 'create_folders' ) );
79
+
80
+ // All in One WP Migration
81
+ add_action( 'plugins_loaded', array( $this, 'ai1wm_loaded' ), 20 );
82
+
83
+ // Export and import commands
84
+ add_action( 'plugins_loaded', array( $this, 'ai1wm_commands' ), 10 );
85
+
86
+ // Export and import buttons
87
+ add_action( 'plugins_loaded', array( $this, 'ai1wm_buttons' ), 10 );
88
 
89
  // Add updater scripts and styles
90
  add_action( 'admin_enqueue_scripts', array( $this, 'register_updater_scripts_and_styles' ) );
101
  // Add a links to plugin list page
102
  add_filter( 'plugin_row_meta', array( $this, 'plugin_row_meta' ), 10, 2 );
103
 
104
+ return $this;
105
+ }
106
+
107
+ /**
108
+ * Export and import commands
109
+ *
110
+ * @return void
111
+ */
112
+ public function ai1wm_commands() {
113
+ // Add export commands
114
+ add_filter( 'ai1wm_export', 'Ai1wm_Export_Resolve::execute', 5 );
115
+ add_filter( 'ai1wm_export', 'Ai1wm_Export_Archive::execute', 10 );
116
+ add_filter( 'ai1wm_export', 'Ai1wm_Export_Config::execute', 50 );
117
+ add_filter( 'ai1wm_export', 'Ai1wm_Export_Enumerate::execute', 100 );
118
+ add_filter( 'ai1wm_export', 'Ai1wm_Export_Content::execute', 150 );
119
+ add_filter( 'ai1wm_export', 'Ai1wm_Export_Database::execute', 200 );
120
+ add_filter( 'ai1wm_export', 'Ai1wm_Export_Download::execute', 250 );
121
+ add_filter( 'ai1wm_export', 'Ai1wm_Export_Clean::execute', 300 );
122
+
123
+ // Add import commands
124
+ add_filter( 'ai1wm_import', 'Ai1wm_Import_Upload::execute', 5 );
125
+ add_filter( 'ai1wm_import', 'Ai1wm_Import_Resolve::execute', 10 );
126
+ add_filter( 'ai1wm_import', 'Ai1wm_Import_Validate::execute', 50 );
127
+ add_filter( 'ai1wm_import', 'Ai1wm_Import_Confirm::execute', 100 );
128
+ add_filter( 'ai1wm_import', 'Ai1wm_Import_Blogs::execute', 150 );
129
+ add_filter( 'ai1wm_import', 'Ai1wm_Import_Enumerate::execute', 200 );
130
+ add_filter( 'ai1wm_import', 'Ai1wm_Import_Content::execute', 250 );
131
+ add_filter( 'ai1wm_import', 'Ai1wm_Import_Database::execute', 300 );
132
+ add_filter( 'ai1wm_import', 'Ai1wm_Import_Done::execute', 350 );
133
+ add_filter( 'ai1wm_import', 'Ai1wm_Import_Clean::execute', 400 );
134
+ }
135
+
136
+ /**
137
+ * Export and import buttons
138
+ *
139
+ * @return void
140
+ */
141
+ public function ai1wm_buttons() {
142
  // Add export buttons
143
  add_filter( 'ai1wm_export_buttons', 'Ai1wm_Export_Controller::buttons' );
144
 
145
  // Add import buttons
146
  add_filter( 'ai1wm_import_buttons', 'Ai1wm_Import_Controller::buttons' );
147
+ }
148
+
149
+ /**
150
+ * All in One WP Migration loaded
151
+ *
152
+ * @return void
153
+ */
154
+ public function ai1wm_loaded() {
155
+ if ( is_multisite() ) {
156
+ if ( apply_filters( 'ai1wm_multisite_menu', false ) ) {
157
+ add_action( 'network_admin_menu', array( $this, 'admin_menu' ) );
158
+ } else {
159
+ add_action( 'network_admin_notices', array( $this, 'multisite_notice' ) );
160
+ }
161
+ } else {
162
+ add_action( 'admin_menu', array( $this, 'admin_menu' ) );
163
+ }
164
+
165
+ // Add automatic plugins update
166
+ add_action( 'wp_maybe_auto_update', 'Ai1wm_Updater_Controller::check_for_updates' );
167
 
168
  // Add chunk size limit
169
  add_filter( 'ai1wm_max_chunk_size', 'Ai1wm_Import_Controller::max_chunk_size' );
179
 
180
  // Add "Check for updates" link to plugin list page
181
  add_filter( 'plugin_row_meta', 'Ai1wm_Updater_Controller::plugin_row_meta', 10, 2 );
 
 
182
  }
183
 
184
  /**
230
  return $links;
231
  }
232
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
233
  /**
234
  * Create folders needed for plugin operation, if they don't exist
235
  *
237
  */
238
  public function create_folders() {
239
  // Check if storage folder exist
240
+ if ( ! is_dir( AI1WM_STORAGE_PATH ) ) {
241
 
242
  // Folder doesn't exist, attempt to create it
243
  if ( ! mkdir( AI1WM_STORAGE_PATH ) ) {
255
  Ai1wm_File_Index::create( AI1WM_STORAGE_INDEX );
256
 
257
  // Check if backups folder exist
258
+ if ( ! is_dir( AI1WM_BACKUPS_PATH ) ) {
259
 
260
  // Folder doesn't exist, attempt to create it
261
  if ( ! mkdir( AI1WM_BACKUPS_PATH ) ) {
271
 
272
  // Create index.php in backups folder
273
  Ai1wm_File_Index::create( AI1WM_BACKUPS_INDEX );
274
+
275
+ // Create .htaccess in backups folder
276
+ Ai1wm_File_Htaccess::create( AI1WM_BACKUPS_HTACCESS );
277
  }
278
 
279
  /**
291
  $file = $path . DIRECTORY_SEPARATOR . AI1WM_DIRECTORY_INDEX;
292
 
293
  // Check if the file exists
294
+ if ( ! is_file( $file ) ) {
295
 
296
  // File doesn't exist attempt to create ti
297
  $handle = fopen( $file, 'w' );
328
  '',
329
  '76.295'
330
  );
331
+
332
  // sublevel Export menu
333
  $export_page_hook_suffix = add_submenu_page(
334
  'site-migration-export',
342
  'admin_print_scripts-' . $export_page_hook_suffix,
343
  array( $this, 'register_export_scripts_and_styles' )
344
  );
345
+
346
  // sublevel Import menu
347
  $import_page_hook_suffix = add_submenu_page(
348
  'site-migration-export',
356
  'admin_print_scripts-' . $import_page_hook_suffix,
357
  array( $this, 'register_import_scripts_and_styles' )
358
  );
359
+
360
  // sublevel Backups menu
361
+ $backups_page_hook_suffix = add_submenu_page(
362
  'site-migration-export',
363
  __( 'Backups', AI1WM_PLUGIN_NAME ),
364
  __( 'Backups', AI1WM_PLUGIN_NAME ),
365
+ 'import',
366
+ 'site-migration-backups',
367
+ 'Ai1wm_Backups_Controller::index'
368
  );
369
  add_action(
370
+ 'admin_print_scripts-' . $backups_page_hook_suffix,
371
+ array( $this, 'register_backups_scripts_and_styles' )
372
  );
373
  }
374
 
 
 
 
 
 
 
 
 
 
 
 
375
  /**
376
  * Register scripts and styles for Export Controller
377
  *
394
  );
395
  wp_localize_script( 'ai1wm-js-export', 'ai1wm_feedback', array(
396
  'ajax' => array(
397
+ 'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_feedback' ) ),
398
  ),
399
  ) );
400
  wp_localize_script( 'ai1wm-js-export', 'ai1wm_report', array(
401
  'ajax' => array(
402
+ 'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_report' ) ),
 
 
 
 
 
 
 
 
 
 
403
  ),
404
  ) );
405
  wp_localize_script( 'ai1wm-js-export', 'ai1wm_export', array(
414
  ) );
415
  }
416
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
417
  /**
418
  * Register scripts and styles for Import Controller
419
  *
451
  'unique_names' => true,
452
  'multipart' => true,
453
  'multipart_params' => array(
454
+ 'priority' => 5,
 
455
  'secret_key' => get_site_option( AI1WM_SECRET_KEY, false, false ),
456
  ),
457
  'filters' => array(
461
  ) );
462
  wp_localize_script( 'ai1wm-js-import', 'ai1wm_feedback', array(
463
  'ajax' => array(
464
+ 'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_feedback' ) ),
465
  ),
466
  ) );
467
  wp_localize_script( 'ai1wm-js-import', 'ai1wm_report', array(
468
  'ajax' => array(
469
+ 'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_report' ) ),
 
 
 
 
 
470
  ),
471
  ) );
472
  wp_localize_script( 'ai1wm-js-import', 'ai1wm_import', array(
504
  ) );
505
  }
506
 
507
+ /**
508
+ * Register scripts and styles for Backups Controller
509
+ *
510
+ * @return void
511
+ */
512
+ public function register_backups_scripts_and_styles() {
513
+ do_action( 'ai1mw-register-backups-scripts-and-styles' );
514
+
515
+ wp_enqueue_script(
516
+ 'ai1wm-js-backups',
517
+ Ai1wm_Template::asset_link( 'javascript/backups.min.js' ),
518
+ array( 'jquery' )
519
+ );
520
+ wp_enqueue_style(
521
+ 'ai1wm-css-backups',
522
+ Ai1wm_Template::asset_link( 'css/backups.min.css' )
523
+ );
524
+ wp_localize_script( 'ai1wm-js-backups', 'ai1wm_feedback', array(
525
+ 'ajax' => array(
526
+ 'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_feedback' ) ),
527
+ ),
528
+ ) );
529
+ wp_localize_script( 'ai1wm-js-backups', 'ai1wm_report', array(
530
+ 'ajax' => array(
531
+ 'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_report' ) ),
532
+ ),
533
+ ) );
534
+ wp_localize_script( 'ai1wm-js-backups', 'ai1wm_backups', array(
535
+ 'ajax' => array(
536
+ 'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_backups' ) ),
537
+ ),
538
+ ) );
539
+ wp_localize_script( 'ai1wm-js-backups', 'ai1wm_import', array(
540
+ 'ajax' => array(
541
+ 'url' => wp_make_link_relative( admin_url( 'admin-ajax.php?action=ai1wm_import' ) ),
542
+ ),
543
+ 'status' => array(
544
+ 'php' => wp_make_link_relative( plugins_url( 'status.php', AI1WM_PLUGIN_BASENAME ) ),
545
+ 'js' => wp_make_link_relative( plugins_url( 'storage/status.js', AI1WM_PLUGIN_BASENAME ) ),
546
+ ),
547
+ 'secret_key' => get_site_option( AI1WM_SECRET_KEY, false, false ),
548
+ ) );
549
+ }
550
+
551
  /**
552
  * Register scripts and styles for Updater Controller
553
  *
575
  ),
576
  ) );
577
  }
578
+
579
+ /**
580
+ * Outputs menu icon between head tags
581
+ *
582
+ * @return void
583
+ */
584
+ public function admin_head() {
585
+ global $wp_version;
586
+
587
+ // Admin header
588
+ Ai1wm_Template::render( 'main/admin-head', array( 'version' => $wp_version ) );
589
+ }
590
+
591
+ /**
592
+ * Register initial parameters
593
+ *
594
+ * @return void
595
+ */
596
+ public function init() {
597
+ // Set secret key
598
+ if ( ! get_site_option( AI1WM_SECRET_KEY, false, false ) ) {
599
+ update_site_option( AI1WM_SECRET_KEY, wp_generate_password( 12, false ) );
600
+ }
601
+
602
+ // Set username
603
+ if ( isset( $_SERVER['PHP_AUTH_USER'] ) ) {
604
+ update_site_option( AI1WM_AUTH_USER, $_SERVER['PHP_AUTH_USER'] );
605
+ } else if ( isset( $_SERVER['REMOTE_USER'] ) ) {
606
+ update_site_option( AI1WM_AUTH_USER, $_SERVER['REMOTE_USER'] );
607
+ }
608
+
609
+ // Set password
610
+ if ( isset( $_SERVER['PHP_AUTH_PW'] ) ) {
611
+ update_site_option( AI1WM_AUTH_PASSWORD, $_SERVER['PHP_AUTH_PW'] );
612
+ }
613
+
614
+ // Check for updates
615
+ if ( isset( $_GET['ai1wm_updater'] ) ) {
616
+ if ( current_user_can( 'update_plugins' ) && check_admin_referer( 'ai1wm_updater_nonce' ) ) {
617
+ Ai1wm_Updater::check_for_updates();
618
+ }
619
+ }
620
+ }
621
+
622
+ /**
623
+ * Register initial router
624
+ *
625
+ * @return void
626
+ */
627
+ public function router() {
628
+ // Public
629
+ add_action( 'wp_ajax_nopriv_ai1wm_export', 'Ai1wm_Export_Controller::export' );
630
+ add_action( 'wp_ajax_nopriv_ai1wm_import', 'Ai1wm_Import_Controller::import' );
631
+ add_action( 'wp_ajax_nopriv_ai1wm_resolve', 'Ai1wm_Resolve_Controller::resolve' );
632
+
633
+ // Update
634
+ if ( current_user_can( 'update_plugins' ) ) {
635
+ add_action( 'wp_ajax_ai1wm_updater', 'Ai1wm_Updater_Controller::updater' );
636
+ }
637
+
638
+ // Export
639
+ if ( current_user_can( 'export' ) ) {
640
+ add_action( 'wp_ajax_ai1wm_export', 'Ai1wm_Export_Controller::export' );
641
+ }
642
+
643
+ // Import
644
+ if ( current_user_can( 'import' ) ) {
645
+ add_action( 'wp_ajax_ai1wm_import', 'Ai1wm_Import_Controller::import' );
646
+ }
647
+
648
+ // Both
649
+ if ( current_user_can( 'export' ) || current_user_can( 'import' ) ) {
650
+ add_action( 'wp_ajax_ai1wm_backups', 'Ai1wm_Backups_Controller::delete' );
651
+ add_action( 'wp_ajax_ai1wm_feedback', 'Ai1wm_Feedback_Controller::feedback' );
652
+ add_action( 'wp_ajax_ai1wm_report', 'Ai1wm_Report_Controller::report' );
653
+ add_action( 'wp_ajax_ai1wm_resolve', 'Ai1wm_Resolve_Controller::resolve' );
654
+ }
655
+ }
656
  }
lib/controller/class-ai1wm-report-controller.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -25,28 +25,29 @@
25
 
26
  class Ai1wm_Report_Controller {
27
 
28
- public static function report_problem() {
 
29
  // Set E-mail
30
  $email = null;
31
- if ( isset( $_POST['email'] ) ) {
32
- $email = trim( $_POST['email'] );
33
  }
34
 
35
  // Set Message
36
  $message = null;
37
- if ( isset( $_POST['message'] ) ) {
38
- $message = trim( $_POST['message'] );
39
  }
40
 
41
  // Set Terms
42
  $terms = false;
43
- if ( isset( $_POST['terms'] ) ) {
44
- $terms = (bool) $_POST['terms'];
45
  }
46
 
47
  // Send Feedback
48
  $model = new Ai1wm_Report;
49
- $result = $model->report_problem( $email, $message, $terms );
50
  echo json_encode( $result );
51
  exit;
52
  }
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
25
 
26
  class Ai1wm_Report_Controller {
27
 
28
+ public static function report() {
29
+
30
  // Set E-mail
31
  $email = null;
32
+ if ( isset( $_POST['ai1wm-email'] ) ) {
33
+ $email = trim( $_POST['ai1wm-email'] );
34
  }
35
 
36
  // Set Message
37
  $message = null;
38
+ if ( isset( $_POST['ai1wm-message'] ) ) {
39
+ $message = trim( $_POST['ai1wm-message'] );
40
  }
41
 
42
  // Set Terms
43
  $terms = false;
44
+ if ( isset( $_POST['ai1wm-terms'] ) ) {
45
+ $terms = (bool) $_POST['ai1wm-terms'];
46
  }
47
 
48
  // Send Feedback
49
  $model = new Ai1wm_Report;
50
+ $result = $model->add( $email, $message, $terms );
51
  echo json_encode( $result );
52
  exit;
53
  }
lib/controller/class-ai1wm-resolve-controller.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -25,41 +25,38 @@
25
 
26
  class Ai1wm_Resolve_Controller {
27
 
28
- public static function resolve( $args = array() ) {
29
 
30
  // Set error handler
31
- @set_error_handler( 'Ai1wm_Log::error_handler' );
32
 
33
- // Set arguments
34
- if ( empty( $args ) ) {
35
- $args = ai1wm_urldecode( $_REQUEST );
36
  }
37
 
38
  // Set secret key
39
  $secret_key = null;
40
- if ( isset( $args['secret_key'] ) ) {
41
- $secret_key = $args['secret_key'];
42
  }
43
 
44
  // Verify secret key by using the value in the database, not in cache
45
  if ( $secret_key !== get_site_option( AI1WM_SECRET_KEY, false, false ) ) {
46
- Ai1wm_Status::set(
47
- array(
48
- 'type' => 'error',
49
- 'title' => __( "Unable to resolve", AI1WM_PLUGIN_NAME ),
50
- 'message' => __( "Unable to authenticate your request with secret_key = \"{$secret_key}\"", AI1WM_PLUGIN_NAME ),
51
- )
52
  );
53
  exit;
54
  }
55
 
56
  // Set IP address
57
- if ( isset( $args['url_ip'] ) && ( $ip = $args['url_ip' ] ) ) {
58
  update_site_option( AI1WM_URL_IP, $ip );
59
  }
60
 
61
  // Set transport layer
62
- if ( isset( $args['url_transport'] ) && ( $transport = $args['url_transport'] ) ) {
63
  if ( $transport === 'curl' ) {
64
  update_site_option( AI1WM_URL_TRANSPORT, array( 'curl', 'ai1wm' ) );
65
  } else {
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
25
 
26
  class Ai1wm_Resolve_Controller {
27
 
28
+ public static function resolve( $params = array() ) {
29
 
30
  // Set error handler
31
+ @set_error_handler( 'Ai1wm_Handler::error' );
32
 
33
+ // Set params
34
+ if ( empty( $params ) ) {
35
+ $params = ai1wm_urldecode( $_REQUEST );
36
  }
37
 
38
  // Set secret key
39
  $secret_key = null;
40
+ if ( isset( $params['secret_key'] ) ) {
41
+ $secret_key = $params['secret_key'];
42
  }
43
 
44
  // Verify secret key by using the value in the database, not in cache
45
  if ( $secret_key !== get_site_option( AI1WM_SECRET_KEY, false, false ) ) {
46
+ Ai1wm_Status::error(
47
+ __( "Unable to authenticate your request with secret_key = \"{$secret_key}\"", AI1WM_PLUGIN_NAME ),
48
+ __( "Unable to resolve", AI1WM_PLUGIN_NAME )
 
 
 
49
  );
50
  exit;
51
  }
52
 
53
  // Set IP address
54
+ if ( isset( $params['url_ip'] ) && ( $ip = $params['url_ip' ] ) ) {
55
  update_site_option( AI1WM_URL_IP, $ip );
56
  }
57
 
58
  // Set transport layer
59
+ if ( isset( $params['url_transport'] ) && ( $transport = $params['url_transport'] ) ) {
60
  if ( $transport === 'curl' ) {
61
  update_site_option( AI1WM_URL_TRANSPORT, array( 'curl', 'ai1wm' ) );
62
  } else {
lib/controller/class-ai1wm-updater-controller.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
lib/{controller/class-ai1wm-message-controller.php → exception/class-ai1wm-archive-exception.php} RENAMED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -23,21 +23,4 @@
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
 
26
- class Ai1wm_Message_Controller {
27
-
28
- public static function close_message() {
29
- $errors = array();
30
-
31
- // Set Key
32
- $key = null;
33
- if ( isset( $_POST['key'] ) ) {
34
- $key = trim( $_POST['key'] );
35
- }
36
-
37
- // Close message
38
- $model = new Ai1wm_Message;
39
- $result = $model->close_message( $key );
40
- echo json_encode( $result );
41
- exit;
42
- }
43
- }
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
 
26
+ class Ai1wm_Archive_Exception extends Exception {}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib/exception/class-ai1wm-backups-exception.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ *
18
+ * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
19
+ * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
20
+ * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
21
+ * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
22
+ * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
+ * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
+ */
25
+
26
+ class Ai1wm_Backups_Exception extends Exception {}
lib/exception/class-ai1wm-export-exception.php CHANGED
@@ -1,7 +1,6 @@
1
  <?php
2
-
3
  /**
4
- * Copyright (C) 2014 ServMask Inc.
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License as published by
@@ -23,6 +22,5 @@
23
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
24
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
25
  */
26
- class Ai1wm_Export_Exception extends Exception {
27
 
28
- }
1
  <?php
 
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
22
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
 
25
 
26
+ class Ai1wm_Export_Exception extends Exception {}
lib/exception/class-ai1wm-http-exception.php CHANGED
@@ -1,7 +1,6 @@
1
  <?php
2
-
3
  /**
4
- * Copyright (C) 2014 ServMask Inc.
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License as published by
@@ -23,6 +22,5 @@
23
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
24
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
25
  */
26
- class Ai1wm_Http_Exception extends Exception {
27
 
28
- }
1
  <?php
 
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
22
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
 
25
 
26
+ class Ai1wm_Http_Exception extends Exception {}
lib/exception/class-ai1wm-import-exception.php CHANGED
@@ -1,7 +1,6 @@
1
  <?php
2
-
3
  /**
4
- * Copyright (C) 2014 ServMask Inc.
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License as published by
@@ -23,58 +22,5 @@
23
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
24
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
25
  */
26
- class Ai1wm_Import_Exception extends Exception {
27
-
28
- /**
29
- * Exception title
30
- * @type string
31
- */
32
- protected $title;
33
-
34
- /**
35
- * Extend constructor to accept message and title
36
- *
37
- * We want to be able to set the title of our modal and default Exception class
38
- * doesn't have at title property so we have to extend the constructor to accept one
39
- *
40
- * @param string $message Exception message
41
- * @param string $title Exception title
42
- */
43
- public function __construct( $message = '', $title = '' ) {
44
- // initialize our parent
45
- parent::__construct( $message );
46
-
47
- $this->title = $title;
48
- }
49
-
50
- /**
51
- * Get exception title
52
- *
53
- * We check if the title is set and return it if it is,
54
- * if title is not set (empty string), we return a default string
55
- * Site could not be imported, which should be a catch all phrase
56
- *
57
- * @return string
58
- */
59
- public function get_title() {
60
- if ( empty( $this->title ) ) {
61
- // no title is set, return default title
62
- return __( 'Site could not be imported', AI1WM_PLUGIN_NAME );
63
- } else {
64
- return $this->title;
65
- }
66
- }
67
 
68
- /**
69
- * Get exception message
70
- *
71
- * We are creating our own WordPress code-style compatible function to
72
- * return the value of getMessage method of our parent, Exception, class.
73
- * This is only necessary so that we have a common way to name our methods
74
- *
75
- * @return string
76
- */
77
- public function get_message() {
78
- return $this->getMessage();
79
- }
80
- }
1
  <?php
 
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
22
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
 
26
+ class Ai1wm_Import_Exception extends Exception {}
 
 
 
 
 
 
 
 
 
 
 
 
lib/exception/class-ai1wm-not-accessible-exception.php CHANGED
@@ -1,7 +1,6 @@
1
  <?php
2
-
3
  /**
4
- * Copyright (C) 2014 ServMask Inc.
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License as published by
@@ -23,6 +22,5 @@
23
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
24
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
25
  */
26
- class Ai1wm_Not_Accesible_Exception extends Exception {
27
 
28
- }
1
  <?php
 
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
22
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
 
25
 
26
+ class Ai1wm_Not_Accesible_Exception extends Exception {}
lib/exception/class-ai1wm-not-found-exception.php CHANGED
@@ -1,7 +1,6 @@
1
  <?php
2
-
3
  /**
4
- * Copyright (C) 2014 ServMask Inc.
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License as published by
@@ -23,5 +22,5 @@
23
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
24
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
25
  */
26
- class Ai1wm_Not_Found_Exception extends Exception {
27
- }
1
  <?php
 
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
22
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
+
26
+ class Ai1wm_Not_Found_Exception extends Exception {}
lib/exception/class-ai1wm-not-readable-exception.php CHANGED
@@ -1,7 +1,6 @@
1
  <?php
2
-
3
  /**
4
- * Copyright (C) 2014 ServMask Inc.
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License as published by
@@ -23,6 +22,5 @@
23
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
24
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
25
  */
26
- class Ai1wm_Not_Readable_Exception extends Exception {
27
 
28
- }
1
  <?php
 
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
22
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
 
25
 
26
+ class Ai1wm_Not_Readable_Exception extends Exception {}
lib/exception/class-ai1wm-not-writable-exception.php CHANGED
@@ -1,7 +1,6 @@
1
  <?php
2
-
3
  /**
4
- * Copyright (C) 2014 ServMask Inc.
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License as published by
@@ -23,6 +22,5 @@
23
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
24
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
25
  */
26
- class Ai1wm_Not_Writable_Exception extends Exception {
27
 
28
- }
1
  <?php
 
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
22
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
 
25
 
26
+ class Ai1wm_Not_Writable_Exception extends Exception {}
lib/exception/class-ai1wm-storage-exception.php CHANGED
@@ -1,7 +1,6 @@
1
  <?php
2
-
3
  /**
4
- * Copyright (C) 2014 ServMask Inc.
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License as published by
@@ -23,6 +22,5 @@
23
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
24
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
25
  */
26
- class Ai1wm_Storage_Exception extends Exception {
27
 
28
- }
1
  <?php
 
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
22
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
 
25
 
26
+ class Ai1wm_Storage_Exception extends Exception {}
lib/model/{class-ai1wm-backup.php → class-ai1wm-backups.php} RENAMED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -23,7 +23,7 @@
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
 
26
- class Ai1wm_Backup {
27
 
28
  /**
29
  * Get all backup files
@@ -61,9 +61,9 @@ class Ai1wm_Backup {
61
  */
62
  public function delete_file( $file ) {
63
  if ( empty( $file ) ) {
64
- throw new Ai1wm_Backup_Exception( __( 'File name is not specified.', AI1WM_PLUGIN_NAME ) );
65
  } else if ( ! unlink( AI1WM_BACKUPS_PATH . DIRECTORY_SEPARATOR . $file ) ) {
66
- throw new Ai1wm_Backup_Exception(
67
  sprintf(
68
  __( 'Unable to delete <strong>"%s"</strong> file.', AI1WM_PLUGIN_NAME ),
69
  AI1WM_BACKUPS_PATH . DIRECTORY_SEPARATOR . $file
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
 
26
+ class Ai1wm_Backups {
27
 
28
  /**
29
  * Get all backup files
61
  */
62
  public function delete_file( $file ) {
63
  if ( empty( $file ) ) {
64
+ throw new Ai1wm_Backups_Exception( __( 'File name is not specified.', AI1WM_PLUGIN_NAME ) );
65
  } else if ( ! unlink( AI1WM_BACKUPS_PATH . DIRECTORY_SEPARATOR . $file ) ) {
66
+ throw new Ai1wm_Backups_Exception(
67
  sprintf(
68
  __( 'Unable to delete <strong>"%s"</strong> file.', AI1WM_PLUGIN_NAME ),
69
  AI1WM_BACKUPS_PATH . DIRECTORY_SEPARATOR . $file
lib/model/class-ai1wm-config.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ *
18
+ * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
19
+ * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
20
+ * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
21
+ * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
22
+ * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
+ * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
+ */
25
+
26
+ class Ai1wm_Config {}
lib/model/{service/class-ai1wm-service-interface.php → class-ai1wm-deprecated.php} RENAMED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -23,9 +23,6 @@
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
 
26
- interface Ai1wm_Service_Interface {
27
 
28
- public function import();
29
-
30
- public function export();
31
- }
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
 
26
+ class Ai1wm_Export_Abstract {}
27
 
28
+ class Ai1wm_Import_Abstract {}
 
 
 
lib/model/class-ai1wm-export-abstract.php DELETED
@@ -1,507 +0,0 @@
1
- <?php
2
- /**
3
- * Copyright (C) 2014 ServMask Inc.
4
- *
5
- * This program is free software: you can redistribute it and/or modify
6
- * it under the terms of the GNU General Public License as published by
7
- * the Free Software Foundation, either version 3 of the License, or
8
- * (at your option) any later version.
9
- *
10
- * This program is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- * GNU General Public License for more details.
14
- *
15
- * You should have received a copy of the GNU General Public License
16
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
- *
18
- * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
19
- * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
20
- * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
21
- * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
22
- * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
- * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
- */
25
-
26
- abstract class Ai1wm_Export_Abstract {
27
-
28
- protected $args = array();
29
-
30
- protected $storage = null;
31
-
32
- public function __construct( array $args = array() ) {
33
- $this->args = $args;
34
-
35
- // HTTP resolve
36
- if ( $this->args['method'] === 'start' ) {
37
- Ai1wm_Http::resolve( admin_url( 'admin-ajax.php?action=ai1wm_resolve' ) );
38
- }
39
- }
40
-
41
- /**
42
- * Create empty archive and add package config
43
- *
44
- * @return void
45
- */
46
- public function start() {
47
- // Set default progress
48
- Ai1wm_Status::set( array(
49
- 'type' => 'info',
50
- 'message' => __( 'Creating an empty archive...', AI1WM_PLUGIN_NAME )
51
- ) );
52
-
53
- // Get package file
54
- $service = new Ai1wm_Service_Package( $this->args );
55
- $service->export();
56
-
57
- // Get archive file
58
- $archive = new Ai1wm_Compressor( $this->storage()->archive() );
59
-
60
- // Add package file
61
- $archive->add_file( $this->storage()->package(), AI1WM_PACKAGE_NAME );
62
- $archive->close();
63
-
64
- // Set progress
65
- Ai1wm_Status::set( array(
66
- 'type' => 'info',
67
- 'message' => __( 'Done creating an empty archive.', AI1WM_PLUGIN_NAME )
68
- ) );
69
-
70
- // Redirect
71
- $this->route_to( 'enumerate' );
72
- }
73
-
74
- /**
75
- * Enumerate content files and directories
76
- *
77
- * @return void
78
- */
79
- public function enumerate() {
80
- // Set progress
81
- Ai1wm_Status::set( array(
82
- 'type' => 'info',
83
- 'message' => __( 'Retrieving a list of all WordPress files...', AI1WM_PLUGIN_NAME )
84
- ) );
85
-
86
- // Default filters
87
- $filters = array(
88
- 'index.php',
89
- 'ai1wm-backups',
90
- 'themes' . DIRECTORY_SEPARATOR . 'index.php',
91
- 'plugins' . DIRECTORY_SEPARATOR . 'index.php',
92
- 'uploads' . DIRECTORY_SEPARATOR . 'index.php',
93
- );
94
-
95
- // Exclude media
96
- if ( $this->should_exclude_media() ) {
97
- $filters = array_merge( $filters, array( 'uploads' ) );
98
- }
99
-
100
- // Exclude themes
101
- if ( $this->should_exclude_themes() ) {
102
- $filters = array_merge( $filters, array( 'themes' ) );
103
- }
104
-
105
- // Exclude plugins
106
- if ( $this->should_exclude_plugins() ) {
107
- $filters = array_merge( $filters, array( 'plugins', 'mu-plugins' ) );
108
- } else {
109
- $filters = array_merge( $filters, array(
110
- 'plugins' . DIRECTORY_SEPARATOR . AI1WM_PLUGIN_BASEDIR,
111
- 'plugins' . DIRECTORY_SEPARATOR . AI1WMDE_PLUGIN_BASEDIR,
112
- 'plugins' . DIRECTORY_SEPARATOR . AI1WMGE_PLUGIN_BASEDIR,
113
- 'plugins' . DIRECTORY_SEPARATOR . AI1WMSE_PLUGIN_BASEDIR,
114
- 'plugins' . DIRECTORY_SEPARATOR . AI1WMME_PLUGIN_BASEDIR,
115
- 'plugins' . DIRECTORY_SEPARATOR . AI1WMUE_PLUGIN_BASEDIR,
116
- 'plugins' . DIRECTORY_SEPARATOR . AI1WMFE_PLUGIN_BASEDIR,
117
- 'plugins' . DIRECTORY_SEPARATOR . AI1WMLE_PLUGIN_BASEDIR,
118
- 'plugins' . DIRECTORY_SEPARATOR . AI1WMOE_PLUGIN_BASEDIR,
119
- ) );
120
- }
121
-
122
- // Create map file
123
- $filemap = fopen( $this->storage()->filemap(), 'a+' );
124
-
125
- // Total files
126
- $total = 0;
127
-
128
- // Iterate over WP_CONTENT_DIR directory
129
- $iterator = new RecursiveIteratorIterator(
130
- new Ai1wm_Recursive_Exclude_Filter(
131
- new Ai1wm_Recursive_Directory_Iterator(
132
- WP_CONTENT_DIR
133
- ),
134
- apply_filters( 'ai1wm_exclude_content_from_export', $filters )
135
- ),
136
- RecursiveIteratorIterator::SELF_FIRST
137
- );
138
-
139
- foreach ( $iterator as $item ) {
140
- if ( $item->isFile() ) {
141
- // Write path line
142
- if ( fwrite( $filemap, $iterator->getSubPathName() . PHP_EOL ) ) {
143
- $total++;
144
- }
145
- }
146
- }
147
-
148
- // Close handler
149
- fclose( $filemap );
150
-
151
- // Set total files
152
- $this->args['total'] = $total;
153
-
154
- // Set progress
155
- Ai1wm_Status::set( array(
156
- 'type' => 'info',
157
- 'message' => __( 'Done retrieving a list of all WordPress files.', AI1WM_PLUGIN_NAME )
158
- ) );
159
-
160
- // Redirect
161
- $this->route_to( 'content' );
162
- }
163
-
164
- /**
165
- * Add content files and directories
166
- *
167
- * @return void
168
- */
169
- public function content() {
170
- // Set content offset
171
- if ( isset( $this->args['content_offset'] ) ) {
172
- $content_offset = $this->args['content_offset'];
173
- } else {
174
- $content_offset = 0;
175
- }
176
-
177
- // Set filemap offset
178
- if ( isset( $this->args['filemap_offset'] ) ) {
179
- $filemap_offset = $this->args['filemap_offset'];
180
- } else {
181
- $filemap_offset = 0;
182
- }
183
-
184
- // Set total files
185
- if ( isset( $this->args['total'] ) ) {
186
- $total = $this->args['total'];
187
- } else {
188
- $total = 1;
189
- }
190
-
191
- // Set processed files
192
- if ( isset( $this->args['processed'] ) ) {
193
- $processed = $this->args['processed'];
194
- } else {
195
- $processed = 0;
196
- }
197
-
198
- // What percent of files have we processed?
199
- $progress = (int) ( ( $processed / $total ) * 100 );
200
-
201
- // Set progress
202
- if ( empty( $content_offset ) ) {
203
- Ai1wm_Status::set( array(
204
- 'type' => 'info',
205
- 'message' => sprintf( __( 'Archiving %d files...<br />%.2f%% complete', AI1WM_PLUGIN_NAME ), $total, $progress )
206
- ) );
207
- }
208
-
209
- // Get map file
210
- $filemap = fopen( $this->storage()->filemap(), 'r' );
211
-
212
- // Start time
213
- $start = microtime( true );
214
-
215
- // Flag to hold if all files have been processed
216
- $completed = true;
217
-
218
- // Set file map pointer at the current index
219
- if ( fseek( $filemap, $filemap_offset ) !== -1 ) {
220
-
221
- // Get archive
222
- $archive = new Ai1wm_Compressor( $this->storage()->archive() );
223
-
224
- while ( $path = trim( fgets( $filemap ) ) ) {
225
- try {
226
-
227
- // Set absolute path
228
- $abs_path = WP_CONTENT_DIR . DIRECTORY_SEPARATOR . $path;
229
-
230
- // Add file to archive
231
- if ( ( $content_offset = $archive->add_file( $abs_path, $path, $content_offset, 3 ) ) ) {
232
-
233
- // Set progress
234
- if ( ( $sub_progress = ( $content_offset / $archive->get_current_filesize() ) ) < 1 ) {
235
- $progress += $sub_progress;
236
- }
237
-
238
- // Set progress
239
- Ai1wm_Status::set( array(
240
- 'type' => 'info',
241
- 'message' => sprintf( __( 'Archiving %d files...<br />%.2f%% complete', AI1WM_PLUGIN_NAME ), $total, $progress )
242
- ) );
243
-
244
- // Set content offset
245
- $this->args['content_offset'] = $content_offset;
246
-
247
- // Set filemap offset
248
- $this->args['filemap_offset'] = $filemap_offset;
249
-
250
- // Close the filemap file
251
- fclose( $filemap );
252
-
253
- // Redirect
254
- return $this->route_to( 'content' );
255
-
256
- }
257
-
258
- // Set content offset
259
- $content_offset = 0;
260
-
261
- // Set filemap offset
262
- $filemap_offset = ftell( $filemap );
263
-
264
- } catch ( Exception $e ) {
265
- // Skip bad file permissions
266
- }
267
-
268
- $processed++;
269
-
270
- // Time elapsed
271
- if ( ( microtime( true ) - $start ) > 3 ) {
272
- // More than 3 seconds have passed, break and do another request
273
- $completed = false;
274
- break;
275
- }
276
- }
277
-
278
- $archive->close();
279
- }
280
-
281
- // Set content offset
282
- $this->args['content_offset'] = $content_offset;
283
-
284
- // Set filemap offset
285
- $this->args['filemap_offset'] = $filemap_offset;
286
-
287
- // Set processed files
288
- $this->args['processed'] = $processed;
289
-
290
- // Close the filemap file
291
- fclose( $filemap );
292
-
293
- // Redirect
294
- if ( $completed ) {
295
- $this->route_to( 'database' );
296
- } else {
297
- $this->route_to( 'content' );
298
- }
299
- }
300
-
301
- /**
302
- * Add database
303
- *
304
- * @return void
305
- */
306
- public function database() {
307
- // Set exclude database
308
- if ( $this->should_exclude_database() ) {
309
- // Disable maintenance mode
310
- Ai1wm_Maintenance::disable();
311
-
312
- // Redirect
313
- return $this->route_to( 'export' );
314
- }
315
-
316
- // Set progress
317
- Ai1wm_Status::set( array(
318
- 'type' => 'info',
319
- 'message' => __( 'Exporting database...', AI1WM_PLUGIN_NAME )
320
- ) );
321
-
322
- // Get databsae file
323
- $service = new Ai1wm_Service_Database( $this->args );
324
- $service->export();
325
-
326
- // Get archive file
327
- $archive = new Ai1wm_Compressor( $this->storage()->archive() );
328
-
329
- // Add database to archive
330
- $archive->add_file( $this->storage()->database(), AI1WM_DATABASE_NAME );
331
- $archive->close();
332
-
333
- // Set progress
334
- Ai1wm_Status::set( array(
335
- 'type' => 'info',
336
- 'message' => __( 'Done exporting database.', AI1WM_PLUGIN_NAME )
337
- ) );
338
-
339
- // Disable maintenance mode
340
- Ai1wm_Maintenance::disable();
341
-
342
- // Redirect
343
- $this->route_to( 'export' );
344
- }
345
-
346
- /**
347
- * Stop export and clean storage
348
- *
349
- * @return void
350
- */
351
- public function stop() {
352
- $this->storage()->clean();
353
- }
354
-
355
- /**
356
- * Clean storage path
357
- *
358
- * @return void
359
- */
360
- public function clean() {
361
- $this->storage()->clean();
362
- }
363
-
364
- /**
365
- * Get export package
366
- *
367
- * @return void
368
- */
369
- abstract public function export();
370
-
371
- /*
372
- * Get storage object
373
- *
374
- * @return Ai1wm_Storage
375
- */
376
- protected function storage() {
377
- if ( $this->storage === null ) {
378
- if ( isset( $this->args['archive'] ) ) {
379
- $this->args['archive'] = basename( $this->args['archive'] );
380
- } else {
381
- $this->args['archive'] = $this->filename();
382
- }
383
-
384
- $this->storage = new Ai1wm_Storage( $this->args );
385
- }
386
-
387
- return $this->storage;
388
- }
389
-
390
- /**
391
- * Get file name
392
- *
393
- * @return string
394
- */
395
- protected function filename() {
396
- $url = parse_url( home_url() );
397
- $name = array();
398
-
399
- // Add domain
400
- if ( isset( $url['host'] ) ) {
401
- $name[] = $url['host'];
402
- }
403
-
404
- // Add path
405
- if ( isset( $url['path'] ) ) {
406
- $name[] = trim( $url['path'], '/' );
407
- }
408
-
409
- // Add year, month and day
410
- $name[] = date( 'Ymd' );
411
-
412
- // Add hours, minutes and seconds
413
- $name[] = date( 'His' );
414
-
415
- // Add unique identifier
416
- $name[] = rand( 100, 999 );
417
-
418
- return sprintf( '%s.wpress', implode( '-', $name ) );
419
- }
420
-
421
- /**
422
- * Get folder name
423
- *
424
- * @return string
425
- */
426
- protected function foldername() {
427
- $url = parse_url( home_url() );
428
- $name = array();
429
-
430
- // Add domain
431
- if ( isset( $url['host'] ) ) {
432
- $name[] = $url['host'];
433
- }
434
-
435
- // Add path
436
- if ( isset( $url['path'] ) ) {
437
- $name[] = trim( $url['path'] , '/' );
438
- }
439
-
440
- return implode( '-', $name );
441
- }
442
-
443
- /**
444
- * Route to method
445
- *
446
- * @param string $method Name of the method
447
- * @return void
448
- */
449
- protected function route_to( $method ) {
450
- // Redirect arguments
451
- $this->args['method'] = $method;
452
- $this->args['secret_key'] = get_site_option( AI1WM_SECRET_KEY, false, false );
453
-
454
- // Check the status of the export, maybe we need to stop it
455
- if ( ! is_file( $this->storage()->archive() ) ) {
456
- exit;
457
- }
458
-
459
- // HTTP request
460
- Ai1wm_Http::get( admin_url( 'admin-ajax.php?action=ai1wm_export' ), $this->args );
461
- }
462
-
463
- /**
464
- * Should exclude database?
465
- *
466
- * @return boolean
467
- */
468
- protected function should_exclude_database() {
469
- return isset( $this->args['options']['no-database'] );
470
- }
471
-
472
- /**
473
- * Should exclude media?
474
- *
475
- * @return boolean
476
- */
477
- protected function should_exclude_media() {
478
- return isset( $this->args['options']['no-media'] );
479
- }
480
-
481
- /**
482
- * Should exclude themes?
483
- *
484
- * @return boolean
485
- */
486
- protected function should_exclude_themes() {
487
- return isset( $this->args['options']['no-themes'] );
488
- }
489
-
490
- /**
491
- * Should exclude plugins?
492
- *
493
- * @return boolean
494
- */
495
- protected function should_exclude_plugins() {
496
- return isset( $this->args['options']['no-plugins'] );
497
- }
498
-
499
- /**
500
- * Should enable maintenance?
501
- *
502
- * @return boolean
503
- */
504
- protected function should_enable_maintenance() {
505
- return isset( $this->args['options']['maintenance-mode'] );
506
- }
507
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib/model/class-ai1wm-feedback.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -35,17 +35,18 @@ class Ai1wm_Feedback {
35
  *
36
  * @return array
37
  */
38
- public function leave_feedback( $type, $email, $message, $terms ) {
39
  $errors = array();
 
40
  // Submit feedback to ServMask
41
  if ( empty( $type ) ) {
42
- $errors[] = 'Feedback type is invalid.';
43
  } else if ( ! filter_var( $email, FILTER_VALIDATE_EMAIL ) ) {
44
- $errors[] = 'Your email is not valid.';
45
  } else if ( empty( $message ) ) {
46
- $errors[] = 'Please enter comments in the text area.';
47
- } else if ( ! $terms ) {
48
- $errors[] = 'Please accept feedback term conditions.';
49
  } else {
50
  $response = wp_remote_post(
51
  AI1WM_FEEDBACK_URL,
@@ -60,8 +61,9 @@ class Ai1wm_Feedback {
60
  ),
61
  )
62
  );
 
63
  if ( is_wp_error( $response ) ) {
64
- $errors[] = 'Something went wrong: ' . $response->get_error_message();
65
  }
66
  }
67
 
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
35
  *
36
  * @return array
37
  */
38
+ public function add( $type, $email, $message, $terms ) {
39
  $errors = array();
40
+
41
  // Submit feedback to ServMask
42
  if ( empty( $type ) ) {
43
+ $errors[] = __( 'Feedback type is invalid.', AI1WM_PLUGIN_NAME );
44
  } else if ( ! filter_var( $email, FILTER_VALIDATE_EMAIL ) ) {
45
+ $errors[] = __( 'Your email is not valid.', AI1WM_PLUGIN_NAME );
46
  } else if ( empty( $message ) ) {
47
+ $errors[] = __( 'Please enter comments in the text area.', AI1WM_PLUGIN_NAME );
48
+ } else if ( empty( $terms ) ) {
49
+ $errors[] = __( 'Please accept feedback term conditions.', AI1WM_PLUGIN_NAME );
50
  } else {
51
  $response = wp_remote_post(
52
  AI1WM_FEEDBACK_URL,
61
  ),
62
  )
63
  );
64
+
65
  if ( is_wp_error( $response ) ) {
66
+ $errors[] = sprintf( __( 'Something went wrong: %s', AI1WM_PLUGIN_NAME ), $response->get_error_message() );
67
  }
68
  }
69
 
lib/model/class-ai1wm-handler.php ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ *
18
+ * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
19
+ * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
20
+ * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
21
+ * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
22
+ * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
+ * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
+ */
25
+
26
+ class Ai1wm_Handler {
27
+
28
+ /**
29
+ * Error handler
30
+ *
31
+ * @param integer $errno Error level
32
+ * @param string $errstr Error message
33
+ * @param string $errfile Error file
34
+ * @param integer $errline Error line
35
+ * @return void
36
+ */
37
+ public static function error( $errno, $errstr, $errfile, $errline ) {
38
+ Ai1wm_Log::error( array(
39
+ 'Number' => $errno,
40
+ 'Message' => $errstr,
41
+ 'File' => $errfile,
42
+ 'Line' => $errline,
43
+ ) );
44
+ }
45
+ }
lib/model/class-ai1wm-http.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -29,6 +29,11 @@ class Ai1wm_Http {
29
 
30
  public static function get( $url, $params = array() ) {
31
 
 
 
 
 
 
32
  // Get IP address
33
  $ip = get_site_option( AI1WM_URL_IP, false, false );
34
 
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
29
 
30
  public static function get( $url, $params = array() ) {
31
 
32
+ // Check the status, maybe we need to stop it
33
+ if ( ! is_file( ai1wm_export_path( $params ) ) && ! is_file( ai1wm_import_path( $params ) ) ) {
34
+ exit;
35
+ }
36
+
37
  // Get IP address
38
  $ip = get_site_option( AI1WM_URL_IP, false, false );
39
 
lib/model/class-ai1wm-import-abstract.php DELETED
@@ -1,437 +0,0 @@
1
- <?php
2
- /**
3
- * Copyright (C) 2014 ServMask Inc.
4
- *
5
- * This program is free software: you can redistribute it and/or modify
6
- * it under the terms of the GNU General Public License as published by
7
- * the Free Software Foundation, either version 3 of the License, or
8
- * (at your option) any later version.
9
- *
10
- * This program is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- * GNU General Public License for more details.
14
- *
15
- * You should have received a copy of the GNU General Public License
16
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
- *
18
- * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
19
- * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
20
- * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
21
- * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
22
- * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
- * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
- */
25
-
26
- abstract class Ai1wm_Import_Abstract {
27
-
28
- protected $args = array();
29
-
30
- protected $storage = null;
31
-
32
- public function __construct( array $args = array() ) {
33
- $this->args = $args;
34
-
35
- // HTTP resolve
36
- if ( $this->args['method'] === 'import' ) {
37
- Ai1wm_Http::resolve( admin_url( 'admin-ajax.php?action=ai1wm_resolve' ) );
38
- }
39
- }
40
-
41
- /**
42
- * Unpack archive
43
- *
44
- * @return void
45
- */
46
- public function start() {
47
- // Set default progress
48
- Ai1wm_Status::set( array(
49
- 'type' => 'info',
50
- 'message' => __( 'Unpacking archive...', AI1WM_PLUGIN_NAME ),
51
- ) );
52
-
53
- // Open the archive file for reading
54
- $archive = new Ai1wm_Extractor( $this->storage()->archive() );
55
-
56
- // Unpack package.json and database.sql files
57
- $archive->extract_by_files_array(
58
- $this->storage()->path(),
59
- array(
60
- AI1WM_PACKAGE_NAME,
61
- AI1WM_DATABASE_NAME,
62
- )
63
- );
64
-
65
- // Close the archive file
66
- $archive->close();
67
-
68
- // Validate the archive file
69
- if ( $this->validate() ) {
70
-
71
- // Parse the package file
72
- $service = new Ai1wm_Service_Package( $this->args );
73
- if ( $service->import() ) {
74
- $this->route_to( 'confirm' );
75
- } else {
76
- throw new Ai1wm_Import_Exception( __( 'Invalid package.json file.', AI1WM_PLUGIN_NAME ) );
77
- }
78
-
79
- } else {
80
- throw new Ai1wm_Import_Exception(
81
- __( 'Invalid archive file. It should contain <strong>package.json</strong> file.', AI1WM_PLUGIN_NAME )
82
- );
83
- }
84
- }
85
-
86
- /**
87
- * Confirm import
88
- *
89
- * @return void
90
- */
91
- public function confirm() {
92
- // Obtain the size of the archive
93
- $size = @filesize( $this->storage()->archive() );
94
-
95
- if ( false === $size ) {
96
- throw new Ai1wm_Not_Accesible_Exception(
97
- sprintf(
98
- __(
99
- 'Unable to get the file size of <strong>"%s"</strong>',
100
- AI1WM_PLUGIN_NAME
101
- ),
102
- $this->storage()->archive()
103
- )
104
- );
105
- }
106
-
107
- $allowed_size = apply_filters( 'ai1wm_max_file_size', AI1WM_MAX_FILE_SIZE );
108
-
109
- // Let's check the size of the file to make sure it is less than the maximum allowed
110
- if ( ( $allowed_size > 0 ) && ( $size > $allowed_size ) ) {
111
- throw new Ai1wm_Import_Exception(
112
- sprintf(
113
- __(
114
- 'The file that you are trying to import is over the maximum upload file size limit of %s.' .
115
- '<br />You can remove this restriction by purchasing our ' .
116
- '<a href="https://servmask.com/products/unlimited-extension" target="_blank">Unlimited Extension</a>.',
117
- AI1WM_PLUGIN_NAME
118
- ),
119
- apply_filters( 'ai1wm_max_file_size', AI1WM_MAX_FILE_SIZE )
120
- )
121
- );
122
- }
123
-
124
- // Set progress
125
- Ai1wm_Status::set(
126
- array(
127
- 'type' => 'confirm',
128
- 'message' => __(
129
- 'The import process will overwrite your database, media, plugins, and themes. ' .
130
- 'Please ensure that you have a backup of your data before proceeding to the next step.',
131
- AI1WM_PLUGIN_NAME
132
- ),
133
- )
134
- );
135
- }
136
-
137
- /**
138
- * Enumerate content files and directories
139
- *
140
- * @return void
141
- */
142
- public function enumerate() {
143
- // Set progress
144
- Ai1wm_Status::set( array(
145
- 'type' => 'info',
146
- 'message' => __( 'Retrieving a list of all WordPress files...', AI1WM_PLUGIN_NAME )
147
- ) );
148
-
149
- // Open the archive file for reading
150
- $archive = new Ai1wm_Extractor( $this->storage()->archive() );
151
-
152
- // Get number of files
153
- $total = $archive->get_number_of_files();
154
-
155
- // Close the archive file
156
- $archive->close();
157
-
158
- // Set total
159
- $this->args['total'] = $total;
160
-
161
- // Set progress
162
- Ai1wm_Status::set( array(
163
- 'type' => 'info',
164
- 'message' => __( 'Done retrieving a list of all WordPress files.', AI1WM_PLUGIN_NAME ),
165
- ) );
166
-
167
- // Redirect
168
- $this->route_to( 'truncate' );
169
- }
170
-
171
- /**
172
- * Truncate content files and directories
173
- *
174
- * @return void
175
- */
176
- public function truncate() {
177
- // Enable maintenance mode
178
- Ai1wm_Maintenance::enable();
179
-
180
- // Redirect
181
- $this->route_to( 'content' );
182
- }
183
-
184
- /**
185
- * Add content files and directories
186
- *
187
- * @return void
188
- */
189
- public function content() {
190
- // Set content offset
191
- if ( isset( $this->args['content_offset'] ) ) {
192
- $content_offset = $this->args['content_offset'];
193
- } else {
194
- $content_offset = 0;
195
- }
196
-
197
- // Set archive offset
198
- if ( isset( $this->args['archive_offset']) ) {
199
- $archive_offset = $this->args['archive_offset'];
200
- } else {
201
- $archive_offset = 0;
202
- }
203
-
204
- // Set total files
205
- if ( isset( $this->args['total'] ) ) {
206
- $total = $this->args['total'];
207
- } else {
208
- $total = 1;
209
- }
210
-
211
- // Set processed files
212
- if ( isset( $this->args['processed'] ) ) {
213
- $processed = $this->args['processed'];
214
- } else {
215
- $processed = 0;
216
- }
217
-
218
- // What percent of files have we processed?
219
- $progress = (int) ( ( $processed / $total ) * 100 );
220
-
221
- // Set progress
222
- if ( empty( $content_offset ) ) {
223
- Ai1wm_Status::set( array(
224
- 'type' => 'info',
225
- 'message' => sprintf( __( 'Restoring %d files...<br />%.2f%% complete', AI1WM_PLUGIN_NAME ), $total, $progress ),
226
- ) );
227
- }
228
-
229
- // Start time
230
- $start = microtime( true );
231
-
232
- // Flag to hold if all files have been processed
233
- $completed = true;
234
-
235
- // Open the archive file for reading
236
- $archive = new Ai1wm_Extractor( $this->storage()->archive() );
237
-
238
- // Set the file pointer to the one that we have saved
239
- $archive->set_file_pointer( null, $archive_offset );
240
-
241
- while ( $archive->has_not_reached_eof() ) {
242
- try {
243
-
244
- // Extract a file from archive to WP_CONTENT_DIR
245
- if ( ( $content_offset = $archive->extract_one_file_to( WP_CONTENT_DIR, array( AI1WM_PACKAGE_NAME, AI1WM_DATABASE_NAME ), $content_offset, 3 ) ) ) {
246
-
247
- // Set progress
248
- if ( ( $sub_progress = ( $content_offset / $archive->get_current_filesize() ) ) < 1 ) {
249
- $progress += $sub_progress;
250
- }
251
-
252
- // Set progress
253
- Ai1wm_Status::set( array(
254
- 'type' => 'info',
255
- 'message' => sprintf( __( 'Restoring %d files...<br />%.2f%% complete', AI1WM_PLUGIN_NAME ), $total, $progress ),
256
- ) );
257
-
258
- // Set content offset
259
- $this->args['content_offset'] = $content_offset;
260
-
261
- // Set archive offset
262
- $this->args['archive_offset'] = $archive_offset;
263
-
264
- // Close the archive file
265
- $archive->close();
266
-
267
- // Redirect
268
- return $this->route_to( 'content' );
269
-
270
- }
271
-
272
- // Set content offset
273
- $content_offset = 0;
274
-
275
- // Set archive offset
276
- $archive_offset = $archive->get_file_pointer();
277
-
278
- } catch ( Exception $e ) {
279
- // Skip bad file permissions
280
- }
281
-
282
- // Increment processed files counter
283
- $processed++;
284
-
285
- // Time elapsed
286
- if ( ( microtime( true ) - $start ) > 3 ) {
287
- // More than 3 seconds have passed, break and do another request
288
- $completed = false;
289
- break;
290
- }
291
- }
292
-
293
- // Set content offset
294
- $this->args['content_offset'] = $content_offset;
295
-
296
- // Set archive offset
297
- $this->args['archive_offset'] = $archive_offset;
298
-
299
- // Set processed files
300
- $this->args['processed'] = $processed;
301
-
302
- // Close the archive file
303
- $archive->close();
304
-
305
- // Redirect
306
- if ( $completed ) {
307
- $this->route_to( 'database' );
308
- } else {
309
- $this->route_to( 'content' );
310
- }
311
- }
312
-
313
- /**
314
- * Add database
315
- *
316
- * @return void
317
- */
318
- public function database() {
319
- // Set exclude database
320
- if ( ! is_file( $this->storage()->database() ) ) {
321
- return $this->route_to( 'finish' );
322
- }
323
-
324
- // Display progress
325
- Ai1wm_Status::set( array(
326
- 'type' => 'info',
327
- 'message' => __( 'Restoring database...', AI1WM_PLUGIN_NAME ),
328
- ) );
329
-
330
- // Get database file
331
- $service = new Ai1wm_Service_Database( $this->args );
332
- $service->import();
333
-
334
- // Redirect
335
- $this->route_to( 'finish' );
336
- }
337
-
338
- /**
339
- * Finish import process
340
- *
341
- * @return void
342
- */
343
- public function finish() {
344
- // Set progress
345
- Ai1wm_Status::set( array(
346
- 'type' => 'finish',
347
- 'title' => __( 'Your data has been imported successfuly!', AI1WM_PLUGIN_NAME ),
348
- 'message' => sprintf(
349
- __(
350
- 'You need to perform two more steps:<br />' .
351
- '<strong>1. You must save your permalinks structure twice. <a class="ai1wm-no-underline" href="%s" target="_blank">Permalinks Settings</a></strong> <small>(opens a new window)</small><br />' .
352
- '<strong>2. <a class="ai1wm-no-underline" href="https://wordpress.org/support/view/plugin-reviews/all-in-one-wp-migration?rate=5#postform" target="_blank">Review the plugin</a>.</strong> <small>(opens a new window)</small>',
353
- AI1WM_PLUGIN_NAME
354
- ),
355
- admin_url( 'options-permalink.php#submit' )
356
- )
357
- ) );
358
-
359
- // Disable maintenance mode
360
- Ai1wm_Maintenance::disable();
361
- }
362
-
363
- /**
364
- * Stop import and clean storage
365
- *
366
- * @return void
367
- */
368
- public function stop() {
369
- $this->storage->clean();
370
- }
371
-
372
- /**
373
- * Clean storage path
374
- *
375
- * @return void
376
- */
377
- public function clean() {
378
- $this->storage()->clean();
379
- }
380
-
381
- /**
382
- * Get import archive
383
- *
384
- * @return void
385
- */
386
- abstract public function import();
387
-
388
- /**
389
- * Validate archive and WP_CONTENT_DIR permissions
390
- *
391
- * @return boolean
392
- */
393
- protected function validate() {
394
- if ( is_file( $this->storage()->package() ) ) {
395
- return true;
396
- }
397
-
398
- return false;
399
- }
400
-
401
- /*
402
- * Get storage object
403
- *
404
- * @return Ai1wm_Storage
405
- */
406
- protected function storage() {
407
- if ( $this->storage === null ) {
408
- if ( isset( $this->args['archive'] ) ) {
409
- $this->args['archive'] = basename( $this->args['archive'] );
410
- }
411
-
412
- $this->storage = new Ai1wm_Storage( $this->args );
413
- }
414
-
415
- return $this->storage;
416
- }
417
-
418
- /**
419
- * Route to method
420
- *
421
- * @param string $method Name of the method
422
- * @return void
423
- */
424
- protected function route_to( $method ) {
425
- // Redirect arguments
426
- $this->args['method'] = $method;
427
- $this->args['secret_key'] = get_site_option( AI1WM_SECRET_KEY, false, false );
428
-
429
- // Check the status of the export, maybe we need to stop it
430
- if ( ! is_file( $this->storage()->archive() ) ) {
431
- exit;
432
- }
433
-
434
- // HTTP request
435
- Ai1wm_Http::get( admin_url( 'admin-ajax.php?action=ai1wm_import' ), $this->args );
436
- }
437
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib/model/class-ai1wm-log.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -25,107 +25,64 @@
25
 
26
  class Ai1wm_Log {
27
 
28
- /**
29
- * Write log message of INFO type
30
- *
31
- * @param string $message Log message
32
- * @return void
33
- */
34
- public static function info( $message ) {
35
- self::write( $message, 'INFO' );
36
- }
37
 
38
- /**
39
- * Write log message of INFO type
40
- *
41
- * @param string $message Log message
42
- * @return void
43
- */
44
- public static function error( $message ) {
45
- self::write( $message, 'ERROR' );
46
- }
47
 
48
- /**
49
- * Write log message with the specified type
50
- *
51
- * @param string $message Log message
52
- * @param string $type Log type
53
- * @return void
54
- */
55
- public static function write( $message, $type = 'INFO' ) {
56
- // Set date to UTC
57
- @date_default_timezone_set( 'UTC' );
58
 
59
- // Build message array
60
- $_message = array();
61
 
62
- // Append the date
63
- $_message[] = '[' . date( 'M d Y H:i:s' ) . ']';
 
 
 
 
 
 
64
 
65
- // Append the type
66
- $_message[] = $type;
67
 
68
- // Append the message
69
- $_message[] = $message;
70
 
71
- // Append new line
72
- $_message[] = PHP_EOL;
73
 
74
- // Convert message to string
75
- $_message = implode( ' ', $_message );
76
 
77
- // Append the message to our error.log and close the file handle
78
- // only if we can get a handle
79
- if ( $handle = @fopen( AI1WM_LOG_FILE, 'a' ) ) {
80
- @fwrite( $handle, $_message );
81
- @fclose( $handle );
 
82
  }
83
  }
84
 
85
- /**
86
- * Error handler
87
- *
88
- * @param int $errno Error level
89
- * @param string $errstr Error message
90
- * @param string $errfile Error file
91
- * @param int $errline Error line
92
- * @return void
93
- */
94
- public static function error_handler( $errno, $errstr, $errfile, $errline ) {
95
- $message = array();
96
-
97
- // Add an empty line
98
- $message[] = '';
99
- $message[] = 'Number: ' . $errno;
100
- $message[] = 'Message: ' . $errstr;
101
- $message[] = 'File: ' . $errfile;
102
- $message[] = 'Line: ' . $errline;
103
- $message[] = '--------------------------------------------';
104
-
105
- $message = implode( PHP_EOL, $message );
106
-
107
- self::write( $message, 'ERROR_HANDLER' );
108
- }
109
 
110
- /**
111
- * Exception handler
112
- *
113
- * @param Exception $exception Exception object
114
- * @return void
115
- */
116
- public static function exception_handler( $exception ) {
117
- $message = array();
118
-
119
- // Add an empty line
120
- $message[] = '';
121
- $message[] = 'Number: ' . $exception->getCode();
122
- $message[] = 'Message: ' . $exception->getMessage();
123
- $message[] = 'File: ' . $exception->getFile();
124
- $message[] = 'Line: ' . $exception->getLine();
125
- $message[] = '--------------------------------------------';
126
-
127
- $message = implode( PHP_EOL, $message );
128
-
129
- self::write( $message, 'EXCEPTION_HANDLER' );
130
  }
131
- }
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
25
 
26
  class Ai1wm_Log {
27
 
28
+ public static function export( $params ) {
29
+ $data = array();
 
 
 
 
 
 
 
30
 
31
+ // Add date
32
+ $data[] = date( 'M d Y H:i:s' );
 
 
 
 
 
 
 
33
 
34
+ // Add params
35
+ $data[] = print_r( $params, true );
 
 
 
 
 
 
 
 
36
 
37
+ // Add empty line
38
+ $data[] = PHP_EOL;
39
 
40
+ // Write log data
41
+ if ( empty( $params['priority'] ) || is_file( ai1wm_export_path( $params ) ) ) {
42
+ if ( $handle = fopen( ai1wm_export_path( $params ), 'a' ) ) {
43
+ fwrite( $handle, implode( $data, PHP_EOL ) );
44
+ fclose( $handle );
45
+ }
46
+ }
47
+ }
48
 
49
+ public static function import( $params ) {
50
+ $data = array();
51
 
52
+ // Add date
53
+ $data[] = date( 'M d Y H:i:s' );
54
 
55
+ // Add params
56
+ $data[] = print_r( $params, true );
57
 
58
+ // Add empty line
59
+ $data[] = PHP_EOL;
60
 
61
+ // Write log data
62
+ if ( empty( $params['priority'] ) || is_file( ai1wm_import_path( $params ) ) ) {
63
+ if ( $handle = fopen( ai1wm_import_path( $params ), 'a' ) ) {
64
+ fwrite( $handle, implode( $data, PHP_EOL ) );
65
+ fclose( $handle );
66
+ }
67
  }
68
  }
69
 
70
+ public static function error( $params ) {
71
+ $data = array();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72
 
73
+ // Add date
74
+ $data[] = date( 'M d Y H:i:s' );
75
+
76
+ // Add params
77
+ $data[] = print_r( $params, true );
78
+
79
+ // Add empty line
80
+ $data[] = PHP_EOL;
81
+
82
+ // Write log data
83
+ if ( $handle = fopen( ai1wm_error_path(), 'a' ) ) {
84
+ fwrite( $handle, implode( $data, PHP_EOL ) );
85
+ fclose( $handle );
86
+ }
 
 
 
 
 
 
87
  }
88
+ }
lib/model/class-ai1wm-report.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -34,15 +34,16 @@ class Ai1wm_Report {
34
  *
35
  * @return array
36
  */
37
- public function report_problem( $email, $message, $terms ) {
38
  $errors = array();
 
39
  // Submit report to ServMask
40
  if ( ! filter_var( $email, FILTER_VALIDATE_EMAIL ) ) {
41
- $errors[] = 'Your email is not valid.';
42
  } else if ( empty( $message ) ) {
43
- $errors[] = 'Please enter comments in the text area.';
44
- } else if ( ! $terms ) {
45
- $errors[] = 'Please accept report term conditions.';
46
  } else {
47
  $response = wp_remote_post(
48
  AI1WM_REPORT_URL,
@@ -57,7 +58,7 @@ class Ai1wm_Report {
57
  )
58
  );
59
  if ( is_wp_error( $response ) ) {
60
- $errors[] = 'Something went wrong: ' . $response->get_error_message();
61
  }
62
  }
63
 
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
34
  *
35
  * @return array
36
  */
37
+ public function add( $email, $message, $terms ) {
38
  $errors = array();
39
+
40
  // Submit report to ServMask
41
  if ( ! filter_var( $email, FILTER_VALIDATE_EMAIL ) ) {
42
+ $errors[] = __( 'Your email is not valid.', AI1WM_PLUGIN_NAME );
43
  } else if ( empty( $message ) ) {
44
+ $errors[] = __( 'Please enter comments in the text area.', AI1WM_PLUGIN_NAME );
45
+ } else if ( empty( $terms ) ) {
46
+ $errors[] = __( 'Please accept report term conditions.', AI1WM_PLUGIN_NAME );
47
  } else {
48
  $response = wp_remote_post(
49
  AI1WM_REPORT_URL,
58
  )
59
  );
60
  if ( is_wp_error( $response ) ) {
61
+ $errors[] = sprintf( __( 'Something went wrong: %s', AI1WM_PLUGIN_NAME ), $response->get_error_message() );
62
  }
63
  }
64
 
lib/model/class-ai1wm-status.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -25,120 +25,34 @@
25
 
26
  class Ai1wm_Status {
27
 
28
- public static function get( $key = null ) {
29
- // have we got a status file yet?
30
- if ( is_file( AI1WM_STATUS_FILE ) ) {
31
- // open status file for reading
32
- $handle = @fopen( AI1WM_STATUS_FILE, 'r' );
33
- if ( false === $handle ) {
34
- throw new Ai1wm_Not_Accesible_Exception(
35
- sprintf(
36
- __( 'Unable to open <strong>"%s"</strong> for reading.', AI1WM_PLUGIN_NAME ),
37
- AI1WM_STATUS_FILE
38
- )
39
- );
40
- }
41
-
42
- // holds the content of the file
43
- $content = '';
44
- while ( false === feof( $handle ) ) {
45
- $chunk = @fread( $handle, 512 );
46
- if ( false === $chunk ) {
47
- throw new Ai1wm_Not_Readable_Exception(
48
- sprintf(
49
- __( 'Unable to read from <strong>"%s"</strong>', AI1WM_PLUGIN_NAME ),
50
- AI1WM_STATUS_FILE
51
- )
52
- );
53
- }
54
-
55
- // append the chunk we read from the file to our content
56
- $content .= $chunk;
57
- }
58
-
59
- // do we have something to parse?
60
- if ( empty( $content ) ) {
61
- // file is empty, return empty array
62
- return array();
63
- }
64
-
65
- // close status file handle
66
- fclose( $handle );
67
-
68
- // decode status
69
- $data = @json_decode( $content, true );
70
-
71
- if ( is_null( $data ) ) {
72
- throw new Exception(
73
- sprintf(
74
- __( 'Unable to decode <strong>"%s"</strong> with json_decode', AI1WM_PLUGIN_NAME ),
75
- $content
76
- )
77
- );
78
- }
79
-
80
- // are we asking for particular key?
81
- if ( false === is_null( $key ) ) {
82
- // is the key available in the data array?
83
- if ( false === isset( $data[$key] ) ) {
84
- // key is not available :/
85
- return false;
86
- }
87
-
88
- // give the user the value they asked for
89
- return $data[$key];
90
- }
91
-
92
- // return the full status array
93
- return $data;
94
- }
95
-
96
- // no status file yet, return empty array
97
- return array();
98
  }
99
 
100
- public static function set( $status ) {
101
- // get old status before truncating file
102
- $status_old = self::get();
103
 
104
- // open status file for writing, truncate its content
105
- $handle = @fopen( AI1WM_STATUS_FILE, 'w' );
106
- if ( false === $handle ) {
107
- throw new Ai1wm_Not_Accesible_Exception(
108
- sprintf(
109
- __( 'Unable to open <strong>"%s"</strong> for writing.', AI1WM_PLUGIN_NAME ),
110
- AI1WM_STATUS_FILE
111
- )
112
- );
113
- }
114
 
115
- // create the status that we want to write to the status file
116
- $content = json_encode( $status + $status_old ); // union the statuses
 
117
 
118
- if ( false === $content ) {
119
- throw new Exception(
120
- sprintf(
121
- __( 'Unable to encode <strong>"%s"</strong> with json_encode', AI1WM_PLUGIN_NAME ),
122
- print_r( $status + $status_old, true )
123
- )
124
- );
125
- }
126
 
127
- // write the new status in status file
128
- $result = @fwrite( $handle, $content );
 
129
 
130
- // check if we were able to write to the file
131
- if ( false === $result ) {
132
- throw new Ai1wm_Not_Writable_Exception(
133
- sprintf(
134
- __( 'Unable to write <strong>"%s"</strong> in <strong>"%s"</strong>.', AI1WM_PLUGIN_NAME ),
135
- $content,
136
- AI1WM_STATUS_FILE
137
- )
138
- );
139
  }
140
-
141
- // close status file handle
142
- fclose( $handle );
143
  }
144
  }
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
25
 
26
  class Ai1wm_Status {
27
 
28
+ public static function error( $message, $title = null ) {
29
+ self::log( array( 'type' => 'error', 'message' => $message, 'title' => $title ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  }
31
 
32
+ public static function info( $message, $title = null ) {
33
+ self::log( array( 'type' => 'info', 'message' => $message, 'title' => $title ) );
34
+ }
35
 
36
+ public static function download( $message, $title = null ) {
37
+ self::log( array( 'type' => 'download', 'message' => $message, 'title' => $title ) );
38
+ }
 
 
 
 
 
 
 
39
 
40
+ public static function confirm( $message, $title = null ) {
41
+ self::log( array( 'type' => 'confirm', 'message' => $message, 'title' => $title ) );
42
+ }
43
 
44
+ public static function done( $message, $title = null ) {
45
+ self::log( array( 'type' => 'done', 'message' => $message, 'title' => $title ) );
46
+ }
 
 
 
 
 
47
 
48
+ public static function progress( $percent, $title = null ) {
49
+ self::log( array( 'type' => 'progress', 'percent' => $percent, 'title' => $title ) );
50
+ }
51
 
52
+ public static function log( $data = array() ) {
53
+ if ( $handle = fopen( ai1wm_status_path(), 'w' ) ) {
54
+ fwrite( $handle, json_encode( $data ) );
55
+ fclose( $handle );
 
 
 
 
 
56
  }
 
 
 
57
  }
58
  }
lib/model/class-ai1wm-storage.php DELETED
@@ -1,157 +0,0 @@
1
- <?php
2
- /**
3
- * Copyright (C) 2014 ServMask Inc.
4
- *
5
- * This program is free software: you can redistribute it and/or modify
6
- * it under the terms of the GNU General Public License as published by
7
- * the Free Software Foundation, either version 3 of the License, or
8
- * (at your option) any later version.
9
- *
10
- * This program is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- * GNU General Public License for more details.
14
- *
15
- * You should have received a copy of the GNU General Public License
16
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
- *
18
- * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
19
- * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
20
- * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
21
- * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
22
- * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
- * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
- */
25
-
26
- class Ai1wm_Storage {
27
-
28
- protected $storage = null;
29
-
30
- protected $archive = null;
31
-
32
- public function __construct( array $args = array() ) {
33
- // Set storage
34
- if ( isset( $args['storage'] ) ) {
35
- $this->storage = basename( $args['storage'] );
36
- }
37
-
38
- // Set archive
39
- if ( isset( $args['archive'] ) ) {
40
- $this->archive = basename( $args['archive'] );
41
- }
42
- }
43
-
44
- /**
45
- * Get storage path
46
- *
47
- * @return string
48
- */
49
- public function path() {
50
- if ( ! isset( $this->storage ) ) {
51
- throw new Ai1wm_Storage_Exception( 'Storage name is not configured.' );
52
- }
53
-
54
- // Make storage directory
55
- $path = AI1WM_STORAGE_PATH . DIRECTORY_SEPARATOR . $this->storage;
56
- if ( ! is_dir( $path ) ) {
57
- mkdir( $path );
58
- }
59
-
60
- return $path;
61
- }
62
-
63
- /**
64
- * Get archive path
65
- *
66
- * @return string
67
- */
68
- public function archive() {
69
- if ( ! isset( $this->archive ) ) {
70
- throw new Ai1wm_Storage_Exception( 'Archive name is not configured.' );
71
- }
72
-
73
- // Use backup if needed for restore purposes
74
- if ( file_exists( $this->backup() ) ) {
75
- return $this->backup();
76
- }
77
-
78
- return $this->path() . DIRECTORY_SEPARATOR . $this->archive;
79
- }
80
-
81
- /**
82
- * Get backup path
83
- *
84
- * @return string
85
- */
86
- public function backup() {
87
- if ( ! isset( $this->archive ) ) {
88
- throw new Ai1wm_Storage_Exception( 'Archive name is not configured.' );
89
- }
90
-
91
- return AI1WM_BACKUPS_PATH . DIRECTORY_SEPARATOR . $this->archive;
92
- }
93
-
94
- /**
95
- * Get package file path
96
- *
97
- * @return string
98
- */
99
- public function package() {
100
- return $this->path() . DIRECTORY_SEPARATOR . AI1WM_PACKAGE_NAME;
101
- }
102
-
103
- /**
104
- * Get file map path
105
- *
106
- * @return string
107
- */
108
- public function filemap() {
109
- return $this->path() . DIRECTORY_SEPARATOR . AI1WM_FILEMAP_NAME;
110
- }
111
-
112
- /**
113
- * Get database file path
114
- *
115
- * @return string
116
- */
117
- public function database() {
118
- return $this->path() . DIRECTORY_SEPARATOR . AI1WM_DATABASE_NAME;
119
- }
120
-
121
- /**
122
- * Get status file path
123
- *
124
- * @return string
125
- */
126
- public function status() {
127
- return $this->path() . DIRECTORY_SEPARATOR . AI1WM_STATUS_NAME;
128
- }
129
-
130
- /**
131
- * Clean storage path
132
- *
133
- * @return void
134
- */
135
- public function clean() {
136
- $iterator = new RecursiveIteratorIterator(
137
- new RecursiveDirectoryIterator($this->path()),
138
- RecursiveIteratorIterator::CHILD_FIRST
139
- );
140
-
141
- foreach ($iterator as $item) {
142
- // Skip dots
143
- if ($iterator->isDot()) {
144
- continue;
145
- }
146
-
147
- if ($item->isFile()) {
148
- unlink($item->getPathname());
149
- } else {
150
- rmdir($item->getPathname());
151
- }
152
- }
153
-
154
- // Remove storage path
155
- rmdir($this->path());
156
- }
157
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib/model/class-ai1wm-template.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
lib/model/class-ai1wm-updater.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
lib/model/export/class-ai1wm-export-archive.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ *
18
+ * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
19
+ * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
20
+ * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
21
+ * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
22
+ * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
+ * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
+ */
25
+
26
+ class Ai1wm_Export_Archive {
27
+
28
+ public static function execute( $params ) {
29
+
30
+ // Set progress
31
+ Ai1wm_Status::info( __( 'Creating an empty archive...', AI1WM_PLUGIN_NAME ) );
32
+
33
+ // Create empty archive file
34
+ $archive = new Ai1wm_Compressor( ai1wm_archive_path( $params ) );
35
+ $archive->close();
36
+
37
+ // Set progress
38
+ Ai1wm_Status::info( __( 'Done creating an empty archive.', AI1WM_PLUGIN_NAME ) );
39
+
40
+ return $params;
41
+ }
42
+ }
lib/{vendor/mysqldump-factory/mysqldump-factory/lib/MysqlDumpFactory.php → model/export/class-ai1wm-export-clean.php} RENAMED
@@ -1,7 +1,6 @@
1
  <?php
2
-
3
  /**
4
- * Copyright (C) 2014 ServMask Inc.
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License as published by
@@ -24,27 +23,36 @@
24
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
25
  */
26
 
27
- require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'MysqlDumpPDO.php';
28
- require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'MysqlDumpSQL.php';
29
-
30
- class MysqlDumpFactory
31
- {
32
- public static function makeMysqlDump($hostname = 'localhost', $username = '', $password = '', $database = '')
33
- {
34
- try {
35
- // Is PDO available?
36
- if (class_exists('PDO') && in_array('mysql', PDO::getAvailableDrivers())) {
37
- $client = new MysqlDumpPDO($hostname, $username, $password, $database);
38
- } else {
39
- $client = new MysqlDumpSQL($hostname, $username, $password, $database);
 
 
 
 
 
40
  }
41
 
42
- // Test connection
43
- $client->getConnection();
44
- } catch (Exception $e) {
45
- $client = new MysqlDumpSQL($hostname, $username, $password, $database);
 
46
  }
47
 
48
- return $client;
 
 
 
49
  }
50
  }
1
  <?php
 
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
 
26
+ class Ai1wm_Export_Clean {
27
+
28
+ public static function execute( $params ) {
29
+
30
+ // Remove export log file
31
+ unlink( ai1wm_export_path( $params ) );
32
+
33
+ // Get storage iterator
34
+ $iterator = new RecursiveIteratorIterator(
35
+ new RecursiveDirectoryIterator( ai1wm_storage_path( $params ) ),
36
+ RecursiveIteratorIterator::CHILD_FIRST
37
+ );
38
+
39
+ foreach ( $iterator as $item ) {
40
+
41
+ // Skip dots
42
+ if ( $iterator->isDot() ) {
43
+ continue;
44
  }
45
 
46
+ if ( $item->isFile() ) {
47
+ unlink( $item->getPathname() );
48
+ } else {
49
+ rmdir( $item->getPathname() );
50
+ }
51
  }
52
 
53
+ // Remove storage path
54
+ rmdir( ai1wm_storage_path( $params ) );
55
+
56
+ exit;
57
  }
58
  }
lib/model/{class-ai1wm-logger.php → export/class-ai1wm-export-config.php} RENAMED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -23,47 +23,56 @@
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
 
26
- class Ai1wm_Logger {
27
 
28
- /**
29
- * Log debug data
30
- *
31
- * @return boolean
32
- */
33
- public static function debug( $key, array $data = array() ) {
34
  global $wp_version;
35
 
36
- // Meta options
37
- $data['plugin_version'] = AI1WM_VERSION;
38
- $data['wp_version'] = $wp_version;
39
- $data['php_version'] = phpversion();
40
- $data['php_uname'] = php_uname();
41
- $data['max_execution_time'] = ini_get( 'max_execution_time' );
42
- $data['memory_limit'] = ini_get( 'memory_limit' );
43
- $data['memory_get_peak_usage'] = memory_get_peak_usage();
44
- $data['memory_get_usage'] = memory_get_usage();
45
- $data['PDO_available'] = class_exists( 'PDO' ) ? 1 : 0;
46
- $data['site_url'] = site_url();
47
- $data['home_url'] = home_url();
48
 
49
- return update_site_option( $key, $data );
50
- }
51
 
52
- /**
53
- * Log error data
54
- *
55
- * @return boolean
56
- */
57
- public static function error( $key, array $data = array() ) {
58
- return update_site_option( $key, $data );
59
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
 
61
- /**
62
- * Log info data
63
- *
64
- * @return boolean
65
- */
66
- public static function info( $key, array $data = array() ) {
67
- return update_site_option( $key, $data );
68
  }
69
  }
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
 
26
+ class Ai1wm_Export_Config {
27
 
28
+ public static function execute( $params ) {
 
 
 
 
 
29
  global $wp_version;
30
 
31
+ // Set progress
32
+ Ai1wm_Status::info( __( 'Adding configuration to archive...', AI1WM_PLUGIN_NAME ) );
 
 
 
 
 
 
 
 
 
 
33
 
34
+ // Clear WP options cache
35
+ wp_cache_flush();
36
 
37
+ // Get options
38
+ $options = wp_load_alloptions();
39
+
40
+ // Set config
41
+ $config = new Ai1wm_Config;
42
+
43
+ // Set Site URL
44
+ if ( isset( $options['siteurl'] ) ) {
45
+ $config->SiteURL = untrailingslashit( $options['siteurl'] );
46
+ } else {
47
+ $config->SiteURL = site_url();
48
+ }
49
+
50
+ // Set Home URL
51
+ if ( isset( $options['home'] ) ) {
52
+ $config->HomeURL = untrailingslashit( $options['home'] );
53
+ } else {
54
+ $config->HomeURL = home_url();
55
+ }
56
+
57
+ // Set Plugin Version
58
+ $config->Plugin = (object) array( 'Version' => AI1WM_VERSION );
59
+
60
+ // Set WordPress Version and Content
61
+ $config->WordPress = (object) array( 'Version' => $wp_version, 'Content' => WP_CONTENT_DIR );
62
+
63
+ // Save package.json file
64
+ $handle = fopen( ai1wm_package_path( $params ), 'w' );
65
+ fwrite( $handle, json_encode( $config ) );
66
+ fclose( $handle );
67
+
68
+ // Add package.json file
69
+ $archive = new Ai1wm_Compressor( ai1wm_archive_path( $params ) );
70
+ $archive->add_file( ai1wm_package_path( $params ), AI1WM_PACKAGE_NAME );
71
+ $archive->close();
72
+
73
+ // Set progress
74
+ Ai1wm_Status::info( __( 'Done adding configuration to archive.', AI1WM_PLUGIN_NAME ) );
75
 
76
+ return $params;
 
 
 
 
 
 
77
  }
78
  }
lib/model/export/class-ai1wm-export-content.php ADDED
@@ -0,0 +1,149 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ *
18
+ * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
19
+ * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
20
+ * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
21
+ * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
22
+ * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
+ * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
+ */
25
+
26
+ class Ai1wm_Export_Content {
27
+
28
+ public static function execute( $params ) {
29
+
30
+ // Set content offset
31
+ if ( isset( $params['content_offset'] ) ) {
32
+ $content_offset = $params['content_offset'];
33
+ } else {
34
+ $content_offset = 0;
35
+ }
36
+ // Set filemap offset
37
+ if ( isset( $params['filemap_offset'] ) ) {
38
+ $filemap_offset = $params['filemap_offset'];
39
+ } else {
40
+ $filemap_offset = 0;
41
+ }
42
+
43
+ // Get total files
44
+ if ( isset( $params['total'] ) ) {
45
+ $total = (int) $params['total'];
46
+ } else {
47
+ $total = 1;
48
+ }
49
+
50
+ // Get processed files
51
+ if ( isset( $params['processed'] ) ) {
52
+ $processed = (int) $params['processed'];
53
+ } else {
54
+ $processed = 0;
55
+ }
56
+
57
+ // What percent of files have we processed?
58
+ $progress = (int) ( ( $processed / $total ) * 100 );
59
+
60
+ // Set progress
61
+ if ( empty( $content_offset ) ) {
62
+ Ai1wm_Status::info( sprintf( __( 'Archiving %d files...<br />%.2f%% complete', AI1WM_PLUGIN_NAME ), $total, $progress ) );
63
+ }
64
+
65
+ // Get map file
66
+ $filemap = fopen( ai1wm_filemap_path( $params ), 'r' );
67
+
68
+ // Start time
69
+ $start = microtime( true );
70
+
71
+ // Flag to hold if all files have been processed
72
+ $completed = true;
73
+
74
+ // Set filemap pointer at the current index
75
+ if ( fseek( $filemap, $filemap_offset ) !== -1 ) {
76
+
77
+ // Get archive
78
+ $archive = new Ai1wm_Compressor( ai1wm_archive_path( $params ) );
79
+
80
+ while ( $path = trim( fgets( $filemap ) ) ) {
81
+ try {
82
+
83
+ // Add file to archive
84
+ if ( ( $content_offset = $archive->add_file( WP_CONTENT_DIR . DIRECTORY_SEPARATOR . $path, $path, $content_offset, 3 ) ) ) {
85
+
86
+ // Set progress
87
+ if ( ( $sub_progress = ( $content_offset / $archive->get_current_filesize() ) ) < 1 ) {
88
+ $progress += $sub_progress;
89
+ }
90
+
91
+ // Set progress
92
+ Ai1wm_Status::info( sprintf( __( 'Archiving %d files...<br />%.2f%% complete', AI1WM_PLUGIN_NAME ), $total, $progress ) );
93
+
94
+ // Set content offset
95
+ $params['content_offset'] = $content_offset;
96
+
97
+ // Set filemap offset
98
+ $params['filemap_offset'] = $filemap_offset;
99
+
100
+ // Set completed flag
101
+ $params['completed'] = false;
102
+
103
+ // Close the filemap file
104
+ fclose( $filemap );
105
+
106
+ return $params;
107
+ }
108
+
109
+ // Set content offset
110
+ $content_offset = 0;
111
+
112
+ // Set filemap offset
113
+ $filemap_offset = ftell( $filemap );
114
+
115
+ } catch ( Exception $e ) {
116
+ // Skip bad file permissions
117
+ }
118
+
119
+ // Increment processed files counter
120
+ $processed++;
121
+
122
+ // More than 3 seconds have passed, break and do another request
123
+ if ( ( microtime( true ) - $start ) > 3 ) {
124
+ $completed = false;
125
+ break;
126
+ }
127
+ }
128
+
129
+ $archive->close();
130
+ }
131
+
132
+ // Set content offset
133
+ $params['content_offset'] = $content_offset;
134
+
135
+ // Set filemap offset
136
+ $params['filemap_offset'] = $filemap_offset;
137
+
138
+ // Set processed files
139
+ $params['processed'] = $processed;
140
+
141
+ // Set completed flag
142
+ $params['completed'] = $completed;
143
+
144
+ // Close the filemap file
145
+ fclose( $filemap );
146
+
147
+ return $params;
148
+ }
149
+ }
lib/model/export/class-ai1wm-export-database.php ADDED
@@ -0,0 +1,122 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ *
18
+ * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
19
+ * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
20
+ * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
21
+ * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
22
+ * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
+ * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
+ */
25
+
26
+ class Ai1wm_Export_Database {
27
+
28
+ public static function execute( $params ) {
29
+ global $wpdb;
30
+
31
+ // Set exclude database
32
+ if ( isset( $params['options']['no-database'] ) ) {
33
+ return $params;
34
+ }
35
+
36
+ // Set progress
37
+ Ai1wm_Status::info( __( 'Exporting database...', AI1WM_PLUGIN_NAME ) );
38
+
39
+ // Get database client
40
+ if ( empty( $wpdb->use_mysqli ) ) {
41
+ $client = new Ai1wm_Database_Mysql( $wpdb );
42
+ } else {
43
+ $client = new Ai1wm_Database_Mysqli( $wpdb );
44
+ }
45
+
46
+ // Spam comments
47
+ if ( isset( $params['options']['no-spam-comments'] ) ) {
48
+ $client->set_table_query_clauses( ai1wm_table_prefix() . 'comments', " WHERE comment_approved != 'spam' " );
49
+ $client->set_table_query_clauses( ai1wm_table_prefix() . 'commentmeta', sprintf(
50
+ " WHERE comment_id IN ( SELECT comment_ID FROM `%s` WHERE comment_approved != 'spam' ) ",
51
+ ai1wm_table_prefix() . 'comments'
52
+ ) );
53
+ }
54
+
55
+ // Post revisions
56
+ if ( isset( $params['options']['no-revisions'] ) ) {
57
+ $client->set_table_query_clauses( ai1wm_table_prefix() . 'posts', " WHERE post_type != 'revision' " );
58
+ }
59
+
60
+ $old_table_values = array();
61
+ $new_table_values = array();
62
+
63
+ // Find and replace
64
+ if ( isset( $params['options']['replace'] ) && ( $replace = $params['options']['replace'] ) ) {
65
+ for ( $i = 0; $i < count( $replace['old-value'] ); $i++ ) {
66
+ if ( ! empty( $replace['old-value'][$i] ) && ! empty( $replace['new-value'][$i] ) ) {
67
+ $old_table_values[] = $replace['old-value'][$i];
68
+ $new_table_values[] = $replace['new-value'][$i];
69
+ }
70
+ }
71
+ }
72
+
73
+ $old_table_prefixes = array();
74
+ $new_table_prefixes = array();
75
+
76
+ // Set table prefixes
77
+ if ( ai1wm_table_prefix() ) {
78
+ $old_table_prefixes[] = ai1wm_table_prefix();
79
+ $new_table_prefixes[] = ai1wm_servmask_prefix();
80
+ } else {
81
+ foreach ( $client->get_tables() as $table_name ) {
82
+ $old_table_prefixes[] = $table_name;
83
+ $new_table_prefixes[] = ai1wm_servmask_prefix() . $table_name;
84
+ }
85
+ }
86
+
87
+ $include_table_prefixes = array();
88
+
89
+ // Include table prefixes
90
+ if ( ai1wm_table_prefix() ) {
91
+ $include_table_prefixes[] = ai1wm_table_prefix();
92
+ } else {
93
+ foreach ( $client->get_tables() as $table_name ) {
94
+ $include_table_prefixes[] = $table_name;
95
+ }
96
+ }
97
+
98
+ // Set database options
99
+ $client->set_old_table_prefixes( $old_table_prefixes )
100
+ ->set_new_table_prefixes( $new_table_prefixes )
101
+ ->set_old_replace_values( $old_table_values )
102
+ ->set_new_replace_values( $new_table_values )
103
+ ->set_include_table_prefixes( $include_table_prefixes )
104
+ ->set_table_prefix_columns( ai1wm_table_prefix() . 'options', array( 'option_name' ) )
105
+ ->set_table_prefix_columns( ai1wm_table_prefix() . 'usermeta', array( 'meta_key' ) );
106
+
107
+ // Export database
108
+ $client->export( ai1wm_database_path( $params ) );
109
+
110
+ // Get archive file
111
+ $archive = new Ai1wm_Compressor( ai1wm_archive_path( $params ) );
112
+
113
+ // Add database to archive
114
+ $archive->add_file( ai1wm_database_path( $params ), AI1WM_DATABASE_NAME );
115
+ $archive->close();
116
+
117
+ // Set progress
118
+ Ai1wm_Status::info( __( 'Done exporting database.', AI1WM_PLUGIN_NAME ) );
119
+
120
+ return $params;
121
+ }
122
+ }
lib/model/{class-ai1wm-export-file.php → export/class-ai1wm-export-download.php} RENAMED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -23,40 +23,37 @@
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
 
26
- class Ai1wm_Export_File extends Ai1wm_Export_Abstract {
 
 
27
 
28
- public function export() {
29
  // Set progress
30
- Ai1wm_Status::set( array(
31
- 'type' => 'info',
32
- 'message' => __( 'Renaming exported file...', AI1WM_PLUGIN_NAME )
33
- ) );
34
 
35
  // Close achive file
36
- $archive = new Ai1wm_Compressor( $this->storage()->archive() );
37
 
38
  // Append EOF block
39
  $archive->close( true );
40
 
41
  // Rename archive file
42
- if ( rename( $this->storage()->archive(), $this->storage()->backup() ) ) {
 
 
 
 
 
 
43
  // Set progress
44
- Ai1wm_Status::set( array(
45
- 'type' => 'download',
46
- 'message' => sprintf(
47
- __(
48
- '<a href="%s/%s" class="ai1wm-button-green ai1wm-emphasize">' .
49
- '<span>Download %s</span>' .
50
- '<em>Size: %s</em>' .
51
- '</a>',
52
- AI1WM_PLUGIN_NAME
53
- ),
54
- AI1WM_BACKUPS_URL,
55
- basename( $this->storage()->backup() ),
56
- parse_url( home_url(), PHP_URL_HOST ),
57
- size_format( filesize( $this->storage()->backup() ) )
58
- )
59
  ) );
60
  }
 
 
61
  }
62
  }
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
 
26
+ class Ai1wm_Export_Download {
27
+
28
+ public static function execute( $params ) {
29
 
 
30
  // Set progress
31
+ Ai1wm_Status::info( __( 'Renaming exported file...', AI1WM_PLUGIN_NAME ) );
 
 
 
32
 
33
  // Close achive file
34
+ $archive = new Ai1wm_Compressor( ai1wm_archive_path( $params ) );
35
 
36
  // Append EOF block
37
  $archive->close( true );
38
 
39
  // Rename archive file
40
+ if ( rename( ai1wm_archive_path( $params ), ai1wm_download_path( $params ) ) ) {
41
+
42
+ // Set archive details
43
+ $link = ai1wm_backups_url( $params );
44
+ $size = ai1wm_download_size( $params );
45
+ $name = ai1wm_site_name();
46
+
47
  // Set progress
48
+ Ai1wm_Status::download( __(
49
+ "<a href=\"{$link}\" class=\"ai1wm-button-green ai1wm-emphasize\">" .
50
+ "<span>Download {$name}</span>" .
51
+ "<em>Size: {$size}</em>" .
52
+ "</a>",
53
+ AI1WM_PLUGIN_NAME
 
 
 
 
 
 
 
 
 
54
  ) );
55
  }
56
+
57
+ return $params;
58
  }
59
  }
lib/model/{class-ai1wm-message.php → export/class-ai1wm-export-enumerate.php} RENAMED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -23,73 +23,72 @@
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
 
26
- class Ai1wm_Message {
27
 
28
- protected $messages = array();
29
 
30
- public function __construct() {
31
- $this->messages = array(
32
- 'SiteURLDepricated' => __(
33
- 'Since version 1.8.0, Site URL is deprecated.' .
34
- 'Upon import, the plugin auto-detects Site URL and makes necessary changes to the database.',
35
- AI1WM_PLUGIN_NAME
36
- ),
37
- );
38
 
39
- // Prepare messages
40
- $msgs = array();
41
- $keys = get_site_option( AI1WM_MESSAGES );
42
- foreach ( array_keys( $this->messages ) as $key ) {
43
- if ( ! isset( $keys[ $key ] ) ) {
44
- $msgs[ $key ] = true;
45
- }
46
- }
47
 
48
- // Update messages
49
- if ( $msgs ) {
50
- update_site_option( AI1WM_MESSAGES, $msgs );
51
  }
52
- }
53
 
54
- /**
55
- * Get list of all active messages
56
- *
57
- * @return array
58
- */
59
- public function get_messages() {
60
- $msgs = array();
61
- $keys = get_site_option( AI1WM_MESSAGES );
62
- foreach ( $keys as $key => $active ) {
63
- if ( isset( $this->messages[ $key ] ) && $active ) {
64
- $msgs[ $key ] = $this->messages[ $key ];
65
- }
66
  }
67
 
68
- return $msgs;
69
- }
 
 
70
 
71
- /**
72
- * Close message by key
73
- *
74
- * @param string $key Message key
75
- *
76
- * @return array
77
- */
78
- public function close_message( $key ) {
79
- $errors = array();
80
- $keys = get_site_option( AI1WM_MESSAGES );
81
- if ( isset( $keys[ $key ] ) ) {
82
- // Deactivate message from the list
83
- $keys[ $key ] = false;
84
 
85
- // Update keys
86
- if ( ! update_site_option( AI1WM_MESSAGES, $keys ) ) {
87
- $errors[] = 'Something went wrong! Please try again later.';
 
 
 
 
88
  }
89
- } else {
90
- $errors[] = 'Message key does not exist in the list.';
91
  }
92
 
93
- return array( 'errors' => $errors );
 
 
 
 
 
 
 
 
 
94
  }
95
  }
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
 
26
+ class Ai1wm_Export_Enumerate {
27
 
28
+ public static function execute( $params ) {
29
 
30
+ // Set progress
31
+ Ai1wm_Status::info( __( 'Retrieving a list of all WordPress files...', AI1WM_PLUGIN_NAME ) );
 
 
 
 
 
 
32
 
33
+ // Total files
34
+ $total = 0;
35
+
36
+ // Create map file
37
+ $filemap = fopen( ai1wm_filemap_path( $params ) , 'a+' );
38
+
39
+ // Set exclude filters
40
+ $exclude_filters = ai1wm_content_filters();
41
 
42
+ // Exclude themes
43
+ if ( isset( $params['options']['no-themes'] ) ) {
44
+ $exclude_filters[] = 'themes';
45
  }
 
46
 
47
+ // Exclude plugins
48
+ if ( isset( $params['options']['no-plugins'] ) ) {
49
+ $exclude_filters = array_merge( $exclude_filters, array( 'plugins', 'mu-plugins' ) );
50
+ } else {
51
+ $exclude_filters = array_merge( $exclude_filters, ai1wm_plugin_filters() );
 
 
 
 
 
 
 
52
  }
53
 
54
+ // Exclude media
55
+ if ( isset( $params['options']['no-media'] ) ) {
56
+ $exclude_filters[] = 'uploads';
57
+ }
58
 
59
+ try {
60
+ // Iterate over content directory
61
+ $iterator = new RecursiveIteratorIterator(
62
+ new Ai1wm_Recursive_Exclude_Filter(
63
+ new Ai1wm_Recursive_Directory_Iterator(
64
+ WP_CONTENT_DIR
65
+ ),
66
+ $exclude_filters
67
+ ),
68
+ RecursiveIteratorIterator::SELF_FIRST
69
+ );
 
 
70
 
71
+ // Write path line
72
+ foreach ( $iterator as $item ) {
73
+ if ( $item->isFile() ) {
74
+ if ( fwrite( $filemap, $iterator->getSubPathName() . PHP_EOL ) ) {
75
+ $total++;
76
+ }
77
+ }
78
  }
79
+ } catch ( Exception $e ) {
80
+ // Skip bad file permissions
81
  }
82
 
83
+ // Close handle
84
+ fclose( $filemap );
85
+
86
+ // Set total files
87
+ $params['total'] = $total;
88
+
89
+ // Set progress
90
+ Ai1wm_Status::info( __( 'Done retrieving a list of all WordPress files.', AI1WM_PLUGIN_NAME ) );
91
+
92
+ return $params;
93
  }
94
  }
lib/model/export/class-ai1wm-export-resolve.php ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ *
18
+ * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
19
+ * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
20
+ * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
21
+ * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
22
+ * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
+ * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
+ */
25
+
26
+ class Ai1wm_Export_Resolve {
27
+
28
+ public static function execute( $params ) {
29
+
30
+ // Set progress
31
+ Ai1wm_Status::info( __( 'Resolving URL address...', AI1WM_PLUGIN_NAME ) );
32
+
33
+ // HTTP resolve
34
+ Ai1wm_Http::resolve( admin_url( 'admin-ajax.php?action=ai1wm_resolve' ) );
35
+
36
+ // Set archive
37
+ if ( empty( $params['archive'] ) ) {
38
+ $params['archive'] = ai1wm_archive_file();
39
+ }
40
+
41
+ // Set storage
42
+ if ( empty( $params['storage'] ) ) {
43
+ $params['storage'] = ai1wm_storage_folder();
44
+ }
45
+
46
+ // Set progress
47
+ Ai1wm_Status::info( __( 'Done resolving URL address...', AI1WM_PLUGIN_NAME ) );
48
+
49
+ return $params;
50
+ }
51
+ }
lib/model/import/class-ai1wm-import-blogs.php ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ *
18
+ * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
19
+ * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
20
+ * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
21
+ * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
22
+ * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
+ * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
+ */
25
+
26
+ class Ai1wm_Import_Blogs {
27
+
28
+ public static function execute( $params ) {
29
+
30
+ // Set progress
31
+ Ai1wm_Status::info( __( 'Preparing blogs...', AI1WM_PLUGIN_NAME ) );
32
+
33
+ $blogs = array();
34
+
35
+ // Check multisite.json file
36
+ if ( true === is_file( ai1wm_multisite_path( $params ) ) ) {
37
+
38
+ // Read multisite.json file
39
+ $handle = fopen( ai1wm_multisite_path( $params ), 'r' );
40
+ if ( $handle === false ) {
41
+ throw new Ai1wm_Import_Exception( __( 'Unable to read multisite.json file', AI1WM_PLUGIN_NAME ) );
42
+ }
43
+
44
+ // Parse multisite.json file
45
+ $multisite = fread( $handle, filesize( ai1wm_multisite_path( $params ) ) );
46
+ $multisite = json_decode( $multisite );
47
+
48
+ // Close handle
49
+ fclose( $handle );
50
+
51
+ // Validate
52
+ if ( empty( $multisite->Network ) ) {
53
+ if ( isset( $multisite->Sites ) && ( $sites = $multisite->Sites ) ) {
54
+ if ( count( $sites ) === 1 && ( $site = current( $sites ) ) ) {
55
+ $blogs[] = array(
56
+ 'Old' => array(
57
+ 'Id' => (int) $site->BlogID,
58
+ 'SiteURL' => $site->SiteURL,
59
+ 'HomeURL' => $site->HomeURL,
60
+ ),
61
+ 'New' => array(
62
+ 'Id' => 0,
63
+ 'SiteURL' => site_url(),
64
+ 'HomeURL' => home_url(),
65
+ ),
66
+ );
67
+ } else {
68
+ throw new Ai1wm_Import_Exception(
69
+ __( 'The archive should contain <strong>Single WordPress</strong> site! Please revisit your export settings.', AI1WM_PLUGIN_NAME )
70
+ );
71
+ }
72
+ } else {
73
+ throw new Ai1wm_Import_Exception(
74
+ __( 'At least <strong>one WordPress</strong> site should be presented in the archive.', AI1WM_PLUGIN_NAME )
75
+ );
76
+ }
77
+ } else {
78
+ throw new Ai1wm_Import_Exception(
79
+ __( 'Unable to import <strong>WordPress Network</strong> into WordPress <strong>Single</strong> site.', AI1WM_PLUGIN_NAME )
80
+ );
81
+ }
82
+ }
83
+
84
+ // Save blogs.json file
85
+ $handle = fopen( ai1wm_blogs_path( $params ), 'w' );
86
+ fwrite( $handle, json_encode( $blogs ) );
87
+ fclose( $handle );
88
+
89
+ // Set progress
90
+ Ai1wm_Status::info( __( 'Done preparing blogs...', AI1WM_PLUGIN_NAME ) );
91
+
92
+ return $params;
93
+ }
94
+ }
lib/model/import/class-ai1wm-import-clean.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ *
18
+ * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
19
+ * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
20
+ * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
21
+ * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
22
+ * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
+ * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
+ */
25
+
26
+ class Ai1wm_Import_Clean {
27
+
28
+ public static function execute( $params ) {
29
+
30
+ // Remove import log file
31
+ unlink( ai1wm_import_path( $params ) );
32
+
33
+ // Get storage iterator
34
+ $iterator = new RecursiveIteratorIterator(
35
+ new RecursiveDirectoryIterator( ai1wm_storage_path( $params ) ),
36
+ RecursiveIteratorIterator::CHILD_FIRST
37
+ );
38
+
39
+ foreach ( $iterator as $item ) {
40
+
41
+ // Skip dots
42
+ if ( $iterator->isDot() ) {
43
+ continue;
44
+ }
45
+
46
+ if ( $item->isFile() ) {
47
+ unlink( $item->getPathname() );
48
+ } else {
49
+ rmdir( $item->getPathname() );
50
+ }
51
+ }
52
+
53
+ // Remove storage path
54
+ rmdir( ai1wm_storage_path( $params ) );
55
+
56
+ exit;
57
+ }
58
+ }
lib/model/import/class-ai1wm-import-confirm.php ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ *
18
+ * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
19
+ * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
20
+ * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
21
+ * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
22
+ * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
+ * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
+ */
25
+
26
+ class Ai1wm_Import_Confirm {
27
+
28
+ public static function execute( $params ) {
29
+
30
+ // Obtain the name of the archive
31
+ $name = ai1wm_archive_name( $params );
32
+
33
+ // Obtain the size of the archive
34
+ $size = ai1wm_archive_bytes( $params );
35
+
36
+ // Check file size of the archive
37
+ if ( false === $size ) {
38
+ throw new Ai1wm_Not_Accesible_Exception(
39
+ __( "Unable to get the file size of <strong>{$name}</strong>", AI1WM_PLUGIN_NAME )
40
+ );
41
+ }
42
+
43
+ $allowed_size = apply_filters( 'ai1wm_max_file_size', AI1WM_MAX_FILE_SIZE );
44
+
45
+ // Let's check the size of the file to make sure it is less than the maximum allowed
46
+ if ( ( $allowed_size > 0 ) && ( $size > $allowed_size ) ) {
47
+ throw new Ai1wm_Import_Exception(
48
+ __(
49
+ "The file that you are trying to import is over the maximum upload file size limit of {$allowed_size}.<br />" .
50
+ "You can remove this restriction by purchasing our " .
51
+ "<a href=\"https://servmask.com/products/unlimited-extension\" target=\"_blank\">Unlimited Extension</a>.",
52
+ AI1WM_PLUGIN_NAME
53
+ )
54
+ );
55
+ }
56
+
57
+ // Set progress
58
+ Ai1wm_Status::confirm( __(
59
+ 'The import process will overwrite your database, media, plugins, and themes. ' .
60
+ 'Please ensure that you have a backup of your data before proceeding to the next step.',
61
+ AI1WM_PLUGIN_NAME
62
+ ) );
63
+
64
+ exit;
65
+ }
66
+ }
lib/model/import/class-ai1wm-import-content.php ADDED
@@ -0,0 +1,166 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ *
18
+ * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
19
+ * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
20
+ * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
21
+ * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
22
+ * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
+ * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
+ */
25
+
26
+ class Ai1wm_Import_Content {
27
+
28
+ public static function execute( $params ) {
29
+
30
+ // Read blogs.json file
31
+ $handle = fopen( ai1wm_blogs_path( $params ), 'r' );
32
+ if ( $handle === false ) {
33
+ throw new Ai1wm_Import_Exception( 'Unable to read blogs.json file' );
34
+ }
35
+
36
+ // Parse blogs.json file
37
+ $blogs = fread( $handle, filesize( ai1wm_blogs_path( $params ) ) );
38
+ $blogs = json_decode( $blogs );
39
+
40
+ // Close handle
41
+ fclose( $handle );
42
+
43
+ // Set content offset
44
+ if ( isset( $params['content_offset'] ) ) {
45
+ $content_offset = $params['content_offset'];
46
+ } else {
47
+ $content_offset = 0;
48
+ }
49
+
50
+ // Set archive offset
51
+ if ( isset( $params['archive_offset']) ) {
52
+ $archive_offset = $params['archive_offset'];
53
+ } else {
54
+ $archive_offset = 0;
55
+ }
56
+
57
+ // Get total files
58
+ if ( isset( $params['total'] ) ) {
59
+ $total = (int) $params['total'];
60
+ } else {
61
+ $total = 1;
62
+ }
63
+
64
+ // Get processed files
65
+ if ( isset( $params['processed'] ) ) {
66
+ $processed = (int) $params['processed'];
67
+ } else {
68
+ $processed = 0;
69
+ }
70
+
71
+ // What percent of files have we processed?
72
+ $progress = (int) ( ( $processed / $total ) * 100 );
73
+
74
+ // Set progress
75
+ if ( empty( $content_offset ) ) {
76
+ Ai1wm_Status::info( sprintf( __( 'Restoring %d files...<br />%.2f%% complete', AI1WM_PLUGIN_NAME ), $total, $progress ) );
77
+ }
78
+
79
+ // Start time
80
+ $start = microtime( true );
81
+
82
+ // Flag to hold if all files have been processed
83
+ $completed = true;
84
+
85
+ // Open the archive file for reading
86
+ $archive = new Ai1wm_Extractor( ai1wm_archive_path( $params ) );
87
+
88
+ // Set the file pointer to the one that we have saved
89
+ $archive->set_file_pointer( null, $archive_offset );
90
+
91
+ $old_paths = array();
92
+ $new_paths = array();
93
+
94
+ // Set extract paths
95
+ foreach ( $blogs as $blog ) {
96
+ $old_paths[] = ai1wm_sites_path( $blog->Old->Id );
97
+ $new_paths[] = ai1wm_sites_path( $blog->New->Id );
98
+ }
99
+
100
+ while ( $archive->has_not_reached_eof() ) {
101
+ try {
102
+
103
+ // Extract a file from archive to WP_CONTENT_DIR
104
+ if ( ( $content_offset = $archive->extract_one_file_to( WP_CONTENT_DIR, array( AI1WM_PACKAGE_NAME, AI1WM_MULTISITE_NAME, AI1WM_DATABASE_NAME ), $old_paths, $new_paths, $content_offset, 3 ) ) ) {
105
+
106
+ // Set progress
107
+ if ( ( $sub_progress = ( $content_offset / $archive->get_current_filesize() ) ) < 1 ) {
108
+ $progress += $sub_progress;
109
+ }
110
+
111
+ // Set progress
112
+ Ai1wm_Status::info( sprintf( __( 'Restoring %d files...<br />%.2f%% complete', AI1WM_PLUGIN_NAME ), $total, $progress ) );
113
+
114
+ // Set content offset
115
+ $params['content_offset'] = $content_offset;
116
+
117
+ // Set archive offset
118
+ $params['archive_offset'] = $archive_offset;
119
+
120
+ // Set completed flag
121
+ $params['completed'] = false;
122
+
123
+ // Close the archive file
124
+ $archive->close();
125
+
126
+ return $params;
127
+ }
128
+
129
+ // Set content offset
130
+ $content_offset = 0;
131
+
132
+ // Set archive offset
133
+ $archive_offset = $archive->get_file_pointer();
134
+
135
+ } catch ( Exception $e ) {
136
+ // Skip bad file permissions
137
+ }
138
+
139
+ // Increment processed files counter
140
+ $processed++;
141
+
142
+ // More than 3 seconds have passed, break and do another request
143
+ if ( ( microtime( true ) - $start ) > 3 ) {
144
+ $completed = false;
145
+ break;
146
+ }
147
+ }
148
+
149
+ // Set content offset
150
+ $params['content_offset'] = $content_offset;
151
+
152
+ // Set archive offset
153
+ $params['archive_offset'] = $archive_offset;
154
+
155
+ // Set processed files
156
+ $params['processed'] = $processed;
157
+
158
+ // Set completed flag
159
+ $params['completed'] = $completed;
160
+
161
+ // Close the archive file
162
+ $archive->close();
163
+
164
+ return $params;
165
+ }
166
+ }
lib/model/import/class-ai1wm-import-database.php ADDED
@@ -0,0 +1,396 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ *
18
+ * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
19
+ * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
20
+ * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
21
+ * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
22
+ * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
+ * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
+ */
25
+
26
+ class Ai1wm_Import_Database {
27
+
28
+ public static function execute( $params ) {
29
+ global $wpdb;
30
+
31
+ // Skip database import
32
+ if ( ! is_file( ai1wm_database_path( $params ) ) ) {
33
+ return $params;
34
+ }
35
+
36
+ // Read blogs.json file
37
+ $handle = fopen( ai1wm_blogs_path( $params ), 'r' );
38
+ if ( $handle === false ) {
39
+ throw new Ai1wm_Import_Exception( 'Unable to read blogs.json file' );
40
+ }
41
+
42
+ // Parse blogs.json file
43
+ $blogs = fread( $handle, filesize( ai1wm_blogs_path( $params ) ) );
44
+ $blogs = json_decode( $blogs );
45
+
46
+ // Close handle
47
+ fclose( $handle );
48
+
49
+ // Read package.json file
50
+ $handle = fopen( ai1wm_package_path( $params ), 'r' );
51
+ if ( $handle === false ) {
52
+ throw new Ai1wm_Import_Exception( 'Unable to read package.json file' );
53
+ }
54
+
55
+ // Parse package.json file
56
+ $config = fread( $handle, filesize( ai1wm_package_path( $params ) ) );
57
+ $config = json_decode( $config );
58
+
59
+ // Close handle
60
+ fclose( $handle );
61
+
62
+ // Set progress
63
+ Ai1wm_Status::info( __( 'Restoring database...', AI1WM_PLUGIN_NAME ) );
64
+
65
+ $old_values = array();
66
+ $new_values = array();
67
+
68
+ // Get Blog URLs
69
+ foreach ( $blogs as $blog ) {
70
+
71
+ // Get Upload Path
72
+ if ( ! in_array( ai1wm_uploads_path( $blog->Old->Id ), $old_values ) ) {
73
+ $old_values[] = ai1wm_uploads_path( $blog->Old->Id );
74
+ $new_values[] = ai1wm_uploads_path( $blog->New->Id );
75
+ }
76
+
77
+ // Get escaped Upload Path
78
+ if ( ! in_array( addslashes( addcslashes( ai1wm_uploads_path( $blog->Old->Id ), '\/' ) ), $old_values ) ) {
79
+ $old_values[] = addslashes( addcslashes( ai1wm_uploads_path( $blog->Old->Id ), '\/' ) );
80
+ $new_values[] = addslashes( addcslashes( ai1wm_uploads_path( $blog->New->Id ), '\/' ) );
81
+ }
82
+
83
+ // Get Site URL
84
+ if ( isset( $blog->Old->SiteURL ) && ( $blog->Old->SiteURL !== $blog->New->SiteURL ) ) {
85
+
86
+ // Get domain
87
+ $old_domain = parse_url( $blog->Old->SiteURL, PHP_URL_HOST );
88
+ $new_domain = parse_url( $blog->New->SiteURL, PHP_URL_HOST );
89
+
90
+ // Replace Site URL protocol
91
+ foreach ( array( 'http', 'https' ) as $protocol ) {
92
+
93
+ // Add plain Site URL
94
+ if ( ! in_array( set_url_scheme( $blog->Old->SiteURL, $protocol ), $old_values ) ) {
95
+ $old_values[] = set_url_scheme( $blog->Old->SiteURL, $protocol );
96
+ $new_values[] = set_url_scheme( $blog->New->SiteURL );
97
+ }
98
+
99
+ // Add encoded Site URL
100
+ if ( ! in_array( urlencode( set_url_scheme( $blog->Old->SiteURL, $protocol ) ), $old_values ) ) {
101
+ $old_values[] = urlencode( set_url_scheme( $blog->Old->SiteURL, $protocol ) );
102
+ $new_values[] = urlencode( set_url_scheme( $blog->New->SiteURL ) );
103
+ }
104
+
105
+ // Add escaped Site URL
106
+ if ( ! in_array( addslashes( addcslashes( set_url_scheme( $blog->Old->SiteURL, $protocol ), '/' ) ), $old_values ) ) {
107
+ $old_values[] = addslashes( addcslashes( set_url_scheme( $blog->Old->SiteURL, $protocol ), '/' ) );
108
+ $new_values[] = addslashes( addcslashes( set_url_scheme( $blog->New->SiteURL ), '/' ) );
109
+ }
110
+ }
111
+
112
+ // Add email
113
+ if ( ! in_array( sprintf( "@%s", $old_domain ), $old_values ) ) {
114
+ $old_values[] = sprintf( "@%s", $old_domain );
115
+ $new_values[] = sprintf( "@%s", $new_domain );
116
+ }
117
+ }
118
+
119
+ // Get Home URL
120
+ if ( isset( $blog->Old->HomeURL ) && ( $blog->Old->HomeURL !== $blog->New->HomeURL ) ) {
121
+
122
+ // Get domain
123
+ $old_domain = parse_url( $blog->Old->HomeURL, PHP_URL_HOST );
124
+ $new_domain = parse_url( $blog->New->HomeURL, PHP_URL_HOST );
125
+
126
+ // Replace Home URL protocol
127
+ foreach ( array( 'http', 'https' ) as $protocol ) {
128
+
129
+ // Add plain Home URL
130
+ if ( ! in_array( set_url_scheme( $blog->Old->HomeURL, $protocol ), $old_values ) ) {
131
+ $old_values[] = set_url_scheme( $blog->Old->HomeURL, $protocol );
132
+ $new_values[] = set_url_scheme( $blog->New->HomeURL );
133
+ }
134
+
135
+ // Add encoded Home URL
136
+ if ( ! in_array( urlencode( set_url_scheme( $blog->Old->HomeURL, $protocol ) ), $old_values ) ) {
137
+ $old_values[] = urlencode( set_url_scheme( $blog->Old->HomeURL, $protocol ) );
138
+ $new_values[] = urlencode( set_url_scheme( $blog->New->HomeURL ) );
139
+ }
140
+
141
+ // Add escaped Home URL
142
+ if ( ! in_array( addslashes( addcslashes( set_url_scheme( $blog->Old->HomeURL, $protocol ), '/' ) ), $old_values ) ) {
143
+ $old_values[] = addslashes( addcslashes( set_url_scheme( $blog->Old->HomeURL, $protocol ), '/' ) );
144
+ $new_values[] = addslashes( addcslashes( set_url_scheme( $blog->New->HomeURL ), '/' ) );
145
+ }
146
+ }
147
+
148
+ // Add email
149
+ if ( ! in_array( sprintf( "@%s", $old_domain ), $old_values ) ) {
150
+ $old_values[] = sprintf( "@%s", $old_domain );
151
+ $new_values[] = sprintf( "@%s", $new_domain );
152
+ }
153
+ }
154
+ }
155
+
156
+ // Get Site URL
157
+ if ( isset( $config->SiteURL ) && ( $config->SiteURL !== site_url() ) ) {
158
+
159
+ // Get www URL
160
+ if ( stripos( $config->SiteURL, '//www.' ) !== false ) {
161
+ $www = str_ireplace( '//www.', '//', $config->SiteURL );
162
+ } else {
163
+ $www = str_ireplace( '//', '//www.', $config->SiteURL );
164
+ }
165
+
166
+ // Replace Site URL
167
+ foreach ( array( $config->SiteURL, $www ) as $url ) {
168
+
169
+ // Get domain
170
+ $old_domain = parse_url( $url, PHP_URL_HOST );
171
+ $new_domain = parse_url( site_url(), PHP_URL_HOST );
172
+
173
+ // Get path
174
+ $old_path = parse_url( $url, PHP_URL_PATH );
175
+ $new_path = parse_url( site_url(), PHP_URL_PATH );
176
+
177
+ // Add domain and path
178
+ if ( ! in_array( sprintf( "%s','%s", $old_domain, trailingslashit( $old_path ) ), $old_values ) ) {
179
+ $old_values[] = sprintf( "%s','%s", $old_domain, trailingslashit( $old_path ) );
180
+ $new_values[] = sprintf( "%s','%s", $new_domain, trailingslashit( $new_path ) );
181
+ }
182
+
183
+ // Replace Site URL protocol
184
+ foreach ( array( 'http', 'https' ) as $protocol ) {
185
+
186
+ // Add plain Site URL
187
+ if ( ! in_array( set_url_scheme( $url, $protocol ), $old_values ) ) {
188
+ $old_values[] = set_url_scheme( $url, $protocol );
189
+ $new_values[] = set_url_scheme( site_url() );
190
+ }
191
+
192
+ // Add encoded Site URL
193
+ if ( ! in_array( urlencode( set_url_scheme( $url, $protocol ) ), $old_values ) ) {
194
+ $old_values[] = urlencode( set_url_scheme( $url, $protocol ) );
195
+ $new_values[] = urlencode( set_url_scheme( site_url() ) );
196
+ }
197
+
198
+ // Add escaped Site URL
199
+ if ( ! in_array( addslashes( addcslashes( set_url_scheme( $url, $protocol ), '/' ) ), $old_values ) ) {
200
+ $old_values[] = addslashes( addcslashes( set_url_scheme( $url, $protocol ), '/' ) );
201
+ $new_values[] = addslashes( addcslashes( set_url_scheme( site_url() ), '/' ) );
202
+ }
203
+ }
204
+
205
+ // Add email
206
+ if ( ! in_array( sprintf( "@%s", $old_domain ), $old_values ) ) {
207
+ $old_values[] = sprintf( "@%s", $old_domain );
208
+ $new_values[] = sprintf( "@%s", $new_domain );
209
+ }
210
+ }
211
+ }
212
+
213
+ // Get Home URL
214
+ if ( isset( $config->HomeURL ) && ( $config->HomeURL !== home_url() ) ) {
215
+
216
+ // Get www URL
217
+ if ( stripos( $config->HomeURL, '//www.' ) !== false ) {
218
+ $www = str_ireplace( '//www.', '//', $config->HomeURL );
219
+ } else {
220
+ $www = str_ireplace( '//', '//www.', $config->HomeURL );
221
+ }
222
+
223
+ // Replace Home URL
224
+ foreach ( array( $config->HomeURL, $www ) as $url ) {
225
+
226
+ // Get domain
227
+ $old_domain = parse_url( $url, PHP_URL_HOST );
228
+ $new_domain = parse_url( home_url(), PHP_URL_HOST );
229
+
230
+ // Get path
231
+ $old_path = parse_url( $url, PHP_URL_PATH );
232
+ $new_path = parse_url( home_url(), PHP_URL_PATH );
233
+
234
+ // Add domain and path
235
+ if ( ! in_array( sprintf( "%s','%s", $old_domain, trailingslashit( $old_path ) ), $old_values ) ) {
236
+ $old_values[] = sprintf( "%s','%s", $old_domain, trailingslashit( $old_path ) );
237
+ $new_values[] = sprintf( "%s','%s", $new_domain, trailingslashit( $new_path ) );
238
+ }
239
+
240
+ // Replace Home URL protocol
241
+ foreach ( array( 'http', 'https' ) as $protocol ) {
242
+
243
+ // Add plain Home URL
244
+ if ( ! in_array( set_url_scheme( $url, $protocol ), $old_values ) ) {
245
+ $old_values[] = set_url_scheme( $url, $protocol );
246
+ $new_values[] = set_url_scheme( home_url() );
247
+ }
248
+
249
+ // Add encoded Home URL
250
+ if ( ! in_array( urlencode( set_url_scheme( $url, $protocol ) ), $old_values ) ) {
251
+ $old_values[] = urlencode( set_url_scheme( $url, $protocol ) );
252
+ $new_values[] = urlencode( set_url_scheme( home_url() ) );
253
+ }
254
+
255
+ // Add escaped Home URL
256
+ if ( ! in_array( addslashes( addcslashes( set_url_scheme( $url, $protocol ), '/' ) ), $old_values ) ) {
257
+ $old_values[] = addslashes( addcslashes( set_url_scheme( $url, $protocol ), '/' ) );
258
+ $new_values[] = addslashes( addcslashes( set_url_scheme( home_url() ), '/' ) );
259
+ }
260
+ }
261
+
262
+ // Add email
263
+ if ( ! in_array( sprintf( "@%s", $old_domain ), $old_values ) ) {
264
+ $old_values[] = sprintf( "@%s", $old_domain );
265
+ $new_values[] = sprintf( "@%s", $new_domain );
266
+ }
267
+ }
268
+ }
269
+
270
+ // Get WordPress Content
271
+ if ( isset( $config->WordPress->Content ) && ( $config->WordPress->Content !== WP_CONTENT_DIR ) ) {
272
+
273
+ // Add plain WordPress Content
274
+ if ( ! in_array( $config->WordPress->Content, $old_values ) ) {
275
+ $old_values[] = $config->WordPress->Content;
276
+ $new_values[] = WP_CONTENT_DIR;
277
+ }
278
+
279
+ // Add encoded WordPress Content
280
+ if ( ! in_array( urlencode( $config->WordPress->Content ), $old_values ) ) {
281
+ $old_values[] = urlencode( $config->WordPress->Content );
282
+ $new_values[] = urlencode( WP_CONTENT_DIR );
283
+ }
284
+
285
+ // Add escaped WordPress Content
286
+ if ( ! in_array( addslashes( addcslashes( $config->WordPress->Content, '\/' ) ), $old_values ) ) {
287
+ $old_values[] = addslashes( addcslashes( $config->WordPress->Content, '\/' ) );
288
+ $new_values[] = addslashes( addcslashes( WP_CONTENT_DIR, '\/' ) );
289
+ }
290
+ }
291
+
292
+ // Get URL IP
293
+ $url_ip = get_site_option( AI1WM_URL_IP, false, false );
294
+
295
+ // Get URL transport
296
+ $url_transport = get_site_option( AI1WM_URL_TRANSPORT, false, false );
297
+
298
+ // Get secret key
299
+ $secret_key = get_site_option( AI1WM_SECRET_KEY, false, false );
300
+
301
+ // Get HTTP user
302
+ $auth_user = get_site_option( AI1WM_AUTH_USER, false, false );
303
+
304
+ // Get HTTP password
305
+ $auth_password = get_site_option( AI1WM_AUTH_PASSWORD, false, false );
306
+
307
+ // Get active plugins
308
+ $active_plugins = get_site_option( AI1WM_ACTIVE_PLUGINS, array(), false );
309
+
310
+ $old_prefixes = array();
311
+ $new_prefixes = array();
312
+
313
+ // Set main table prefixes
314
+ $old_prefixes[] = ai1wm_servmask_prefix( 'mainsite' );
315
+ $new_prefixes[] = ai1wm_table_prefix();
316
+
317
+ // Set site table prefixes
318
+ foreach ( $blogs as $blog ) {
319
+ if ( ai1wm_main_site( $blog->Old->Id ) === false ) {
320
+ $old_prefixes[] = ai1wm_servmask_prefix( $blog->Old->Id );
321
+ $new_prefixes[] = ai1wm_table_prefix( $blog->New->Id );
322
+ }
323
+ }
324
+
325
+ // Set base table prefixes
326
+ foreach ( $blogs as $blog ) {
327
+ if ( ai1wm_main_site( $blog->Old->Id ) === true ) {
328
+ $old_prefixes[] = ai1wm_servmask_prefix( 'basesite' );
329
+ $new_prefixes[] = ai1wm_table_prefix( $blog->New->Id );
330
+ }
331
+ }
332
+
333
+ // Set site table prefixes
334
+ foreach ( $blogs as $blog ) {
335
+ if ( ai1wm_main_site( $blog->Old->Id ) === true ) {
336
+ $old_prefixes[] = ai1wm_servmask_prefix( $blog->Old->Id );
337
+ $new_prefixes[] = ai1wm_table_prefix( $blog->New->Id );
338
+ }
339
+ }
340
+
341
+ // Set table prefixes
342
+ $old_prefixes[] = ai1wm_servmask_prefix();
343
+ $new_prefixes[] = ai1wm_table_prefix();
344
+
345
+ // Get database client
346
+ if ( empty( $wpdb->use_mysqli ) ) {
347
+ $client = new Ai1wm_Database_Mysql( $wpdb );
348
+ } else {
349
+ $client = new Ai1wm_Database_Mysqli( $wpdb );
350
+ }
351
+
352
+ // Set database options
353
+ $client->set_old_table_prefixes( $old_prefixes )
354
+ ->set_new_table_prefixes( $new_prefixes )
355
+ ->set_old_replace_values( $old_values )
356
+ ->set_new_replace_values( $new_values );
357
+
358
+ // Flush database
359
+ if ( ( $version = $config->Plugin->Version ) ) {
360
+ if ( $version !== 'develop' && version_compare( $version, '4.10', '<' ) ) {
361
+ $client->set_include_table_prefixes( array( ai1wm_table_prefix() ) );
362
+ $client->flush();
363
+ }
364
+ }
365
+
366
+ // Import database
367
+ $client->import( ai1wm_database_path( $params ) );
368
+
369
+ // Clear WP options cache
370
+ wp_cache_flush();
371
+
372
+ // Activate plugins
373
+ foreach ( $active_plugins as $plugin ) {
374
+ if ( in_array( $plugin, ai1wm_active_plugins() ) ) {
375
+ activate_plugin( $plugin );
376
+ }
377
+ }
378
+
379
+ // Set the new URL IP
380
+ update_site_option( AI1WM_URL_IP, $url_ip );
381
+
382
+ // Set the new URL transport
383
+ update_site_option( AI1WM_URL_TRANSPORT, $url_transport );
384
+
385
+ // Set the new secret key value
386
+ update_site_option( AI1WM_SECRET_KEY, $secret_key );
387
+
388
+ // Set the new HTTP user
389
+ update_site_option( AI1WM_AUTH_USER, $auth_user );
390
+
391
+ // Set the new HTTP password
392
+ update_site_option( AI1WM_AUTH_PASSWORD, $auth_password );
393
+
394
+ return $params;
395
+ }
396
+ }
lib/model/import/class-ai1wm-import-done.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ *
18
+ * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
19
+ * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
20
+ * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
21
+ * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
22
+ * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
+ * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
+ */
25
+
26
+ class Ai1wm_Import_Done {
27
+
28
+ public static function execute( $params ) {
29
+
30
+ // Get permalink URL
31
+ $permalink = admin_url( 'options-permalink.php#submit' );
32
+
33
+ // Set progress
34
+ Ai1wm_Status::done(
35
+ __(
36
+ "You need to perform two more steps:<br />" .
37
+ "<strong>1. You must save your permalinks structure twice. <a class=\"ai1wm-no-underline\" href=\"{$permalink}\" target=\"_blank\">Permalinks Settings</a></strong> <small>(opens a new window)</small><br />" .
38
+ "<strong>2. <a class=\"ai1wm-no-underline\" href=\"https://wordpress.org/support/view/plugin-reviews/all-in-one-wp-migration?rate=5#postform\" target=\"_blank\">Review the plugin</a>.</strong> <small>(opens a new window)</small>",
39
+ AI1WM_PLUGIN_NAME
40
+ ),
41
+ __(
42
+ "Your data has been imported successfuly!",
43
+ AI1WM_PLUGIN_NAME
44
+ )
45
+ );
46
+
47
+ return $params;
48
+ }
49
+ }
lib/model/import/class-ai1wm-import-enumerate.php ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ *
18
+ * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
19
+ * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
20
+ * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
21
+ * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
22
+ * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
+ * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
+ */
25
+
26
+ class Ai1wm_Import_Enumerate {
27
+
28
+ public static function execute( $params ) {
29
+
30
+ // Set progress
31
+ Ai1wm_Status::info( __( 'Retrieving a list of all WordPress files...', AI1WM_PLUGIN_NAME ) );
32
+
33
+ // Open the archive file for reading
34
+ $archive = new Ai1wm_Extractor( ai1wm_archive_path( $params ) );
35
+
36
+ // Get number of files
37
+ $total = $archive->get_number_of_files();
38
+
39
+ // Close the archive file
40
+ $archive->close();
41
+
42
+ // Set total
43
+ $params['total'] = $total;
44
+
45
+ // Set progress
46
+ Ai1wm_Status::info( __( 'Done retrieving a list of all WordPress files.', AI1WM_PLUGIN_NAME ) );
47
+
48
+ return $params;
49
+ }
50
+ }
lib/model/import/class-ai1wm-import-resolve.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ *
18
+ * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
19
+ * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
20
+ * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
21
+ * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
22
+ * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
+ * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
+ */
25
+
26
+ class Ai1wm_Import_Resolve {
27
+
28
+ public static function execute( $params ) {
29
+
30
+ // Set progress
31
+ Ai1wm_Status::info( __( 'Resolving URL address...', AI1WM_PLUGIN_NAME ) );
32
+
33
+ // HTTP resolve
34
+ Ai1wm_Http::resolve( admin_url( 'admin-ajax.php?action=ai1wm_resolve' ) );
35
+
36
+ // Set progress
37
+ Ai1wm_Status::info( __( 'Done resolving URL address...', AI1WM_PLUGIN_NAME ) );
38
+
39
+ return $params;
40
+ }
41
+ }
lib/model/{class-ai1wm-import-file.php → import/class-ai1wm-import-upload.php} RENAMED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -23,39 +23,36 @@
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
 
26
- class Ai1wm_Import_File extends Ai1wm_Import_Abstract {
 
 
27
 
28
- public function import() {
29
  // Get upload file
30
  if ( ! isset( $_FILES['upload-file'] ) ) {
31
- wp_die( 'Unable to process file upload.' );
32
  }
33
 
34
  // Set chunk
35
- if ( isset( $this->args['chunk'] ) ) {
36
- $chunk = (int) $this->args['chunk'];
37
  } else {
38
  $chunk = 0;
39
  }
40
 
41
  // Set chunks
42
- if ( isset( $this->args['chunks'] ) ) {
43
- $chunks = (int) $this->args['chunks'];
44
  } else {
45
  $chunks = 1;
46
  }
47
 
48
- // Set archive
49
- if ( isset( $this->args['name'] ) ) {
50
- $this->args['archive'] = $this->args['name'];
51
- }
52
-
53
  // Has any upload error?
54
  if ( empty( $_FILES['upload-file']['error'] ) ) {
55
 
56
  // Open partial file
57
- $out = fopen( $this->storage()->archive(), $chunk === 0 ? 'wb' : 'ab' );
58
  if ( $out ) {
 
59
  // Read binary input stream and append it to temp file
60
  $in = fopen( $_FILES['upload-file']['tmp_name'], 'rb' );
61
  if ( $in ) {
@@ -75,5 +72,7 @@ class Ai1wm_Import_File extends Ai1wm_Import_Abstract {
75
  } else {
76
  status_header( 500 );
77
  }
 
 
78
  }
79
  }
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
 
26
+ class Ai1wm_Import_Upload {
27
+
28
+ public static function execute( $params ) {
29
 
 
30
  // Get upload file
31
  if ( ! isset( $_FILES['upload-file'] ) ) {
32
+ return $params;
33
  }
34
 
35
  // Set chunk
36
+ if ( isset( $params['chunk'] ) ) {
37
+ $chunk = (int) $params['chunk'];
38
  } else {
39
  $chunk = 0;
40
  }
41
 
42
  // Set chunks
43
+ if ( isset( $params['chunks'] ) ) {
44
+ $chunks = (int) $params['chunks'];
45
  } else {
46
  $chunks = 1;
47
  }
48
 
 
 
 
 
 
49
  // Has any upload error?
50
  if ( empty( $_FILES['upload-file']['error'] ) ) {
51
 
52
  // Open partial file
53
+ $out = fopen( ai1wm_archive_path( $params ), $chunk === 0 ? 'wb' : 'ab' );
54
  if ( $out ) {
55
+
56
  // Read binary input stream and append it to temp file
57
  $in = fopen( $_FILES['upload-file']['tmp_name'], 'rb' );
58
  if ( $in ) {
72
  } else {
73
  status_header( 500 );
74
  }
75
+
76
+ exit;
77
  }
78
  }
lib/model/import/class-ai1wm-import-validate.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ *
18
+ * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
19
+ * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
20
+ * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
21
+ * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
22
+ * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
+ * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
+ */
25
+
26
+ class Ai1wm_Import_Validate {
27
+
28
+ public static function execute( $params ) {
29
+
30
+ // Set progress
31
+ Ai1wm_Status::info( __( 'Unpacking archive...', AI1WM_PLUGIN_NAME ) );
32
+
33
+ // Open the archive file for reading
34
+ $archive = new Ai1wm_Extractor( ai1wm_archive_path( $params ) );
35
+
36
+ // Unpack package.json and database.sql files
37
+ $archive->extract_by_files_array(
38
+ ai1wm_storage_path( $params ),
39
+ array(
40
+ AI1WM_PACKAGE_NAME,
41
+ AI1WM_MULTISITE_NAME,
42
+ AI1WM_DATABASE_NAME,
43
+ )
44
+ );
45
+
46
+ // Close the archive file
47
+ $archive->close();
48
+
49
+ // Check package.json file
50
+ if ( false === is_file( ai1wm_package_path( $params ) ) ) {
51
+ throw new Ai1wm_Import_Exception(
52
+ __( 'Invalid archive file. It should contain <strong>package.json</strong> file.', AI1WM_PLUGIN_NAME )
53
+ );
54
+ }
55
+
56
+ return $params;
57
+ }
58
+ }
lib/model/service/class-ai1wm-service-database.php DELETED
@@ -1,307 +0,0 @@
1
- <?php
2
- /**
3
- * Copyright (C) 2014 ServMask Inc.
4
- *
5
- * This program is free software: you can redistribute it and/or modify
6
- * it under the terms of the GNU General Public License as published by
7
- * the Free Software Foundation, either version 3 of the License, or
8
- * (at your option) any later version.
9
- *
10
- * This program is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- * GNU General Public License for more details.
14
- *
15
- * You should have received a copy of the GNU General Public License
16
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
- *
18
- * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
19
- * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
20
- * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
21
- * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
22
- * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
- * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
- */
25
-
26
- class Ai1wm_Service_Database implements Ai1wm_Service_Interface {
27
-
28
- protected $args = array();
29
-
30
- protected $storage = null;
31
-
32
- public function __construct( array $args = array() ) {
33
- $this->args = $args;
34
- }
35
-
36
- /**
37
- * Import database
38
- *
39
- * @return void
40
- */
41
- public function import() {
42
- global $wpdb;
43
-
44
- // Get configuration
45
- $service = new Ai1wm_Service_Package( $this->args );
46
- $config = $service->import();
47
-
48
- $old_values = array();
49
- $new_values = array();
50
-
51
- // Get Site URL
52
- if ( isset( $config['SiteURL'] ) && ( $config['SiteURL'] !== site_url() ) ) {
53
-
54
- // Get domain
55
- $old_domain = parse_url( $config['SiteURL'], PHP_URL_HOST );
56
- $new_domain = parse_url( site_url(), PHP_URL_HOST );
57
-
58
- // Add plain Site URL
59
- $old_values[] = set_url_scheme( $config['SiteURL'], 'http' );
60
- $new_values[] = set_url_scheme( site_url() );
61
-
62
- // Add plain Site URL SSL
63
- $old_values[] = set_url_scheme( $config['SiteURL'], 'https' );
64
- $new_values[] = set_url_scheme( site_url() );
65
-
66
- // Add encoded Site URL
67
- $old_values[] = urlencode( set_url_scheme( $config['SiteURL'], 'http' ) );
68
- $new_values[] = urlencode( set_url_scheme( site_url() ) );
69
-
70
- // Add encoded Site URL SSL
71
- $old_values[] = urlencode( set_url_scheme( $config['SiteURL'], 'https' ) );
72
- $new_values[] = urlencode( set_url_scheme( site_url() ) );
73
-
74
- // Add escaped Site URL
75
- $old_values[] = addslashes( addcslashes( set_url_scheme( $config['SiteURL'], 'http' ), '/' ) );
76
- $new_values[] = addslashes( addcslashes( set_url_scheme( site_url() ), '/' ) );
77
-
78
- // Add escaped Site URL SSL
79
- $old_values[] = addslashes( addcslashes( set_url_scheme( $config['SiteURL'], 'https' ), '/' ) );
80
- $new_values[] = addslashes( addcslashes( set_url_scheme( site_url() ), '/' ) );
81
-
82
- // Add email
83
- $old_values[] = sprintf( "@%s", $old_domain );
84
- $new_values[] = sprintf( "@%s", $new_domain );
85
- }
86
-
87
- // Get Home URL
88
- if ( isset( $config['HomeURL'] ) && ( $config['HomeURL'] !== home_url() ) ) {
89
-
90
- // Add plain Home URL
91
- $old_values[] = set_url_scheme( $config['HomeURL'], 'http' );
92
- $new_values[] = set_url_scheme( home_url() );
93
-
94
- // Add plain Home URL SSL
95
- $old_values[] = set_url_scheme( $config['HomeURL'], 'https' );
96
- $new_values[] = set_url_scheme( home_url() );
97
-
98
- // Add encoded Home URL
99
- $old_values[] = urlencode( set_url_scheme( $config['HomeURL'], 'http' ) );
100
- $new_values[] = urlencode( set_url_scheme( home_url() ) );
101
-
102
- // Add encoded Home URL SSL
103
- $old_values[] = urlencode( set_url_scheme( $config['HomeURL'], 'https' ) );
104
- $new_values[] = urlencode( set_url_scheme( home_url() ) );
105
-
106
- // Add escaped Home URL
107
- $old_values[] = addslashes( addcslashes( set_url_scheme( $config['HomeURL'], 'http' ), '/' ) );
108
- $new_values[] = addslashes( addcslashes( set_url_scheme( home_url() ), '/' ) );
109
-
110
- // Add escaped Home URL SSL
111
- $old_values[] = addslashes( addcslashes( set_url_scheme( $config['HomeURL'], 'https' ), '/' ) );
112
- $new_values[] = addslashes( addcslashes( set_url_scheme( home_url() ), '/' ) );
113
- }
114
-
115
- // Get WordPress Content
116
- if ( isset( $config['WordPress']['Content'] ) && ( $config['WordPress']['Content'] !== WP_CONTENT_DIR ) ) {
117
-
118
- // Add plain WordPress Content
119
- $old_values[] = $config['WordPress']['Content'];
120
- $new_values[] = WP_CONTENT_DIR;
121
-
122
- // Get escaped WordPress Content
123
- $old_values[] = addslashes( addcslashes( $config['WordPress']['Content'], '\/' ) );
124
- $new_values[] = addslashes( addcslashes( WP_CONTENT_DIR, '\/' ) );
125
- }
126
-
127
- // Get user details
128
- if ( isset( $config['Import']['User']['Id'] ) && ( $id = $config['Import']['User']['Id'] ) ) {
129
- $meta = get_userdata( $id );
130
- $user = array(
131
- 'user_login' => $meta->user_login,
132
- 'user_pass' => $meta->user_pass,
133
- 'user_nicename' => $meta->user_nicename,
134
- 'user_url' => $meta->user_url,
135
- 'user_email' => $meta->user_email,
136
- 'display_name' => $meta->display_name,
137
- 'nickname' => $meta->nickname,
138
- 'first_name' => $meta->first_name,
139
- 'last_name' => $meta->last_name,
140
- 'description' => $meta->description,
141
- 'rich_editing' => $meta->rich_editing,
142
- 'user_registered' => $meta->user_registered,
143
- 'jabber' => $meta->jabber,
144
- 'aim' => $meta->aim,
145
- 'yim' => $meta->yim,
146
- 'show_admin_bar_front' => $meta->show_admin_bar_front,
147
- );
148
- } else {
149
- $user = array();
150
- }
151
-
152
- // Get URL IP
153
- $url_ip = get_site_option( AI1WM_URL_IP, false, false );
154
-
155
- // Get URL transport
156
- $url_transport = get_site_option( AI1WM_URL_TRANSPORT, false, false );
157
-
158
- // Get secret key
159
- $secret_key = get_site_option( AI1WM_SECRET_KEY, false, false );
160
-
161
- // Get HTTP user
162
- $auth_user = get_site_option( AI1WM_AUTH_USER, false, false );
163
-
164
- // Get HTTP password
165
- $auth_password = get_site_option( AI1WM_AUTH_PASSWORD, false, false );
166
-
167
- // Get active plugins
168
- $active_plugins = get_site_option( AI1WM_ACTIVE_PLUGINS, array(), false );
169
-
170
- // Get database client
171
- $client = MysqlDumpFactory::makeMysqlDump( DB_HOST, DB_USER, DB_PASSWORD, DB_NAME );
172
-
173
- // Set database options
174
- $client->setOldTablePrefixes( array( AI1WM_TABLE_PREFIX ) )
175
- ->setNewTablePrefixes( array( $wpdb->prefix ) )
176
- ->setOldReplaceValues( $old_values )
177
- ->setNewReplaceValues( $new_values );
178
-
179
- // Flush database
180
- if ( ( $version = $config['Plugin']['Version'] ) ) {
181
- if ( $version !== 'develop' && version_compare( $version, '4.9', '<' ) ) {
182
- $client->setIncludeTablePrefixes( array( $wpdb->prefix ) );
183
- $client->flush();
184
- }
185
- }
186
-
187
- // Import database
188
- $client->import( $this->storage()->database() );
189
-
190
- // Clear WP options cache
191
- wp_cache_flush();
192
-
193
- // Activate plugins
194
- foreach ( $active_plugins as $plugin ) {
195
- if ( in_array( $plugin, ai1wm_active_plugins() ) ) {
196
- activate_plugin( $plugin );
197
- }
198
- }
199
-
200
- // Set new user identity
201
- if ( isset( $config['Export']['User']['Id'] ) && ( $id = $config['Export']['User']['Id'] ) ) {
202
-
203
- // Update user login and password
204
- if ( isset( $user['user_login'] ) && isset( $user['user_pass'] ) ) {
205
- $wpdb->update(
206
- $wpdb->users,
207
- array( 'user_login' => $user['user_login'], 'user_pass' => $user['user_pass'] ),
208
- array( 'ID' => $id ),
209
- array( '%s', '%s' ),
210
- array( '%d' )
211
- );
212
-
213
- // Unset user login
214
- unset( $user['user_login'] );
215
-
216
- // Unset user password
217
- unset( $user['user_pass'] );
218
- }
219
-
220
- // Update user details
221
- $result = wp_update_user( array( 'ID' => $id ) + $user );
222
-
223
- // Log the error
224
- if ( is_wp_error( $result ) ) {
225
- Ai1wm_Log::error( 'Exception while importing user identity: ' . $result->get_error_message() );
226
- }
227
- }
228
-
229
- // Set the new URL IP
230
- update_site_option( AI1WM_URL_IP, $url_ip );
231
-
232
- // Set the new URL transport
233
- update_site_option( AI1WM_URL_TRANSPORT, $url_transport );
234
-
235
- // Set the new secret key value
236
- update_site_option( AI1WM_SECRET_KEY, $secret_key );
237
-
238
- // Set the new HTTP user
239
- update_site_option( AI1WM_AUTH_USER, $auth_user );
240
-
241
- // Set the new HTTP password
242
- update_site_option( AI1WM_AUTH_PASSWORD, $auth_password );
243
- }
244
-
245
- /**
246
- * Export database
247
- *
248
- * @return void
249
- */
250
- public function export() {
251
- global $wpdb;
252
-
253
- // Get database client
254
- $client = MysqlDumpFactory::makeMysqlDump( DB_HOST, DB_USER, DB_PASSWORD, DB_NAME );
255
-
256
- // Spam comments
257
- if ( isset( $this->args['options']['no-spam-comments'] ) ) {
258
- $client->setTableQueryClauses( $wpdb->comments, " WHERE comment_approved != 'spam' " );
259
- $client->setTableQueryClauses( $wpdb->commentmeta, sprintf(
260
- " WHERE comment_id IN ( SELECT comment_ID FROM `%s` WHERE comment_approved != 'spam' ) ",
261
- $wpdb->comments
262
- ) );
263
- }
264
-
265
- // Post revisions
266
- if ( isset( $this->args['options']['no-revisions'] ) ) {
267
- $client->setTableQueryClauses( $wpdb->posts, " WHERE post_type != 'revision' " );
268
- }
269
-
270
- // Find and replace
271
- $old_values = array();
272
- $new_values = array();
273
- if ( isset( $this->args['options']['replace'] ) && ( $replace = $this->args['options']['replace'] ) ) {
274
- for ( $i = 0; $i < count( $replace['old-value'] ); $i++ ) {
275
- if ( ! empty( $replace['old-value'][$i] ) && ! empty( $replace['new-value'][$i] ) ) {
276
- $old_values[] = $replace['old-value'][$i];
277
- $new_values[] = $replace['new-value'][$i];
278
- }
279
- }
280
- }
281
-
282
- // Set database options
283
- $client->setOldTablePrefixes( array( $wpdb->prefix ) )
284
- ->setNewTablePrefixes( array( AI1WM_TABLE_PREFIX ) )
285
- ->setOldReplaceValues( $old_values )
286
- ->setNewReplaceValues( $new_values )
287
- ->setIncludeTablePrefixes( array( $wpdb->prefix ) )
288
- ->setTablePrefixColumns( $wpdb->options, array( 'option_name' ) )
289
- ->setTablePrefixColumns( $wpdb->usermeta, array( 'meta_key' ) );
290
-
291
- // Export database
292
- $client->export( $this->storage()->database() );
293
- }
294
-
295
- /*
296
- * Get storage object
297
- *
298
- * @return Ai1wm_Storage
299
- */
300
- protected function storage() {
301
- if ( $this->storage === null ) {
302
- $this->storage = new Ai1wm_Storage( $this->args );
303
- }
304
-
305
- return $this->storage;
306
- }
307
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib/model/service/class-ai1wm-service-package.php DELETED
@@ -1,142 +0,0 @@
1
- <?php
2
- /**
3
- * Copyright (C) 2014 ServMask Inc.
4
- *
5
- * This program is free software: you can redistribute it and/or modify
6
- * it under the terms of the GNU General Public License as published by
7
- * the Free Software Foundation, either version 3 of the License, or
8
- * (at your option) any later version.
9
- *
10
- * This program is distributed in the hope that it will be useful,
11
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
- * GNU General Public License for more details.
14
- *
15
- * You should have received a copy of the GNU General Public License
16
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
- *
18
- * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
19
- * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
20
- * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
21
- * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
22
- * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
- * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
- */
25
-
26
- class Ai1wm_Service_Package implements Ai1wm_Service_Interface {
27
-
28
- protected $args = array();
29
-
30
- protected $storage = null;
31
-
32
- public function __construct( array $args = array() ) {
33
- $this->args = $args;
34
- }
35
-
36
- /**
37
- * Import package configuration
38
- *
39
- * @return array
40
- */
41
- public function import() {
42
- global $wp_version;
43
-
44
- $config = array();
45
-
46
- // Get package file
47
- $package = file_get_contents( $this->storage()->package() );
48
- if ( false === $package ) {
49
- throw new Ai1wm_Import_Exception( 'Unable to read package.json file' );
50
- }
51
-
52
- // Get config data
53
- if ( ( $config = json_decode( $package, true ) ) ) {
54
-
55
- // Add plugin version
56
- if ( ! isset( $config['Plugin']['Version'] ) ) {
57
- $config['Plugin']['Version'] = AI1WM_VERSION;
58
- }
59
-
60
- // Add WordPress version
61
- if ( ! isset( $config['WordPress']['Version'] ) ) {
62
- $config['WordPress']['Version'] = $wp_version;
63
- }
64
-
65
- // Add WordPress content
66
- if ( ! isset( $config['WordPress']['Content'] ) ) {
67
- $config['WordPress']['Content'] = WP_CONTENT_DIR;
68
- }
69
-
70
- // Add user identity
71
- if ( ! isset( $config['Import']['User'] ) && ! empty( $config['Export']['User'] ) ) {
72
- $config['Import']['User'] = array( 'Id' => get_current_user_id() );
73
-
74
- // Save package file
75
- $package = file_put_contents( $this->storage()->package(), json_encode( $config ) );
76
- if ( false === $package ) {
77
- throw new Ai1wm_Import_Exception( 'Unable to write package.json file' );
78
- }
79
- }
80
- } else {
81
- throw new Ai1wm_Import_Exception( 'Unable to parse package.json file' );
82
- }
83
-
84
- return $config;
85
- }
86
-
87
- /**
88
- * Export package configuration
89
- *
90
- * @return string
91
- */
92
- public function export() {
93
- global $wp_version;
94
-
95
- // Get options
96
- $options = wp_load_alloptions();
97
-
98
- // Get Site URL
99
- $site_url = site_url();
100
- if ( isset( $options['siteurl'] ) ) {
101
- $site_url = untrailingslashit( $options['siteurl'] );
102
- }
103
-
104
- // Get Home URL
105
- $home_url = home_url();
106
- if ( isset( $options['home'] ) ) {
107
- $home_url = untrailingslashit( $options['home'] );
108
- }
109
-
110
- // Default configuration
111
- $config = array(
112
- 'SiteURL' => $site_url,
113
- 'HomeURL' => $home_url,
114
- 'Plugin' => array( 'Version' => AI1WM_VERSION ),
115
- 'WordPress' => array( 'Version' => $wp_version, 'Content' => WP_CONTENT_DIR ),
116
- );
117
-
118
- // Get user identity
119
- if ( apply_filters( 'ai1wm_keep_user_identity_on_export', false ) ) {
120
- $config['Export']['User'] = array( 'Id' => get_current_user_id() );
121
- }
122
-
123
- // Save package file
124
- $package = file_put_contents( $this->storage()->package(), json_encode( $config ) );
125
- if ( false === $package ) {
126
- throw new Ai1wm_Import_Exception( 'Unable to write package.json file' );
127
- }
128
- }
129
-
130
- /*
131
- * Get storage object
132
- *
133
- * @return Ai1wm_Storage
134
- */
135
- protected function storage() {
136
- if ( $this->storage === null ) {
137
- $this->storage = new Ai1wm_Storage( $this->args );
138
- }
139
-
140
- return $this->storage;
141
- }
142
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib/vendor/mysqldump-factory/mysqldump-factory/LICENSE DELETED
@@ -1,20 +0,0 @@
1
- The MIT License (MIT)
2
-
3
- Copyright (c) 2013 Yani Iliev, Bobby Angelov
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy of
6
- this software and associated documentation files (the "Software"), to deal in
7
- the Software without restriction, including without limitation the rights to
8
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
- the Software, and to permit persons to whom the Software is furnished to do so,
10
- subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
- FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
- COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
- IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib/vendor/mysqldump-factory/mysqldump-factory/lib/MysqlDumpInterface.php DELETED
@@ -1,196 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Copyright (C) 2014 ServMask Inc.
5
- *
6
- * This program is free software: you can redistribute it and/or modify
7
- * it under the terms of the GNU General Public License as published by
8
- * the Free Software Foundation, either version 3 of the License, or
9
- * (at your option) any later version.
10
- *
11
- * This program is distributed in the hope that it will be useful,
12
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- * GNU General Public License for more details.
15
- *
16
- * You should have received a copy of the GNU General Public License
17
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
18
- *
19
- * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
20
- * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
21
- * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
22
- * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
23
- * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
24
- * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
25
- */
26
-
27
- interface MysqlDumpInterface
28
- {
29
-
30
- const QUERIES_PER_TRANSACTION = 1000;
31
-
32
- /**
33
- * Define MySQL credentials for the current connection
34
- *
35
- * @param string $hostname MySQL Hostname
36
- * @param string $username MySQL Username
37
- * @param string $password MySQL Password
38
- * @param string $database MySQL Database
39
- * @return void
40
- */
41
- public function __construct($hostname = 'localhost', $username = '', $password = '', $database = '');
42
-
43
- /**
44
- * Set old table prefix
45
- *
46
- * @param array $prefixes List of table prefixes
47
- * @return MysqlDumpInterface
48
- */
49
- public function setOldTablePrefixes($prefixes);
50
-
51
- /**
52
- * Get old table prefixes
53
- *
54
- * @return array
55
- */
56
- public function getOldTablePrefixes();
57
-
58
- /**
59
- * Set new table prefixes
60
- *
61
- * @param array $prefixes List of table prefixes
62
- * @return MysqlDumpInterface
63
- */
64
- public function setNewTablePrefixes($prefixes);
65
-
66
- /**
67
- * Get new table prefixes
68
- *
69
- * @return array
70
- */
71
- public function getNewTablePrefixes();
72
-
73
- /**
74
- * Set old replace values
75
- *
76
- * @param array $values List of values
77
- * @return MysqlDumpInterface
78
- */
79
- public function setOldReplaceValues($values);
80
-
81
- /**
82
- * Get old replace values
83
- *
84
- * @return array
85
- */
86
- public function getOldReplaceValues();
87
-
88
- /**
89
- * Set new replace values
90
- *
91
- * @param array $values List of values
92
- * @return MysqlDumpInterface
93
- */
94
- public function setNewReplaceValues($values);
95
-
96
- /**
97
- * Get new replace values
98
- *
99
- * @return array
100
- */
101
- public function getNewReplaceValues();
102
-
103
- /**
104
- * Set table query clauses
105
- *
106
- * @param string $table Table name
107
- * @param array $clauses Table clauses
108
- * @return MysqlDumpInterface
109
- */
110
- public function setTableQueryClauses($table, $clauses);
111
-
112
- /**
113
- * Get table query clauses
114
- *
115
- * @param string $table Table name
116
- * @return array
117
- */
118
- public function getTableQueryClauses($table);
119
-
120
- /**
121
- * Set table prefix columns
122
- *
123
- * @param string $table Table name
124
- * @param array $columns Table columns
125
- * @return MysqlDumpInterface
126
- */
127
- public function setTablePrefixColumns($table, $columns);
128
-
129
- /**
130
- * Get table prefix columns
131
- *
132
- * @param string $table Table name
133
- * @return array
134
- */
135
- public function getTablePrefixColumns($table);
136
-
137
- /**
138
- * Set exclude table prefixes
139
- *
140
- * @param array $prefixes List of table prefixes
141
- * @return MysqlDumpInterface
142
- */
143
- public function setExcludeTablePrefixes($prefixes);
144
-
145
- /**
146
- * Get exclude table prefixes
147
- *
148
- * @return array
149
- */
150
- public function getExcludeTablePrefixes();
151
-
152
- /**
153
- * Get tables
154
- *
155
- * @return array
156
- */
157
- public function getTables();
158
-
159
- /**
160
- * Get MySQL connection (lazy loading)
161
- *
162
- * @return resource
163
- */
164
- public function getConnection();
165
-
166
- /**
167
- * Run MySQL query
168
- *
169
- * @param string $query SQL query
170
- * @return resource
171
- */
172
- public function query($query);
173
-
174
- /**
175
- * Export database into a file
176
- *
177
- * @param string $fileName Name of file
178
- * @return bool
179
- */
180
- public function export($fileName);
181
-
182
- /**
183
- * Import database from file
184
- *
185
- * @param string $fileName Name of file
186
- * @return bool
187
- */
188
- public function import($fileName);
189
-
190
- /**
191
- * Flush database
192
- *
193
- * @return void
194
- */
195
- public function flush();
196
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib/vendor/mysqldump-factory/mysqldump-factory/lib/MysqlDumpPDO.php DELETED
@@ -1,974 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Copyright (C) 2014 ServMask Inc.
5
- *
6
- * This program is free software: you can redistribute it and/or modify
7
- * it under the terms of the GNU General Public License as published by
8
- * the Free Software Foundation, either version 3 of the License, or
9
- * (at your option) any later version.
10
- *
11
- * This program is distributed in the hope that it will be useful,
12
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- * GNU General Public License for more details.
15
- *
16
- * You should have received a copy of the GNU General Public License
17
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
18
- *
19
- * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
20
- * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
21
- * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
22
- * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
23
- * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
24
- * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
25
- */
26
-
27
- require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'MysqlDumpInterface.php';
28
- require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'MysqlDumpUtility.php';
29
-
30
- class MysqlDumpPDO implements MysqlDumpInterface
31
- {
32
- protected $hostname = null;
33
-
34
- protected $port = null;
35
-
36
- protected $socket = null;
37
-
38
- protected $username = null;
39
-
40
- protected $password = null;
41
-
42
- protected $database = null;
43
-
44
- protected $connection = null;
45
-
46
- protected $oldTablePrefixes = null;
47
-
48
- protected $newTablePrefixes = null;
49
-
50
- protected $oldReplaceValues = array();
51
-
52
- protected $newReplaceValues = array();
53
-
54
- protected $tableQueryClauses = array();
55
-
56
- protected $tablePrefixColumns = array();
57
-
58
- protected $includeTablePrefixes = array();
59
-
60
- protected $excludeTablePrefixes = array();
61
-
62
- /**
63
- * Define MySQL credentials for the current connection
64
- *
65
- * @param string $hostname MySQL Hostname
66
- * @param string $username MySQL Username
67
- * @param string $password MySQL Password
68
- * @param string $database MySQL Database
69
- * @return void
70
- */
71
- public function __construct($hostname = 'localhost', $username = '', $password = '', $database = '')
72
- {
73
- $dsn = $this->parseDSN($hostname);
74
-
75
- // Set MySQL credentials
76
- $this->hostname = $dsn['host'];
77
- $this->port = $dsn['port'];
78
- $this->socket = $dsn['socket'];
79
- $this->username = $username;
80
- $this->password = $password;
81
- $this->database = $database;
82
- }
83
-
84
- /**
85
- * Set old table prefixes
86
- *
87
- * @param array $prefixes List of table prefixes
88
- * @return MysqlDumpPDO
89
- */
90
- public function setOldTablePrefixes($prefixes)
91
- {
92
- $this->oldTablePrefixes = $prefixes;
93
-
94
- return $this;
95
- }
96
-
97
- /**
98
- * Get old table prefixes
99
- *
100
- * @return array
101
- */
102
- public function getOldTablePrefixes()
103
- {
104
- return $this->oldTablePrefixes;
105
- }
106
-
107
- /**
108
- * Set new table prefixes
109
- *
110
- * @param array $prefix List of table prefixes
111
- * @return MysqlDumpPDO
112
- */
113
- public function setNewTablePrefixes($prefixes)
114
- {
115
- $this->newTablePrefixes = $prefixes;
116
-
117
- return $this;
118
- }
119
-
120
- /**
121
- * Get new table prefixes
122
- *
123
- * @return array
124
- */
125
- public function getNewTablePrefixes()
126
- {
127
- return $this->newTablePrefixes;
128
- }
129
-
130
- /**
131
- * Set old replace values
132
- *
133
- * @param array $values List of values
134
- * @return MysqlDumpPDO
135
- */
136
- public function setOldReplaceValues($values)
137
- {
138
- $this->oldReplaceValues = $values;
139
-
140
- return $this;
141
- }
142
-
143
- /**
144
- * Get old replace values
145
- *
146
- * @return array
147
- */
148
- public function getOldReplaceValues()
149
- {
150
- return $this->oldReplaceValues;
151
- }
152
-
153
- /**
154
- * Set new replace values
155
- *
156
- * @param array $values List of values
157
- * @return MysqlDumpPDO
158
- */
159
- public function setNewReplaceValues($values)
160
- {
161
- $this->newReplaceValues = $values;
162
-
163
- return $this;
164
- }
165
-
166
- /**
167
- * Get new replace values
168
- *
169
- * @return array
170
- */
171
- public function getNewReplaceValues()
172
- {
173
- return $this->newReplaceValues;
174
- }
175
-
176
- /**
177
- * Set table query clauses
178
- *
179
- * @param string $table Table name
180
- * @param array $clauses Table clauses
181
- * @return MysqlDumpPDO
182
- */
183
- public function setTableQueryClauses($table, $clauses)
184
- {
185
- $this->tableQueryClauses[strtolower($table)] = $clauses;
186
-
187
- return $this;
188
- }
189
-
190
- /**
191
- * Get table query clauses
192
- *
193
- * @param string $table Table name
194
- * @return array
195
- */
196
- public function getTableQueryClauses($table)
197
- {
198
- if (isset($this->tableQueryClauses[strtolower($table)])) {
199
- return $this->tableQueryClauses[strtolower($table)];
200
- }
201
-
202
- return array();
203
- }
204
-
205
- /**
206
- * Set table prefix columns
207
- *
208
- * @param string $table Table name
209
- * @param array $columns Table columns
210
- * @return MysqlDumpPDO
211
- */
212
- public function setTablePrefixColumns($table, $columns)
213
- {
214
- foreach ($columns as $column) {
215
- $this->tablePrefixColumns[strtolower($table)][strtolower($column)] = true;
216
- }
217
-
218
- return $this;
219
- }
220
-
221
- /**
222
- * Get table prefix columns
223
- *
224
- * @param string $table Table name
225
- * @return array
226
- */
227
- public function getTablePrefixColumns($table)
228
- {
229
- if (isset($this->tablePrefixColumns[strtolower($table)])) {
230
- return $this->tablePrefixColumns[strtolower($table)];
231
- }
232
-
233
- return array();
234
- }
235
-
236
- /**
237
- * Set include table prefixes
238
- *
239
- * @param array $prefixes List of table prefixes
240
- * @return MysqlDumpPDO
241
- */
242
- public function setIncludeTablePrefixes($prefixes)
243
- {
244
- $this->includeTablePrefixes = $prefixes;
245
-
246
- return $this;
247
- }
248
-
249
- /**
250
- * Get include table prefixes
251
- *
252
- * @return array
253
- */
254
- public function getIncludeTablePrefixes()
255
- {
256
- return $this->includeTablePrefixes;
257
- }
258
-
259
- /**
260
- * Set exclude table prefixes
261
- *
262
- * @param array $prefixes List of table prefixes
263
- * @return MysqlDumpPDO
264
- */
265
- public function setExcludeTablePrefixes($prefixes)
266
- {
267
- $this->excludeTablePrefixes = $prefixes;
268
-
269
- return $this;
270
- }
271
-
272
- /**
273
- * Get exclude table prefixes
274
- *
275
- * @return array
276
- */
277
- public function getExcludeTablePrefixes()
278
- {
279
- return $this->excludeTablePrefixes;
280
- }
281
-
282
- /**
283
- * Get tables
284
- *
285
- * @return array
286
- */
287
- public function getTables()
288
- {
289
- $tables = array();
290
-
291
- try {
292
- $result = $this->getConnection()->query(
293
- "SELECT TABLE_NAME AS TableName FROM `INFORMATION_SCHEMA`.`TABLES` WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA = '{$this->database}'"
294
- );
295
- while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
296
- if (isset($row['TableName']) && ($tableName = $row['TableName'])) {
297
-
298
- // Include table prefixes
299
- if ($this->getIncludeTablePrefixes()) {
300
- $include = false;
301
-
302
- // Check table prefixes
303
- foreach ($this->getIncludeTablePrefixes() as $prefix) {
304
- if (stripos($tableName, $prefix) === 0) {
305
- $include = true;
306
- break;
307
- }
308
- }
309
-
310
- // Skip current table
311
- if ($include === false) {
312
- continue;
313
- }
314
- }
315
-
316
- // Exclude table prefixes
317
- if ($this->getExcludeTablePrefixes()) {
318
- $exclude = false;
319
-
320
- // Check table prefixes
321
- foreach ($this->getExcludeTablePrefixes() as $prefix) {
322
- if (stripos($tableName, $prefix) === 0) {
323
- $exclude = true;
324
- break;
325
- }
326
- }
327
-
328
- // Skip current table
329
- if ($exclude === true) {
330
- continue;
331
- }
332
- }
333
-
334
- // Add table name
335
- $tables[] = $tableName;
336
- }
337
- }
338
- } catch (Exception $e) {
339
- $result = $this->getConnection()->query("SHOW TABLES FROM `{$this->database}`");
340
- while ($row = $result->fetch(PDO::FETCH_NUM)) {
341
- if (isset($row[0]) && ($tableName = $row[0])) {
342
-
343
- // Include table prefixes
344
- if ($this->getIncludeTablePrefixes()) {
345
- $include = false;
346
-
347
- // Check table prefixes
348
- foreach ($this->getIncludeTablePrefixes() as $prefix) {
349
- if (stripos($tableName, $prefix) === 0) {
350
- $include = true;
351
- break;
352
- }
353
- }
354
-
355
- // Skip current table
356
- if ($include === false) {
357
- continue;
358
- }
359
- }
360
-
361
- // Exclude table prefixes
362
- if ($this->getExcludeTablePrefixes()) {
363
- $exclude = false;
364
-
365
- // Check table prefixes
366
- foreach ($this->getExcludeTablePrefixes() as $prefix) {
367
- if (stripos($tableName, $prefix) === 0) {
368
- $exclude = true;
369
- break;
370
- }
371
- }
372
-
373
- // Skip current table
374
- if ($exclude === true) {
375
- continue;
376
- }
377
- }
378
-
379
- // Add table name
380
- $tables[] = $tableName;
381
- }
382
- }
383
- }
384
-
385
- return $tables;
386
- }
387
-
388
- /**
389
- * Get MySQL connection (lazy loading)
390
- *
391
- * @return PDO
392
- */
393
- public function getConnection()
394
- {
395
- if ($this->connection === null) {
396
- try {
397
- // Make connection (Socket)
398
- $this->connection = $this->makeConnection();
399
- } catch (Exception $e) {
400
- try {
401
- // Make connection (TCP)
402
- $this->connection = $this->makeConnection(false);
403
- } catch (Exception $e) {
404
- throw new Exception('Unable to connect to MySQL database server: ' . $e->getMessage());
405
- }
406
- }
407
- }
408
-
409
- return $this->connection;
410
- }
411
-
412
- /**
413
- * Run MySQL query
414
- *
415
- * @param string $query SQL query
416
- * @return resource
417
- */
418
- public function query($query)
419
- {
420
- return $this->getConnection()->query($query);
421
- }
422
-
423
- /**
424
- * Export database into a file
425
- *
426
- * @param string $fileName Name of file
427
- * @return bool
428
- */
429
- public function export($fileName)
430
- {
431
- // Set file handler
432
- $fileHandler = fopen($fileName, 'wb');
433
- if ($fileHandler === false) {
434
- throw new Exception('Unable to open database file');
435
- }
436
-
437
- // Write headers
438
- if (fwrite($fileHandler, $this->getHeader()) === false) {
439
- throw new Exception('Unable to write database header information');
440
- }
441
-
442
- // Export tables
443
- foreach ($this->getTables() as $tableName) {
444
-
445
- // Replace table name prefixes
446
- $newTableName = $this->replaceTablePrefixes($tableName, true);
447
-
448
- // Get table structure
449
- $structure = $this->getConnection()->query("SHOW CREATE TABLE `$tableName`");
450
- $table = $structure->fetch(PDO::FETCH_ASSOC);
451
-
452
- // Close structure cursor
453
- $structure->closeCursor();
454
-
455
- // Get create table
456
- if (isset($table['Create Table'])) {
457
-
458
- // Write table drop statement
459
- $dropTable = "DROP TABLE IF EXISTS `$newTableName`;\n";
460
-
461
- // Write table statement
462
- if (fwrite($fileHandler, $dropTable) === false) {
463
- throw new Exception('Unable to write database table statement');
464
- }
465
-
466
- // Replace create table prefixes
467
- $createTable = $this->replaceTablePrefixes($table['Create Table'], true);
468
-
469
- // Strip table constraints
470
- $createTable = $this->stripTableConstraints($createTable);
471
-
472
- // Write table structure
473
- if (fwrite($fileHandler, $createTable) === false) {
474
- throw new Exception('Unable to write database table structure');
475
- }
476
-
477
- // Write end of statement
478
- if (fwrite($fileHandler, ";\n\n") === false) {
479
- throw new Exception('Unable to write database end of statement');
480
- }
481
-
482
- // Set query
483
- $query = "SELECT * FROM `$tableName` ";
484
-
485
- // Apply additional table query clauses
486
- if (($queryClauses = $this->getTableQueryClauses($tableName))) {
487
- $query .= $queryClauses;
488
- }
489
-
490
- // Apply additional table prefix columns
491
- $columns = $this->getTablePrefixColumns($tableName);
492
-
493
- // Get results
494
- $result = $this->getConnection()->query($query);
495
-
496
- $processedRows = 0;
497
-
498
- // Generate insert statements
499
- while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
500
- if ($processedRows === 0) {
501
- // Write start transaction
502
- if (fwrite($fileHandler, "START TRANSACTION;\n") === false) {
503
- throw new Exception('Unable to write database start transaction');
504
- }
505
- }
506
-
507
- $items = array();
508
- foreach ($row as $key => $value) {
509
- // Replace table prefix columns
510
- if (isset($columns[strtolower($key)])) {
511
- $value = $this->replaceTablePrefixes($value, true, 0);
512
- }
513
-
514
- // Replace table values
515
- $items[] = is_null($value) ? 'NULL' : $this->getConnection()->quote($this->replaceTableValues($value));
516
- }
517
-
518
- // Set table values
519
- $tableValues = implode(',', $items);
520
-
521
- // Set insert statement
522
- $tableInsert = "INSERT INTO `$newTableName` VALUES ($tableValues);\n";
523
-
524
- // Write insert statement
525
- if (fwrite($fileHandler, $tableInsert) === false) {
526
- throw new Exception('Unable to write database insert statement');
527
- }
528
-
529
- $processedRows++;
530
-
531
- // Write end of transaction
532
- if ($processedRows === MysqlDumpInterface::QUERIES_PER_TRANSACTION) {
533
- if (fwrite($fileHandler, "COMMIT;\n") === false) {
534
- throw new Exception('Unable to write database end of transaction');
535
- }
536
-
537
- $processedRows = 0;
538
- }
539
- }
540
-
541
- // Write end of transaction
542
- if ($processedRows !== 0) {
543
- if (fwrite($fileHandler, "COMMIT;\n") === false) {
544
- throw new Exception('Unable to write database end of transaction');
545
- }
546
- }
547
-
548
- // Write end of statements
549
- if (fwrite($fileHandler, "\n") === false) {
550
- throw new Exception('Unable to write database end of statement');
551
- }
552
-
553
- // Close result cursor
554
- $result->closeCursor();
555
- }
556
- }
557
-
558
- // Close file handler
559
- fclose($fileHandler);
560
-
561
- return true;
562
- }
563
-
564
- /**
565
- * Import database from a file
566
- *
567
- * @param string $fileName Name of file
568
- * @return bool
569
- */
570
- public function import($fileName)
571
- {
572
- // Set collation name
573
- $collation = $this->getCollation('utf8mb4_general_ci');
574
-
575
- // Set max allowed packet
576
- $maxAllowedPacket = $this->getMaxAllowedPacket();
577
-
578
- // Set file handler
579
- $fileHandler = fopen($fileName, 'r');
580
- if ($fileHandler === false) {
581
- throw new Exception('Unable to open database file');
582
- }
583
-
584
- $passed = 0;
585
- $failed = 0;
586
- $query = null;
587
-
588
- // Read database file line by line
589
- while (($line = fgets($fileHandler)) !== false) {
590
- $query .= $line;
591
-
592
- // End of query
593
- if (preg_match('/;\s*$/', $query)) {
594
-
595
- // Check max allowed packet
596
- if (strlen($query) <= $maxAllowedPacket) {
597
-
598
- // Replace table prefixes
599
- $query = $this->replaceTablePrefixes($query);
600
-
601
- // Replace table values
602
- $query = $this->replaceTableValues($query, true);
603
-
604
- // Replace table collation
605
- if (empty($collation)) {
606
- $query = $this->replaceTableCollation($query);
607
- }
608
-
609
- try {
610
- // Run SQL query
611
- $result = $this->getConnection()->query($query);
612
- if ($result === false) {
613
- throw new PDOException(var_export($this->getConnection()->errorinfo(), true));
614
- } else {
615
- $passed++;
616
- }
617
-
618
- } catch (PDOException $e) {
619
- $failed++;
620
- }
621
-
622
- } else {
623
- $failed++;
624
- }
625
-
626
- $query = null;
627
- }
628
- }
629
-
630
- // Close file handler
631
- fclose($fileHandler);
632
-
633
- // Check failed queries
634
- if ((($failed / $passed) * 100) > 2) {
635
- return false;
636
- }
637
-
638
- return true;
639
- }
640
-
641
- /**
642
- * Flush database
643
- *
644
- * @return void
645
- */
646
- public function flush()
647
- {
648
- $dropTables = array();
649
- foreach ($this->getTables() as $tableName) {
650
- $dropTables[] = "DROP TABLE IF EXISTS `$tableName`";
651
- }
652
-
653
- // Drop tables
654
- foreach ($dropTables as $dropQuery) {
655
- $this->getConnection()->query($dropQuery);
656
- }
657
- }
658
-
659
- /**
660
- * Get MySQL version
661
- *
662
- * @return string
663
- */
664
- protected function getVersion() {
665
- try {
666
- $result = $this->getConnection()->query("SELECT @@version AS VersionName");
667
- while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
668
- if (isset($row['VersionName'])) {
669
- return $row['VersionName'];
670
- }
671
- }
672
- } catch (Exception $e) {
673
- $result = $this->getConnection()->query("SHOW VARIABLES LIKE 'version'");
674
- while ($row = $result->fetch(PDO::FETCH_NUM)) {
675
- if (isset($row[1])) {
676
- return $row[1];
677
- }
678
- }
679
- }
680
- }
681
-
682
- /**
683
- * Get MySQL max allowed packaet
684
- *
685
- * @return integer
686
- */
687
- protected function getMaxAllowedPacket() {
688
- try {
689
- $result = $this->getConnection()->query("SELECT @@max_allowed_packet AS MaxAllowedPacket");
690
- while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
691
- if (isset($row['MaxAllowedPacket'])) {
692
- return $row['MaxAllowedPacket'];
693
- }
694
- }
695
- } catch (Exception $e) {
696
- $result = $this->getConnection()->query("SHOW VARIABLES LIKE 'max_allowed_packet'");
697
- while ($row = $result->fetch(PDO::FETCH_NUM)) {
698
- if (isset($row[1])) {
699
- return $row[1];
700
- }
701
- }
702
- }
703
- }
704
-
705
- /**
706
- * Get MySQL collation name
707
- *
708
- * @param string $collationName Collation name
709
- * @return string
710
- */
711
- protected function getCollation($collationName) {
712
- try {
713
- $result = $this->getConnection()->query(
714
- "SELECT COLLATION_NAME AS CollationName FROM `INFORMATION_SCHEMA`.`COLLATIONS` WHERE COLLATION_NAME = '$collationName'"
715
- );
716
- while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
717
- if (isset($row['CollationName'])) {
718
- return $row['CollationName'];
719
- }
720
- }
721
- } catch (Exception $e) {
722
- $result = $this->getConnection()->query("SHOW COLLATION LIKE '$collationName'");
723
- while ($row = $result->fetch(PDO::FETCH_NUM)) {
724
- if (isset($row[0])) {
725
- return $row[0];
726
- }
727
- }
728
- }
729
- }
730
-
731
- /**
732
- * Replace table prefixes
733
- *
734
- * @param string $input Table value
735
- * @param boolean $first Replace first occurrence at any position
736
- * @param boolean $position Replace first occurrence at a specified position
737
- * @return string
738
- */
739
- protected function replaceTablePrefixes($input, $first = false, $position = false)
740
- {
741
- // Get table prefixes
742
- $search = $this->getOldTablePrefixes();
743
- $replace = $this->getNewTablePrefixes();
744
-
745
- // Replace table prefixes
746
- if ($first) {
747
-
748
- // Replace first occurance at a specified position
749
- if ($position !== false) {
750
- for ($i = 0; $i < count($search); $i++) {
751
- $current = stripos($input, $search[$i]);
752
- if ($current === $position) {
753
- $input = substr_replace($input, $replace[$i], $current, strlen($search[$i]));
754
- }
755
- }
756
-
757
- return $input;
758
- }
759
-
760
- // Replace first occurance at any position
761
- for ($i = 0; $i < count($search); $i++) {
762
- $current = stripos($input, $search[$i]);
763
- if ($current !== $position) {
764
- $input = substr_replace($input, $replace[$i], $current, strlen($search[$i]));
765
- }
766
- }
767
-
768
- return $input;
769
- }
770
-
771
- // Replace all occurrences
772
- return str_ireplace($search, $replace, $input);
773
- }
774
-
775
- /**
776
- * Replace table values
777
- *
778
- * @param string $input Table value
779
- * @param boolean $parse Parse value
780
- * @return string
781
- */
782
- protected function replaceTableValues($input, $parse = false)
783
- {
784
- // Get replace values
785
- $old = $this->getOldReplaceValues();
786
- $new = $this->getNewReplaceValues();
787
-
788
- $oldValues = array();
789
- $newValues = array();
790
-
791
- // Prepare replace values
792
- for ($i = 0; $i < count($old); $i++) {
793
- if (stripos($input, $old[$i]) !== false) {
794
- $oldValues[] = $old[$i];
795
- $newValues[] = $new[$i];
796
- }
797
- }
798
-
799
- // Do replace values
800
- if ($oldValues) {
801
- if ($parse) {
802
- // Parse and replace serialized values
803
- $input = $this->parseSerializedValues($input);
804
-
805
- // Replace values
806
- return MysqlDumpUtility::replaceValues($oldValues, $newValues, $input);
807
- }
808
-
809
- return MysqlDumpUtility::replaceSerializedValues($oldValues, $newValues, $input);
810
- }
811
-
812
- return $input;
813
- }
814
-
815
- /**
816
- * Parse serialized values
817
- *
818
- * @param string $input Table value
819
- * @return string
820
- */
821
- protected function parseSerializedValues($input)
822
- {
823
- // Serialization format
824
- $array = '(a:\d+:{.*?})';
825
- $string = '(s:\d+:".*?")';
826
- $object = '(O:\d+:".+":\d+:{.*})';
827
-
828
- // Replace serialized values
829
- return preg_replace_callback("/'($array|$string|$object)'/", array($this, 'replaceSerializedValues'), $input);
830
- }
831
-
832
- /**
833
- * Replace serialized values (callback)
834
- *
835
- * @param array $matches List of matches
836
- * @return string
837
- */
838
- protected function replaceSerializedValues($matches)
839
- {
840
- // Unescape MySQL special characters
841
- $input = MysqlDumpUtility::unescapeMysql($matches[1]);
842
-
843
- // Replace serialized values
844
- $input = MysqlDumpUtility::replaceSerializedValues($this->getOldReplaceValues(), $this->getNewReplaceValues(), $input);
845
-
846
- // Prepare query values
847
- return $this->getConnection()->quote($input);
848
- }
849
-
850
- /**
851
- * Replace table collation
852
- *
853
- * @param string $input SQL statement
854
- * @return string
855
- */
856
- protected function replaceTableCollation($input)
857
- {
858
- return str_ireplace('utf8mb4', 'utf8', $input);
859
- }
860
-
861
- /**
862
- * Strip table constraints
863
- *
864
- * @param string $input SQL statement
865
- * @return string
866
- */
867
- protected function stripTableConstraints($input)
868
- {
869
- $pattern = array(
870
- '/\s+CONSTRAINT(.+)REFERENCES(.+),/i',
871
- '/,\s+CONSTRAINT(.+)REFERENCES(.+)/i',
872
- );
873
- $replace = '';
874
-
875
- return preg_replace($pattern, $replace, $input);
876
- }
877
-
878
- /**
879
- * Make MySQL connection
880
- *
881
- * @param bool $useSocket Use socket or TCP connection
882
- * @return PDO
883
- */
884
- protected function makeConnection($useSocket = true)
885
- {
886
- // Use Socket or TCP
887
- $hostname = ($useSocket ? $this->hostname : gethostbyname($this->hostname));
888
-
889
- // Use default or custom port
890
- if ($this->port === 3306 || empty($this->port)) {
891
- $dsn = sprintf('mysql:host=%s;dbname=%s', $hostname, $this->database);
892
- } else if (!empty($this->socket)) {
893
- $dsn = sprintf('mysql:host=%s;unix_socket=%s;dbname=%s', $hostname, $this->socket, $this->database);
894
- } else {
895
- $dsn = sprintf('mysql:host=%s;port=%s;dbname=%s', $hostname, $this->port, $this->database);
896
- }
897
-
898
- // Make connection
899
- $connection = new PDO(
900
- $dsn,
901
- $this->username,
902
- $this->password,
903
- array(
904
- PDO::ATTR_PERSISTENT => true,
905
- PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
906
- )
907
- );
908
-
909
- // Set additional connection attributes
910
- $connection->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_NATURAL);
911
- $connection->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
912
-
913
- // Set default encoding
914
- $connection->exec("SET NAMES 'utf8'");
915
-
916
- // Set foreign key
917
- $connection->exec("SET FOREIGN_KEY_CHECKS = 0");
918
-
919
- return $connection;
920
- }
921
-
922
- /**
923
- * Returns header for dump file
924
- *
925
- * @return string
926
- */
927
- protected function getHeader()
928
- {
929
- // Some info about software, source and time
930
- $header = "-- All In One WP Migration SQL Dump\n" .
931
- "-- http://servmask.com/\n" .
932
- "--\n" .
933
- "-- Host: {$this->hostname}\n" .
934
- "-- Generation Time: " . date('r') . "\n" .
935
- "-- PDO Extension\n\n" .
936
- "--\n" .
937
- "-- Database: `{$this->database}`\n" .
938
- "--\n\n";
939
-
940
- return $header;
941
- }
942
-
943
- /**
944
- * Parse data source name
945
- *
946
- * @param string $input Data source name
947
- * @return array List of host, port and socket
948
- */
949
- protected function parseDSN($input) {
950
- $data = explode(':', $input);
951
-
952
- // Set hostname
953
- $host = 'localhost';
954
- if (!empty($data[0])) {
955
- $host = $data[0];
956
- }
957
-
958
- // Set port and socket
959
- $port = $socket = null;
960
- if (!empty($data[1])) {
961
- if (is_numeric($data[1])) {
962
- $port = $data[1];
963
- } else {
964
- $socket = $data[1];
965
- }
966
- }
967
-
968
- return array(
969
- 'host' => $host,
970
- 'port' => $port,
971
- 'socket' => $socket,
972
- );
973
- }
974
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib/vendor/mysqldump-factory/mysqldump-factory/lib/MysqlDumpSQL.php DELETED
@@ -1,924 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Copyright (C) 2014 ServMask Inc.
5
- *
6
- * This program is free software: you can redistribute it and/or modify
7
- * it under the terms of the GNU General Public License as published by
8
- * the Free Software Foundation, either version 3 of the License, or
9
- * (at your option) any later version.
10
- *
11
- * This program is distributed in the hope that it will be useful,
12
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- * GNU General Public License for more details.
15
- *
16
- * You should have received a copy of the GNU General Public License
17
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
18
- *
19
- * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
20
- * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
21
- * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
22
- * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
23
- * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
24
- * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
25
- */
26
-
27
- require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'MysqlDumpInterface.php';
28
- require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'MysqlDumpUtility.php';
29
-
30
- class MysqlDumpSQL implements MysqlDumpInterface
31
- {
32
- protected $hostname = null;
33
-
34
- protected $username = null;
35
-
36
- protected $password = null;
37
-
38
- protected $database = null;
39
-
40
- protected $connection = null;
41
-
42
- protected $oldTablePrefixes = null;
43
-
44
- protected $newTablePrefixes = null;
45
-
46
- protected $oldReplaceValues = array();
47
-
48
- protected $newReplaceValues = array();
49
-
50
- protected $tableQueryClauses = array();
51
-
52
- protected $tablePrefixColumns = array();
53
-
54
- protected $includeTablePrefixes = array();
55
-
56
- protected $excludeTablePrefixes = array();
57
-
58
- /**
59
- * Define MySQL credentials for the current connection
60
- *
61
- * @param string $hostname MySQL Hostname
62
- * @param string $username MySQL Username
63
- * @param string $password MySQL Password
64
- * @param string $database MySQL Database
65
- * @return void
66
- */
67
- public function __construct($hostname = 'localhost', $username = '', $password = '', $database = '')
68
- {
69
- // Set MySQL credentials
70
- $this->hostname = $hostname;
71
- $this->username = $username;
72
- $this->password = $password;
73
- $this->database = $database;
74
- }
75
-
76
- /**
77
- * Set old table prefixes
78
- *
79
- * @param array $prefixes List of table prefixes
80
- * @return MysqlDumpSQL
81
- */
82
- public function setOldTablePrefixes($prefixes)
83
- {
84
- $this->oldTablePrefixes = $prefixes;
85
-
86
- return $this;
87
- }
88
-
89
- /**
90
- * Get old table prefixes
91
- *
92
- * @return array
93
- */
94
- public function getOldTablePrefixes()
95
- {
96
- return $this->oldTablePrefixes;
97
- }
98
-
99
- /**
100
- * Set new table prefixes
101
- *
102
- * @param array $prefixes List of table prefixes
103
- * @return MysqlDumpSQL
104
- */
105
- public function setNewTablePrefixes($prefixes)
106
- {
107
- $this->newTablePrefixes = $prefixes;
108
-
109
- return $this;
110
- }
111
-
112
- /**
113
- * Get new table prefixes
114
- *
115
- * @return array
116
- */
117
- public function getNewTablePrefixes()
118
- {
119
- return $this->newTablePrefixes;
120
- }
121
-
122
- /**
123
- * Set old replace values
124
- *
125
- * @param array $values List of values
126
- * @return MysqlDumpSQL
127
- */
128
- public function setOldReplaceValues($values)
129
- {
130
- $this->oldReplaceValues = $values;
131
-
132
- return $this;
133
- }
134
-
135
- /**
136
- * Get old replace values
137
- *
138
- * @return array
139
- */
140
- public function getOldReplaceValues()
141
- {
142
- return $this->oldReplaceValues;
143
- }
144
-
145
- /**
146
- * Set new replace values
147
- *
148
- * @param array $values List of values
149
- * @return MysqlDumpSQL
150
- */
151
- public function setNewReplaceValues($values)
152
- {
153
- $this->newReplaceValues = $values;
154
-
155
- return $this;
156
- }
157
-
158
- /**
159
- * Get new replace values
160
- *
161
- * @return array
162
- */
163
- public function getNewReplaceValues()
164
- {
165
- return $this->newReplaceValues;
166
- }
167
-
168
- /**
169
- * Set table query clauses
170
- *
171
- * @param string $table Table name
172
- * @param array $clauses Table clauses
173
- * @return MysqlDumpSQL
174
- */
175
- public function setTableQueryClauses($table, $clauses)
176
- {
177
- $this->tableQueryClauses[strtolower($table)] = $clauses;
178
-
179
- return $this;
180
- }
181
- /**
182
- * Get table query clauses
183
- *
184
- * @param string $table Table name
185
- * @return array
186
- */
187
- public function getTableQueryClauses($table)
188
- {
189
- if (isset($this->tableQueryClauses[strtolower($table)])) {
190
- return $this->tableQueryClauses[strtolower($table)];
191
- }
192
-
193
- return array();
194
- }
195
-
196
- /**
197
- * Set table prefix columns
198
- *
199
- * @param string $table Table name
200
- * @param array $columns Table columns
201
- * @return MysqlDumpSQL
202
- */
203
- public function setTablePrefixColumns($table, $columns)
204
- {
205
- foreach ($columns as $column) {
206
- $this->tablePrefixColumns[strtolower($table)][strtolower($column)] = true;
207
- }
208
-
209
- return $this;
210
- }
211
-
212
- /**
213
- * Get table prefix columns
214
- *
215
- * @param string $table Table name
216
- * @return array
217
- */
218
- public function getTablePrefixColumns($table)
219
- {
220
- if (isset($this->tablePrefixColumns[strtolower($table)])) {
221
- return $this->tablePrefixColumns[strtolower($table)];
222
- }
223
-
224
- return array();
225
- }
226
-
227
- /**
228
- * Set include table prefixes
229
- *
230
- * @param array $prefixes List of table prefixes
231
- * @return MysqlDumpSQL
232
- */
233
- public function setIncludeTablePrefixes($prefixes)
234
- {
235
- $this->includeTablePrefixes = $prefixes;
236
-
237
- return $this;
238
- }
239
-
240
- /**
241
- * Get include table prefixes
242
- *
243
- * @return array
244
- */
245
- public function getIncludeTablePrefixes()
246
- {
247
- return $this->includeTablePrefixes;
248
- }
249
-
250
- /**
251
- * Set exclude table prefixes
252
- *
253
- * @param array $prefixes List of table prefixes
254
- * @return MysqlDumpSQL
255
- */
256
- public function setExcludeTablePrefixes($prefixes)
257
- {
258
- $this->excludeTablePrefixes = $prefixes;
259
-
260
- return $this;
261
- }
262
-
263
- /**
264
- * Get exclude table prefixes
265
- *
266
- * @return array
267
- */
268
- public function getExcludeTablePrefixes()
269
- {
270
- return $this->excludeTablePrefixes;
271
- }
272
-
273
- /**
274
- * Get tables
275
- *
276
- * @return array
277
- */
278
- public function getTables()
279
- {
280
- $tables = array();
281
-
282
- // Get list of tables
283
- $result = mysql_unbuffered_query(
284
- "SELECT TABLE_NAME AS TableName FROM `INFORMATION_SCHEMA`.`TABLES` WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA = '{$this->database}'",
285
- $this->getConnection()
286
- );
287
-
288
- if ($result) {
289
- while ($row = mysql_fetch_assoc($result)) {
290
- if (isset($row['TableName']) && ($tableName = $row['TableName'])) {
291
-
292
- // Include table prefixes
293
- if ($this->getIncludeTablePrefixes()) {
294
- $include = false;
295
-
296
- // Check table prefixes
297
- foreach ($this->getIncludeTablePrefixes() as $prefix) {
298
- if (stripos($tableName, $prefix) === 0) {
299
- $include = true;
300
- break;
301
- }
302
- }
303
-
304
- // Skip current table
305
- if ($include === false) {
306
- continue;
307
- }
308
- }
309
-
310
- // Exclude table prefixes
311
- if ($this->getExcludeTablePrefixes()) {
312
- $exclude = false;
313
-
314
- // Check table prefixes
315
- foreach ($this->getExcludeTablePrefixes() as $prefix) {
316
- if (stripos($tableName, $prefix) === 0) {
317
- $exclude = true;
318
- break;
319
- }
320
- }
321
-
322
- // Skip current table
323
- if ($exclude === true) {
324
- continue;
325
- }
326
- }
327
-
328
- // Add table name
329
- $tables[] = $tableName;
330
- }
331
- }
332
- } else {
333
- $result = mysql_unbuffered_query("SHOW TABLES FROM `{$this->database}`", $this->getConnection());
334
- while ($row = mysql_fetch_row($result)) {
335
- if (isset($row[0]) && ($tableName = $row[0])) {
336
-
337
- // Include table prefixes
338
- if ($this->getIncludeTablePrefixes()) {
339
- $include = false;
340
-
341
- // Check table prefixes
342
- foreach ($this->getIncludeTablePrefixes() as $prefix) {
343
- if (stripos($tableName, $prefix) === 0) {
344
- $include = true;
345
- break;
346
- }
347
- }
348
-
349
- // Skip current table
350
- if ($include === false) {
351
- continue;
352
- }
353
- }
354
-
355
- // Exclude table prefixes
356
- if ($this->getExcludeTablePrefixes()) {
357
- $exclude = false;
358
-
359
- // Check table prefixes
360
- foreach ($this->getExcludeTablePrefixes() as $prefix) {
361
- if (stripos($tableName, $prefix) === 0) {
362
- $exclude = true;
363
- break;
364
- }
365
- }
366
-
367
- // Skip current table
368
- if ($exclude === true) {
369
- continue;
370
- }
371
- }
372
-
373
- // Add table name
374
- $tables[] = $tableName;
375
- }
376
- }
377
- }
378
-
379
- return $tables;
380
- }
381
-
382
- /**
383
- * Get MySQL connection (lazy loading)
384
- *
385
- * @return resource
386
- */
387
- public function getConnection()
388
- {
389
- if ($this->connection === null) {
390
- // Make connection (Socket)
391
- $this->connection = $this->makeConnection();
392
-
393
- if ($this->connection === false) {
394
- // Make connection (TCP)
395
- $this->connection = $this->makeConnection(false);
396
-
397
- // Unable to connect to MySQL database server
398
- if ($this->connection === false) {
399
- throw new Exception('Unable to connect to MySQL database server: ' . mysql_error($this->connection));
400
- }
401
- }
402
- }
403
-
404
- return $this->connection;
405
- }
406
-
407
- /**
408
- * Run MySQL query
409
- *
410
- * @param string $query SQL query
411
- * @return resource
412
- */
413
- public function query($query)
414
- {
415
- return mysql_unbuffered_query($query, $this->getConnection());
416
- }
417
-
418
- /**
419
- * Export database into a file
420
- *
421
- * @param string $fileName Name of file
422
- * @return bool
423
- */
424
- public function export($fileName)
425
- {
426
- // Set file handler
427
- $fileHandler = fopen($fileName, 'wb');
428
- if ($fileHandler === false) {
429
- throw new Exception('Unable to open database file');
430
- }
431
-
432
- // Write headers
433
- if (fwrite($fileHandler, $this->getHeader()) === false) {
434
- throw new Exception('Unable to write database header information');
435
- }
436
-
437
- // Export tables
438
- foreach ($this->getTables() as $tableName) {
439
-
440
- // Replace table name prefixes
441
- $newTableName = $this->replaceTablePrefixes($tableName, true);
442
-
443
- // Get table structure
444
- $structure = mysql_unbuffered_query("SHOW CREATE TABLE `$tableName`", $this->getConnection());
445
- $table = mysql_fetch_assoc($structure);
446
-
447
- // Close structure cursor
448
- mysql_free_result($structure);
449
-
450
- // Get create table
451
- if (isset($table['Create Table'])) {
452
-
453
- // Write table drop statement
454
- $dropTable = "DROP TABLE IF EXISTS `$newTableName`;\n";
455
-
456
- // Write table statement
457
- if (fwrite($fileHandler, $dropTable) === false) {
458
- throw new Exception('Unable to write database table statement');
459
- }
460
-
461
- // Replace create table prefixes
462
- $createTable = $this->replaceTablePrefixes($table['Create Table'], true);
463
-
464
- // Strip table constraints
465
- $createTable = $this->stripTableConstraints($createTable);
466
-
467
- // Write table structure
468
- if (fwrite($fileHandler, $createTable) === false) {
469
- throw new Exception('Unable to write database table structure');
470
- }
471
-
472
- // Write end of statement
473
- if (fwrite($fileHandler, ";\n\n") === false) {
474
- throw new Exception('Unable to write database end of statement');
475
- }
476
-
477
- // Set query
478
- $query = "SELECT * FROM `$tableName` ";
479
-
480
- // Apply additional table query clauses
481
- if (($queryClauses = $this->getTableQueryClauses($tableName))) {
482
- $query .= $queryClauses;
483
- }
484
-
485
- // Apply additional table prefix columns
486
- $columns = $this->getTablePrefixColumns($tableName);
487
-
488
- // Get results
489
- $result = mysql_unbuffered_query($query, $this->getConnection());
490
-
491
- $processedRows = 0;
492
-
493
- // Generate insert statements
494
- while ($row = mysql_fetch_assoc($result)) {
495
- if ($processedRows === 0) {
496
- // Write start transaction
497
- if (fwrite($fileHandler, "START TRANSACTION;\n") === false) {
498
- throw new Exception('Unable to write database start transaction');
499
- }
500
- }
501
-
502
- $items = array();
503
- foreach ($row as $key => $value) {
504
- // Replace table prefix columns
505
- if (isset($columns[strtolower($key)])) {
506
- $value = $this->replaceTablePrefixes($value, true, 0);
507
- }
508
-
509
- // Replace table values
510
- $items[] = is_null($value) ? 'NULL' : "'" . mysql_real_escape_string($this->replaceTableValues($value), $this->getConnection()) . "'";
511
- }
512
-
513
- // Set table values
514
- $tableValues = implode(',', $items);
515
-
516
- // Set insert statement
517
- $tableInsert = "INSERT INTO `$newTableName` VALUES ($tableValues);\n";
518
-
519
- // Write insert statement
520
- if (fwrite($fileHandler, $tableInsert) === false) {
521
- throw new Exception('Unable to write database insert statement');
522
- }
523
-
524
- $processedRows++;
525
-
526
- // Write end of transaction
527
- if ($processedRows === MysqlDumpInterface::QUERIES_PER_TRANSACTION) {
528
- if (fwrite($fileHandler, "COMMIT;\n") === false) {
529
- throw new Exception('Unable to write database end of transaction');
530
- }
531
-
532
- $processedRows = 0;
533
- }
534
- }
535
-
536
- // Write end of transaction
537
- if ($processedRows !== 0) {
538
- if (fwrite($fileHandler, "COMMIT;\n") === false) {
539
- throw new Exception('Unable to write database end of transaction');
540
- }
541
- }
542
-
543
- // Write end of statements
544
- if (fwrite($fileHandler, "\n") === false) {
545
- throw new Exception('Unable to write database end of statement');
546
- }
547
-
548
- // Close result cursor
549
- mysql_free_result($result);
550
- }
551
- }
552
-
553
- // Close file handler
554
- fclose($fileHandler);
555
-
556
- return true;
557
- }
558
-
559
- /**
560
- * Import database from a file
561
- *
562
- * @param string $fileName Name of file
563
- * @return bool
564
- */
565
- public function import($fileName)
566
- {
567
- // Set collation name
568
- $collation = $this->getCollation('utf8mb4_general_ci');
569
-
570
- // Set max allowed packet
571
- $maxAllowedPacket = $this->getMaxAllowedPacket();
572
-
573
- // Set file handler
574
- $fileHandler = fopen($fileName, 'r');
575
- if ($fileHandler === false) {
576
- throw new Exception('Unable to open database file');
577
- }
578
-
579
- $passed = 0;
580
- $failed = 0;
581
- $query = null;
582
-
583
- // Read database file line by line
584
- while (($line = fgets($fileHandler)) !== false) {
585
- $query .= $line;
586
-
587
- // End of query
588
- if (preg_match('/;\s*$/', $query)) {
589
-
590
- // Check max allowed packet
591
- if (strlen($query) <= $maxAllowedPacket) {
592
-
593
- // Replace table prefixes
594
- $query = $this->replaceTablePrefixes($query);
595
-
596
- // Replace table values
597
- $query = $this->replaceTableValues($query, true);
598
-
599
- // Replace table collation
600
- if (empty($collation)) {
601
- $query = $this->replaceTableCollation($query);
602
- }
603
-
604
- try {
605
- // Run SQL query
606
- $result = mysql_unbuffered_query($query, $this->getConnection());
607
- if ($result === false) {
608
- throw new Exception(var_export(array(mysql_errno($this->getConnection()), mysql_error($this->getConnection()))));
609
- } else {
610
- $passed++;
611
- }
612
-
613
- } catch (Exception $e) {
614
- $failed++;
615
- }
616
-
617
- } else {
618
- $failed++;
619
- }
620
-
621
- $query = null;
622
- }
623
- }
624
-
625
- // Close file handler
626
- fclose($fileHandler);
627
-
628
- // Check failed queries
629
- if ((($failed / $passed) * 100) > 2) {
630
- return false;
631
- }
632
-
633
- return true;
634
- }
635
-
636
- /**
637
- * Flush database
638
- *
639
- * @return void
640
- */
641
- public function flush()
642
- {
643
- $dropTables = array();
644
- foreach ($this->getTables() as $tableName) {
645
- $dropTables[] = "DROP TABLE IF EXISTS `$tableName`";
646
- }
647
-
648
- // Drop tables
649
- foreach ($dropTables as $dropQuery) {
650
- mysql_unbuffered_query($dropQuery, $this->getConnection());
651
- }
652
- }
653
-
654
- /**
655
- * Get MySQL version
656
- *
657
- * @return string
658
- */
659
- protected function getVersion() {
660
- if (($result = mysql_unbuffered_query("SELECT @@version AS VersionName", $this->getConnection()))) {
661
- while ($row = mysql_fetch_assoc($result)) {
662
- if (isset($row['VersionName'])) {
663
- return $row['VersionName'];
664
- }
665
- }
666
- } else {
667
- $result = mysql_unbuffered_query("SHOW VARIABLES LIKE 'version'", $this->getConnection());
668
- while ($row = mysql_fetch_row($result)) {
669
- if (isset($row[1])) {
670
- return $row[1];
671
- }
672
- }
673
- }
674
- }
675
-
676
- /**
677
- * Get MySQL max allowed packaet
678
- *
679
- * @return integer
680
- */
681
- protected function getMaxAllowedPacket() {
682
- if (($result = mysql_unbuffered_query("SELECT @@max_allowed_packet AS MaxAllowedPacket", $this->getConnection()))) {
683
- while ($row = mysql_fetch_assoc($result)) {
684
- if (isset($row['MaxAllowedPacket'])) {
685
- return $row['MaxAllowedPacket'];
686
- }
687
- }
688
- } else {
689
- $result = mysql_unbuffered_query("SHOW VARIABLES LIKE 'max_allowed_packet'", $this->getConnection());
690
- while ($row = mysql_fetch_row($result)) {
691
- if (isset($row[1])) {
692
- return $row[1];
693
- }
694
- }
695
- }
696
- }
697
-
698
- /**
699
- * Get MySQL collation name
700
- *
701
- * @param string $collationName Collation name
702
- * @return string
703
- */
704
- protected function getCollation($collationName) {
705
- // Get collation name
706
- $result = mysql_unbuffered_query(
707
- "SELECT COLLATION_NAME AS CollationName FROM `INFORMATION_SCHEMA`.`COLLATIONS` WHERE COLLATION_NAME = '$collationName'",
708
- $this->getConnection()
709
- );
710
-
711
- if ($result) {
712
- while ($row = mysql_fetch_assoc($result)) {
713
- if (isset($row['CollationName'])) {
714
- return $row['CollationName'];
715
- }
716
- }
717
- } else {
718
- $result = mysql_unbuffered_query("SHOW COLLATION LIKE '$collationName'", $this->getConnection());
719
- while ($row = mysql_fetch_row($result)) {
720
- if (isset($row[0])) {
721
- return $row[0];
722
- }
723
- }
724
- }
725
- }
726
-
727
- /**
728
- * Replace table prefixes
729
- *
730
- * @param string $input Table value
731
- * @param boolean $first Replace first occurrence at any position
732
- * @param boolean $position Replace first occurrence at a specified position
733
- * @return string
734
- */
735
- protected function replaceTablePrefixes($input, $first = false, $position = false)
736
- {
737
- // Get table prefixes
738
- $search = $this->getOldTablePrefixes();
739
- $replace = $this->getNewTablePrefixes();
740
-
741
- // Replace table prefixes
742
- if ($first) {
743
-
744
- // Replace first occurance at a specified position
745
- if ($position !== false) {
746
- for ($i = 0; $i < count($search); $i++) {
747
- $current = stripos($input, $search[$i]);
748
- if ($current === $position) {
749
- $input = substr_replace($input, $replace[$i], $current, strlen($search[$i]));
750
- }
751
- }
752
-
753
- return $input;
754
- }
755
-
756
- // Replace first occurance at any position
757
- for ($i = 0; $i < count($search); $i++) {
758
- $current = stripos($input, $search[$i]);
759
- if ($current !== $position) {
760
- $input = substr_replace($input, $replace[$i], $current, strlen($search[$i]));
761
- }
762
- }
763
-
764
- return $input;
765
- }
766
-
767
- // Replace all occurrences
768
- return str_ireplace($search, $replace, $input);
769
- }
770
-
771
- /**
772
- * Replace table values
773
- *
774
- * @param string $input Table value
775
- * @param boolean $parse Parse value
776
- * @return string
777
- */
778
- protected function replaceTableValues($input, $parse = false)
779
- {
780
- // Get replace values
781
- $old = $this->getOldReplaceValues();
782
- $new = $this->getNewReplaceValues();
783
-
784
- $oldValues = array();
785
- $newValues = array();
786
-
787
- // Prepare replace values
788
- for ($i = 0; $i < count($old); $i++) {
789
- if (stripos($input, $old[$i]) !== false) {
790
- $oldValues[] = $old[$i];
791
- $newValues[] = $new[$i];
792
- }
793
- }
794
-
795
- // Do replace values
796
- if ($oldValues) {
797
- if ($parse) {
798
- // Parse and replace serialized values
799
- $input = $this->parseSerializedValues($input);
800
-
801
- // Replace values
802
- return MysqlDumpUtility::replaceValues($oldValues, $newValues, $input);
803
- }
804
-
805
- return MysqlDumpUtility::replaceSerializedValues($oldValues, $newValues, $input);
806
- }
807
-
808
- return $input;
809
- }
810
-
811
- /**
812
- * Parse serialized values
813
- *
814
- * @param string $input Table value
815
- * @return string
816
- */
817
- protected function parseSerializedValues($input)
818
- {
819
- // Serialization format
820
- $array = '(a:\d+:{.*?})';
821
- $string = '(s:\d+:".*?")';
822
- $object = '(O:\d+:".+":\d+:{.*})';
823
-
824
- // Replace serialized values
825
- return preg_replace_callback("/'($array|$string|$object)'/", array($this, 'replaceSerializedValues'), $input);
826
- }
827
-
828
- /**
829
- * Replace serialized values (callback)
830
- *
831
- * @param array $matches List of matches
832
- * @return string
833
- */
834
- protected function replaceSerializedValues($matches)
835
- {
836
- // Unescape MySQL special characters
837
- $input = MysqlDumpUtility::unescapeMysql($matches[1]);
838
-
839
- // Replace serialized values
840
- $input = MysqlDumpUtility::replaceSerializedValues($this->getOldReplaceValues(), $this->getNewReplaceValues(), $input);
841
-
842
- // Prepare query values
843
- return "'" . mysql_real_escape_string($input, $this->getConnection()) . "'";
844
- }
845
-
846
- /**
847
- * Replace table collation
848
- *
849
- * @param string $input SQL statement
850
- * @return string
851
- */
852
- protected function replaceTableCollation($input)
853
- {
854
- return str_ireplace('utf8mb4', 'utf8', $input);
855
- }
856
-
857
- /**
858
- * Strip table constraints
859
- *
860
- * @param string $input SQL statement
861
- * @return string
862
- */
863
- protected function stripTableConstraints($input)
864
- {
865
- $pattern = array(
866
- '/\s+CONSTRAINT(.+)REFERENCES(.+),/i',
867
- '/,\s+CONSTRAINT(.+)REFERENCES(.+)/i',
868
- );
869
- $replace = '';
870
-
871
- return preg_replace($pattern, $replace, $input);
872
- }
873
-
874
- /**
875
- * Make MySQL connection
876
- *
877
- * @param bool $useSocket Use socket or TCP connection
878
- * @return resource
879
- */
880
- protected function makeConnection($useSocket = true)
881
- {
882
- // Use Socket or TCP
883
- $hostname = ($useSocket ? $this->hostname : gethostbyname($this->hostname));
884
-
885
- // Make connection
886
- $connection = @mysql_pconnect($hostname, $this->username, $this->password);
887
-
888
- // Select database and set default encoding
889
- if ($connection) {
890
- if (mysql_select_db($this->database, $connection)) {
891
- // Set default encoding
892
- mysql_unbuffered_query("SET NAMES 'utf8'", $connection);
893
-
894
- // Set foreign key
895
- mysql_unbuffered_query("SET FOREIGN_KEY_CHECKS = 0", $connection);
896
- } else {
897
- throw new Exception('Could not select MySQL database: ' . mysql_error($connection));
898
- }
899
- }
900
-
901
- return $connection;
902
- }
903
-
904
- /**
905
- * Returns header for dump file
906
- *
907
- * @return string
908
- */
909
- protected function getHeader()
910
- {
911
- // Some info about software, source and time
912
- $header = "-- All In One WP Migration SQL Dump\n" .
913
- "-- http://servmask.com/\n" .
914
- "--\n" .
915
- "-- Host: {$this->hostname}\n" .
916
- "-- Generation Time: " . date('r') . "\n" .
917
- "-- MySQL Extension\n\n" .
918
- "--\n" .
919
- "-- Database: `{$this->database}`\n" .
920
- "--\n\n";
921
-
922
- return $header;
923
- }
924
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib/vendor/servmask/archiver/class-ai1wm-archiver.php CHANGED
@@ -1,7 +1,6 @@
1
  <?php
2
-
3
  /**
4
- * Copyright (C) 2014 ServMask Inc.
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License as published by
@@ -23,6 +22,7 @@
23
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
24
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
25
  */
 
26
  abstract class Ai1wm_Archiver {
27
 
28
  /**
@@ -227,5 +227,4 @@ abstract class Ai1wm_Archiver {
227
  throw new Ai1wm_Not_Accesible_Exception( sprintf( __( 'Unable to close %s', AI1WM_PLUGIN_NAME ), $this->filename ) );
228
  }
229
  }
230
-
231
  }
1
  <?php
 
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
22
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
+
26
  abstract class Ai1wm_Archiver {
27
 
28
  /**
227
  throw new Ai1wm_Not_Accesible_Exception( sprintf( __( 'Unable to close %s', AI1WM_PLUGIN_NAME ), $this->filename ) );
228
  }
229
  }
 
230
  }
lib/vendor/servmask/archiver/class-ai1wm-compressor.php CHANGED
@@ -1,7 +1,6 @@
1
  <?php
2
-
3
  /**
4
- * Copyright (C) 2014 ServMask Inc.
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License as published by
@@ -23,6 +22,7 @@
23
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
24
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
25
  */
 
26
  class Ai1wm_Compressor extends Ai1wm_Archiver {
27
 
28
  /**
@@ -38,7 +38,7 @@ class Ai1wm_Compressor extends Ai1wm_Archiver {
38
  /**
39
  * Add a file to the archive
40
  *
41
- * @param string $file File to Add to the archive
42
  * @param string $new_filename Write the file with a different name
43
  * @param int $offset File offset
44
  * @param int $timeout Process timeout
1
  <?php
 
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
22
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
+
26
  class Ai1wm_Compressor extends Ai1wm_Archiver {
27
 
28
  /**
38
  /**
39
  * Add a file to the archive
40
  *
41
+ * @param string $file File to add to the archive
42
  * @param string $new_filename Write the file with a different name
43
  * @param int $offset File offset
44
  * @param int $timeout Process timeout
lib/vendor/servmask/archiver/class-ai1wm-extractor.php CHANGED
@@ -1,7 +1,6 @@
1
  <?php
2
-
3
  /**
4
- * Copyright (C) 2014 ServMask Inc.
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License as published by
@@ -23,6 +22,7 @@
23
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
24
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
25
  */
 
26
  class Ai1wm_Extractor extends Ai1wm_Archiver {
27
 
28
  /**
@@ -75,7 +75,7 @@ class Ai1wm_Extractor extends Ai1wm_Archiver {
75
  return $files_found;
76
  }
77
 
78
- public function extract_one_file_to( $location, $exclude = array(), $offset = 0, $timeout = 0 ) {
79
  if ( false === file_exists( $location ) ) {
80
  throw new Ai1wm_Not_Readable_Exception( sprintf( __( '%s doesn\'t exist', AI1WM_PLUGIN_NAME ), $location ) );
81
  }
@@ -109,6 +109,14 @@ class Ai1wm_Extractor extends Ai1wm_Archiver {
109
  // we need to build the path for the file
110
  $path = str_replace( '/', DIRECTORY_SEPARATOR, $data['path'] );
111
 
 
 
 
 
 
 
 
 
112
  // append prepend extract location
113
  $path = $location . DIRECTORY_SEPARATOR . $path;
114
 
1
  <?php
 
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
22
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
+
26
  class Ai1wm_Extractor extends Ai1wm_Archiver {
27
 
28
  /**
75
  return $files_found;
76
  }
77
 
78
+ public function extract_one_file_to( $location, $exclude = array(), $old_paths = array(), $new_paths = array(), $offset = 0, $timeout = 0 ) {
79
  if ( false === file_exists( $location ) ) {
80
  throw new Ai1wm_Not_Readable_Exception( sprintf( __( '%s doesn\'t exist', AI1WM_PLUGIN_NAME ), $location ) );
81
  }
109
  // we need to build the path for the file
110
  $path = str_replace( '/', DIRECTORY_SEPARATOR, $data['path'] );
111
 
112
+ // replace extract paths
113
+ for ( $i = 0; $i < count( $old_paths ); $i++ ) {
114
+ if ( strpos( $path . DIRECTORY_SEPARATOR, $old_paths[$i] . DIRECTORY_SEPARATOR ) === 0 ) {
115
+ $path = substr_replace( $path, $new_paths[$i], 0, strlen( $old_paths[$i] ) );
116
+ break;
117
+ }
118
+ }
119
+
120
  // append prepend extract location
121
  $path = $location . DIRECTORY_SEPARATOR . $path;
122
 
lib/vendor/servmask/cron/class-ai1wm-cron.php CHANGED
@@ -1,7 +1,6 @@
1
  <?php
2
-
3
  /**
4
- * Copyright (C) 2014 ServMask Inc.
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License as published by
@@ -23,6 +22,7 @@
23
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
24
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
25
  */
 
26
  class Ai1wm_Cron {
27
 
28
  /*
1
  <?php
 
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
22
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
+
26
  class Ai1wm_Cron {
27
 
28
  /*
lib/{model/class-ai1wm-maintenance.php → vendor/servmask/database/class-ai1wm-database-mysql.php} RENAMED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -23,46 +23,73 @@
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
 
26
- class Ai1wm_Maintenance {
27
 
28
  /**
29
- * Enable WordPress maintenance mode
30
  *
31
- * @return boolean
 
32
  */
33
- public static function enable() {
34
- return update_site_option( AI1WM_MAINTENANCE_MODE, true );
35
  }
36
 
37
  /**
38
- * Disable WordPress maintenance mode
39
  *
40
- * @return boolean
 
41
  */
42
- public static function disable() {
43
- return update_site_option( AI1WM_MAINTENANCE_MODE, false );
44
  }
45
 
46
- public static function active() {
47
- return get_site_option( AI1WM_MAINTENANCE_MODE );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  }
49
 
50
  /**
51
- * Display Wordpress maintenance mode
52
  *
53
- * @return void
 
54
  */
55
- public static function display() {
56
- if ( self::active() ) {
57
- $title = __( 'Maintenance Mode', AI1WM_PLUGIN_NAME );
58
- $body = sprintf(
59
- '<h1>%s</h1><p>%s<br /><strong>%s%s</strong></p>',
60
- __( 'Website Under Maintenance', AI1WM_PLUGIN_NAME ),
61
- __( 'Hi, our Website is currently undergoing scheduled maintenance', AI1WM_PLUGIN_NAME ),
62
- __( 'Please check back very soon. ', AI1WM_PLUGIN_NAME ),
63
- __( 'Sorry for the inconvenience!', AI1WM_PLUGIN_NAME )
64
- );
65
- wp_die( $body, $title );
66
- }
67
  }
68
- }
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
 
26
+ class Ai1wm_Database_Mysql extends Ai1wm_Database {
27
 
28
  /**
29
+ * Run MySQL query
30
  *
31
+ * @param string $input SQL query
32
+ * @return resource
33
  */
34
+ public function query( $input ) {
35
+ return mysql_unbuffered_query( $input, $this->wpdb->dbh );
36
  }
37
 
38
  /**
39
+ * Escape string input for mysql query
40
  *
41
+ * @param string $input String to escape
42
+ * @return string
43
  */
44
+ public function quote( $input ) {
45
+ return "'" . mysql_real_escape_string( $input, $this->wpdb->dbh ) . "'";
46
  }
47
 
48
+ /**
49
+ * Returns the error code for the most recent function call
50
+ *
51
+ * @return int
52
+ */
53
+ public function errno() {
54
+ return mysql_errno( $this->wpdb->dbh );
55
+ }
56
+
57
+ /**
58
+ * Returns a string description of the last error
59
+ *
60
+ * @return string
61
+ */
62
+ public function error() {
63
+ return mysql_error( $this->wpdb->dbh );
64
+ }
65
+
66
+ /**
67
+ * Return the result from MySQL query as associative array
68
+ *
69
+ * @param resource $result MySQL resource
70
+ * @return array
71
+ */
72
+ public function fetch_assoc( $result ) {
73
+ return mysql_fetch_assoc( $result );
74
+ }
75
+
76
+ /**
77
+ * Return the result from MySQL query as row
78
+ *
79
+ * @param resource $result MySQL resource
80
+ * @return array
81
+ */
82
+ public function fetch_row( $result ) {
83
+ return mysql_fetch_row( $result );
84
  }
85
 
86
  /**
87
+ * Free MySQL result memory
88
  *
89
+ * @param resource $result MySQL resource
90
+ * @return bool
91
  */
92
+ public function free_result( $result ) {
93
+ return mysql_free_result( $result );
 
 
 
 
 
 
 
 
 
 
94
  }
95
+ }
lib/{model/class-ai1wm-error.php → vendor/servmask/database/class-ai1wm-database-mysqli.php} RENAMED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -23,63 +23,73 @@
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
 
26
- class Ai1wm_Error {
27
-
28
- const ERROR_LIMIT = 10;
29
- const EXCEPTION_LIMIT = 10;
30
 
31
  /**
32
- * Custom Error Handler
33
  *
34
- * @param integer $code Error Code
35
- * @param string $message Error Message
36
- * @param string $file Error File
37
- * @param integer $line Error Line
38
- * @return void
39
  */
40
- public static function error_handler( $code, $message, $file, $line ) {
41
- $errors = get_site_option( AI1WM_ERROR_HANDLER, array() );
42
-
43
- // Limit errors
44
- if ( count( $errors ) > self::ERROR_LIMIT ) {
45
- array_shift( $errors );
46
- }
47
 
48
- // Add error
49
- $errors[] = array(
50
- 'code' => $code,
51
- 'message' => $message,
52
- 'file' => $file,
53
- 'line' => $line,
54
- 'time' => time(),
55
- );
 
56
 
57
- Ai1wm_Logger::error( AI1WM_ERROR_HANDLER, $errors );
 
 
 
 
 
 
58
  }
59
 
60
  /**
61
- * Custom Exception Handler
62
  *
63
- * @param Exception $e Exception Object
64
- * @return void
65
  */
66
- public static function exception_handler( $e ) {
67
- $exceptions = get_site_option( AI1WM_EXCEPTION_HANDLER, array() );
 
68
 
69
- // Limit errors
70
- if ( count( $exceptions ) > self::EXCEPTION_LIMIT ) {
71
- array_shift( $exceptions );
72
- }
 
 
 
 
 
73
 
74
- // Add exception
75
- $exceptions[] = array(
76
- 'code' => $e->getCode(),
77
- 'message' => $e->getMessage(),
78
- 'file' => $e->getFile(),
79
- 'line' => $e->getLine(),
80
- 'time' => time(),
81
- );
 
82
 
83
- Ai1wm_Logger::error( AI1WM_EXCEPTION_HANDLER, $exceptions );
 
 
 
 
 
 
 
84
  }
85
- }
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
 
26
+ class Ai1wm_Database_Mysqli extends Ai1wm_Database {
 
 
 
27
 
28
  /**
29
+ * Run MySQL query
30
  *
31
+ * @param string $input SQL query
32
+ * @return resource
 
 
 
33
  */
34
+ public function query( $input ) {
35
+ return mysqli_query( $this->wpdb->dbh, $input, MYSQLI_USE_RESULT );
36
+ }
 
 
 
 
37
 
38
+ /**
39
+ * Escape string input for mysql query
40
+ *
41
+ * @param string $input String to escape
42
+ * @return string
43
+ */
44
+ public function quote( $input ) {
45
+ return "'" . mysqli_real_escape_string( $this->wpdb->dbh, $input ) . "'";
46
+ }
47
 
48
+ /**
49
+ * Returns the error code for the most recent function call
50
+ *
51
+ * @return int
52
+ */
53
+ public function errno() {
54
+ return mysqli_errno( $this->wpdb->dbh );
55
  }
56
 
57
  /**
58
+ * Returns a string description of the last error
59
  *
60
+ * @return string
 
61
  */
62
+ public function error() {
63
+ return mysqli_error( $this->wpdb->dbh );
64
+ }
65
 
66
+ /**
67
+ * Return the result from MySQL query as associative array
68
+ *
69
+ * @param resource $result MySQL resource
70
+ * @return array
71
+ */
72
+ public function fetch_assoc( $result ) {
73
+ return mysqli_fetch_assoc( $result );
74
+ }
75
 
76
+ /**
77
+ * Return the result from MySQL query as row
78
+ *
79
+ * @param resource $result MySQL resource
80
+ * @return array
81
+ */
82
+ public function fetch_row( $result ) {
83
+ return mysqli_fetch_row( $result );
84
+ }
85
 
86
+ /**
87
+ * Free MySQL result memory
88
+ *
89
+ * @param resource $result MySQL resource
90
+ * @return bool
91
+ */
92
+ public function free_result( $result ) {
93
+ return mysqli_free_result( $result );
94
  }
95
+ }
lib/vendor/{mysqldump-factory/mysqldump-factory/lib/MysqlDumpUtility.php → servmask/database/class-ai1wm-database-utility.php} RENAMED
@@ -1,7 +1,6 @@
1
  <?php
2
-
3
  /**
4
- * Copyright (C) 2014 ServMask Inc.
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License as published by
@@ -24,8 +23,8 @@
24
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
25
  */
26
 
27
- class MysqlDumpUtility
28
- {
29
  /**
30
  * Replace all occurrences of the search string with the replacement string.
31
  * This function is case-sensitive.
@@ -35,9 +34,8 @@ class MysqlDumpUtility
35
  * @param string $data Data to replace.
36
  * @return mixed The original string with all elements replaced as needed.
37
  */
38
- public static function replaceValues($from = array(), $to = array(), $data = '')
39
- {
40
- return str_ireplace($from, $to, $data);
41
  }
42
 
43
  /**
@@ -51,41 +49,42 @@ class MysqlDumpUtility
51
  * @param bool $serialized Does the array passed via $data need serializing.
52
  * @return mixed The original array with all elements replaced as needed.
53
  */
54
- public static function replaceSerializedValues($from = array(), $to = array(), $data = '', $serialized = false)
55
- {
56
- // Some unserialized data cannot be re-serialized eg. SimpleXMLElements
57
  try {
58
 
59
- if (is_string($data) && ($unserialized = @unserialize($data)) !== false) {
60
- $data = self::replaceSerializedValues($from, $to, $unserialized, true);
61
- } else if (is_array($data)) {
62
- $tmp = array();
63
- foreach ($data as $key => $value) {
64
- $tmp[$key] = self::replaceSerializedValues($from, $to, $value, false);
65
- }
 
 
66
 
67
- $data = $tmp;
68
- unset($tmp);
69
- } elseif (is_object($data)) {
70
- $tmp = $data;
71
- $props = get_object_vars($data);
72
- foreach ($props as $key => $value) {
73
- $tmp->$key = self::replaceSerializedValues($from, $to, $value, false);
74
- }
75
 
76
- $data = $tmp;
77
- unset($tmp);
78
- } else {
79
- if (is_string($data)) {
80
- $data = str_ireplace($from, $to, $data);
 
81
  }
82
- }
83
 
84
- if ($serialized) {
85
- return serialize($data);
 
86
  }
87
 
88
- } catch (Exception $e) {
89
  // pass
90
  }
91
 
@@ -98,10 +97,10 @@ class MysqlDumpUtility
98
  * @param string $data Data to replace.
99
  * @return string
100
  */
101
- public static function unescapeMysql($data) {
102
  return str_ireplace(
103
- array('\\\\', '\\0', "\\n", "\\r", '\Z', "\'", '\"'),
104
- array('\\', '\0', "\n", "\r", "\x1a", "'", '"'),
105
  $data
106
  );
107
  }
@@ -111,7 +110,7 @@ class MysqlDumpUtility
111
  * @param string $data Data to replace.
112
  * @return string
113
  */
114
- public static function unescapeQuotes($data) {
115
- return str_ireplace('\"', '"', $data);
116
  }
117
  }
1
  <?php
 
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
 
26
+ class Ai1wm_Database_Utility {
27
+
28
  /**
29
  * Replace all occurrences of the search string with the replacement string.
30
  * This function is case-sensitive.
34
  * @param string $data Data to replace.
35
  * @return mixed The original string with all elements replaced as needed.
36
  */
37
+ public static function replace_values( $from = array(), $to = array(), $data = '' ) {
38
+ return str_ireplace( $from, $to, $data );
 
39
  }
40
 
41
  /**
49
  * @param bool $serialized Does the array passed via $data need serializing.
50
  * @return mixed The original array with all elements replaced as needed.
51
  */
52
+ public static function replace_serialized_values( $from = array(), $to = array(), $data = '', $serialized = false ) {
 
 
53
  try {
54
 
55
+ // Some unserialized data cannot be re-serialized eg. SimpleXMLElements
56
+ if ( $data ) {
57
+ if ( is_serialized( $data ) && ( $unserialized = @unserialize( $data ) ) !== false ) {
58
+ $data = self::replace_serialized_values( $from, $to, $unserialized, true );
59
+ } else if ( is_array( $data ) ) {
60
+ $tmp = array();
61
+ foreach ( $data as $key => $value ) {
62
+ $tmp[$key] = self::replace_serialized_values( $from, $to, $value, false );
63
+ }
64
 
65
+ $data = $tmp;
66
+ unset( $tmp );
67
+ } elseif ( is_object( $data ) ) {
68
+ $tmp = $data;
69
+ $props = get_object_vars( $data );
70
+ foreach ( $props as $key => $value ) {
71
+ $tmp->$key = self::replace_serialized_values( $from, $to, $value, false );
72
+ }
73
 
74
+ $data = $tmp;
75
+ unset( $tmp );
76
+ } else {
77
+ if ( is_string( $data ) ) {
78
+ $data = str_ireplace( $from, $to, $data );
79
+ }
80
  }
 
81
 
82
+ if ( $serialized ) {
83
+ return serialize( $data );
84
+ }
85
  }
86
 
87
+ } catch ( Exception $e ) {
88
  // pass
89
  }
90
 
97
  * @param string $data Data to replace.
98
  * @return string
99
  */
100
+ public static function unescape_mysql( $data ) {
101
  return str_ireplace(
102
+ array( '\\\\', '\\0', "\\n", "\\r", '\Z', "\'", '\"', '\0' ),
103
+ array( '\\', '\0', "\n", "\r", "\x1a", "'", '"', "\0" ),
104
  $data
105
  );
106
  }
110
  * @param string $data Data to replace.
111
  * @return string
112
  */
113
+ public static function unescape_quotes( $data ) {
114
+ return str_ireplace( '\"', '"', $data );
115
  }
116
  }
lib/vendor/servmask/database/class-ai1wm-database.php ADDED
@@ -0,0 +1,864 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ *
18
+ * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
19
+ * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
20
+ * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
21
+ * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
22
+ * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
+ * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
+ */
25
+
26
+ abstract class Ai1wm_Database {
27
+
28
+ /**
29
+ * Number of queries per transaction
30
+ *
31
+ * @var int
32
+ */
33
+ const QUERIES_PER_TRANSACTION = 1000;
34
+
35
+ /**
36
+ * WordPress database handler
37
+ *
38
+ * @access protected
39
+ * @var mixed
40
+ */
41
+ protected $wpdb = null;
42
+
43
+ /**
44
+ * Old table prefixes
45
+ *
46
+ * @access protected
47
+ * @var array
48
+ */
49
+ protected $old_table_prefixes = array();
50
+
51
+ /**
52
+ * New table prefixes
53
+ *
54
+ * @access protected
55
+ * @var array
56
+ */
57
+ protected $new_table_prefixes = array();
58
+
59
+ /**
60
+ * Old replace values
61
+ *
62
+ * @access protected
63
+ * @var array
64
+ */
65
+ protected $old_replace_values = array();
66
+
67
+ /**
68
+ * New replace values
69
+ *
70
+ * @access protected
71
+ * @var array
72
+ */
73
+ protected $new_replace_values = array();
74
+
75
+ /**
76
+ * Table query clauses
77
+ *
78
+ * @access protected
79
+ * @var array
80
+ */
81
+ protected $table_query_clauses = array();
82
+
83
+ /**
84
+ * Table prefix columns
85
+ *
86
+ * @access protected
87
+ * @var array
88
+ */
89
+ protected $table_prefix_columns = array();
90
+
91
+ /**
92
+ * Include table prefixes
93
+ *
94
+ * @access protected
95
+ * @var array
96
+ */
97
+ protected $include_table_prefixes = array();
98
+
99
+ /**
100
+ * Exclude table prefixes
101
+ *
102
+ * @access protected
103
+ * @var array
104
+ */
105
+ protected $exclude_table_prefixes = array();
106
+
107
+ /**
108
+ * Constructor
109
+ *
110
+ * @param object $wpdb WPDB instance
111
+ * @return Ai1wm_Database
112
+ */
113
+ public function __construct( $wpdb ) {
114
+ $this->wpdb = $wpdb;
115
+ }
116
+
117
+ /**
118
+ * Set old table prefixes
119
+ *
120
+ * @param array $prefixes List of table prefixes
121
+ * @return Ai1wm_Database
122
+ */
123
+ public function set_old_table_prefixes( $prefixes ) {
124
+ $this->old_table_prefixes = $prefixes;
125
+
126
+ return $this;
127
+ }
128
+
129
+ /**
130
+ * Get old table prefixes
131
+ *
132
+ * @return array
133
+ */
134
+ public function get_old_table_prefixes() {
135
+ return $this->old_table_prefixes;
136
+ }
137
+
138
+ /**
139
+ * Set new table prefixes
140
+ *
141
+ * @param array $prefixes List of table prefixes
142
+ * @return Ai1wm_Database
143
+ */
144
+ public function set_new_table_prefixes( $prefixes ) {
145
+ $this->new_table_prefixes = $prefixes;
146
+
147
+ return $this;
148
+ }
149
+
150
+ /**
151
+ * Get new table prefixes
152
+ *
153
+ * @return array
154
+ */
155
+ public function get_new_table_prefixes() {
156
+ return $this->new_table_prefixes;
157
+ }
158
+
159
+ /**
160
+ * Set old replace values
161
+ *
162
+ * @param array $values List of values
163
+ * @return Ai1wm_Database
164
+ */
165
+ public function set_old_replace_values( $values ) {
166
+ $this->old_replace_values = $values;
167
+
168
+ return $this;
169
+ }
170
+
171
+ /**
172
+ * Get old replace values
173
+ *
174
+ * @return array
175
+ */
176
+ public function get_old_replace_values() {
177
+ return $this->old_replace_values;
178
+ }
179
+
180
+ /**
181
+ * Set new replace values
182
+ *
183
+ * @param array $values List of values
184
+ * @return Ai1wm_Database
185
+ */
186
+ public function set_new_replace_values( $values ) {
187
+ $this->new_replace_values = $values;
188
+
189
+ return $this;
190
+ }
191
+
192
+ /**
193
+ * Get new replace values
194
+ *
195
+ * @return array
196
+ */
197
+ public function get_new_replace_values() {
198
+ return $this->new_replace_values;
199
+ }
200
+
201
+ /**
202
+ * Set table query clauses
203
+ *
204
+ * @param string $table Table name
205
+ * @param array $clauses Table clauses
206
+ * @return Ai1wm_Database
207
+ */
208
+ public function set_table_query_clauses( $table, $clauses ) {
209
+ $this->table_query_clauses[ strtolower( $table ) ] = $clauses;
210
+
211
+ return $this;
212
+ }
213
+
214
+ /**
215
+ * Get table query clauses
216
+ *
217
+ * @param string $table Table name
218
+ * @return array
219
+ */
220
+ public function get_table_query_clauses( $table ) {
221
+ if ( isset( $this->table_query_clauses[ strtolower( $table ) ] ) ) {
222
+ return $this->table_query_clauses[ strtolower( $table ) ];
223
+ }
224
+
225
+ return array();
226
+ }
227
+
228
+ /**
229
+ * Set table prefix columns
230
+ *
231
+ * @param string $table Table name
232
+ * @param array $columns Table columns
233
+ * @return Ai1wm_Database
234
+ */
235
+ public function set_table_prefix_columns( $table, $columns ) {
236
+ foreach ( $columns as $column ) {
237
+ $this->table_prefix_columns[ strtolower( $table ) ][ strtolower( $column ) ] = true;
238
+ }
239
+
240
+ return $this;
241
+ }
242
+
243
+ /**
244
+ * Get table prefix columns
245
+ *
246
+ * @param string $table Table name
247
+ * @return array
248
+ */
249
+ public function get_table_prefix_columns( $table ) {
250
+ if ( isset( $this->table_prefix_columns[ strtolower( $table ) ] ) ) {
251
+ return $this->table_prefix_columns[ strtolower( $table ) ];
252
+ }
253
+
254
+ return array();
255
+ }
256
+
257
+ /**
258
+ * Set include table prefixes
259
+ *
260
+ * @param array $prefixes List of table prefixes
261
+ * @return Ai1wm_Database
262
+ */
263
+ public function set_include_table_prefixes( $prefixes ) {
264
+ $this->include_table_prefixes = $prefixes;
265
+
266
+ return $this;
267
+ }
268
+
269
+ /**
270
+ * Get include table prefixes
271
+ *
272
+ * @return array
273
+ */
274
+ public function get_include_table_prefixes() {
275
+ return $this->include_table_prefixes;
276
+ }
277
+
278
+ /**
279
+ * Set exclude table prefixes
280
+ *
281
+ * @param array $prefixes List of table prefixes
282
+ * @return Ai1wm_Database
283
+ */
284
+ public function set_exclude_table_prefixes( $prefixes ) {
285
+ $this->exclude_table_prefixes = $prefixes;
286
+
287
+ return $this;
288
+ }
289
+
290
+ /**
291
+ * Get exclude table prefixes
292
+ *
293
+ * @return array
294
+ */
295
+ public function get_exclude_table_prefixes() {
296
+ return $this->exclude_table_prefixes;
297
+ }
298
+
299
+ /**
300
+ * Get tables
301
+ *
302
+ * @return array
303
+ */
304
+ public function get_tables() {
305
+ $tables = array();
306
+
307
+ $result = $this->query( "SHOW TABLES FROM `{$this->wpdb->dbname}`" );
308
+ while ( $row = $this->fetch_row( $result ) ) {
309
+ if ( isset( $row[0] ) && ( $table_name = $row[0] ) ) {
310
+
311
+ // Include table prefixes
312
+ if ( $this->get_include_table_prefixes() ) {
313
+ $include = false;
314
+
315
+ // Check table prefixes
316
+ foreach ( $this->get_include_table_prefixes() as $prefix ) {
317
+ if ( stripos( $table_name, $prefix ) === 0 ) {
318
+ $include = true;
319
+ break;
320
+ }
321
+ }
322
+
323
+ // Skip current table
324
+ if ( $include === false ) {
325
+ continue;
326
+ }
327
+ }
328
+
329
+ // Exclude table prefixes
330
+ if ( $this->get_exclude_table_prefixes() ) {
331
+ $exclude = false;
332
+
333
+ // Check table prefixes
334
+ foreach ( $this->get_exclude_table_prefixes() as $prefix ) {
335
+ if ( stripos( $table_name, $prefix ) === 0 ) {
336
+ $exclude = true;
337
+ break;
338
+ }
339
+ }
340
+
341
+ // Skip current table
342
+ if ( $exclude === true ) {
343
+ continue;
344
+ }
345
+ }
346
+
347
+ // Add table name
348
+ $tables[] = $table_name;
349
+ }
350
+ }
351
+
352
+ // Close result cursor
353
+ $this->free_result( $result );
354
+
355
+ return $tables;
356
+ }
357
+
358
+ /**
359
+ * Export database into a file
360
+ *
361
+ * @param string $file_name Name of file
362
+ * @return bool
363
+ */
364
+ public function export( $file_name ) {
365
+
366
+ // Set file handler
367
+ $file_handler = fopen( $file_name, 'wb' );
368
+ if ( $file_handler === false ) {
369
+ throw new Exception( 'Unable to open database file' );
370
+ }
371
+
372
+ // Write headers
373
+ if ( fwrite( $file_handler, $this->get_header() ) === false ) {
374
+ throw new Exception( 'Unable to write database header information' );
375
+ }
376
+
377
+ // Export tables
378
+ foreach ( $this->get_tables() as $table_name ) {
379
+
380
+ // Replace table name prefixes
381
+ $new_table_name = $this->replace_table_prefixes( $table_name, 0 );
382
+
383
+ // Get table structure
384
+ $structure = $this->query( "SHOW CREATE TABLE `$table_name`" );
385
+ $table = $this->fetch_assoc( $structure );
386
+
387
+ // Close structure cursor
388
+ $this->free_result( $structure );
389
+
390
+ // Get create table
391
+ if ( isset( $table['Create Table'] ) ) {
392
+
393
+ // Write table drop statement
394
+ $drop_table = "DROP TABLE IF EXISTS `$new_table_name`;\n";
395
+
396
+ // Write table statement
397
+ if ( fwrite( $file_handler, $drop_table ) === false ) {
398
+ throw new Exception( 'Unable to write database table statement' );
399
+ }
400
+
401
+ // Replace create table prefixes
402
+ $create_table = $this->replace_table_prefixes( $table['Create Table'], 14 );
403
+
404
+ // Strip table constraints
405
+ $create_table = $this->strip_table_constraints( $create_table );
406
+
407
+ // Write table structure
408
+ if ( fwrite( $file_handler, $create_table ) === false ) {
409
+ throw new Exception( 'Unable to write database table structure' );
410
+ }
411
+
412
+ // Write end of statement
413
+ if ( fwrite( $file_handler, ";\n\n" ) === false ) {
414
+ throw new Exception( 'Unable to write database end of statement' );
415
+ }
416
+
417
+ // Set query
418
+ $query = "SELECT * FROM `$table_name` ";
419
+
420
+ // Apply additional table query clauses
421
+ if ( ( $query_clauses = $this->get_table_query_clauses( $table_name ) ) ) {
422
+ $query .= $query_clauses;
423
+ }
424
+
425
+ // Apply additional table prefix columns
426
+ $columns = $this->get_table_prefix_columns( $table_name );
427
+
428
+ // Get results
429
+ $result = $this->query( $query );
430
+
431
+ $processed_rows = 0;
432
+
433
+ // Generate insert statements
434
+ while ( $row = $this->fetch_assoc( $result ) ) {
435
+ if ( $processed_rows === 0 ) {
436
+ // Write start transaction
437
+ if ( fwrite( $file_handler, "START TRANSACTION;\n" ) === false ) {
438
+ throw new Exception( 'Unable to write database start transaction' );
439
+ }
440
+ }
441
+
442
+ $items = array();
443
+ foreach ( $row as $key => $value ) {
444
+ // Replace table prefix columns
445
+ if ( isset( $columns[ strtolower( $key ) ] ) ) {
446
+ $value = $this->replace_table_prefixes( $value, 0 );
447
+ }
448
+
449
+ // Replace table values
450
+ $items[] = is_null( $value ) ? 'NULL' : $this->quote( $this->replace_table_values( $value ) );
451
+ }
452
+
453
+ // Set table values
454
+ $table_values = implode( ',', $items );
455
+
456
+ // Set insert statement
457
+ $table_insert = "INSERT INTO `$new_table_name` VALUES ($table_values);\n";
458
+
459
+ // Write insert statement
460
+ if ( fwrite( $file_handler, $table_insert ) === false ) {
461
+ throw new Exception( 'Unable to write database insert statement' );
462
+ }
463
+
464
+ $processed_rows++;
465
+
466
+ // Write end of transaction
467
+ if ( $processed_rows === Ai1wm_Database::QUERIES_PER_TRANSACTION ) {
468
+ if (fwrite( $file_handler, "COMMIT;\n" ) === false ) {
469
+ throw new Exception( 'Unable to write database end of transaction' );
470
+ }
471
+
472
+ $processed_rows = 0;
473
+ }
474
+ }
475
+
476
+ // Write end of transaction
477
+ if ( $processed_rows !== 0 ) {
478
+ if ( fwrite( $file_handler, "COMMIT;\n" ) === false ) {
479
+ throw new Exception( 'Unable to write database end of transaction' );
480
+ }
481
+ }
482
+
483
+ // Write end of statements
484
+ if ( fwrite( $file_handler, "\n" ) === false ) {
485
+ throw new Exception( 'Unable to write database end of statement' );
486
+ }
487
+
488
+ // Close result cursor
489
+ $this->free_result( $result );
490
+ }
491
+ }
492
+
493
+ // Close file handler
494
+ fclose( $file_handler );
495
+
496
+ return true;
497
+ }
498
+
499
+ /**
500
+ * Import database from a file
501
+ *
502
+ * @param string $file_name Name of file
503
+ * @return bool
504
+ */
505
+ public function import( $file_name ) {
506
+
507
+ // Set collation name
508
+ $collation = $this->get_collation( 'utf8mb4_general_ci' );
509
+
510
+ // Set max allowed packet
511
+ $max_allowed_packet = $this->get_max_allowed_packet();
512
+
513
+ // Set file handler
514
+ $file_handler = fopen( $file_name, 'r' );
515
+ if ($file_handler === false) {
516
+ throw new Exception( 'Unable to open database file' );
517
+ }
518
+
519
+ $passed = 0;
520
+ $failed = 0;
521
+ $query = null;
522
+
523
+ // Read database file line by line
524
+ while ( ( $line = fgets( $file_handler ) ) !== false ) {
525
+ $query .= $line;
526
+
527
+ // End of query
528
+ if ( preg_match( '/;\s*$/', $query ) ) {
529
+
530
+ // Check max allowed packet
531
+ if ( strlen( $query ) <= $max_allowed_packet ) {
532
+
533
+ // Replace table prefixes
534
+ $query = $this->replace_table_prefixes( $query );
535
+
536
+ // Replace table values
537
+ $query = $this->replace_table_values( $query, true );
538
+
539
+ // Replace table collation
540
+ if ( empty( $collation ) ) {
541
+ $query = $this->replace_table_collation( $query );
542
+ }
543
+
544
+ try {
545
+
546
+ // Run SQL query
547
+ $result = $this->query( $query );
548
+ if ( $result === false ) {
549
+ throw new Exception( $this->error(), $this->errno() );
550
+ } else {
551
+ $passed++;
552
+ }
553
+
554
+ } catch ( Exception $e ) {
555
+ $failed++;
556
+ }
557
+
558
+ } else {
559
+ $failed++;
560
+ }
561
+
562
+ $query = null;
563
+ }
564
+ }
565
+
566
+ // Close file handler
567
+ fclose( $file_handler );
568
+
569
+ // Check failed queries
570
+ if ( ( ( $failed / $passed ) * 100 ) > 2 ) {
571
+ return false;
572
+ }
573
+
574
+ return true;
575
+ }
576
+
577
+ /**
578
+ * Flush database
579
+ *
580
+ * @return void
581
+ */
582
+ public function flush() {
583
+ foreach ( $this->get_tables() as $table_name ) {
584
+ $this->query( "DROP TABLE IF EXISTS `$table_name`" );
585
+ }
586
+ }
587
+
588
+ /**
589
+ * Get MySQL version
590
+ *
591
+ * @return string
592
+ */
593
+ protected function get_version() {
594
+ $version = null;
595
+
596
+ $result = $this->query( "SHOW VARIABLES LIKE 'version'" );
597
+ while ( $row = $this->fetch_row( $result ) ) {
598
+ if ( isset( $row[1] ) ) {
599
+ $version = $row[1];
600
+ break;
601
+ }
602
+ }
603
+
604
+ // Close result cursor
605
+ $this->free_result( $result );
606
+
607
+ return $version;
608
+ }
609
+
610
+ /**
611
+ * Get MySQL max allowed packaet
612
+ *
613
+ * @return integer
614
+ */
615
+ protected function get_max_allowed_packet() {
616
+ $max_allowed_packet = null;
617
+
618
+ $result = $this->query( "SHOW VARIABLES LIKE 'max_allowed_packet'" );
619
+ while ( $row = $this->fetch_row( $result ) ) {
620
+ if ( isset( $row[1] ) ) {
621
+ $max_allowed_packet = $row[1];
622
+ break;
623
+ }
624
+ }
625
+
626
+ // Close result cursor
627
+ $this->free_result( $result );
628
+
629
+ return $max_allowed_packet;
630
+ }
631
+
632
+ /**
633
+ * Get MySQL collation name
634
+ *
635
+ * @param string $collation_name Collation name
636
+ * @return string
637
+ */
638
+ protected function get_collation( $collation_name ) {
639
+ $collation_result = null;
640
+
641
+ $result = $this->query( "SHOW COLLATION LIKE '$collation_name'" );
642
+ while ( $row = $this->fetch_row( $result ) ) {
643
+ if ( isset( $row[0] ) ) {
644
+ $collation_result = $row[0];
645
+ break;
646
+ }
647
+ }
648
+
649
+ // Close result cursor
650
+ $this->free_result( $result );
651
+
652
+ return $collation_result;
653
+ }
654
+
655
+ /**
656
+ * Replace table prefixes
657
+ *
658
+ * @param string $input Table value
659
+ * @param boolean $position Replace first occurrence at a specified position
660
+ * @return string
661
+ */
662
+ protected function replace_table_prefixes( $input, $position = false ) {
663
+ // Get table prefixes
664
+ $search = $this->get_old_table_prefixes();
665
+ $replace = $this->get_new_table_prefixes();
666
+
667
+ // Replace first occurance at a specified position
668
+ if ( $position !== false ) {
669
+ for ( $i = 0; $i < count( $search ); $i++ ) {
670
+ $current = stripos( $input, $search[$i] );
671
+ if ( $current === $position ) {
672
+ $input = substr_replace( $input, $replace[$i], $current, strlen( $search[$i] ) );
673
+ }
674
+ }
675
+
676
+ return $input;
677
+ }
678
+
679
+ // Replace all occurrences
680
+ return str_ireplace( $search, $replace, $input );
681
+ }
682
+
683
+ /**
684
+ * Replace table values
685
+ *
686
+ * @param string $input Table value
687
+ * @param boolean $parse Parse value
688
+ * @return string
689
+ */
690
+ protected function replace_table_values( $input, $parse = false ) {
691
+ // Get replace values
692
+ $old = $this->get_old_replace_values();
693
+ $new = $this->get_new_replace_values();
694
+
695
+ $old_values = array();
696
+ $new_values = array();
697
+
698
+ // Prepare replace values
699
+ for ( $i = 0; $i < count( $old ); $i++ ) {
700
+ if ( stripos( $input, $old[$i] ) !== false ) {
701
+ $old_values[] = $old[$i];
702
+ $new_values[] = $new[$i];
703
+ }
704
+ }
705
+
706
+ // Do replace values
707
+ if ( $old_values ) {
708
+ if ( $parse ) {
709
+ return $this->parse_serialized_values( $old_values, $new_values, $input );
710
+ }
711
+
712
+ return Ai1wm_Database_Utility::replace_serialized_values( $old_values, $new_values, $input );
713
+ }
714
+
715
+ return $input;
716
+ }
717
+
718
+ /**
719
+ * Parse serialized values
720
+ *
721
+ * @param array $old_values Old replace values
722
+ * @param array $new_values New replace values
723
+ * @param string $input Table value
724
+ * @return string
725
+ */
726
+ protected function parse_serialized_values( $old_values, $new_values, $input ) {
727
+ // Serialization format
728
+ $array = '(a:\d+:{.*?})';
729
+ $string = '(s:\d+:".*?")';
730
+ $object = '(O:\d+:".+":\d+:{.*})';
731
+
732
+ // Number of replaces
733
+ $count = 0;
734
+
735
+ // Replace serialized values
736
+ $input = preg_replace_callback( "/'($array|$string|$object)'/", array( $this, 'replace_serialized_values' ), $input, -1, $count );
737
+
738
+ // Replace values
739
+ if ( $count === 0 ) {
740
+ $input = Ai1wm_Database_Utility::replace_values( $old_values, $new_values, $input );
741
+ }
742
+
743
+ return $input;
744
+ }
745
+
746
+ /**
747
+ * Replace serialized values (callback)
748
+ *
749
+ * @param array $matches List of matches
750
+ * @return string
751
+ */
752
+ protected function replace_serialized_values( $matches ) {
753
+ // Unescape MySQL special characters
754
+ $input = Ai1wm_Database_Utility::unescape_mysql( $matches[1] );
755
+
756
+ // Replace serialized values
757
+ $input = Ai1wm_Database_Utility::replace_serialized_values( $this->get_old_replace_values(), $this->get_new_replace_values(), $input );
758
+
759
+ // Prepare query values
760
+ return $this->quote( $input );
761
+ }
762
+
763
+ /**
764
+ * Replace table collation
765
+ *
766
+ * @param string $input SQL statement
767
+ * @return string
768
+ */
769
+ protected function replace_table_collation($input) {
770
+ return str_ireplace( 'utf8mb4', 'utf8', $input );
771
+ }
772
+
773
+ /**
774
+ * Strip table constraints
775
+ *
776
+ * @param string $input SQL statement
777
+ * @return string
778
+ */
779
+ protected function strip_table_constraints($input) {
780
+ $pattern = array(
781
+ '/\s+CONSTRAINT(.+)REFERENCES(.+),/i',
782
+ '/,\s+CONSTRAINT(.+)REFERENCES(.+)/i',
783
+ );
784
+
785
+ return preg_replace( $pattern, '', $input );
786
+ }
787
+
788
+ /**
789
+ * Returns header for dump file
790
+ *
791
+ * @return string
792
+ */
793
+ protected function get_header() {
794
+ // Some info about software, source and time
795
+ $header = sprintf(
796
+ "-- All In One WP Migration SQL Dump\n" .
797
+ "-- https://servmask.com/\n" .
798
+ "--\n" .
799
+ "-- Host: %s\n" .
800
+ "-- Database: %s\n" .
801
+ "-- Class: %s\n" .
802
+ "--\n\n",
803
+ $this->wpdb->dbhost,
804
+ $this->wpdb->dbname,
805
+ get_class( $this )
806
+ );
807
+
808
+ return $header;
809
+ }
810
+
811
+ /**
812
+ * Run MySQL query
813
+ *
814
+ * @param string $input SQL query
815
+ * @return resource
816
+ */
817
+ abstract public function query( $input );
818
+
819
+ /**
820
+ * Escape string input for mysql query
821
+ *
822
+ * @param string $input String to escape
823
+ * @return string
824
+ */
825
+ abstract public function quote( $input );
826
+
827
+ /**
828
+ * Returns the error code for the most recent function call
829
+ *
830
+ * @return int
831
+ */
832
+ abstract public function errno();
833
+
834
+ /**
835
+ * Returns a string description of the last error
836
+ *
837
+ * @return string
838
+ */
839
+ abstract public function error();
840
+
841
+ /**
842
+ * Return the result from MySQL query as associative array
843
+ *
844
+ * @param resource $result MySQL resource
845
+ * @return array
846
+ */
847
+ abstract public function fetch_assoc( $result );
848
+
849
+ /**
850
+ * Return the result from MySQL query as row
851
+ *
852
+ * @param resource $result MySQL resource
853
+ * @return array
854
+ */
855
+ abstract public function fetch_row( $result );
856
+
857
+ /**
858
+ * Free MySQL result memory
859
+ *
860
+ * @param resource $result MySQL resource
861
+ * @return bool
862
+ */
863
+ abstract public function free_result( $result );
864
+ }
lib/vendor/servmask/filesystem/class-ai1wm-file-index.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -22,29 +22,57 @@
22
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
- class Ai1wm_File_Index {
26
 
 
27
  /**
28
- * Create a index.php file
29
  *
30
- * The method will create index.php file with contents '<?php // silence is golden' without the single quotes
31
- * at the path specified by the argument. The file is only created if it doesn't exist.
32
  *
33
- * @param string $file Path to the index.php file
34
- * @return boolean
 
 
35
  */
36
- public static function create( $file ) {
37
- if ( ! is_file( $file ) ) {
38
- // File doesn't exist attempt to create it
39
- $handle = fopen( $file, 'w' );
40
- // Check if we were able to open the file
41
  if ( false === $handle ) {
42
  return false;
43
  }
44
- fwrite( $handle, '<?php // silence is golden' );
45
  fclose( $handle );
46
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
 
48
- return true;
 
 
 
 
 
 
 
 
 
 
 
49
  }
50
- }
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
22
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
 
25
 
26
+ class Ai1wm_File {
27
  /**
28
+ * Create a file with contents
29
  *
30
+ * The method will only create the file if it doesn't already exist.
 
31
  *
32
+ * @param string $path Path to the file
33
+ * @param string $contents Contents of the file
34
+ *
35
+ * @return boolean|null
36
  */
37
+ public static function create( $path, $contents ) {
38
+ if ( ! is_file( $path ) ) {
39
+ $handle = fopen( $path, 'w' );
 
 
40
  if ( false === $handle ) {
41
  return false;
42
  }
43
+ fwrite( $handle, $contents );
44
  fclose( $handle );
45
  }
46
+ }
47
+ }
48
+
49
+ class Ai1wm_File_Index {
50
+ /**
51
+ * Create a index.php file
52
+ *
53
+ * The method will create index.php file with contents '<?php // silence is golden' without the single quotes
54
+ * at the path specified by the argument.
55
+ *
56
+ * @param string $path Path to the index.php file
57
+ * @return boolean|null
58
+ */
59
+ public static function create( $path ) {
60
+ $contents = '<?php // silence is golden';
61
+ return Ai1wm_File::create( $path, $contents );
62
+ }
63
+ }
64
 
65
+ class Ai1wm_File_Htaccess {
66
+ /**
67
+ * Create .htaccess file
68
+ *
69
+ * The method will create .htaccess file with contents 'AddType application/octet-stream .wpress'
70
+ *
71
+ * @param string $path Path to the .htaccess file
72
+ * @return boolean|null
73
+ */
74
+ public static function create( $path ) {
75
+ $contents = "<IfModule mod_mime.c>\nAddType application/octet-stream .wpress\n</IfModule>";
76
+ return Ai1wm_File::create( $path, $contents );
77
  }
78
+ }
lib/vendor/servmask/filter/class-ai1wm-extension-filter.php CHANGED
@@ -1,7 +1,6 @@
1
  <?php
2
-
3
  /**
4
- * Copyright (C) 2014 ServMask Inc.
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License as published by
@@ -23,6 +22,7 @@
23
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
24
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
25
  */
 
26
  class Ai1wm_Extension_Filter extends FilterIterator {
27
 
28
  protected $include = array();
1
  <?php
 
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
22
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
+
26
  class Ai1wm_Extension_Filter extends FilterIterator {
27
 
28
  protected $include = array();
lib/vendor/servmask/filter/class-ai1wm-recursive-exclude-filter.php CHANGED
@@ -1,7 +1,6 @@
1
  <?php
2
-
3
  /**
4
- * Copyright (C) 2014 ServMask Inc.
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License as published by
@@ -23,6 +22,7 @@
23
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
24
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
25
  */
 
26
  class Ai1wm_Recursive_Exclude_Filter extends RecursiveFilterIterator {
27
 
28
  protected $exclude = array();
1
  <?php
 
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
22
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
+
26
  class Ai1wm_Recursive_Exclude_Filter extends RecursiveFilterIterator {
27
 
28
  protected $exclude = array();
lib/vendor/servmask/iterator/class-ai1wm-recursive-directory-iterator.php CHANGED
@@ -1,7 +1,6 @@
1
  <?php
2
-
3
  /**
4
- * Copyright (C) 2014 ServMask Inc.
5
  *
6
  * This program is free software: you can redistribute it and/or modify
7
  * it under the terms of the GNU General Public License as published by
@@ -23,6 +22,7 @@
23
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
24
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
25
  */
 
26
  class Ai1wm_Recursive_Directory_Iterator extends RecursiveDirectoryIterator {
27
 
28
  protected $exclude = array();
1
  <?php
 
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
22
  * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
  * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
  */
25
+
26
  class Ai1wm_Recursive_Directory_Iterator extends RecursiveDirectoryIterator {
27
 
28
  protected $exclude = array();
lib/view/assets/css/{backup.min.css → backups.min.css} RENAMED
@@ -1 +1 @@
1
- @charset "UTF-8";.ai1wm-divider{-ms-box-sizing:border-box;box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;border:none;height:0;background-color:transparent;font-size:14px;font-weight:700;text-align:center;text-transform:uppercase;color:rgba(0,0,0,.8);position:relative;top:0%;left:0%;margin:1rem 2.5rem;height:auto;padding:0;line-height:1}.ai1wm-divider:before,.ai1wm-divider:after{position:absolute;content:" ";z-index:3;width:50%;top:50%;height:0%;border-top:1px solid rgba(0,0,0,.1);border-bottom:1px solid rgba(255,255,255,.8)}.ai1wm-divider:before{left:0%;margin-left:-2.5rem}.ai1wm-divider:after{left:auto;right:0%;margin-right:-2.5rem}@-webkit-keyframes ai1wm-rotate{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}25%{-webkit-transform:rotateZ(-90deg);transform:rotateZ(-90deg)}50%{-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}75%{-webkit-transform:rotateZ(-270deg);transform:rotateZ(-270deg)}100%{-webkit-transform:rotateZ(-360deg);transform:rotateZ(-360deg)}}@keyframes ai1wm-rotate{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}25%{-webkit-transform:rotateZ(-90deg);transform:rotateZ(-90deg)}50%{-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}75%{-webkit-transform:rotateZ(-270deg);transform:rotateZ(-270deg)}100%{-webkit-transform:rotateZ(-360deg);transform:rotateZ(-360deg)}}@-webkit-keyframes ai1wm-emphasize{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.2);transform:scale(1.2)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes ai1wm-emphasize{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.2);transform:scale(1.2)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes ai1wm-fadein{0%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1.5);transform:scale(1.5)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes ai1wm-fadein{0%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1.5);transform:scale(1.5)}100%{-webkit-transform:scale(1);transform:scale(1)}}[class^="ai1wm-icon-"],[class*=" ai1wm-icon-"]{font-family:'servmask';speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ai1wm-icon-file-zip:before{content:"\e60f"}.ai1wm-icon-folder:before{content:"\e60e"}.ai1wm-icon-file:before{content:"\e60b"}.ai1wm-icon-file-content:before{content:"\e60c"}.ai1wm-icon-cloud-upload:before{content:"\e600"}.ai1wm-icon-history:before{content:"\e603"}.ai1wm-icon-notification:before{content:"\e619"}.ai1wm-icon-arrow-down:before{content:"\e604"}.ai1wm-icon-close:before{content:"\e61a"}.ai1wm-icon-wordpress2:before{content:"\e620"}.ai1wm-icon-arrow-right:before{content:"\e605"}.ai1wm-icon-plus2:before{content:"\e607"}.ai1wm-icon-export:before{content:"\e601"}.ai1wm-icon-publish:before{content:"\e602"}.ai1wm-icon-paperplane:before{content:"\e608"}.ai1wm-icon-help:before{content:"\e609"}.ai1wm-icon-chevron-right:before{content:"\e60d"}.ai1wm-icon-chevron-down{display:inline-block;position:relative;-webkit-transform:rotateZ(90deg);transform:rotateZ(90deg);margin-left:.5em!important}.ai1wm-icon-chevron-down:before{content:"\e60d"}.ai1wm-icon-dropbox:before{content:"\e606"}.ai1wm-icon-gear:before{content:"\e60a"}.ai1wm-icon-alone{margin:0!important}@media (min-width:855px){.ai1wm-row{margin-right:399px}.ai1wm-row:before,.ai1wm-row:after{content:" ";display:table}.ai1wm-row:after{clear:both}.ai1wm-left{float:left;width:100%}.ai1wm-right{float:right;width:377px;margin-right:-399px}.ai1wm-right .ai1wm-sidebar{width:100%}.ai1wm-right .ai1wm-segment{width:333px;border:1px solid #d6d6d6;border-radius:3px;box-shadow:inset 0 1px 0 0 #fff;color:#333;background-color:#f9f9f9;padding:20px;text-decoration:none;text-shadow:0 1px 0 #fff;background-clip:padding-box}.ai1wm-right .ai1wm-segment h2{margin:22px 0 0;padding:0;font-weight:700;font-size:14px;text-transform:uppercase;text-align:center}.ai1wm-right .ai1wm-feedback-email{width:100%;font-weight:400;font-size:.8rem;height:2.3rem;line-height:2.3rem;border-radius:5px;margin-bottom:4px;padding:0 10px}.ai1wm-right .ai1wm-feedback-message,.ai1wm-right .ai1wm-http-authentication{width:100%;border-radius:3px;font-size:.8rem;padding:6px 10px;resize:none}.ai1wm-right .ai1wm-feedback-terms-segment{font-size:.7rem;line-height:1rem;margin:4px 0 8px}.ai1wm-right .ai1wm-feedback-terms-segment>.ai1wm-feedback-terms{border-radius:3px}}.ai1wm-holder{position:relative;border:1px solid #d6d6d6;border-radius:3px;box-shadow:inset 0 1px 0 0 #fff;padding:20px;background:#f9f9f9}.ai1wm-holder h1{margin:0;padding:0;float:left;font-weight:300;font-size:22px;text-transform:uppercase}.ai1wm-holder h1 i{position:relative;top:2px}@media (max-width:854px){.ai1wm-container{margin-left:10px!important}.ai1wm-row,.ai1wm-right{margin-right:0!important}.ai1wm-right{float:left!important;width:100%!important;margin-top:18px}.ai1wm-right .ai1wm-sidebar{width:auto!important;border:1px solid #d6d6d6;border-radius:3px;box-shadow:inset 0 1px 0 0 #fff;padding:20px;background:#f9f9f9}.ai1wm-right .ai1wm-feedback-email{width:100%;font-weight:400;font-size:.8rem;height:2.3rem;line-height:2.3rem;border-radius:5px;margin-bottom:4px;padding:0 10px}.ai1wm-right .ai1wm-feedback-message{width:100%;border-radius:3px;font-size:.8rem;padding:6px 10px;resize:none}.ai1wm-right .ai1wm-feedback-terms-segment{font-size:.7rem;line-height:1rem;margin:4px 0 8px;border-radius:3px}.ai1wm-right .ai1wm-feedback-terms-segment>.ai1wm-feedback-terms{border-radius:3px}}.ai1wm-container{margin:20px 20px 0 2px}.ai1wm-container:before,.ai1wm-container:after{content:" ";display:table}.ai1wm-container:after{clear:both}.ai1wm-replace-row{width:100%;box-shadow:outset 0 1px 0 0 #fff;border-radius:3px;color:#333;font-size:11px;font-weight:700;background-color:#f9f9f9;text-decoration:none;text-shadow:0 1px 0 #fff;background-clip:padding-box;margin-bottom:10px}.ai1wm-replace-row .ai1wm-field-inline{float:left;width:100%}.ai1wm-replace-row .ai1wm-field-inline input{width:100%;font-weight:400;font-size:.8rem;padding:0 10px;height:2.3rem;line-height:2.3rem;margin-bottom:4px}.ai1wm-field{margin-bottom:4px}.ai1wm-field input[type="text"],.ai1wm-field textarea{width:100%;font-weight:400}.ai1wm-field-set{margin-top:18px}.ai1wm-message{-moz-box-sizing:border-box;background-color:#EFEFEF;border-radius:4px;color:rgba(0,0,0,.6);height:auto;margin:10px 0;min-height:18px;padding:6px 10px;position:relative;border:1px solid;transition:opacity .1s ease 0s,color .1s ease 0s,background .1s ease 0s,box-shadow .1s ease 0s}.ai1wm-message.ai1wm-success-message{background-color:#F2F8F0;color:#119000;font-size:12px}.ai1wm-message.ai1wm-info-message{background-color:#d9edf7;color:#31708f;font-size:11px}.ai1wm-message.ai1wm-error-message{background-color:#F1D7D7;color:#A95252;font-size:12px}.ai1wm-message.ai1wm-red-message{color:#D95C5C;border:2px solid #D95C5C;background-color:transparent}.ai1wm-message.ai1wm-red-message h3{margin:.4em 0;color:#D95C5C}.ai1wm-message p{margin:4px 0;font-size:12px}.ai1wm-message-warning{display:block;font-size:14px;line-height:18px;padding:12px 20px;margin:0 0 22px;background-color:#f9f9f9;border:1px solid #d6d6d6;border-radius:3px;box-shadow:0 1px 0 0 #fff inset;border-left:4px solid #ffba00}.ai1wm-button-group{border:2px solid #27ae60;background-color:transparent;color:#27ae60;border-radius:5px;cursor:pointer;text-transform:uppercase;font-weight:600;transition:background-color .2s ease-out;display:inline-block}.ai1wm-button-group.ai1wm-button-export{width:147px}.ai1wm-button-group.ai1wm-button-export.ai1wm-open>.ai1wm-dropdown-menu{height:150px;border-top:1px solid #27ae60}.ai1wm-button-group.ai1wm-button-import{width:158px}.ai1wm-button-group.ai1wm-button-import.ai1wm-open>.ai1wm-dropdown-menu{height:180px;border-top:1px solid #27ae60}.ai1wm-button-group .ai1wm-button-main{padding:6px 25px 1px;height:22px}.ai1wm-button-group .ai1wm-dropdown-menu{height:0;overflow:hidden;transition:height .2s cubic-bezier(.19,1,.22,1);border-top:none}.ai1wm-dropdown-menu{list-style:none}.ai1wm-dropdown-menu,.ai1wm-dropdown-menu li{margin:0!important;padding:0}.ai1wm-dropdown-menu li a,.ai1wm-dropdown-menu li a:visited{display:block;padding:6px 25px 1px 26px;height:22px;line-height:22px;text-decoration:none;color:#27ae60;text-align:left}.ai1wm-dropdown-menu li a:hover,.ai1wm-dropdown-menu li a:visited:hover{text-decoration:none;color:#111}.ai1mw-lines{-webkit-transform:translate(11px,-1px);transform:translate(11px,-1px);position:relative;display:inline-block;width:12px;height:10px}.ai1wm-line{display:inline-block;width:100%;height:2px;margin:auto;background:#27ae60;position:absolute;transition:all .2s ease-in-out}.ai1wm-line-first{top:0}div.ai1wm-open .ai1wm-line-first,div.ai1wm-open .ai1wm-line-third,.ai1wm-line-second{top:50%}.ai1wm-line-third{top:100%}.ai1wm-button-gray{border:2px solid #95a5a6;background-color:transparent;color:#95a5a6;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-gray:hover{background-color:#95a5a6;color:#fff}.ai1wm-button-green{border:2px solid #27ae60;background-color:transparent;color:#27ae60;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-green:hover{background-color:#27ae60;color:#fff}.ai1wm-button-green-small{border:2px solid #6eb649;background-color:transparent;color:#6eb649;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-green-small:hover{background-color:#6eb649;color:#fff}.ai1wm-button-blue{border:2px solid #00aff0;background-color:transparent;color:#00aff0;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-blue:hover{background-color:#00aff0;color:#fff}.ai1wm-button-red{border:2px solid #e74c3c;background-color:transparent;color:#e74c3c;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-red:hover{background-color:#e74c3c;color:#fff}.ai1wm-button-alone{border-radius:50px!important;padding:5px 8px!important}.ai1wm-button-blue[disabled="disabled"],.ai1wm-button-green[disabled="disabled"],.ai1wm-button-red[disabled="disabled"],.ai1wm-button-green-small[disabled="disabled"]{opacity:.6;cursor:default}.ai1wm-button-blue[disabled="disabled"]:hover{color:#00aff0}.ai1wm-button-red[disabled="disabled"]:hover{color:#e74c3c}.ai1wm-button-green[disabled="disabled"]:hover{color:#27ae60}.ai1wm-button-blue[disabled="disabled"]:hover,.ai1wm-button-green[disabled="disabled"]:hover,.ai1wm-button-red[disabled="disabled"]:hover,.ai1wm-button-green-small[disabled="disabled"]:hover{background:0 0}.ai1wm-button-gray i,.ai1wm-button-green i,.ai1wm-button-blue i,.ai1wm-button-red i{margin-left:-.5em;margin-right:.2em}.ai1wm-message-close-button{position:absolute;right:10px;top:6px;text-decoration:none;font-size:10px}input[type="radio"].ai1wm-flat-radio-button{display:none}input[type="radio"].ai1wm-flat-radio-button+a i,input[type="radio"].ai1wm-flat-radio-button+label i{vertical-align:middle;float:left;width:25px;height:25px;border-radius:50%;background:0 0;border:2px solid #ccc;content:" ";cursor:pointer;position:relative;box-sizing:content-box}input[type="radio"].ai1wm-flat-radio-button:checked+a i,input[type="radio"].ai1wm-flat-radio-button:checked+label i{background-color:#d9d9d9;border-color:#6f6f6f}.ai1wm-clear{*zoom:1;clear:both}.ai1wm-clear:before,.ai1wm-clear:after{content:" ";display:table}.ai1wm-clear:after{clear:both}.ai1wm-list-expanded{display:block!important}.ai1wm-field-inline input{border-radius:5px}.ai1wm-container .ai1wm-row label{position:relative;top:-1px}.ai1wm-share-button-container{text-align:center}.ai1wm-share-button-container .ai1wm-share-button{text-decoration:none;margin:10px;font-size:30px}.ai1wm-report-problem{position:relative;float:right}.ai1wm-report-problem-dialog{position:absolute;z-index:999;width:280px;right:0;background-color:#fff;margin:6px 0 0;padding:15px 15px 10px;border:1px solid #D6D6D6;border-radius:3px;box-shadow:0 1px 0 0 #fff inset;display:none}.ai1wm-report-email{width:100%;font-weight:400;font-size:.8rem;height:2.3rem;line-height:2.3rem;border-radius:5px;margin-bottom:4px;padding:0 10px}.ai1wm-report-message{width:100%;border-radius:3px;font-size:.8rem;padding:6px 10px;resize:none}.ai1wm-report-cancel:link,.ai1wm-report-cancel:visited,.ai1wm-report-cancel:active,.ai1wm-feedback-cancel:link,.ai1wm-feedback-cancel:visited,.ai1wm-feedback-cancel:active{float:right;line-height:34px;outline:0;text-decoration:none;color:#e74c3c}.ai1wm-report-active{display:block}.ai1wm-report-terms-segment{font-size:.7rem;line-height:1rem;margin:4px 0 8px}.ai1wm-report-terms-segment>.ai1wm-report-terms{border-radius:3px}.ai1wm-no-underline{text-decoration:none}.ai1wm-top-negative-four{top:-4px}.ai1wm-feedback-form{display:none}.ai1wm-feedback-types{margin:0;padding:0;list-style:none}.ai1wm-feedback-types li{margin:14px 0;padding:0}.ai1wm-feedback-types>li>label>span{display:inline-block;padding:5px 0 6px 8px}.ai1wm-feedback-types>li>a{height:29px;outline:none;color:#333;text-deciration:none}.ai1wm-feedback-types>li>a>span{display:inline-block;padding:5px 0 6px 8px}.ai1wm-loader{display:inline-block;width:128px;height:128px;position:relative;-webkit-animation:ai1wm-rotate 1.5s infinite linear;animation:ai1wm-rotate 1.5s infinite linear;background:url("../img/logo.svg") no-repeat center center}.ai1wm-hide{display:none}#ai1wm-backup-progress{background-color:#dfdfdf;height:20px;width:350px;border-radius:15px}#ai1wm-backup-progress-bar{background-color:#00aff0;height:20px;line-height:20px;border-radius:15px;color:#fff;width:0;text-align:center}.ai1wm-backups{width:100%;margin:20px 0 0;padding:0;border-collapse:collapse}.ai1wm-backups .ai1wm-column-name{text-align:left}.ai1wm-backups .ai1wm-column-date,.ai1wm-backups .ai1wm-column-size{text-align:center}.ai1wm-backups .ai1wm-column-actions{text-align:right}.ai1wm-backups thead th{padding:4px 6px;text-align:left;font-size:1.2em}.ai1wm-backups tbody tr:first-child{border-top:1px solid #ccc}.ai1wm-backups tbody tr{border-bottom:1px solid #ccc}.ai1wm-backups tbody tr:hover{background:rgba(0,0,0,.1)}.ai1wm-backups tbody td{padding:4px 6px;box-sizing:border-box;line-height:36px}.ai1wm-backups tbody td span{font-weight:700}.ai1wm-backups tbody td.ai1wm-backup-actions{text-align:right;width:250px}.ai1wm-backups tbody td.ai1wm-backup-actions a{margin-left:4px}.ai1wm-backups tbody td.ai1wm-backup-actions span{transition:width 2s cubic-bezier(.19,1,.22,1);display:inline-block;width:0;text-align:center;visibility:hidden}.ai1wm-backups tbody td.ai1wm-backup-actions .ai1wm-button-on span{width:80px;visibility:visible}.ai1wm-authentication{margin:10px 0}.ai1wm-authentication .ai1wm-authentication-info{font-size:.7rem;line-height:1rem;margin:4px 0 8px}
1
+ @charset "UTF-8";.ai1wm-divider{-ms-box-sizing:border-box;box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;border:none;height:0;background-color:transparent;font-size:14px;font-weight:700;text-align:center;text-transform:uppercase;color:rgba(0,0,0,.8);position:relative;top:0%;left:0%;margin:1rem 2.5rem;height:auto;padding:0;line-height:1}.ai1wm-divider:before,.ai1wm-divider:after{position:absolute;content:" ";z-index:3;width:50%;top:50%;height:0%;border-top:1px solid rgba(0,0,0,.1);border-bottom:1px solid rgba(255,255,255,.8)}.ai1wm-divider:before{left:0%;margin-left:-2.5rem}.ai1wm-divider:after{left:auto;right:0%;margin-right:-2.5rem}@-webkit-keyframes ai1wm-rotate{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}25%{-webkit-transform:rotateZ(-90deg);transform:rotateZ(-90deg)}50%{-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}75%{-webkit-transform:rotateZ(-270deg);transform:rotateZ(-270deg)}100%{-webkit-transform:rotateZ(-360deg);transform:rotateZ(-360deg)}}@keyframes ai1wm-rotate{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}25%{-webkit-transform:rotateZ(-90deg);transform:rotateZ(-90deg)}50%{-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}75%{-webkit-transform:rotateZ(-270deg);transform:rotateZ(-270deg)}100%{-webkit-transform:rotateZ(-360deg);transform:rotateZ(-360deg)}}@-webkit-keyframes ai1wm-emphasize{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.2);transform:scale(1.2)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes ai1wm-emphasize{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.2);transform:scale(1.2)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes ai1wm-fadein{0%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1.5);transform:scale(1.5)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes ai1wm-fadein{0%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1.5);transform:scale(1.5)}100%{-webkit-transform:scale(1);transform:scale(1)}}[class^="ai1wm-icon-"],[class*=" ai1wm-icon-"]{font-family:'servmask';speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ai1wm-icon-file-zip:before{content:"\e60f"}.ai1wm-icon-folder:before{content:"\e60e"}.ai1wm-icon-file:before{content:"\e60b"}.ai1wm-icon-file-content:before{content:"\e60c"}.ai1wm-icon-cloud-upload:before{content:"\e600"}.ai1wm-icon-history:before{content:"\e603"}.ai1wm-icon-notification:before{content:"\e619"}.ai1wm-icon-arrow-down:before{content:"\e604"}.ai1wm-icon-close:before{content:"\e61a"}.ai1wm-icon-wordpress2:before{content:"\e620"}.ai1wm-icon-arrow-right:before{content:"\e605"}.ai1wm-icon-plus2:before{content:"\e607"}.ai1wm-icon-export:before{content:"\e601"}.ai1wm-icon-publish:before{content:"\e602"}.ai1wm-icon-paperplane:before{content:"\e608"}.ai1wm-icon-help:before{content:"\e609"}.ai1wm-icon-chevron-right:before{content:"\e60d"}.ai1wm-icon-chevron-down{display:inline-block;position:relative;-webkit-transform:rotateZ(90deg);transform:rotateZ(90deg);margin-left:.5em!important}.ai1wm-icon-chevron-down:before{content:"\e60d"}.ai1wm-icon-dropbox:before{content:"\e606"}.ai1wm-icon-gear:before{content:"\e60a"}.ai1wm-icon-alone{margin:0!important}@media (min-width:855px){.ai1wm-row{margin-right:399px}.ai1wm-row:before,.ai1wm-row:after{content:" ";display:table}.ai1wm-row:after{clear:both}.ai1wm-left{float:left;width:100%}.ai1wm-right{float:right;width:377px;margin-right:-399px}.ai1wm-right .ai1wm-sidebar{width:100%}.ai1wm-right .ai1wm-segment{width:333px;border:1px solid #d6d6d6;border-radius:3px;box-shadow:inset 0 1px 0 0 #fff;color:#333;background-color:#f9f9f9;padding:20px;text-decoration:none;text-shadow:0 1px 0 #fff;background-clip:padding-box}.ai1wm-right .ai1wm-segment h2{margin:22px 0 0;padding:0;font-weight:700;font-size:14px;text-transform:uppercase;text-align:center}.ai1wm-right .ai1wm-feedback-email{width:100%;font-weight:400;font-size:.8rem;height:2.3rem;line-height:2.3rem;border-radius:5px;margin-bottom:4px;padding:0 10px}.ai1wm-right .ai1wm-feedback-message,.ai1wm-right .ai1wm-http-authentication{width:100%;border-radius:3px;font-size:.8rem;padding:6px 10px;resize:none}.ai1wm-right .ai1wm-feedback-terms-segment{font-size:.7rem;line-height:1rem;margin:4px 0 8px}.ai1wm-right .ai1wm-feedback-terms-segment>.ai1wm-feedback-terms{border-radius:3px}}.ai1wm-holder{position:relative;border:1px solid #d6d6d6;border-radius:3px;box-shadow:inset 0 1px 0 0 #fff;padding:20px;background:#f9f9f9}.ai1wm-holder h1{margin:0;padding:0;float:left;font-weight:300;font-size:22px;text-transform:uppercase}.ai1wm-holder h1 i{position:relative;top:2px}@media (max-width:854px){.ai1wm-container{margin-left:10px!important}.ai1wm-row,.ai1wm-right{margin-right:0!important}.ai1wm-right{float:left!important;width:100%!important;margin-top:18px}.ai1wm-right .ai1wm-sidebar{width:auto!important;border:1px solid #d6d6d6;border-radius:3px;box-shadow:inset 0 1px 0 0 #fff;padding:20px;background:#f9f9f9}.ai1wm-right .ai1wm-feedback-email{width:100%;font-weight:400;font-size:.8rem;height:2.3rem;line-height:2.3rem;border-radius:5px;margin-bottom:4px;padding:0 10px}.ai1wm-right .ai1wm-feedback-message{width:100%;border-radius:3px;font-size:.8rem;padding:6px 10px;resize:none}.ai1wm-right .ai1wm-feedback-terms-segment{font-size:.7rem;line-height:1rem;margin:4px 0 8px;border-radius:3px}.ai1wm-right .ai1wm-feedback-terms-segment>.ai1wm-feedback-terms{border-radius:3px}}.ai1wm-container{margin:20px 20px 0 2px}.ai1wm-container:before,.ai1wm-container:after{content:" ";display:table}.ai1wm-container:after{clear:both}.ai1wm-replace-row{width:100%;box-shadow:outset 0 1px 0 0 #fff;border-radius:3px;color:#333;font-size:11px;font-weight:700;background-color:#f9f9f9;text-decoration:none;text-shadow:0 1px 0 #fff;background-clip:padding-box;margin-bottom:10px}.ai1wm-replace-row .ai1wm-field-inline{float:left;width:100%}.ai1wm-replace-row .ai1wm-field-inline input{width:100%;font-weight:400;font-size:.8rem;padding:0 10px;height:2.3rem;line-height:2.3rem;margin-bottom:4px}.ai1wm-field{margin-bottom:4px}.ai1wm-field input[type="text"],.ai1wm-field textarea{width:100%;font-weight:400}.ai1wm-field-set{margin-top:18px}.ai1wm-message{-moz-box-sizing:border-box;background-color:#EFEFEF;border-radius:4px;color:rgba(0,0,0,.6);height:auto;margin:10px 0;min-height:18px;padding:6px 10px;position:relative;border:1px solid;transition:opacity .1s ease 0s,color .1s ease 0s,background .1s ease 0s,box-shadow .1s ease 0s}.ai1wm-message.ai1wm-success-message{background-color:#F2F8F0;color:#119000;font-size:12px}.ai1wm-message.ai1wm-info-message{background-color:#d9edf7;color:#31708f;font-size:11px}.ai1wm-message.ai1wm-error-message{background-color:#F1D7D7;color:#A95252;font-size:12px}.ai1wm-message.ai1wm-red-message{color:#D95C5C;border:2px solid #D95C5C;background-color:transparent}.ai1wm-message.ai1wm-red-message h3{margin:.4em 0;color:#D95C5C}.ai1wm-message p{margin:4px 0;font-size:12px}.ai1wm-message-warning{display:block;font-size:14px;line-height:18px;padding:12px 20px;margin:0 0 22px;background-color:#f9f9f9;border:1px solid #d6d6d6;border-radius:3px;box-shadow:0 1px 0 0 #fff inset;border-left:4px solid #ffba00}.ai1wm-button-group{border:2px solid #27ae60;background-color:transparent;color:#27ae60;border-radius:5px;cursor:pointer;text-transform:uppercase;font-weight:600;transition:background-color .2s ease-out;display:inline-block}.ai1wm-button-group.ai1wm-button-export{width:147px}.ai1wm-button-group.ai1wm-button-export.ai1wm-open>.ai1wm-dropdown-menu{height:180px;border-top:1px solid #27ae60}.ai1wm-button-group.ai1wm-button-import{width:158px}.ai1wm-button-group.ai1wm-button-import.ai1wm-open>.ai1wm-dropdown-menu{height:210px;border-top:1px solid #27ae60}.ai1wm-button-group .ai1wm-button-main{padding:6px 25px 1px;height:22px}.ai1wm-button-group .ai1wm-dropdown-menu{height:0;overflow:hidden;transition:height .2s cubic-bezier(.19,1,.22,1);border-top:none}.ai1wm-dropdown-menu{list-style:none}.ai1wm-dropdown-menu,.ai1wm-dropdown-menu li{margin:0!important;padding:0}.ai1wm-dropdown-menu li a,.ai1wm-dropdown-menu li a:visited{display:block;padding:6px 25px 1px 26px;height:22px;line-height:22px;text-decoration:none;color:#27ae60;text-align:left}.ai1wm-dropdown-menu li a:hover,.ai1wm-dropdown-menu li a:visited:hover{text-decoration:none;color:#111}.ai1mw-lines{-webkit-transform:translate(11px,-1px);transform:translate(11px,-1px);position:relative;display:inline-block;width:12px;height:10px}.ai1wm-line{display:inline-block;width:100%;height:2px;margin:auto;background:#27ae60;position:absolute;transition:all .2s ease-in-out}.ai1wm-line-first{top:0}div.ai1wm-open .ai1wm-line-first,div.ai1wm-open .ai1wm-line-third,.ai1wm-line-second{top:50%}.ai1wm-line-third{top:100%}.ai1wm-button-gray{border:2px solid #95a5a6;background-color:transparent;color:#95a5a6;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-gray:hover{background-color:#95a5a6;color:#fff}.ai1wm-button-green{border:2px solid #27ae60;background-color:transparent;color:#27ae60;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-green:hover{background-color:#27ae60;color:#fff}.ai1wm-button-green-small{border:2px solid #6eb649;background-color:transparent;color:#6eb649;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-green-small:hover{background-color:#6eb649;color:#fff}.ai1wm-button-blue{border:2px solid #00aff0;background-color:transparent;color:#00aff0;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-blue:hover{background-color:#00aff0;color:#fff}.ai1wm-button-red{border:2px solid #e74c3c;background-color:transparent;color:#e74c3c;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-red:hover{background-color:#e74c3c;color:#fff}.ai1wm-button-alone{border-radius:50px!important;padding:5px 8px!important}.ai1wm-button-blue[disabled="disabled"],.ai1wm-button-green[disabled="disabled"],.ai1wm-button-red[disabled="disabled"],.ai1wm-button-green-small[disabled="disabled"]{opacity:.6;cursor:default}.ai1wm-button-blue[disabled="disabled"]:hover{color:#00aff0}.ai1wm-button-red[disabled="disabled"]:hover{color:#e74c3c}.ai1wm-button-green[disabled="disabled"]:hover{color:#27ae60}.ai1wm-button-blue[disabled="disabled"]:hover,.ai1wm-button-green[disabled="disabled"]:hover,.ai1wm-button-red[disabled="disabled"]:hover,.ai1wm-button-green-small[disabled="disabled"]:hover{background:0 0}.ai1wm-button-gray i,.ai1wm-button-green i,.ai1wm-button-blue i,.ai1wm-button-red i{margin-left:-.5em;margin-right:.2em}.ai1wm-message-close-button{position:absolute;right:10px;top:6px;text-decoration:none;font-size:10px}input[type="radio"].ai1wm-flat-radio-button{display:none}input[type="radio"].ai1wm-flat-radio-button+a i,input[type="radio"].ai1wm-flat-radio-button+label i{vertical-align:middle;float:left;width:25px;height:25px;border-radius:50%;background:0 0;border:2px solid #ccc;content:" ";cursor:pointer;position:relative;box-sizing:content-box}input[type="radio"].ai1wm-flat-radio-button:checked+a i,input[type="radio"].ai1wm-flat-radio-button:checked+label i{background-color:#d9d9d9;border-color:#6f6f6f}.ai1wm-clear{*zoom:1;clear:both}.ai1wm-clear:before,.ai1wm-clear:after{content:" ";display:table}.ai1wm-clear:after{clear:both}.ai1wm-list-expanded{display:block!important}.ai1wm-field-inline input{border-radius:5px}.ai1wm-container .ai1wm-row label{position:relative;top:-1px}.ai1wm-share-button-container{text-align:center}.ai1wm-share-button-container .ai1wm-share-button{text-decoration:none;margin:10px;font-size:30px}.ai1wm-report-problem{position:relative;float:right}.ai1wm-report-problem-dialog{position:absolute;z-index:999;width:280px;right:0;background-color:#fff;margin:6px 0 0;padding:15px 15px 10px;border:1px solid #D6D6D6;border-radius:3px;box-shadow:0 1px 0 0 #fff inset;display:none}.ai1wm-report-email{width:100%;font-weight:400;font-size:.8rem;height:2.3rem;line-height:2.3rem;border-radius:5px;margin-bottom:4px;padding:0 10px}.ai1wm-report-message{width:100%;border-radius:3px;font-size:.8rem;padding:6px 10px;resize:none}.ai1wm-report-cancel:link,.ai1wm-report-cancel:visited,.ai1wm-report-cancel:active,.ai1wm-feedback-cancel:link,.ai1wm-feedback-cancel:visited,.ai1wm-feedback-cancel:active{float:right;line-height:34px;outline:0;text-decoration:none;color:#e74c3c}.ai1wm-report-active{display:block}.ai1wm-report-terms-segment{font-size:.7rem;line-height:1rem;margin:4px 0 8px}.ai1wm-report-terms-segment>.ai1wm-report-terms{border-radius:3px}.ai1wm-no-underline{text-decoration:none}.ai1wm-top-negative-four{top:-4px}.ai1wm-feedback-form{display:none}.ai1wm-feedback-types{margin:0;padding:0;list-style:none}.ai1wm-feedback-types li{margin:14px 0;padding:0}.ai1wm-feedback-types>li>label>span{display:inline-block;padding:5px 0 6px 8px}.ai1wm-feedback-types>li>a{height:29px;outline:none;color:#333;text-deciration:none}.ai1wm-feedback-types>li>a>span{display:inline-block;padding:5px 0 6px 8px}.ai1wm-loader{display:inline-block;width:128px;height:128px;position:relative;-webkit-animation:ai1wm-rotate 1.5s infinite linear;animation:ai1wm-rotate 1.5s infinite linear;background:url("../img/logo.svg") no-repeat center center}.ai1wm-hide{display:none}.ai1wm-label{border:1px solid #5cb85c;background-color:transparent;color:#5cb85c;cursor:pointer;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;padding:.2em .6em;font-size:.8em;border-radius:5px}.ai1wm-label:hover{background-color:#5cb85c;color:#fff}.ai1wm-dialog-message{text-align:left;line-height:1.5em}.ai1wm-overlay{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.7);z-index:100001}.ai1wm-modal-container{position:fixed;display:none;top:50%;left:50%;z-index:100002;width:480px;height:auto;padding:16px;-webkit-transform:translate(-240px,-94px);transform:translate(-240px,-94px);border:1px solid #fff;box-shadow:0 2px 6px #292929;border-radius:6px;background:#f6f6f6;box-sizing:border-box;text-align:center}.ai1wm-modal-container section{display:block;min-height:102px}.ai1wm-modal-container section h1{margin:0;padding:0}.ai1wm-modal-container section h1 .ai1wm-title-green{color:#27ae60;font-size:20px}.ai1wm-modal-container section h1 .ai1wm-title-red{color:#e74c3c;font-size:20px}.ai1wm-modal-container section h1 .ai1wm-loader{width:32px;height:32px}.ai1wm-modal-container section h1 .ai1wm-icon-notification{font-size:1.2em;color:#e74c3c}.ai1wm-modal-container section p{margin:0;padding:12px 0}.ai1wm-modal-container section p .ai1wm-modal-subtitle-green{color:#27ae60}.ai1wm-modal-container section p .ai1wm-modal-subtitle-red{color:#e74c3c}.ai1wm-modal-container section p .ai1wm-modal-subdescription{display:block;text-align:left}.ai1wm-modal-container section p a.ai1wm-button-green{display:inline-block;position:relative;top:26px}.ai1wm-modal-container section p a.ai1wm-emphasize{-webkit-animation:ai1wm-emphasize 1s infinite;animation:ai1wm-emphasize 1s infinite}.ai1wm-modal-container section p em{display:block;color:#34495e;font-style:normal}.ai1wm-growl-info{position:fixed;z-index:200000;top:0;margin-top:16px;right:16px;width:200px;padding:16px;background:#f1c40f;border:1px solid #e67e22;border-radius:5px;color:#111}#ai1wm-backup-progress{background-color:#dfdfdf;height:20px;width:350px;border-radius:15px}#ai1wm-backup-progress-bar{background-color:#00aff0;height:20px;line-height:20px;border-radius:15px;color:#fff;width:0;text-align:center}.ai1wm-backups{width:100%;margin:20px 0 0;padding:0;border-collapse:collapse}.ai1wm-backups .ai1wm-column-name{text-align:left}.ai1wm-backups .ai1wm-column-date,.ai1wm-backups .ai1wm-column-size{text-align:center}.ai1wm-backups .ai1wm-column-actions{text-align:right}.ai1wm-backups thead th{padding:4px 6px;text-align:left;font-size:1.2em}.ai1wm-backups tbody tr:first-child{border-top:1px solid #ccc}.ai1wm-backups tbody tr{border-bottom:1px solid #ccc}.ai1wm-backups tbody tr:hover{background:rgba(0,0,0,.1)}.ai1wm-backups tbody td{padding:4px 6px;box-sizing:border-box;line-height:36px}.ai1wm-backups tbody td span{font-weight:700}.ai1wm-backups tbody td.ai1wm-backup-actions{text-align:right;width:250px}.ai1wm-backups tbody td.ai1wm-backup-actions a{margin-left:4px}.ai1wm-backups tbody td.ai1wm-backup-actions span{transition:width 2s cubic-bezier(.19,1,.22,1);display:inline-block;width:0;text-align:center;visibility:hidden}.ai1wm-backups tbody td.ai1wm-backup-actions .ai1wm-button-on span{width:80px;visibility:visible}.ai1wm-authentication{margin:10px 0}.ai1wm-authentication .ai1wm-authentication-info{font-size:.7rem;line-height:1rem;margin:4px 0 8px}
lib/view/assets/css/export.min.css CHANGED
@@ -1 +1 @@
1
- @charset "UTF-8";.ai1wm-divider{-ms-box-sizing:border-box;box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;border:none;height:0;background-color:transparent;font-size:14px;font-weight:700;text-align:center;text-transform:uppercase;color:rgba(0,0,0,.8);position:relative;top:0%;left:0%;margin:1rem 2.5rem;height:auto;padding:0;line-height:1}.ai1wm-divider:before,.ai1wm-divider:after{position:absolute;content:" ";z-index:3;width:50%;top:50%;height:0%;border-top:1px solid rgba(0,0,0,.1);border-bottom:1px solid rgba(255,255,255,.8)}.ai1wm-divider:before{left:0%;margin-left:-2.5rem}.ai1wm-divider:after{left:auto;right:0%;margin-right:-2.5rem}@-webkit-keyframes ai1wm-rotate{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}25%{-webkit-transform:rotateZ(-90deg);transform:rotateZ(-90deg)}50%{-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}75%{-webkit-transform:rotateZ(-270deg);transform:rotateZ(-270deg)}100%{-webkit-transform:rotateZ(-360deg);transform:rotateZ(-360deg)}}@keyframes ai1wm-rotate{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}25%{-webkit-transform:rotateZ(-90deg);transform:rotateZ(-90deg)}50%{-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}75%{-webkit-transform:rotateZ(-270deg);transform:rotateZ(-270deg)}100%{-webkit-transform:rotateZ(-360deg);transform:rotateZ(-360deg)}}@-webkit-keyframes ai1wm-emphasize{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.2);transform:scale(1.2)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes ai1wm-emphasize{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.2);transform:scale(1.2)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes ai1wm-fadein{0%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1.5);transform:scale(1.5)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes ai1wm-fadein{0%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1.5);transform:scale(1.5)}100%{-webkit-transform:scale(1);transform:scale(1)}}[class^="ai1wm-icon-"],[class*=" ai1wm-icon-"]{font-family:'servmask';speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ai1wm-icon-file-zip:before{content:"\e60f"}.ai1wm-icon-folder:before{content:"\e60e"}.ai1wm-icon-file:before{content:"\e60b"}.ai1wm-icon-file-content:before{content:"\e60c"}.ai1wm-icon-cloud-upload:before{content:"\e600"}.ai1wm-icon-history:before{content:"\e603"}.ai1wm-icon-notification:before{content:"\e619"}.ai1wm-icon-arrow-down:before{content:"\e604"}.ai1wm-icon-close:before{content:"\e61a"}.ai1wm-icon-wordpress2:before{content:"\e620"}.ai1wm-icon-arrow-right:before{content:"\e605"}.ai1wm-icon-plus2:before{content:"\e607"}.ai1wm-icon-export:before{content:"\e601"}.ai1wm-icon-publish:before{content:"\e602"}.ai1wm-icon-paperplane:before{content:"\e608"}.ai1wm-icon-help:before{content:"\e609"}.ai1wm-icon-chevron-right:before{content:"\e60d"}.ai1wm-icon-chevron-down{display:inline-block;position:relative;-webkit-transform:rotateZ(90deg);transform:rotateZ(90deg);margin-left:.5em!important}.ai1wm-icon-chevron-down:before{content:"\e60d"}.ai1wm-icon-dropbox:before{content:"\e606"}.ai1wm-icon-gear:before{content:"\e60a"}.ai1wm-icon-alone{margin:0!important}@media (min-width:855px){.ai1wm-row{margin-right:399px}.ai1wm-row:before,.ai1wm-row:after{content:" ";display:table}.ai1wm-row:after{clear:both}.ai1wm-left{float:left;width:100%}.ai1wm-right{float:right;width:377px;margin-right:-399px}.ai1wm-right .ai1wm-sidebar{width:100%}.ai1wm-right .ai1wm-segment{width:333px;border:1px solid #d6d6d6;border-radius:3px;box-shadow:inset 0 1px 0 0 #fff;color:#333;background-color:#f9f9f9;padding:20px;text-decoration:none;text-shadow:0 1px 0 #fff;background-clip:padding-box}.ai1wm-right .ai1wm-segment h2{margin:22px 0 0;padding:0;font-weight:700;font-size:14px;text-transform:uppercase;text-align:center}.ai1wm-right .ai1wm-feedback-email{width:100%;font-weight:400;font-size:.8rem;height:2.3rem;line-height:2.3rem;border-radius:5px;margin-bottom:4px;padding:0 10px}.ai1wm-right .ai1wm-feedback-message,.ai1wm-right .ai1wm-http-authentication{width:100%;border-radius:3px;font-size:.8rem;padding:6px 10px;resize:none}.ai1wm-right .ai1wm-feedback-terms-segment{font-size:.7rem;line-height:1rem;margin:4px 0 8px}.ai1wm-right .ai1wm-feedback-terms-segment>.ai1wm-feedback-terms{border-radius:3px}}.ai1wm-holder{position:relative;border:1px solid #d6d6d6;border-radius:3px;box-shadow:inset 0 1px 0 0 #fff;padding:20px;background:#f9f9f9}.ai1wm-holder h1{margin:0;padding:0;float:left;font-weight:300;font-size:22px;text-transform:uppercase}.ai1wm-holder h1 i{position:relative;top:2px}@media (max-width:854px){.ai1wm-container{margin-left:10px!important}.ai1wm-row,.ai1wm-right{margin-right:0!important}.ai1wm-right{float:left!important;width:100%!important;margin-top:18px}.ai1wm-right .ai1wm-sidebar{width:auto!important;border:1px solid #d6d6d6;border-radius:3px;box-shadow:inset 0 1px 0 0 #fff;padding:20px;background:#f9f9f9}.ai1wm-right .ai1wm-feedback-email{width:100%;font-weight:400;font-size:.8rem;height:2.3rem;line-height:2.3rem;border-radius:5px;margin-bottom:4px;padding:0 10px}.ai1wm-right .ai1wm-feedback-message{width:100%;border-radius:3px;font-size:.8rem;padding:6px 10px;resize:none}.ai1wm-right .ai1wm-feedback-terms-segment{font-size:.7rem;line-height:1rem;margin:4px 0 8px;border-radius:3px}.ai1wm-right .ai1wm-feedback-terms-segment>.ai1wm-feedback-terms{border-radius:3px}}.ai1wm-container{margin:20px 20px 0 2px}.ai1wm-container:before,.ai1wm-container:after{content:" ";display:table}.ai1wm-container:after{clear:both}.ai1wm-replace-row{width:100%;box-shadow:outset 0 1px 0 0 #fff;border-radius:3px;color:#333;font-size:11px;font-weight:700;background-color:#f9f9f9;text-decoration:none;text-shadow:0 1px 0 #fff;background-clip:padding-box;margin-bottom:10px}.ai1wm-replace-row .ai1wm-field-inline{float:left;width:100%}.ai1wm-replace-row .ai1wm-field-inline input{width:100%;font-weight:400;font-size:.8rem;padding:0 10px;height:2.3rem;line-height:2.3rem;margin-bottom:4px}.ai1wm-field{margin-bottom:4px}.ai1wm-field input[type="text"],.ai1wm-field textarea{width:100%;font-weight:400}.ai1wm-field-set{margin-top:18px}.ai1wm-message{-moz-box-sizing:border-box;background-color:#EFEFEF;border-radius:4px;color:rgba(0,0,0,.6);height:auto;margin:10px 0;min-height:18px;padding:6px 10px;position:relative;border:1px solid;transition:opacity .1s ease 0s,color .1s ease 0s,background .1s ease 0s,box-shadow .1s ease 0s}.ai1wm-message.ai1wm-success-message{background-color:#F2F8F0;color:#119000;font-size:12px}.ai1wm-message.ai1wm-info-message{background-color:#d9edf7;color:#31708f;font-size:11px}.ai1wm-message.ai1wm-error-message{background-color:#F1D7D7;color:#A95252;font-size:12px}.ai1wm-message.ai1wm-red-message{color:#D95C5C;border:2px solid #D95C5C;background-color:transparent}.ai1wm-message.ai1wm-red-message h3{margin:.4em 0;color:#D95C5C}.ai1wm-message p{margin:4px 0;font-size:12px}.ai1wm-message-warning{display:block;font-size:14px;line-height:18px;padding:12px 20px;margin:0 0 22px;background-color:#f9f9f9;border:1px solid #d6d6d6;border-radius:3px;box-shadow:0 1px 0 0 #fff inset;border-left:4px solid #ffba00}.ai1wm-button-group{border:2px solid #27ae60;background-color:transparent;color:#27ae60;border-radius:5px;cursor:pointer;text-transform:uppercase;font-weight:600;transition:background-color .2s ease-out;display:inline-block}.ai1wm-button-group.ai1wm-button-export{width:147px}.ai1wm-button-group.ai1wm-button-export.ai1wm-open>.ai1wm-dropdown-menu{height:150px;border-top:1px solid #27ae60}.ai1wm-button-group.ai1wm-button-import{width:158px}.ai1wm-button-group.ai1wm-button-import.ai1wm-open>.ai1wm-dropdown-menu{height:180px;border-top:1px solid #27ae60}.ai1wm-button-group .ai1wm-button-main{padding:6px 25px 1px;height:22px}.ai1wm-button-group .ai1wm-dropdown-menu{height:0;overflow:hidden;transition:height .2s cubic-bezier(.19,1,.22,1);border-top:none}.ai1wm-dropdown-menu{list-style:none}.ai1wm-dropdown-menu,.ai1wm-dropdown-menu li{margin:0!important;padding:0}.ai1wm-dropdown-menu li a,.ai1wm-dropdown-menu li a:visited{display:block;padding:6px 25px 1px 26px;height:22px;line-height:22px;text-decoration:none;color:#27ae60;text-align:left}.ai1wm-dropdown-menu li a:hover,.ai1wm-dropdown-menu li a:visited:hover{text-decoration:none;color:#111}.ai1mw-lines{-webkit-transform:translate(11px,-1px);transform:translate(11px,-1px);position:relative;display:inline-block;width:12px;height:10px}.ai1wm-line{display:inline-block;width:100%;height:2px;margin:auto;background:#27ae60;position:absolute;transition:all .2s ease-in-out}.ai1wm-line-first{top:0}div.ai1wm-open .ai1wm-line-first,div.ai1wm-open .ai1wm-line-third,.ai1wm-line-second{top:50%}.ai1wm-line-third{top:100%}.ai1wm-button-gray{border:2px solid #95a5a6;background-color:transparent;color:#95a5a6;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-gray:hover{background-color:#95a5a6;color:#fff}.ai1wm-button-green{border:2px solid #27ae60;background-color:transparent;color:#27ae60;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-green:hover{background-color:#27ae60;color:#fff}.ai1wm-button-green-small{border:2px solid #6eb649;background-color:transparent;color:#6eb649;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-green-small:hover{background-color:#6eb649;color:#fff}.ai1wm-button-blue{border:2px solid #00aff0;background-color:transparent;color:#00aff0;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-blue:hover{background-color:#00aff0;color:#fff}.ai1wm-button-red{border:2px solid #e74c3c;background-color:transparent;color:#e74c3c;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-red:hover{background-color:#e74c3c;color:#fff}.ai1wm-button-alone{border-radius:50px!important;padding:5px 8px!important}.ai1wm-button-blue[disabled="disabled"],.ai1wm-button-green[disabled="disabled"],.ai1wm-button-red[disabled="disabled"],.ai1wm-button-green-small[disabled="disabled"]{opacity:.6;cursor:default}.ai1wm-button-blue[disabled="disabled"]:hover{color:#00aff0}.ai1wm-button-red[disabled="disabled"]:hover{color:#e74c3c}.ai1wm-button-green[disabled="disabled"]:hover{color:#27ae60}.ai1wm-button-blue[disabled="disabled"]:hover,.ai1wm-button-green[disabled="disabled"]:hover,.ai1wm-button-red[disabled="disabled"]:hover,.ai1wm-button-green-small[disabled="disabled"]:hover{background:0 0}.ai1wm-button-gray i,.ai1wm-button-green i,.ai1wm-button-blue i,.ai1wm-button-red i{margin-left:-.5em;margin-right:.2em}.ai1wm-message-close-button{position:absolute;right:10px;top:6px;text-decoration:none;font-size:10px}input[type="radio"].ai1wm-flat-radio-button{display:none}input[type="radio"].ai1wm-flat-radio-button+a i,input[type="radio"].ai1wm-flat-radio-button+label i{vertical-align:middle;float:left;width:25px;height:25px;border-radius:50%;background:0 0;border:2px solid #ccc;content:" ";cursor:pointer;position:relative;box-sizing:content-box}input[type="radio"].ai1wm-flat-radio-button:checked+a i,input[type="radio"].ai1wm-flat-radio-button:checked+label i{background-color:#d9d9d9;border-color:#6f6f6f}.ai1wm-clear{*zoom:1;clear:both}.ai1wm-clear:before,.ai1wm-clear:after{content:" ";display:table}.ai1wm-clear:after{clear:both}.ai1wm-list-expanded{display:block!important}.ai1wm-field-inline input{border-radius:5px}.ai1wm-container .ai1wm-row label{position:relative;top:-1px}.ai1wm-share-button-container{text-align:center}.ai1wm-share-button-container .ai1wm-share-button{text-decoration:none;margin:10px;font-size:30px}.ai1wm-report-problem{position:relative;float:right}.ai1wm-report-problem-dialog{position:absolute;z-index:999;width:280px;right:0;background-color:#fff;margin:6px 0 0;padding:15px 15px 10px;border:1px solid #D6D6D6;border-radius:3px;box-shadow:0 1px 0 0 #fff inset;display:none}.ai1wm-report-email{width:100%;font-weight:400;font-size:.8rem;height:2.3rem;line-height:2.3rem;border-radius:5px;margin-bottom:4px;padding:0 10px}.ai1wm-report-message{width:100%;border-radius:3px;font-size:.8rem;padding:6px 10px;resize:none}.ai1wm-report-cancel:link,.ai1wm-report-cancel:visited,.ai1wm-report-cancel:active,.ai1wm-feedback-cancel:link,.ai1wm-feedback-cancel:visited,.ai1wm-feedback-cancel:active{float:right;line-height:34px;outline:0;text-decoration:none;color:#e74c3c}.ai1wm-report-active{display:block}.ai1wm-report-terms-segment{font-size:.7rem;line-height:1rem;margin:4px 0 8px}.ai1wm-report-terms-segment>.ai1wm-report-terms{border-radius:3px}.ai1wm-no-underline{text-decoration:none}.ai1wm-top-negative-four{top:-4px}.ai1wm-feedback-form{display:none}.ai1wm-feedback-types{margin:0;padding:0;list-style:none}.ai1wm-feedback-types li{margin:14px 0;padding:0}.ai1wm-feedback-types>li>label>span{display:inline-block;padding:5px 0 6px 8px}.ai1wm-feedback-types>li>a{height:29px;outline:none;color:#333;text-deciration:none}.ai1wm-feedback-types>li>a>span{display:inline-block;padding:5px 0 6px 8px}.ai1wm-loader{display:inline-block;width:128px;height:128px;position:relative;-webkit-animation:ai1wm-rotate 1.5s infinite linear;animation:ai1wm-rotate 1.5s infinite linear;background:url("../img/logo.svg") no-repeat center center}.ai1wm-hide{display:none}@keyframes ai1wm-rotate{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}25%{-webkit-transform:rotateZ(-90deg);transform:rotateZ(-90deg)}50%{-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}75%{-webkit-transform:rotateZ(-270deg);transform:rotateZ(-270deg)}100%{-webkit-transform:rotateZ(-360deg);transform:rotateZ(-360deg)}}@keyframes ai1wm-emphasize{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.2);transform:scale(1.2)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes ai1wm-fadein{0%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1.5);transform:scale(1.5)}100%{-webkit-transform:scale(1);transform:scale(1)}}.ai1wm-accordion{margin:1em 0;display:block}.ai1wm-accordion h4{cursor:pointer;color:rgba(0,116,162,.8);margin:0}.ai1wm-accordion h4 small{color:#444;font-weight:400}.ai1wm-accordion .ai1wm-icon-arrow-right{transition:-webkit-transform .1s ease-out;transition:transform .1s ease-out}.ai1wm-accordion ul{margin:0;padding:0;list-style:none;visibility:hidden;height:0;transition:height .2s cubic-bezier(.19,1,.22,1)}.ai1wm-accordion.ai1wm-open h4 .ai1wm-icon-arrow-right{-webkit-transform:rotate(90deg);transform:rotate(90deg);display:inline-block}.ai1wm-accordion.ai1wm-open ul{height:auto;margin:.6em 0 0 2em;visibility:visible}.ai1wm-overlay{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.7);z-index:100001}.ai1wm-modal-container{position:fixed;display:none;top:50%;left:50%;z-index:100002;width:480px;height:auto;padding:16px;-webkit-transform:translate(-240px,-94px);transform:translate(-240px,-94px);border:1px solid #fff;box-shadow:0 2px 6px #292929;border-radius:6px;background:#f6f6f6;box-sizing:border-box;text-align:center}.ai1wm-modal-container section{display:block;min-height:102px}.ai1wm-modal-container section h1{margin:0;padding:0}.ai1wm-modal-container section h1 .ai1wm-title-green{color:#27ae60;font-size:20px}.ai1wm-modal-container section h1 .ai1wm-title-red{color:#e74c3c;font-size:20px}.ai1wm-modal-container section h1 .ai1wm-loader{width:32px;height:32px}.ai1wm-modal-container section h1 .ai1wm-icon-notification{font-size:1.2em;color:#e74c3c}.ai1wm-modal-container section p{margin:0;padding:12px 0}.ai1wm-modal-container section p .ai1wm-modal-subtitle-green{color:#27ae60}.ai1wm-modal-container section p .ai1wm-modal-subtitle-red{color:#e74c3c}.ai1wm-modal-container section p .ai1wm-modal-subdescription{display:block;text-align:left}.ai1wm-modal-container section p a.ai1wm-button-green{display:inline-block;position:relative;top:26px}.ai1wm-modal-container section p a.ai1wm-emphasize{-webkit-animation:ai1wm-emphasize 1s infinite;animation:ai1wm-emphasize 1s infinite}.ai1wm-modal-container section p em{display:block;color:#34495e;font-style:normal}.ai1wm-query-arrow{position:relative;top:4px;float:right}.ai1wm-query.ai1wm-open{background:#ebebeb!important}.ai1wm-query.ai1wm-open p small{border-bottom:1px dashed #000}.ai1wm-query.ai1wm-open div{visibility:visible!important;height:82px!important;margin-top:8px}.ai1wm-query.ai1wm-open .ai1wm-query-arrow{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.ai1wm-query{width:100%;margin:0 0 10px;list-style:none;background:0 0;border:1px solid #d8d8d8;padding:10px;border-radius:5px;box-sizing:border-box}.ai1wm-query div{transition:height .2s cubic-bezier(.19,1,.22,1);visibility:hidden;height:0}.ai1wm-query div input{width:100%;font-weight:400;font-size:.8rem;padding:0 10px;height:2.3rem;line-height:2.3rem;margin-bottom:4px;border:1px solid #ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);background-color:#fff;color:#333;transition:.05s border-color ease-in-out;border-radius:5px}.ai1wm-query div input:focus{border-color:#5b9dd9;box-shadow:0 0 2px rgba(30,140,190,.8)}.ai1wm-query p{margin:0;cursor:pointer}.ai1wm-query p small{display:inline;width:auto;float:none}.ai1wm-query-arrow{transition:-webkit-transform .1s ease-out;transition:transform .1s ease-out}.ai1wm-include-tables{display:inline-block;width:300px;margin:0 6px 0 0}.ai1wm-include-plugins{display:inline-block;width:300px;vertical-align:top}.ai1wm-include-media{display:inline-block;width:300px;margin:0 6px 0 0}.ai1wm-include-themes{display:inline-block;width:300px;vertical-align:top}.ai1wm-export-stats{margin-bottom:1em}#ai1wm-export-download{display:none;margin:0 0 2em}#ai1wm-export-download-stop{display:inline-block;margin:0 0 2em}#ai1wm-export-download.ai1wm-active{display:inline-block;-webkit-animation:ai1wm-fadein .5s;animation:ai1wm-fadein .5s}#ai1wm-export-download.ai1wm-emphasize{display:inline-block;-webkit-animation:ai1wm-emphasize 1s infinite;animation:ai1wm-emphasize 1s infinite}#ai1wm-export-download-size{display:block;color:#34495e}
1
+ @charset "UTF-8";.ai1wm-divider{-ms-box-sizing:border-box;box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;border:none;height:0;background-color:transparent;font-size:14px;font-weight:700;text-align:center;text-transform:uppercase;color:rgba(0,0,0,.8);position:relative;top:0%;left:0%;margin:1rem 2.5rem;height:auto;padding:0;line-height:1}.ai1wm-divider:before,.ai1wm-divider:after{position:absolute;content:" ";z-index:3;width:50%;top:50%;height:0%;border-top:1px solid rgba(0,0,0,.1);border-bottom:1px solid rgba(255,255,255,.8)}.ai1wm-divider:before{left:0%;margin-left:-2.5rem}.ai1wm-divider:after{left:auto;right:0%;margin-right:-2.5rem}@-webkit-keyframes ai1wm-rotate{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}25%{-webkit-transform:rotateZ(-90deg);transform:rotateZ(-90deg)}50%{-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}75%{-webkit-transform:rotateZ(-270deg);transform:rotateZ(-270deg)}100%{-webkit-transform:rotateZ(-360deg);transform:rotateZ(-360deg)}}@keyframes ai1wm-rotate{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}25%{-webkit-transform:rotateZ(-90deg);transform:rotateZ(-90deg)}50%{-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}75%{-webkit-transform:rotateZ(-270deg);transform:rotateZ(-270deg)}100%{-webkit-transform:rotateZ(-360deg);transform:rotateZ(-360deg)}}@-webkit-keyframes ai1wm-emphasize{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.2);transform:scale(1.2)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes ai1wm-emphasize{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.2);transform:scale(1.2)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes ai1wm-fadein{0%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1.5);transform:scale(1.5)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes ai1wm-fadein{0%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1.5);transform:scale(1.5)}100%{-webkit-transform:scale(1);transform:scale(1)}}[class^="ai1wm-icon-"],[class*=" ai1wm-icon-"]{font-family:'servmask';speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ai1wm-icon-file-zip:before{content:"\e60f"}.ai1wm-icon-folder:before{content:"\e60e"}.ai1wm-icon-file:before{content:"\e60b"}.ai1wm-icon-file-content:before{content:"\e60c"}.ai1wm-icon-cloud-upload:before{content:"\e600"}.ai1wm-icon-history:before{content:"\e603"}.ai1wm-icon-notification:before{content:"\e619"}.ai1wm-icon-arrow-down:before{content:"\e604"}.ai1wm-icon-close:before{content:"\e61a"}.ai1wm-icon-wordpress2:before{content:"\e620"}.ai1wm-icon-arrow-right:before{content:"\e605"}.ai1wm-icon-plus2:before{content:"\e607"}.ai1wm-icon-export:before{content:"\e601"}.ai1wm-icon-publish:before{content:"\e602"}.ai1wm-icon-paperplane:before{content:"\e608"}.ai1wm-icon-help:before{content:"\e609"}.ai1wm-icon-chevron-right:before{content:"\e60d"}.ai1wm-icon-chevron-down{display:inline-block;position:relative;-webkit-transform:rotateZ(90deg);transform:rotateZ(90deg);margin-left:.5em!important}.ai1wm-icon-chevron-down:before{content:"\e60d"}.ai1wm-icon-dropbox:before{content:"\e606"}.ai1wm-icon-gear:before{content:"\e60a"}.ai1wm-icon-alone{margin:0!important}@media (min-width:855px){.ai1wm-row{margin-right:399px}.ai1wm-row:before,.ai1wm-row:after{content:" ";display:table}.ai1wm-row:after{clear:both}.ai1wm-left{float:left;width:100%}.ai1wm-right{float:right;width:377px;margin-right:-399px}.ai1wm-right .ai1wm-sidebar{width:100%}.ai1wm-right .ai1wm-segment{width:333px;border:1px solid #d6d6d6;border-radius:3px;box-shadow:inset 0 1px 0 0 #fff;color:#333;background-color:#f9f9f9;padding:20px;text-decoration:none;text-shadow:0 1px 0 #fff;background-clip:padding-box}.ai1wm-right .ai1wm-segment h2{margin:22px 0 0;padding:0;font-weight:700;font-size:14px;text-transform:uppercase;text-align:center}.ai1wm-right .ai1wm-feedback-email{width:100%;font-weight:400;font-size:.8rem;height:2.3rem;line-height:2.3rem;border-radius:5px;margin-bottom:4px;padding:0 10px}.ai1wm-right .ai1wm-feedback-message,.ai1wm-right .ai1wm-http-authentication{width:100%;border-radius:3px;font-size:.8rem;padding:6px 10px;resize:none}.ai1wm-right .ai1wm-feedback-terms-segment{font-size:.7rem;line-height:1rem;margin:4px 0 8px}.ai1wm-right .ai1wm-feedback-terms-segment>.ai1wm-feedback-terms{border-radius:3px}}.ai1wm-holder{position:relative;border:1px solid #d6d6d6;border-radius:3px;box-shadow:inset 0 1px 0 0 #fff;padding:20px;background:#f9f9f9}.ai1wm-holder h1{margin:0;padding:0;float:left;font-weight:300;font-size:22px;text-transform:uppercase}.ai1wm-holder h1 i{position:relative;top:2px}@media (max-width:854px){.ai1wm-container{margin-left:10px!important}.ai1wm-row,.ai1wm-right{margin-right:0!important}.ai1wm-right{float:left!important;width:100%!important;margin-top:18px}.ai1wm-right .ai1wm-sidebar{width:auto!important;border:1px solid #d6d6d6;border-radius:3px;box-shadow:inset 0 1px 0 0 #fff;padding:20px;background:#f9f9f9}.ai1wm-right .ai1wm-feedback-email{width:100%;font-weight:400;font-size:.8rem;height:2.3rem;line-height:2.3rem;border-radius:5px;margin-bottom:4px;padding:0 10px}.ai1wm-right .ai1wm-feedback-message{width:100%;border-radius:3px;font-size:.8rem;padding:6px 10px;resize:none}.ai1wm-right .ai1wm-feedback-terms-segment{font-size:.7rem;line-height:1rem;margin:4px 0 8px;border-radius:3px}.ai1wm-right .ai1wm-feedback-terms-segment>.ai1wm-feedback-terms{border-radius:3px}}.ai1wm-container{margin:20px 20px 0 2px}.ai1wm-container:before,.ai1wm-container:after{content:" ";display:table}.ai1wm-container:after{clear:both}.ai1wm-replace-row{width:100%;box-shadow:outset 0 1px 0 0 #fff;border-radius:3px;color:#333;font-size:11px;font-weight:700;background-color:#f9f9f9;text-decoration:none;text-shadow:0 1px 0 #fff;background-clip:padding-box;margin-bottom:10px}.ai1wm-replace-row .ai1wm-field-inline{float:left;width:100%}.ai1wm-replace-row .ai1wm-field-inline input{width:100%;font-weight:400;font-size:.8rem;padding:0 10px;height:2.3rem;line-height:2.3rem;margin-bottom:4px}.ai1wm-field{margin-bottom:4px}.ai1wm-field input[type="text"],.ai1wm-field textarea{width:100%;font-weight:400}.ai1wm-field-set{margin-top:18px}.ai1wm-message{-moz-box-sizing:border-box;background-color:#EFEFEF;border-radius:4px;color:rgba(0,0,0,.6);height:auto;margin:10px 0;min-height:18px;padding:6px 10px;position:relative;border:1px solid;transition:opacity .1s ease 0s,color .1s ease 0s,background .1s ease 0s,box-shadow .1s ease 0s}.ai1wm-message.ai1wm-success-message{background-color:#F2F8F0;color:#119000;font-size:12px}.ai1wm-message.ai1wm-info-message{background-color:#d9edf7;color:#31708f;font-size:11px}.ai1wm-message.ai1wm-error-message{background-color:#F1D7D7;color:#A95252;font-size:12px}.ai1wm-message.ai1wm-red-message{color:#D95C5C;border:2px solid #D95C5C;background-color:transparent}.ai1wm-message.ai1wm-red-message h3{margin:.4em 0;color:#D95C5C}.ai1wm-message p{margin:4px 0;font-size:12px}.ai1wm-message-warning{display:block;font-size:14px;line-height:18px;padding:12px 20px;margin:0 0 22px;background-color:#f9f9f9;border:1px solid #d6d6d6;border-radius:3px;box-shadow:0 1px 0 0 #fff inset;border-left:4px solid #ffba00}.ai1wm-button-group{border:2px solid #27ae60;background-color:transparent;color:#27ae60;border-radius:5px;cursor:pointer;text-transform:uppercase;font-weight:600;transition:background-color .2s ease-out;display:inline-block}.ai1wm-button-group.ai1wm-button-export{width:147px}.ai1wm-button-group.ai1wm-button-export.ai1wm-open>.ai1wm-dropdown-menu{height:180px;border-top:1px solid #27ae60}.ai1wm-button-group.ai1wm-button-import{width:158px}.ai1wm-button-group.ai1wm-button-import.ai1wm-open>.ai1wm-dropdown-menu{height:210px;border-top:1px solid #27ae60}.ai1wm-button-group .ai1wm-button-main{padding:6px 25px 1px;height:22px}.ai1wm-button-group .ai1wm-dropdown-menu{height:0;overflow:hidden;transition:height .2s cubic-bezier(.19,1,.22,1);border-top:none}.ai1wm-dropdown-menu{list-style:none}.ai1wm-dropdown-menu,.ai1wm-dropdown-menu li{margin:0!important;padding:0}.ai1wm-dropdown-menu li a,.ai1wm-dropdown-menu li a:visited{display:block;padding:6px 25px 1px 26px;height:22px;line-height:22px;text-decoration:none;color:#27ae60;text-align:left}.ai1wm-dropdown-menu li a:hover,.ai1wm-dropdown-menu li a:visited:hover{text-decoration:none;color:#111}.ai1mw-lines{-webkit-transform:translate(11px,-1px);transform:translate(11px,-1px);position:relative;display:inline-block;width:12px;height:10px}.ai1wm-line{display:inline-block;width:100%;height:2px;margin:auto;background:#27ae60;position:absolute;transition:all .2s ease-in-out}.ai1wm-line-first{top:0}div.ai1wm-open .ai1wm-line-first,div.ai1wm-open .ai1wm-line-third,.ai1wm-line-second{top:50%}.ai1wm-line-third{top:100%}.ai1wm-button-gray{border:2px solid #95a5a6;background-color:transparent;color:#95a5a6;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-gray:hover{background-color:#95a5a6;color:#fff}.ai1wm-button-green{border:2px solid #27ae60;background-color:transparent;color:#27ae60;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-green:hover{background-color:#27ae60;color:#fff}.ai1wm-button-green-small{border:2px solid #6eb649;background-color:transparent;color:#6eb649;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-green-small:hover{background-color:#6eb649;color:#fff}.ai1wm-button-blue{border:2px solid #00aff0;background-color:transparent;color:#00aff0;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-blue:hover{background-color:#00aff0;color:#fff}.ai1wm-button-red{border:2px solid #e74c3c;background-color:transparent;color:#e74c3c;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-red:hover{background-color:#e74c3c;color:#fff}.ai1wm-button-alone{border-radius:50px!important;padding:5px 8px!important}.ai1wm-button-blue[disabled="disabled"],.ai1wm-button-green[disabled="disabled"],.ai1wm-button-red[disabled="disabled"],.ai1wm-button-green-small[disabled="disabled"]{opacity:.6;cursor:default}.ai1wm-button-blue[disabled="disabled"]:hover{color:#00aff0}.ai1wm-button-red[disabled="disabled"]:hover{color:#e74c3c}.ai1wm-button-green[disabled="disabled"]:hover{color:#27ae60}.ai1wm-button-blue[disabled="disabled"]:hover,.ai1wm-button-green[disabled="disabled"]:hover,.ai1wm-button-red[disabled="disabled"]:hover,.ai1wm-button-green-small[disabled="disabled"]:hover{background:0 0}.ai1wm-button-gray i,.ai1wm-button-green i,.ai1wm-button-blue i,.ai1wm-button-red i{margin-left:-.5em;margin-right:.2em}.ai1wm-message-close-button{position:absolute;right:10px;top:6px;text-decoration:none;font-size:10px}input[type="radio"].ai1wm-flat-radio-button{display:none}input[type="radio"].ai1wm-flat-radio-button+a i,input[type="radio"].ai1wm-flat-radio-button+label i{vertical-align:middle;float:left;width:25px;height:25px;border-radius:50%;background:0 0;border:2px solid #ccc;content:" ";cursor:pointer;position:relative;box-sizing:content-box}input[type="radio"].ai1wm-flat-radio-button:checked+a i,input[type="radio"].ai1wm-flat-radio-button:checked+label i{background-color:#d9d9d9;border-color:#6f6f6f}.ai1wm-clear{*zoom:1;clear:both}.ai1wm-clear:before,.ai1wm-clear:after{content:" ";display:table}.ai1wm-clear:after{clear:both}.ai1wm-list-expanded{display:block!important}.ai1wm-field-inline input{border-radius:5px}.ai1wm-container .ai1wm-row label{position:relative;top:-1px}.ai1wm-share-button-container{text-align:center}.ai1wm-share-button-container .ai1wm-share-button{text-decoration:none;margin:10px;font-size:30px}.ai1wm-report-problem{position:relative;float:right}.ai1wm-report-problem-dialog{position:absolute;z-index:999;width:280px;right:0;background-color:#fff;margin:6px 0 0;padding:15px 15px 10px;border:1px solid #D6D6D6;border-radius:3px;box-shadow:0 1px 0 0 #fff inset;display:none}.ai1wm-report-email{width:100%;font-weight:400;font-size:.8rem;height:2.3rem;line-height:2.3rem;border-radius:5px;margin-bottom:4px;padding:0 10px}.ai1wm-report-message{width:100%;border-radius:3px;font-size:.8rem;padding:6px 10px;resize:none}.ai1wm-report-cancel:link,.ai1wm-report-cancel:visited,.ai1wm-report-cancel:active,.ai1wm-feedback-cancel:link,.ai1wm-feedback-cancel:visited,.ai1wm-feedback-cancel:active{float:right;line-height:34px;outline:0;text-decoration:none;color:#e74c3c}.ai1wm-report-active{display:block}.ai1wm-report-terms-segment{font-size:.7rem;line-height:1rem;margin:4px 0 8px}.ai1wm-report-terms-segment>.ai1wm-report-terms{border-radius:3px}.ai1wm-no-underline{text-decoration:none}.ai1wm-top-negative-four{top:-4px}.ai1wm-feedback-form{display:none}.ai1wm-feedback-types{margin:0;padding:0;list-style:none}.ai1wm-feedback-types li{margin:14px 0;padding:0}.ai1wm-feedback-types>li>label>span{display:inline-block;padding:5px 0 6px 8px}.ai1wm-feedback-types>li>a{height:29px;outline:none;color:#333;text-deciration:none}.ai1wm-feedback-types>li>a>span{display:inline-block;padding:5px 0 6px 8px}.ai1wm-loader{display:inline-block;width:128px;height:128px;position:relative;-webkit-animation:ai1wm-rotate 1.5s infinite linear;animation:ai1wm-rotate 1.5s infinite linear;background:url("../img/logo.svg") no-repeat center center}.ai1wm-hide{display:none}.ai1wm-label{border:1px solid #5cb85c;background-color:transparent;color:#5cb85c;cursor:pointer;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;padding:.2em .6em;font-size:.8em;border-radius:5px}.ai1wm-label:hover{background-color:#5cb85c;color:#fff}.ai1wm-dialog-message{text-align:left;line-height:1.5em}@keyframes ai1wm-rotate{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}25%{-webkit-transform:rotateZ(-90deg);transform:rotateZ(-90deg)}50%{-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}75%{-webkit-transform:rotateZ(-270deg);transform:rotateZ(-270deg)}100%{-webkit-transform:rotateZ(-360deg);transform:rotateZ(-360deg)}}@keyframes ai1wm-emphasize{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.2);transform:scale(1.2)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes ai1wm-fadein{0%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1.5);transform:scale(1.5)}100%{-webkit-transform:scale(1);transform:scale(1)}}.ai1wm-accordion{margin:1em 0;display:block}.ai1wm-accordion h4{cursor:pointer;color:rgba(0,116,162,.8);margin:0}.ai1wm-accordion h4 small{color:#444;font-weight:400;display:inline}.ai1wm-accordion .ai1wm-icon-arrow-right{transition:-webkit-transform .1s ease-out;transition:transform .1s ease-out}.ai1wm-accordion ul{margin:0;padding:0;list-style:none;visibility:hidden;height:0;transition:height .2s cubic-bezier(.19,1,.22,1)}.ai1wm-accordion.ai1wm-open h4 .ai1wm-icon-arrow-right{-webkit-transform:rotate(90deg);transform:rotate(90deg);display:inline-block}.ai1wm-accordion.ai1wm-open ul{height:auto;margin:.6em 0 0 2em;visibility:visible}.ai1wm-overlay{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.7);z-index:100001}.ai1wm-modal-container{position:fixed;display:none;top:50%;left:50%;z-index:100002;width:480px;height:auto;padding:16px;-webkit-transform:translate(-240px,-94px);transform:translate(-240px,-94px);border:1px solid #fff;box-shadow:0 2px 6px #292929;border-radius:6px;background:#f6f6f6;box-sizing:border-box;text-align:center}.ai1wm-modal-container section{display:block;min-height:102px}.ai1wm-modal-container section h1{margin:0;padding:0}.ai1wm-modal-container section h1 .ai1wm-title-green{color:#27ae60;font-size:20px}.ai1wm-modal-container section h1 .ai1wm-title-red{color:#e74c3c;font-size:20px}.ai1wm-modal-container section h1 .ai1wm-loader{width:32px;height:32px}.ai1wm-modal-container section h1 .ai1wm-icon-notification{font-size:1.2em;color:#e74c3c}.ai1wm-modal-container section p{margin:0;padding:12px 0}.ai1wm-modal-container section p .ai1wm-modal-subtitle-green{color:#27ae60}.ai1wm-modal-container section p .ai1wm-modal-subtitle-red{color:#e74c3c}.ai1wm-modal-container section p .ai1wm-modal-subdescription{display:block;text-align:left}.ai1wm-modal-container section p a.ai1wm-button-green{display:inline-block;position:relative;top:26px}.ai1wm-modal-container section p a.ai1wm-emphasize{-webkit-animation:ai1wm-emphasize 1s infinite;animation:ai1wm-emphasize 1s infinite}.ai1wm-modal-container section p em{display:block;color:#34495e;font-style:normal}.ai1wm-query-arrow{position:relative;top:4px;float:right}.ai1wm-query.ai1wm-open{background:#ebebeb!important}.ai1wm-query.ai1wm-open p small{border-bottom:1px dashed #000}.ai1wm-query.ai1wm-open div{visibility:visible!important;height:82px!important;margin-top:8px}.ai1wm-query.ai1wm-open .ai1wm-query-arrow{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.ai1wm-query{width:100%;margin:0 0 10px;list-style:none;background:0 0;border:1px solid #d8d8d8;padding:10px;border-radius:5px;box-sizing:border-box}.ai1wm-query div{transition:height .2s cubic-bezier(.19,1,.22,1);visibility:hidden;height:0}.ai1wm-query div input{width:100%;font-weight:400;font-size:.8rem;padding:0 10px;height:2.3rem;line-height:2.3rem;margin-bottom:4px;border:1px solid #ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);background-color:#fff;color:#333;transition:.05s border-color ease-in-out;border-radius:5px}.ai1wm-query div input:focus{border-color:#5b9dd9;box-shadow:0 0 2px rgba(30,140,190,.8)}.ai1wm-query p{margin:0;cursor:pointer}.ai1wm-query p small{display:inline;width:auto;float:none}.ai1wm-query-arrow{transition:-webkit-transform .1s ease-out;transition:transform .1s ease-out}.ai1wm-include-tables{display:inline-block;width:300px;margin:0 6px 0 0}.ai1wm-include-plugins{display:inline-block;width:300px;vertical-align:top}.ai1wm-include-media{display:inline-block;width:300px;margin:0 6px 0 0}.ai1wm-include-themes{display:inline-block;width:300px;vertical-align:top}.ai1wm-export-stats{margin-bottom:1em}#ai1wm-export-download{display:none;margin:0 0 2em}#ai1wm-export-download-stop{display:inline-block;margin:0 0 2em}#ai1wm-export-download.ai1wm-active{display:inline-block;-webkit-animation:ai1wm-fadein .5s;animation:ai1wm-fadein .5s}#ai1wm-export-download.ai1wm-emphasize{display:inline-block;-webkit-animation:ai1wm-emphasize 1s infinite;animation:ai1wm-emphasize 1s infinite}#ai1wm-export-download-size{display:block;color:#34495e}
lib/view/assets/css/import.min.css CHANGED
@@ -1 +1 @@
1
- @charset "UTF-8";.ai1wm-divider{-ms-box-sizing:border-box;box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;border:none;height:0;background-color:transparent;font-size:14px;font-weight:700;text-align:center;text-transform:uppercase;color:rgba(0,0,0,.8);position:relative;top:0%;left:0%;margin:1rem 2.5rem;height:auto;padding:0;line-height:1}.ai1wm-divider:before,.ai1wm-divider:after{position:absolute;content:" ";z-index:3;width:50%;top:50%;height:0%;border-top:1px solid rgba(0,0,0,.1);border-bottom:1px solid rgba(255,255,255,.8)}.ai1wm-divider:before{left:0%;margin-left:-2.5rem}.ai1wm-divider:after{left:auto;right:0%;margin-right:-2.5rem}@-webkit-keyframes ai1wm-rotate{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}25%{-webkit-transform:rotateZ(-90deg);transform:rotateZ(-90deg)}50%{-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}75%{-webkit-transform:rotateZ(-270deg);transform:rotateZ(-270deg)}100%{-webkit-transform:rotateZ(-360deg);transform:rotateZ(-360deg)}}@keyframes ai1wm-rotate{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}25%{-webkit-transform:rotateZ(-90deg);transform:rotateZ(-90deg)}50%{-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}75%{-webkit-transform:rotateZ(-270deg);transform:rotateZ(-270deg)}100%{-webkit-transform:rotateZ(-360deg);transform:rotateZ(-360deg)}}@-webkit-keyframes ai1wm-emphasize{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.2);transform:scale(1.2)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes ai1wm-emphasize{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.2);transform:scale(1.2)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes ai1wm-fadein{0%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1.5);transform:scale(1.5)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes ai1wm-fadein{0%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1.5);transform:scale(1.5)}100%{-webkit-transform:scale(1);transform:scale(1)}}[class^="ai1wm-icon-"],[class*=" ai1wm-icon-"]{font-family:'servmask';speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ai1wm-icon-file-zip:before{content:"\e60f"}.ai1wm-icon-folder:before{content:"\e60e"}.ai1wm-icon-file:before{content:"\e60b"}.ai1wm-icon-file-content:before{content:"\e60c"}.ai1wm-icon-cloud-upload:before{content:"\e600"}.ai1wm-icon-history:before{content:"\e603"}.ai1wm-icon-notification:before{content:"\e619"}.ai1wm-icon-arrow-down:before{content:"\e604"}.ai1wm-icon-close:before{content:"\e61a"}.ai1wm-icon-wordpress2:before{content:"\e620"}.ai1wm-icon-arrow-right:before{content:"\e605"}.ai1wm-icon-plus2:before{content:"\e607"}.ai1wm-icon-export:before{content:"\e601"}.ai1wm-icon-publish:before{content:"\e602"}.ai1wm-icon-paperplane:before{content:"\e608"}.ai1wm-icon-help:before{content:"\e609"}.ai1wm-icon-chevron-right:before{content:"\e60d"}.ai1wm-icon-chevron-down{display:inline-block;position:relative;-webkit-transform:rotateZ(90deg);transform:rotateZ(90deg);margin-left:.5em!important}.ai1wm-icon-chevron-down:before{content:"\e60d"}.ai1wm-icon-dropbox:before{content:"\e606"}.ai1wm-icon-gear:before{content:"\e60a"}.ai1wm-icon-alone{margin:0!important}@media (min-width:855px){.ai1wm-row{margin-right:399px}.ai1wm-row:before,.ai1wm-row:after{content:" ";display:table}.ai1wm-row:after{clear:both}.ai1wm-left{float:left;width:100%}.ai1wm-right{float:right;width:377px;margin-right:-399px}.ai1wm-right .ai1wm-sidebar{width:100%}.ai1wm-right .ai1wm-segment{width:333px;border:1px solid #d6d6d6;border-radius:3px;box-shadow:inset 0 1px 0 0 #fff;color:#333;background-color:#f9f9f9;padding:20px;text-decoration:none;text-shadow:0 1px 0 #fff;background-clip:padding-box}.ai1wm-right .ai1wm-segment h2{margin:22px 0 0;padding:0;font-weight:700;font-size:14px;text-transform:uppercase;text-align:center}.ai1wm-right .ai1wm-feedback-email{width:100%;font-weight:400;font-size:.8rem;height:2.3rem;line-height:2.3rem;border-radius:5px;margin-bottom:4px;padding:0 10px}.ai1wm-right .ai1wm-feedback-message,.ai1wm-right .ai1wm-http-authentication{width:100%;border-radius:3px;font-size:.8rem;padding:6px 10px;resize:none}.ai1wm-right .ai1wm-feedback-terms-segment{font-size:.7rem;line-height:1rem;margin:4px 0 8px}.ai1wm-right .ai1wm-feedback-terms-segment>.ai1wm-feedback-terms{border-radius:3px}}.ai1wm-holder{position:relative;border:1px solid #d6d6d6;border-radius:3px;box-shadow:inset 0 1px 0 0 #fff;padding:20px;background:#f9f9f9}.ai1wm-holder h1{margin:0;padding:0;float:left;font-weight:300;font-size:22px;text-transform:uppercase}.ai1wm-holder h1 i{position:relative;top:2px}@media (max-width:854px){.ai1wm-container{margin-left:10px!important}.ai1wm-row,.ai1wm-right{margin-right:0!important}.ai1wm-right{float:left!important;width:100%!important;margin-top:18px}.ai1wm-right .ai1wm-sidebar{width:auto!important;border:1px solid #d6d6d6;border-radius:3px;box-shadow:inset 0 1px 0 0 #fff;padding:20px;background:#f9f9f9}.ai1wm-right .ai1wm-feedback-email{width:100%;font-weight:400;font-size:.8rem;height:2.3rem;line-height:2.3rem;border-radius:5px;margin-bottom:4px;padding:0 10px}.ai1wm-right .ai1wm-feedback-message{width:100%;border-radius:3px;font-size:.8rem;padding:6px 10px;resize:none}.ai1wm-right .ai1wm-feedback-terms-segment{font-size:.7rem;line-height:1rem;margin:4px 0 8px;border-radius:3px}.ai1wm-right .ai1wm-feedback-terms-segment>.ai1wm-feedback-terms{border-radius:3px}}.ai1wm-container{margin:20px 20px 0 2px}.ai1wm-container:before,.ai1wm-container:after{content:" ";display:table}.ai1wm-container:after{clear:both}.ai1wm-replace-row{width:100%;box-shadow:outset 0 1px 0 0 #fff;border-radius:3px;color:#333;font-size:11px;font-weight:700;background-color:#f9f9f9;text-decoration:none;text-shadow:0 1px 0 #fff;background-clip:padding-box;margin-bottom:10px}.ai1wm-replace-row .ai1wm-field-inline{float:left;width:100%}.ai1wm-replace-row .ai1wm-field-inline input{width:100%;font-weight:400;font-size:.8rem;padding:0 10px;height:2.3rem;line-height:2.3rem;margin-bottom:4px}.ai1wm-field{margin-bottom:4px}.ai1wm-field input[type="text"],.ai1wm-field textarea{width:100%;font-weight:400}.ai1wm-field-set{margin-top:18px}.ai1wm-message{-moz-box-sizing:border-box;background-color:#EFEFEF;border-radius:4px;color:rgba(0,0,0,.6);height:auto;margin:10px 0;min-height:18px;padding:6px 10px;position:relative;border:1px solid;transition:opacity .1s ease 0s,color .1s ease 0s,background .1s ease 0s,box-shadow .1s ease 0s}.ai1wm-message.ai1wm-success-message{background-color:#F2F8F0;color:#119000;font-size:12px}.ai1wm-message.ai1wm-info-message{background-color:#d9edf7;color:#31708f;font-size:11px}.ai1wm-message.ai1wm-error-message{background-color:#F1D7D7;color:#A95252;font-size:12px}.ai1wm-message.ai1wm-red-message{color:#D95C5C;border:2px solid #D95C5C;background-color:transparent}.ai1wm-message.ai1wm-red-message h3{margin:.4em 0;color:#D95C5C}.ai1wm-message p{margin:4px 0;font-size:12px}.ai1wm-message-warning{display:block;font-size:14px;line-height:18px;padding:12px 20px;margin:0 0 22px;background-color:#f9f9f9;border:1px solid #d6d6d6;border-radius:3px;box-shadow:0 1px 0 0 #fff inset;border-left:4px solid #ffba00}.ai1wm-button-group{border:2px solid #27ae60;background-color:transparent;color:#27ae60;border-radius:5px;cursor:pointer;text-transform:uppercase;font-weight:600;transition:background-color .2s ease-out;display:inline-block}.ai1wm-button-group.ai1wm-button-export{width:147px}.ai1wm-button-group.ai1wm-button-export.ai1wm-open>.ai1wm-dropdown-menu{height:150px;border-top:1px solid #27ae60}.ai1wm-button-group.ai1wm-button-import{width:158px}.ai1wm-button-group.ai1wm-button-import.ai1wm-open>.ai1wm-dropdown-menu{height:180px;border-top:1px solid #27ae60}.ai1wm-button-group .ai1wm-button-main{padding:6px 25px 1px;height:22px}.ai1wm-button-group .ai1wm-dropdown-menu{height:0;overflow:hidden;transition:height .2s cubic-bezier(.19,1,.22,1);border-top:none}.ai1wm-dropdown-menu{list-style:none}.ai1wm-dropdown-menu,.ai1wm-dropdown-menu li{margin:0!important;padding:0}.ai1wm-dropdown-menu li a,.ai1wm-dropdown-menu li a:visited{display:block;padding:6px 25px 1px 26px;height:22px;line-height:22px;text-decoration:none;color:#27ae60;text-align:left}.ai1wm-dropdown-menu li a:hover,.ai1wm-dropdown-menu li a:visited:hover{text-decoration:none;color:#111}.ai1mw-lines{-webkit-transform:translate(11px,-1px);transform:translate(11px,-1px);position:relative;display:inline-block;width:12px;height:10px}.ai1wm-line{display:inline-block;width:100%;height:2px;margin:auto;background:#27ae60;position:absolute;transition:all .2s ease-in-out}.ai1wm-line-first{top:0}div.ai1wm-open .ai1wm-line-first,div.ai1wm-open .ai1wm-line-third,.ai1wm-line-second{top:50%}.ai1wm-line-third{top:100%}.ai1wm-button-gray{border:2px solid #95a5a6;background-color:transparent;color:#95a5a6;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-gray:hover{background-color:#95a5a6;color:#fff}.ai1wm-button-green{border:2px solid #27ae60;background-color:transparent;color:#27ae60;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-green:hover{background-color:#27ae60;color:#fff}.ai1wm-button-green-small{border:2px solid #6eb649;background-color:transparent;color:#6eb649;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-green-small:hover{background-color:#6eb649;color:#fff}.ai1wm-button-blue{border:2px solid #00aff0;background-color:transparent;color:#00aff0;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-blue:hover{background-color:#00aff0;color:#fff}.ai1wm-button-red{border:2px solid #e74c3c;background-color:transparent;color:#e74c3c;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-red:hover{background-color:#e74c3c;color:#fff}.ai1wm-button-alone{border-radius:50px!important;padding:5px 8px!important}.ai1wm-button-blue[disabled="disabled"],.ai1wm-button-green[disabled="disabled"],.ai1wm-button-red[disabled="disabled"],.ai1wm-button-green-small[disabled="disabled"]{opacity:.6;cursor:default}.ai1wm-button-blue[disabled="disabled"]:hover{color:#00aff0}.ai1wm-button-red[disabled="disabled"]:hover{color:#e74c3c}.ai1wm-button-green[disabled="disabled"]:hover{color:#27ae60}.ai1wm-button-blue[disabled="disabled"]:hover,.ai1wm-button-green[disabled="disabled"]:hover,.ai1wm-button-red[disabled="disabled"]:hover,.ai1wm-button-green-small[disabled="disabled"]:hover{background:0 0}.ai1wm-button-gray i,.ai1wm-button-green i,.ai1wm-button-blue i,.ai1wm-button-red i{margin-left:-.5em;margin-right:.2em}.ai1wm-message-close-button{position:absolute;right:10px;top:6px;text-decoration:none;font-size:10px}input[type="radio"].ai1wm-flat-radio-button{display:none}input[type="radio"].ai1wm-flat-radio-button+a i,input[type="radio"].ai1wm-flat-radio-button+label i{vertical-align:middle;float:left;width:25px;height:25px;border-radius:50%;background:0 0;border:2px solid #ccc;content:" ";cursor:pointer;position:relative;box-sizing:content-box}input[type="radio"].ai1wm-flat-radio-button:checked+a i,input[type="radio"].ai1wm-flat-radio-button:checked+label i{background-color:#d9d9d9;border-color:#6f6f6f}.ai1wm-clear{*zoom:1;clear:both}.ai1wm-clear:before,.ai1wm-clear:after{content:" ";display:table}.ai1wm-clear:after{clear:both}.ai1wm-list-expanded{display:block!important}.ai1wm-field-inline input{border-radius:5px}.ai1wm-container .ai1wm-row label{position:relative;top:-1px}.ai1wm-share-button-container{text-align:center}.ai1wm-share-button-container .ai1wm-share-button{text-decoration:none;margin:10px;font-size:30px}.ai1wm-report-problem{position:relative;float:right}.ai1wm-report-problem-dialog{position:absolute;z-index:999;width:280px;right:0;background-color:#fff;margin:6px 0 0;padding:15px 15px 10px;border:1px solid #D6D6D6;border-radius:3px;box-shadow:0 1px 0 0 #fff inset;display:none}.ai1wm-report-email{width:100%;font-weight:400;font-size:.8rem;height:2.3rem;line-height:2.3rem;border-radius:5px;margin-bottom:4px;padding:0 10px}.ai1wm-report-message{width:100%;border-radius:3px;font-size:.8rem;padding:6px 10px;resize:none}.ai1wm-report-cancel:link,.ai1wm-report-cancel:visited,.ai1wm-report-cancel:active,.ai1wm-feedback-cancel:link,.ai1wm-feedback-cancel:visited,.ai1wm-feedback-cancel:active{float:right;line-height:34px;outline:0;text-decoration:none;color:#e74c3c}.ai1wm-report-active{display:block}.ai1wm-report-terms-segment{font-size:.7rem;line-height:1rem;margin:4px 0 8px}.ai1wm-report-terms-segment>.ai1wm-report-terms{border-radius:3px}.ai1wm-no-underline{text-decoration:none}.ai1wm-top-negative-four{top:-4px}.ai1wm-feedback-form{display:none}.ai1wm-feedback-types{margin:0;padding:0;list-style:none}.ai1wm-feedback-types li{margin:14px 0;padding:0}.ai1wm-feedback-types>li>label>span{display:inline-block;padding:5px 0 6px 8px}.ai1wm-feedback-types>li>a{height:29px;outline:none;color:#333;text-deciration:none}.ai1wm-feedback-types>li>a>span{display:inline-block;padding:5px 0 6px 8px}.ai1wm-loader{display:inline-block;width:128px;height:128px;position:relative;-webkit-animation:ai1wm-rotate 1.5s infinite linear;animation:ai1wm-rotate 1.5s infinite linear;background:url("../img/logo.svg") no-repeat center center}.ai1wm-hide{display:none}.ai1wm-overlay{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.7);z-index:100001}.ai1wm-modal-container{position:fixed;display:none;top:50%;left:50%;z-index:100002;width:480px;height:auto;padding:16px;-webkit-transform:translate(-240px,-94px);transform:translate(-240px,-94px);border:1px solid #fff;box-shadow:0 2px 6px #292929;border-radius:6px;background:#f6f6f6;box-sizing:border-box;text-align:center}.ai1wm-modal-container section{display:block;min-height:102px}.ai1wm-modal-container section h1{margin:0;padding:0}.ai1wm-modal-container section h1 .ai1wm-title-green{color:#27ae60;font-size:20px}.ai1wm-modal-container section h1 .ai1wm-title-red{color:#e74c3c;font-size:20px}.ai1wm-modal-container section h1 .ai1wm-loader{width:32px;height:32px}.ai1wm-modal-container section h1 .ai1wm-icon-notification{font-size:1.2em;color:#e74c3c}.ai1wm-modal-container section p{margin:0;padding:12px 0}.ai1wm-modal-container section p .ai1wm-modal-subtitle-green{color:#27ae60}.ai1wm-modal-container section p .ai1wm-modal-subtitle-red{color:#e74c3c}.ai1wm-modal-container section p .ai1wm-modal-subdescription{display:block;text-align:left}.ai1wm-modal-container section p a.ai1wm-button-green{display:inline-block;position:relative;top:26px}.ai1wm-modal-container section p a.ai1wm-emphasize{-webkit-animation:ai1wm-emphasize 1s infinite;animation:ai1wm-emphasize 1s infinite}.ai1wm-modal-container section p em{display:block;color:#34495e;font-style:normal}.ai1wm-growl-info{position:fixed;z-index:200000;top:0;margin-top:16px;right:16px;width:200px;padding:16px;background:#f1c40f;border:1px solid #e67e22;border-radius:5px;color:#111}.ai1wm-drag-drop-area{border:3px dashed #ddd;height:200px;margin:20px 0 16px;background:#fff;text-align:center;border-radius:30px}.ai1wm-drag-drop-area.dragover{background:rgba(255,255,255,.4);border-color:green}.ai1wm-drag-over .ai1wm-drag-drop-area{border-color:#83b4d8}.ai1wm-import-form{position:relative}#ai1wm-import-init{position:absolute;top:10px;left:10%;width:80%;text-align:center}#ai1wm-import-init>p{font-size:18px;color:#9e9e9e}#ai1wm-import-init>p>i{font-size:46px}.ai1wm-label{border:1px solid #5cb85c;background-color:transparent;color:#5cb85c;cursor:pointer;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;padding:.2em .6em;font-size:.8em;border-radius:5px}.ai1wm-label:hover{background-color:#5cb85c;color:#fff}.ai1wm-unlimited-import a{text-decoration:none}.ai1wm-max-upload-size{border-bottom:1px solid #000}.ai1wm-progress-bar{position:relative;display:inline-block;background-color:#bdc3c7;height:32px;width:100%;border-radius:15px;top:35px}.ai1wm-progress-bar-meter{background-color:#2ecc71;border-radius:15px;width:0;text-align:center}.ai1wm-progress-bar-meter,.ai1wm-progress-bar-percent{display:inline-block;float:left;height:32px;line-height:32px;color:#fff}.ai1wm-progress-bar-percent{position:absolute;width:50px;left:50%;-webkit-transform:translate(-24px,0);transform:translate(-24px,0);font-size:.5em;background:0 0}
1
+ @charset "UTF-8";.ai1wm-divider{-ms-box-sizing:border-box;box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;border:none;height:0;background-color:transparent;font-size:14px;font-weight:700;text-align:center;text-transform:uppercase;color:rgba(0,0,0,.8);position:relative;top:0%;left:0%;margin:1rem 2.5rem;height:auto;padding:0;line-height:1}.ai1wm-divider:before,.ai1wm-divider:after{position:absolute;content:" ";z-index:3;width:50%;top:50%;height:0%;border-top:1px solid rgba(0,0,0,.1);border-bottom:1px solid rgba(255,255,255,.8)}.ai1wm-divider:before{left:0%;margin-left:-2.5rem}.ai1wm-divider:after{left:auto;right:0%;margin-right:-2.5rem}@-webkit-keyframes ai1wm-rotate{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}25%{-webkit-transform:rotateZ(-90deg);transform:rotateZ(-90deg)}50%{-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}75%{-webkit-transform:rotateZ(-270deg);transform:rotateZ(-270deg)}100%{-webkit-transform:rotateZ(-360deg);transform:rotateZ(-360deg)}}@keyframes ai1wm-rotate{0%{-webkit-transform:rotateZ(0);transform:rotateZ(0)}25%{-webkit-transform:rotateZ(-90deg);transform:rotateZ(-90deg)}50%{-webkit-transform:rotateZ(-180deg);transform:rotateZ(-180deg)}75%{-webkit-transform:rotateZ(-270deg);transform:rotateZ(-270deg)}100%{-webkit-transform:rotateZ(-360deg);transform:rotateZ(-360deg)}}@-webkit-keyframes ai1wm-emphasize{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.2);transform:scale(1.2)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes ai1wm-emphasize{0%{-webkit-transform:scale(1);transform:scale(1)}50%{-webkit-transform:scale(1.2);transform:scale(1.2)}100%{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes ai1wm-fadein{0%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1.5);transform:scale(1.5)}100%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes ai1wm-fadein{0%{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1.5);transform:scale(1.5)}100%{-webkit-transform:scale(1);transform:scale(1)}}[class^="ai1wm-icon-"],[class*=" ai1wm-icon-"]{font-family:'servmask';speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ai1wm-icon-file-zip:before{content:"\e60f"}.ai1wm-icon-folder:before{content:"\e60e"}.ai1wm-icon-file:before{content:"\e60b"}.ai1wm-icon-file-content:before{content:"\e60c"}.ai1wm-icon-cloud-upload:before{content:"\e600"}.ai1wm-icon-history:before{content:"\e603"}.ai1wm-icon-notification:before{content:"\e619"}.ai1wm-icon-arrow-down:before{content:"\e604"}.ai1wm-icon-close:before{content:"\e61a"}.ai1wm-icon-wordpress2:before{content:"\e620"}.ai1wm-icon-arrow-right:before{content:"\e605"}.ai1wm-icon-plus2:before{content:"\e607"}.ai1wm-icon-export:before{content:"\e601"}.ai1wm-icon-publish:before{content:"\e602"}.ai1wm-icon-paperplane:before{content:"\e608"}.ai1wm-icon-help:before{content:"\e609"}.ai1wm-icon-chevron-right:before{content:"\e60d"}.ai1wm-icon-chevron-down{display:inline-block;position:relative;-webkit-transform:rotateZ(90deg);transform:rotateZ(90deg);margin-left:.5em!important}.ai1wm-icon-chevron-down:before{content:"\e60d"}.ai1wm-icon-dropbox:before{content:"\e606"}.ai1wm-icon-gear:before{content:"\e60a"}.ai1wm-icon-alone{margin:0!important}@media (min-width:855px){.ai1wm-row{margin-right:399px}.ai1wm-row:before,.ai1wm-row:after{content:" ";display:table}.ai1wm-row:after{clear:both}.ai1wm-left{float:left;width:100%}.ai1wm-right{float:right;width:377px;margin-right:-399px}.ai1wm-right .ai1wm-sidebar{width:100%}.ai1wm-right .ai1wm-segment{width:333px;border:1px solid #d6d6d6;border-radius:3px;box-shadow:inset 0 1px 0 0 #fff;color:#333;background-color:#f9f9f9;padding:20px;text-decoration:none;text-shadow:0 1px 0 #fff;background-clip:padding-box}.ai1wm-right .ai1wm-segment h2{margin:22px 0 0;padding:0;font-weight:700;font-size:14px;text-transform:uppercase;text-align:center}.ai1wm-right .ai1wm-feedback-email{width:100%;font-weight:400;font-size:.8rem;height:2.3rem;line-height:2.3rem;border-radius:5px;margin-bottom:4px;padding:0 10px}.ai1wm-right .ai1wm-feedback-message,.ai1wm-right .ai1wm-http-authentication{width:100%;border-radius:3px;font-size:.8rem;padding:6px 10px;resize:none}.ai1wm-right .ai1wm-feedback-terms-segment{font-size:.7rem;line-height:1rem;margin:4px 0 8px}.ai1wm-right .ai1wm-feedback-terms-segment>.ai1wm-feedback-terms{border-radius:3px}}.ai1wm-holder{position:relative;border:1px solid #d6d6d6;border-radius:3px;box-shadow:inset 0 1px 0 0 #fff;padding:20px;background:#f9f9f9}.ai1wm-holder h1{margin:0;padding:0;float:left;font-weight:300;font-size:22px;text-transform:uppercase}.ai1wm-holder h1 i{position:relative;top:2px}@media (max-width:854px){.ai1wm-container{margin-left:10px!important}.ai1wm-row,.ai1wm-right{margin-right:0!important}.ai1wm-right{float:left!important;width:100%!important;margin-top:18px}.ai1wm-right .ai1wm-sidebar{width:auto!important;border:1px solid #d6d6d6;border-radius:3px;box-shadow:inset 0 1px 0 0 #fff;padding:20px;background:#f9f9f9}.ai1wm-right .ai1wm-feedback-email{width:100%;font-weight:400;font-size:.8rem;height:2.3rem;line-height:2.3rem;border-radius:5px;margin-bottom:4px;padding:0 10px}.ai1wm-right .ai1wm-feedback-message{width:100%;border-radius:3px;font-size:.8rem;padding:6px 10px;resize:none}.ai1wm-right .ai1wm-feedback-terms-segment{font-size:.7rem;line-height:1rem;margin:4px 0 8px;border-radius:3px}.ai1wm-right .ai1wm-feedback-terms-segment>.ai1wm-feedback-terms{border-radius:3px}}.ai1wm-container{margin:20px 20px 0 2px}.ai1wm-container:before,.ai1wm-container:after{content:" ";display:table}.ai1wm-container:after{clear:both}.ai1wm-replace-row{width:100%;box-shadow:outset 0 1px 0 0 #fff;border-radius:3px;color:#333;font-size:11px;font-weight:700;background-color:#f9f9f9;text-decoration:none;text-shadow:0 1px 0 #fff;background-clip:padding-box;margin-bottom:10px}.ai1wm-replace-row .ai1wm-field-inline{float:left;width:100%}.ai1wm-replace-row .ai1wm-field-inline input{width:100%;font-weight:400;font-size:.8rem;padding:0 10px;height:2.3rem;line-height:2.3rem;margin-bottom:4px}.ai1wm-field{margin-bottom:4px}.ai1wm-field input[type="text"],.ai1wm-field textarea{width:100%;font-weight:400}.ai1wm-field-set{margin-top:18px}.ai1wm-message{-moz-box-sizing:border-box;background-color:#EFEFEF;border-radius:4px;color:rgba(0,0,0,.6);height:auto;margin:10px 0;min-height:18px;padding:6px 10px;position:relative;border:1px solid;transition:opacity .1s ease 0s,color .1s ease 0s,background .1s ease 0s,box-shadow .1s ease 0s}.ai1wm-message.ai1wm-success-message{background-color:#F2F8F0;color:#119000;font-size:12px}.ai1wm-message.ai1wm-info-message{background-color:#d9edf7;color:#31708f;font-size:11px}.ai1wm-message.ai1wm-error-message{background-color:#F1D7D7;color:#A95252;font-size:12px}.ai1wm-message.ai1wm-red-message{color:#D95C5C;border:2px solid #D95C5C;background-color:transparent}.ai1wm-message.ai1wm-red-message h3{margin:.4em 0;color:#D95C5C}.ai1wm-message p{margin:4px 0;font-size:12px}.ai1wm-message-warning{display:block;font-size:14px;line-height:18px;padding:12px 20px;margin:0 0 22px;background-color:#f9f9f9;border:1px solid #d6d6d6;border-radius:3px;box-shadow:0 1px 0 0 #fff inset;border-left:4px solid #ffba00}.ai1wm-button-group{border:2px solid #27ae60;background-color:transparent;color:#27ae60;border-radius:5px;cursor:pointer;text-transform:uppercase;font-weight:600;transition:background-color .2s ease-out;display:inline-block}.ai1wm-button-group.ai1wm-button-export{width:147px}.ai1wm-button-group.ai1wm-button-export.ai1wm-open>.ai1wm-dropdown-menu{height:180px;border-top:1px solid #27ae60}.ai1wm-button-group.ai1wm-button-import{width:158px}.ai1wm-button-group.ai1wm-button-import.ai1wm-open>.ai1wm-dropdown-menu{height:210px;border-top:1px solid #27ae60}.ai1wm-button-group .ai1wm-button-main{padding:6px 25px 1px;height:22px}.ai1wm-button-group .ai1wm-dropdown-menu{height:0;overflow:hidden;transition:height .2s cubic-bezier(.19,1,.22,1);border-top:none}.ai1wm-dropdown-menu{list-style:none}.ai1wm-dropdown-menu,.ai1wm-dropdown-menu li{margin:0!important;padding:0}.ai1wm-dropdown-menu li a,.ai1wm-dropdown-menu li a:visited{display:block;padding:6px 25px 1px 26px;height:22px;line-height:22px;text-decoration:none;color:#27ae60;text-align:left}.ai1wm-dropdown-menu li a:hover,.ai1wm-dropdown-menu li a:visited:hover{text-decoration:none;color:#111}.ai1mw-lines{-webkit-transform:translate(11px,-1px);transform:translate(11px,-1px);position:relative;display:inline-block;width:12px;height:10px}.ai1wm-line{display:inline-block;width:100%;height:2px;margin:auto;background:#27ae60;position:absolute;transition:all .2s ease-in-out}.ai1wm-line-first{top:0}div.ai1wm-open .ai1wm-line-first,div.ai1wm-open .ai1wm-line-third,.ai1wm-line-second{top:50%}.ai1wm-line-third{top:100%}.ai1wm-button-gray{border:2px solid #95a5a6;background-color:transparent;color:#95a5a6;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-gray:hover{background-color:#95a5a6;color:#fff}.ai1wm-button-green{border:2px solid #27ae60;background-color:transparent;color:#27ae60;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-green:hover{background-color:#27ae60;color:#fff}.ai1wm-button-green-small{border:2px solid #6eb649;background-color:transparent;color:#6eb649;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-green-small:hover{background-color:#6eb649;color:#fff}.ai1wm-button-blue{border:2px solid #00aff0;background-color:transparent;color:#00aff0;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-blue:hover{background-color:#00aff0;color:#fff}.ai1wm-button-red{border:2px solid #e74c3c;background-color:transparent;color:#e74c3c;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-red:hover{background-color:#e74c3c;color:#fff}.ai1wm-button-alone{border-radius:50px!important;padding:5px 8px!important}.ai1wm-button-blue[disabled="disabled"],.ai1wm-button-green[disabled="disabled"],.ai1wm-button-red[disabled="disabled"],.ai1wm-button-green-small[disabled="disabled"]{opacity:.6;cursor:default}.ai1wm-button-blue[disabled="disabled"]:hover{color:#00aff0}.ai1wm-button-red[disabled="disabled"]:hover{color:#e74c3c}.ai1wm-button-green[disabled="disabled"]:hover{color:#27ae60}.ai1wm-button-blue[disabled="disabled"]:hover,.ai1wm-button-green[disabled="disabled"]:hover,.ai1wm-button-red[disabled="disabled"]:hover,.ai1wm-button-green-small[disabled="disabled"]:hover{background:0 0}.ai1wm-button-gray i,.ai1wm-button-green i,.ai1wm-button-blue i,.ai1wm-button-red i{margin-left:-.5em;margin-right:.2em}.ai1wm-message-close-button{position:absolute;right:10px;top:6px;text-decoration:none;font-size:10px}input[type="radio"].ai1wm-flat-radio-button{display:none}input[type="radio"].ai1wm-flat-radio-button+a i,input[type="radio"].ai1wm-flat-radio-button+label i{vertical-align:middle;float:left;width:25px;height:25px;border-radius:50%;background:0 0;border:2px solid #ccc;content:" ";cursor:pointer;position:relative;box-sizing:content-box}input[type="radio"].ai1wm-flat-radio-button:checked+a i,input[type="radio"].ai1wm-flat-radio-button:checked+label i{background-color:#d9d9d9;border-color:#6f6f6f}.ai1wm-clear{*zoom:1;clear:both}.ai1wm-clear:before,.ai1wm-clear:after{content:" ";display:table}.ai1wm-clear:after{clear:both}.ai1wm-list-expanded{display:block!important}.ai1wm-field-inline input{border-radius:5px}.ai1wm-container .ai1wm-row label{position:relative;top:-1px}.ai1wm-share-button-container{text-align:center}.ai1wm-share-button-container .ai1wm-share-button{text-decoration:none;margin:10px;font-size:30px}.ai1wm-report-problem{position:relative;float:right}.ai1wm-report-problem-dialog{position:absolute;z-index:999;width:280px;right:0;background-color:#fff;margin:6px 0 0;padding:15px 15px 10px;border:1px solid #D6D6D6;border-radius:3px;box-shadow:0 1px 0 0 #fff inset;display:none}.ai1wm-report-email{width:100%;font-weight:400;font-size:.8rem;height:2.3rem;line-height:2.3rem;border-radius:5px;margin-bottom:4px;padding:0 10px}.ai1wm-report-message{width:100%;border-radius:3px;font-size:.8rem;padding:6px 10px;resize:none}.ai1wm-report-cancel:link,.ai1wm-report-cancel:visited,.ai1wm-report-cancel:active,.ai1wm-feedback-cancel:link,.ai1wm-feedback-cancel:visited,.ai1wm-feedback-cancel:active{float:right;line-height:34px;outline:0;text-decoration:none;color:#e74c3c}.ai1wm-report-active{display:block}.ai1wm-report-terms-segment{font-size:.7rem;line-height:1rem;margin:4px 0 8px}.ai1wm-report-terms-segment>.ai1wm-report-terms{border-radius:3px}.ai1wm-no-underline{text-decoration:none}.ai1wm-top-negative-four{top:-4px}.ai1wm-feedback-form{display:none}.ai1wm-feedback-types{margin:0;padding:0;list-style:none}.ai1wm-feedback-types li{margin:14px 0;padding:0}.ai1wm-feedback-types>li>label>span{display:inline-block;padding:5px 0 6px 8px}.ai1wm-feedback-types>li>a{height:29px;outline:none;color:#333;text-deciration:none}.ai1wm-feedback-types>li>a>span{display:inline-block;padding:5px 0 6px 8px}.ai1wm-loader{display:inline-block;width:128px;height:128px;position:relative;-webkit-animation:ai1wm-rotate 1.5s infinite linear;animation:ai1wm-rotate 1.5s infinite linear;background:url("../img/logo.svg") no-repeat center center}.ai1wm-hide{display:none}.ai1wm-label{border:1px solid #5cb85c;background-color:transparent;color:#5cb85c;cursor:pointer;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;padding:.2em .6em;font-size:.8em;border-radius:5px}.ai1wm-label:hover{background-color:#5cb85c;color:#fff}.ai1wm-dialog-message{text-align:left;line-height:1.5em}.ai1wm-overlay{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.7);z-index:100001}.ai1wm-modal-container{position:fixed;display:none;top:50%;left:50%;z-index:100002;width:480px;height:auto;padding:16px;-webkit-transform:translate(-240px,-94px);transform:translate(-240px,-94px);border:1px solid #fff;box-shadow:0 2px 6px #292929;border-radius:6px;background:#f6f6f6;box-sizing:border-box;text-align:center}.ai1wm-modal-container section{display:block;min-height:102px}.ai1wm-modal-container section h1{margin:0;padding:0}.ai1wm-modal-container section h1 .ai1wm-title-green{color:#27ae60;font-size:20px}.ai1wm-modal-container section h1 .ai1wm-title-red{color:#e74c3c;font-size:20px}.ai1wm-modal-container section h1 .ai1wm-loader{width:32px;height:32px}.ai1wm-modal-container section h1 .ai1wm-icon-notification{font-size:1.2em;color:#e74c3c}.ai1wm-modal-container section p{margin:0;padding:12px 0}.ai1wm-modal-container section p .ai1wm-modal-subtitle-green{color:#27ae60}.ai1wm-modal-container section p .ai1wm-modal-subtitle-red{color:#e74c3c}.ai1wm-modal-container section p .ai1wm-modal-subdescription{display:block;text-align:left}.ai1wm-modal-container section p a.ai1wm-button-green{display:inline-block;position:relative;top:26px}.ai1wm-modal-container section p a.ai1wm-emphasize{-webkit-animation:ai1wm-emphasize 1s infinite;animation:ai1wm-emphasize 1s infinite}.ai1wm-modal-container section p em{display:block;color:#34495e;font-style:normal}.ai1wm-growl-info{position:fixed;z-index:200000;top:0;margin-top:16px;right:16px;width:200px;padding:16px;background:#f1c40f;border:1px solid #e67e22;border-radius:5px;color:#111}.ai1wm-drag-drop-area{border:3px dashed #ddd;height:200px;margin:20px 0 16px;background:#fff;text-align:center;border-radius:30px}.ai1wm-drag-drop-area.dragover{background:rgba(255,255,255,.4);border-color:green}.ai1wm-drag-over .ai1wm-drag-drop-area{border-color:#83b4d8}.ai1wm-import-form{position:relative}#ai1wm-import-init{position:absolute;top:10px;left:10%;width:80%;text-align:center}#ai1wm-import-init>p{font-size:18px;color:#9e9e9e}#ai1wm-import-init>p>i{font-size:46px}.ai1wm-unlimited-import a{text-decoration:none}.ai1wm-max-upload-size{border-bottom:1px solid #000}.ai1wm-progress-bar{position:relative;display:inline-block;background-color:#bdc3c7;height:32px;width:100%;border-radius:15px;top:35px}.ai1wm-progress-bar-meter{background-color:#2ecc71;border-radius:15px;width:0;text-align:center}.ai1wm-progress-bar-meter,.ai1wm-progress-bar-percent{display:inline-block;float:left;height:32px;line-height:32px;color:#fff}.ai1wm-progress-bar-percent{position:absolute;width:50px;left:50%;-webkit-transform:translate(-24px,0);transform:translate(-24px,0);font-size:.5em;background:0 0}
lib/view/assets/css/updater.min.css CHANGED
@@ -1 +1 @@
1
- @charset "UTF-8";.ai1wm-button-group{border:2px solid #27ae60;background-color:transparent;color:#27ae60;border-radius:5px;cursor:pointer;text-transform:uppercase;font-weight:600;transition:background-color .2s ease-out;display:inline-block}.ai1wm-button-group.ai1wm-button-export{width:147px}.ai1wm-button-group.ai1wm-button-export.ai1wm-open>.ai1wm-dropdown-menu{height:150px;border-top:1px solid #27ae60}.ai1wm-button-group.ai1wm-button-import{width:158px}.ai1wm-button-group.ai1wm-button-import.ai1wm-open>.ai1wm-dropdown-menu{height:180px;border-top:1px solid #27ae60}.ai1wm-button-group .ai1wm-button-main{padding:6px 25px 1px;height:22px}.ai1wm-button-group .ai1wm-dropdown-menu{height:0;overflow:hidden;transition:height .2s cubic-bezier(.19,1,.22,1);border-top:none}.ai1wm-dropdown-menu{list-style:none}.ai1wm-dropdown-menu,.ai1wm-dropdown-menu li{margin:0!important;padding:0}.ai1wm-dropdown-menu li a,.ai1wm-dropdown-menu li a:visited{display:block;padding:6px 25px 1px 26px;height:22px;line-height:22px;text-decoration:none;color:#27ae60;text-align:left}.ai1wm-dropdown-menu li a:hover,.ai1wm-dropdown-menu li a:visited:hover{text-decoration:none;color:#111}.ai1mw-lines{-webkit-transform:translate(11px,-1px);transform:translate(11px,-1px);position:relative;display:inline-block;width:12px;height:10px}.ai1wm-line{display:inline-block;width:100%;height:2px;margin:auto;background:#27ae60;position:absolute;transition:all .2s ease-in-out}.ai1wm-line-first{top:0}div.ai1wm-open .ai1wm-line-first,div.ai1wm-open .ai1wm-line-third,.ai1wm-line-second{top:50%}.ai1wm-line-third{top:100%}.ai1wm-button-gray{border:2px solid #95a5a6;background-color:transparent;color:#95a5a6;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-gray:hover{background-color:#95a5a6;color:#fff}.ai1wm-button-green{border:2px solid #27ae60;background-color:transparent;color:#27ae60;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-green:hover{background-color:#27ae60;color:#fff}.ai1wm-button-green-small{border:2px solid #6eb649;background-color:transparent;color:#6eb649;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-green-small:hover{background-color:#6eb649;color:#fff}.ai1wm-button-blue{border:2px solid #00aff0;background-color:transparent;color:#00aff0;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-blue:hover{background-color:#00aff0;color:#fff}.ai1wm-button-red{border:2px solid #e74c3c;background-color:transparent;color:#e74c3c;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-red:hover{background-color:#e74c3c;color:#fff}.ai1wm-button-alone{border-radius:50px!important;padding:5px 8px!important}.ai1wm-button-blue[disabled="disabled"],.ai1wm-button-green[disabled="disabled"],.ai1wm-button-red[disabled="disabled"],.ai1wm-button-green-small[disabled="disabled"]{opacity:.6;cursor:default}.ai1wm-button-blue[disabled="disabled"]:hover{color:#00aff0}.ai1wm-button-red[disabled="disabled"]:hover{color:#e74c3c}.ai1wm-button-green[disabled="disabled"]:hover{color:#27ae60}.ai1wm-button-blue[disabled="disabled"]:hover,.ai1wm-button-green[disabled="disabled"]:hover,.ai1wm-button-red[disabled="disabled"]:hover,.ai1wm-button-green-small[disabled="disabled"]:hover{background:0 0}.ai1wm-button-gray i,.ai1wm-button-green i,.ai1wm-button-blue i,.ai1wm-button-red i{margin-left:-.5em;margin-right:.2em}.ai1wm-message-close-button{position:absolute;right:10px;top:6px;text-decoration:none;font-size:10px}input[type="radio"].ai1wm-flat-radio-button{display:none}input[type="radio"].ai1wm-flat-radio-button+a i,input[type="radio"].ai1wm-flat-radio-button+label i{vertical-align:middle;float:left;width:25px;height:25px;border-radius:50%;background:0 0;border:2px solid #ccc;content:" ";cursor:pointer;position:relative;box-sizing:content-box}input[type="radio"].ai1wm-flat-radio-button:checked+a i,input[type="radio"].ai1wm-flat-radio-button:checked+label i{background-color:#d9d9d9;border-color:#6f6f6f}.ai1wm-icon-update{font-size:13px;padding:0;margin:0;font-weight:400}.ai1wm-icon-update:before{color:#d54e21;content:'\f463';display:inline-block;font:20px/1 'dashicons';speak:none;padding:0;margin:0;vertical-align:top}.ai1wm-modal-dialog{position:fixed;top:0;right:0;bottom:0;left:0;background:rgba(0,0,0,.7);z-index:99999;opacity:0;transition:opacity 400ms ease-in;pointer-events:none}.ai1wm-modal-dialog:target{opacity:1;pointer-events:auto}.ai1wm-modal-dialog .ai1wm-modal-container{position:fixed;top:50%;left:50%;z-index:100002;width:480px;height:auto;padding:6px 16px 10px;-webkit-transform:translate(-240px,-94px);transform:translate(-240px,-94px);border:1px solid #fff;box-shadow:0 2px 6px #292929;border-radius:6px;background:#f6f6f6;box-sizing:border-box}.ai1wm-modal-dialog .ai1wm-modal-container .ai1wm-modal-error{color:red}.ai1wm-modal-dialog .ai1wm-modal-container .ai1wm-modal-buttons{text-align:left}.ai1wm-modal-dialog .ai1wm-modal-container .ai1wm-purchase-id{width:100%;padding:6px}.ai1wm-modal-dialog .ai1wm-modal-container .ai1wm-help-link{font-weight:700}.ai1wm-modal-dialog .ai1wm-modal-container .ai1wm-purchase-discard{margin-left:1em}
1
+ @charset "UTF-8";.ai1wm-button-group{border:2px solid #27ae60;background-color:transparent;color:#27ae60;border-radius:5px;cursor:pointer;text-transform:uppercase;font-weight:600;transition:background-color .2s ease-out;display:inline-block}.ai1wm-button-group.ai1wm-button-export{width:147px}.ai1wm-button-group.ai1wm-button-export.ai1wm-open>.ai1wm-dropdown-menu{height:180px;border-top:1px solid #27ae60}.ai1wm-button-group.ai1wm-button-import{width:158px}.ai1wm-button-group.ai1wm-button-import.ai1wm-open>.ai1wm-dropdown-menu{height:210px;border-top:1px solid #27ae60}.ai1wm-button-group .ai1wm-button-main{padding:6px 25px 1px;height:22px}.ai1wm-button-group .ai1wm-dropdown-menu{height:0;overflow:hidden;transition:height .2s cubic-bezier(.19,1,.22,1);border-top:none}.ai1wm-dropdown-menu{list-style:none}.ai1wm-dropdown-menu,.ai1wm-dropdown-menu li{margin:0!important;padding:0}.ai1wm-dropdown-menu li a,.ai1wm-dropdown-menu li a:visited{display:block;padding:6px 25px 1px 26px;height:22px;line-height:22px;text-decoration:none;color:#27ae60;text-align:left}.ai1wm-dropdown-menu li a:hover,.ai1wm-dropdown-menu li a:visited:hover{text-decoration:none;color:#111}.ai1mw-lines{-webkit-transform:translate(11px,-1px);transform:translate(11px,-1px);position:relative;display:inline-block;width:12px;height:10px}.ai1wm-line{display:inline-block;width:100%;height:2px;margin:auto;background:#27ae60;position:absolute;transition:all .2s ease-in-out}.ai1wm-line-first{top:0}div.ai1wm-open .ai1wm-line-first,div.ai1wm-open .ai1wm-line-third,.ai1wm-line-second{top:50%}.ai1wm-line-third{top:100%}.ai1wm-button-gray{border:2px solid #95a5a6;background-color:transparent;color:#95a5a6;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-gray:hover{background-color:#95a5a6;color:#fff}.ai1wm-button-green{border:2px solid #27ae60;background-color:transparent;color:#27ae60;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-green:hover{background-color:#27ae60;color:#fff}.ai1wm-button-green-small{border:2px solid #6eb649;background-color:transparent;color:#6eb649;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-green-small:hover{background-color:#6eb649;color:#fff}.ai1wm-button-blue{border:2px solid #00aff0;background-color:transparent;color:#00aff0;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-blue:hover{background-color:#00aff0;color:#fff}.ai1wm-button-red{border:2px solid #e74c3c;background-color:transparent;color:#e74c3c;border-radius:5px;cursor:pointer;padding:5px 25px 5px 26px;text-transform:uppercase;font-weight:600;outline:none;transition:background-color .2s ease-out;text-decoration:none}.ai1wm-button-red:hover{background-color:#e74c3c;color:#fff}.ai1wm-button-alone{border-radius:50px!important;padding:5px 8px!important}.ai1wm-button-blue[disabled="disabled"],.ai1wm-button-green[disabled="disabled"],.ai1wm-button-red[disabled="disabled"],.ai1wm-button-green-small[disabled="disabled"]{opacity:.6;cursor:default}.ai1wm-button-blue[disabled="disabled"]:hover{color:#00aff0}.ai1wm-button-red[disabled="disabled"]:hover{color:#e74c3c}.ai1wm-button-green[disabled="disabled"]:hover{color:#27ae60}.ai1wm-button-blue[disabled="disabled"]:hover,.ai1wm-button-green[disabled="disabled"]:hover,.ai1wm-button-red[disabled="disabled"]:hover,.ai1wm-button-green-small[disabled="disabled"]:hover{background:0 0}.ai1wm-button-gray i,.ai1wm-button-green i,.ai1wm-button-blue i,.ai1wm-button-red i{margin-left:-.5em;margin-right:.2em}.ai1wm-message-close-button{position:absolute;right:10px;top:6px;text-decoration:none;font-size:10px}input[type="radio"].ai1wm-flat-radio-button{display:none}input[type="radio"].ai1wm-flat-radio-button+a i,input[type="radio"].ai1wm-flat-radio-button+label i{vertical-align:middle;float:left;width:25px;height:25px;border-radius:50%;background:0 0;border:2px solid #ccc;content:" ";cursor:pointer;position:relative;box-sizing:content-box}input[type="radio"].ai1wm-flat-radio-button:checked+a i,input[type="radio"].ai1wm-flat-radio-button:checked+label i{background-color:#d9d9d9;border-color:#6f6f6f}.ai1wm-icon-update{font-size:13px;padding:0;margin:0;font-weight:400}.ai1wm-icon-update:before{color:#d54e21;content:'\f463';display:inline-block;font:20px/1 'dashicons';speak:none;padding:0;margin:0;vertical-align:top}.ai1wm-modal-dialog{position:fixed;top:0;right:0;bottom:0;left:0;background:rgba(0,0,0,.7);z-index:99999;opacity:0;transition:opacity 400ms ease-in;pointer-events:none}.ai1wm-modal-dialog:target{opacity:1;pointer-events:auto}.ai1wm-modal-dialog .ai1wm-modal-container{position:fixed;top:50%;left:50%;z-index:100002;width:480px;height:auto;padding:6px 16px 10px;-webkit-transform:translate(-240px,-94px);transform:translate(-240px,-94px);border:1px solid #fff;box-shadow:0 2px 6px #292929;border-radius:6px;background:#f6f6f6;box-sizing:border-box}.ai1wm-modal-dialog .ai1wm-modal-container .ai1wm-modal-error{color:red}.ai1wm-modal-dialog .ai1wm-modal-container .ai1wm-modal-buttons{text-align:left}.ai1wm-modal-dialog .ai1wm-modal-container .ai1wm-purchase-id{width:100%;padding:6px}.ai1wm-modal-dialog .ai1wm-modal-container .ai1wm-help-link{font-weight:700}.ai1wm-modal-dialog .ai1wm-modal-container .ai1wm-purchase-discard{margin-left:1em}
lib/view/assets/javascript/backup.min.js DELETED
@@ -1 +0,0 @@
1
- !function e(a,t,i){function r(s,n){if(!t[s]){if(!a[s]){var m="function"==typeof require&&require;if(!n&&m)return m(s,!0);if(c)return c(s,!0);throw new Error("Cannot find module '"+s+"'")}var o=t[s]={exports:{}};a[s][0].call(o.exports,function(e){var t=a[s][1][e];return r(t?t:e)},o,o.exports,e,a,t,i)}return t[s].exports}for(var c="function"==typeof require&&require,s=0;s<i.length;s++)r(i[s]);return r}({1:[function(e){e("./servmask/report"),e("./servmask/maintenance"),e("./servmask/feedback");jQuery(document).ready(function(e){"use strict";e(".ai1wm-backup-actions > a").hover(function(){e(this).addClass("ai1wm-button-on")},function(){e(this).removeClass("ai1wm-button-on")}),e(".ai1wm-backup-delete").click(function(a){var t=e(this),i=t.data("delete-file");confirm("Are you sure you want to delete this file?")&&e.ajax({type:"POST",url:ai1wm_backup.ajax.url,data:{file:i},success:function(a){var i=a.errors;0===i.length&&(t.closest("tr").remove(),0===e(".ai1wm-backups tbody tr").length&&(e(".ai1wm-backups").addClass("ai1wm-hide"),e(".ai1wm-backups-empty").removeClass("ai1wm-hide")))},dataType:"json"}),a.preventDefault()})})},{"./servmask/feedback":2,"./servmask/maintenance":3,"./servmask/report":4}],2:[function(){jQuery(document).ready(function(e){"use strict";e(".ai1wm-feedback-type").attr("checked",!1),e("#ai1wm-feedback-type-link-1").click(function(a){var t=e("#ai1wm-feedback-type-1");t.is(":checked")?(t.attr("checked",!1),a.preventDefault()):t.attr("checked",!0)}),e("#ai1wm-feedback-type-2").click(function(){e("#ai1wm-feedback-type-1, #ai1wm-feedback-type-3").closest("li").hide(),e(".ai1wm-feedback-form").find(".ai1wm-feedback-message").attr("placeholder","Leave plugin developers any feedback here"),e(".ai1wm-feedback-form").fadeIn()}),e("#ai1wm-feedback-type-3").click(function(){e("#ai1wm-feedback-type-1, #ai1wm-feedback-type-2").closest("li").hide(),e(".ai1wm-feedback-form").find(".ai1wm-feedback-message").attr("placeholder","How may we help you?"),e(".ai1wm-feedback-form").fadeIn()}),e("#ai1wm-feedback-cancel").click(function(a){e(".ai1wm-feedback-form").fadeOut(function(){e(".ai1wm-feedback-type").attr("checked",!1).closest("li").show()}),a.preventDefault()}),e("#ai1wm-feedback-submit").click(function(){var a=ai1wm_feedback.ajax.url,t=e(".ai1wm-feedback-type:checked").val(),i=e(".ai1wm-feedback-email").val(),r=e(".ai1wm-feedback-message").val(),c=e(".ai1wm-feedback-terms").is(":checked");e.ajax({type:"POST",url:a,data:{type:t,email:i,message:r,terms:+c},success:function(a){var t=a.errors;if(t.length>0){e(".ai1wm-feedback .ai1wm-message").remove();var i=e("<div />").addClass("ai1wm-message ai1wm-error-message");e.each(t,function(e,a){i.append("<p>"+a+"</p>")}),e(".ai1wm-feedback").prepend(i)}else{var r=e("<div />").addClass("ai1wm-message ai1wm-success-message").append("<p>Thanks for submitting your feedback!</p>");e(".ai1wm-feedback").html(r)}},dataType:"json",async:!1})})})},{}],3:[function(){jQuery(document).ready(function(e){"use strict";e("#ai1wm-maintenance-off").click(function(a){var t=ai1wm_maintenance.ajax.url,i=e(this);e.ajax({type:"POST",url:t,success:function(){i.closest(".ai1wm-message-warning").remove()}}),a.preventDefault()})})},{}],4:[function(){jQuery(document).ready(function(e){"use strict";e("#ai1wm-report-problem-button").click(function(a){e(this).next(".ai1wm-report-problem-dialog").toggleClass("ai1wm-report-active"),a.preventDefault()}),e("#ai1wm-report-cancel").click(function(a){e(this).closest(".ai1wm-report-problem-dialog").removeClass("ai1wm-report-active"),a.preventDefault()}),e("#ai1wm-report-submit").click(function(){var a=ai1wm_report.ajax.url,t=e(".ai1wm-report-email").val(),i=e(".ai1wm-report-message").val(),r=e(".ai1wm-report-terms").is(":checked");e.ajax({type:"POST",url:a,data:{email:t,message:i,terms:+r},success:function(a){var t=a.errors;if(t.length>0){e(".ai1wm-report-problem-dialog .ai1wm-message").remove();var i=e("<div />").addClass("ai1wm-message ai1wm-error-message");e.each(t,function(e,a){i.append("<p>"+a+"</p>")}),e(".ai1wm-report-problem-dialog").prepend(i)}else{var r=e("<div />").addClass("ai1wm-message ai1wm-success-message").append("<p>Thanks for submitting your request!</p>");e(".ai1wm-report-problem-dialog").html(r),setTimeout(function(){e(".ai1wm-report-problem-dialog").removeClass("ai1wm-report-active")},2e3)}},dataType:"json",async:!1})})})},{}]},{},[1]);
 
lib/view/assets/javascript/backups.min.js ADDED
@@ -0,0 +1 @@
 
1
+ !function e(a,t,i){function o(n,s){if(!t[n]){if(!a[n]){var p="function"==typeof require&&require;if(!s&&p)return p(n,!0);if(r)return r(n,!0);throw new Error("Cannot find module '"+n+"'")}var c=t[n]={exports:{}};a[n][0].call(c.exports,function(e){var t=a[n][1][e];return o(t?t:e)},c,c.exports,e,a,t,i)}return t[n].exports}for(var r="function"==typeof require&&require,n=0;n<i.length;n++)o(i[n]);return o}({1:[function(e){var a=(e("./servmask/report"),e("./servmask/feedback"),e("./servmask/util")),t=e("./import/import");jQuery(document).ready(function(e){"use strict";e(".ai1wm-backup-actions > a").hover(function(){e(this).addClass("ai1wm-button-on")},function(){e(this).removeClass("ai1wm-button-on")}),e(".ai1wm-backup-delete").click(function(a){var t=e(this);confirm("Are you sure you want to delete this file?")&&e.ajax({type:"POST",url:ai1wm_backups.ajax.url,data:{archive:t.data("archive")},success:function(a){var i=a.errors;0===i.length&&(t.closest("tr").remove(),0===e(".ai1wm-backups tbody tr").length&&(e(".ai1wm-backups").addClass("ai1wm-hide"),e(".ai1wm-backups-empty").removeClass("ai1wm-hide")))},dataType:"json"}),a.preventDefault()});var i=new t;e(".ai1wm-backup-restore").click(function(t){var o=a.random(12),r=e(this).data("archive");i.start({storage:o,archive:r,backups:!0}),i.onConfirm=function(){i.confirm({storage:o,archive:r,backups:!0,priority:150})},t.preventDefault()})})},{"./import/import":2,"./servmask/feedback":4,"./servmask/report":5,"./servmask/util":6}],2:[function(e,a){var t=e("./modal"),i=jQuery,o=function(){var e=this;this.modal=new t,this.modal.onConfirm=function(){e.onConfirm()},this.modal.onStop=function(){e.onStop()}};o.prototype.start=function(e){var a=this;i(window).bind("beforeunload",function(){return"You are about to stop importing your website, are you sure?"}),this.stop=!1,this.setStatus({type:"info",message:"Preparing to import..."}),i.post(ai1wm_import.ajax.url,i.extend({secret_key:ai1wm_import.secret_key},e)).done(function(){a.getStatus()}).fail(function(){a.setStatus({type:"error",message:"Unable to start the import. Refresh the page and try again"})})},o.prototype.confirm=function(e){var a=this;i.post(ai1wm_import.ajax.url,i.extend({secret_key:ai1wm_import.secret_key},e)).done(function(){a.getStatus(ai1wm_import.status.php)}).fail(function(){a.setStatus({type:"error",message:"Unable to confirm the import. Refresh the page and try again"})})},o.prototype.clean=function(e){var a=this;this.stop=!0,i.post(ai1wm_import.ajax.url,i.extend({secret_key:ai1wm_import.secret_key},e)).done(function(){i(window).unbind("beforeunload")}).fail(function(){a.setStatus({type:"error",message:"Unable to clean the import. Refresh the page and try again"})})},o.prototype.getStatus=function(e,a){var t=this,a=a||0;this.stop||i.ajax({cache:!1,url:e,dataType:"json"}).done(function(o){if(o)switch(t.setStatus(o),o.type){case"done":case"error":return i(window).unbind("beforeunload"),void 0;case"confirm":return}setTimeout(function(){t.getStatus(e,a)},3e3)}).fail(function(){a++,a>=6?t.setStatus({type:"error",message:"Unable to retrieve status of the export. Is your server running?"}):a>=3?t.getStatus(ai1wm_import.status.js,a):t.getStatus(ai1wm_import.status.php,a)})},o.prototype.setStatus=function(e){this.modal.render(e)},o.prototype.onConfirm=function(){throw"onConfirm event is not implemented"},o.prototype.onStop=function(){throw"onStop event is not implemented"},a.exports=o},{"./modal":3}],3:[function(e,a){var t=jQuery,i=function(){var e=this;this.error=function(a){var i=t("<div></div>"),o=t("<section></section>"),r=t("<h1></h1>"),n=t("<p></p>").html(a.message),s=t("<div></div>"),p=t("<span></span>").addClass("ai1wm-title-red").text("Unable to import"),c=t('<button class="ai1wm-button-red">Close</button>').on("click",function(){e.modal.hide(),e.overlay.hide()});s.append(c),r.append(p),o.append(r).append(n),i.append(o).append(s),e.modal.html(i).show(),e.overlay.show()},this.progress=function(a){var i=t("<div></div>"),o=t("<section></section>"),r=t("<h1></h1>"),n=(t("<p></p>"),t("<div></div>")),s=t('<span class="ai1wm-progress-bar"></span>'),p=t('<span class="ai1wm-progress-bar-meter"></span>').width(a.percent+"%"),c=t('<span class="ai1wm-progress-bar-percent">0%</span>').text(a.percent+"%"),m=t('<button class="ai1wm-button-red"><i class="ai1wm-icon-notification"></i> Stop import</button>').on("click",function(){t(this).attr("disabled","disabled"),e.onStop(),e.modal.hide(),e.overlay.hide()});s.append(p).append(c),n.append(m),r.append(s),o.append(r),i.append(o).append(n),e.modal.html(i).show(),e.overlay.show()},this.confirm=function(a){var i=t("<div></div>"),o=t("<section></section>"),r=t("<h1></h1>"),n=t("<p></p>").html(a.message),s=t("<div></div>"),p=t('<span class="ai1wm-icon-notification"></span>'),c=t('<button class="ai1wm-button-green">Continue</button>').on("click",function(){t(this).attr("disabled","disabled"),e.onConfirm()});s.append(c),r.append(p),o.append(r).append(n),i.append(o).append(s),e.modal.html(i).show(),e.overlay.show()},this.info=function(a){var i=t("<div></div>"),o=t("<section></section>"),r=t("<h1></h1>"),n=t("<p></p>").html(a.message),s=t("<div></div>"),p=t('<span class="ai1wm-loader"></span>'),c=t('<button class="ai1wm-button-red"><i class="ai1wm-icon-notification"></i> Stop import</button>').attr("disabled","disabled");s.append(c),r.append(p),o.append(r).append(n),i.append(o).append(s),e.modal.html(i).show(),e.overlay.show()},this.done=function(a){var i=t("<div></div>"),o=t("<section></section>"),r=t("<h1></h1>"),n=t("<p></p>").html(a.message),s=t("<div></div>"),p=t("<span></span>").addClass("ai1wm-title-green").text(a.title),c=t('<button class="ai1wm-button-red">Close</button>').on("click",function(){e.modal.hide(),e.overlay.hide()});s.append(c),r.append(p),o.append(r).append(n),i.append(o).append(s),e.modal.html(i).show(),e.overlay.show()},this.overlay=t('<div class="ai1wm-overlay"></div>'),this.modal=t('<div class="ai1wm-modal-container"></div>'),t("body").append(this.overlay).append(this.modal)};i.prototype.render=function(e){switch(e.type){case"error":this.error(e);break;case"confirm":this.confirm(e);break;case"progress":this.progress(e);break;case"info":this.info(e);break;case"done":this.done(e)}},a.exports=i},{}],4:[function(){jQuery(document).ready(function(e){"use strict";e(".ai1wm-feedback-type").attr("checked",!1),e("#ai1wm-feedback-type-link-1").click(function(a){var t=e("#ai1wm-feedback-type-1");t.is(":checked")?(t.attr("checked",!1),a.preventDefault()):t.attr("checked",!0)}),e("#ai1wm-feedback-type-2").click(function(){e("#ai1wm-feedback-type-1, #ai1wm-feedback-type-3").closest("li").hide(),e(".ai1wm-feedback-form").find(".ai1wm-feedback-message").attr("placeholder","Leave plugin developers any feedback here"),e(".ai1wm-feedback-form").fadeIn()}),e("#ai1wm-feedback-type-3").click(function(){e("#ai1wm-feedback-type-1, #ai1wm-feedback-type-2").closest("li").hide(),e(".ai1wm-feedback-form").find(".ai1wm-feedback-message").attr("placeholder","How may we help you?"),e(".ai1wm-feedback-form").fadeIn()}),e("#ai1wm-feedback-cancel").click(function(a){e(".ai1wm-feedback-form").fadeOut(function(){e(".ai1wm-feedback-type").attr("checked",!1).closest("li").show()}),a.preventDefault()}),e("#ai1wm-feedback-submit").click(function(){var a=e(".ai1wm-feedback-type:checked").val(),t=e(".ai1wm-feedback-email").val(),i=e(".ai1wm-feedback-message").val(),o=e(".ai1wm-feedback-terms").is(":checked");e.ajax({type:"POST",url:ai1wm_feedback.ajax.url,data:{"ai1wm-type":a,"ai1wm-email":t,"ai1wm-message":i,"ai1wm-terms":+o},success:function(a){var t=a.errors;if(t.length>0){e(".ai1wm-feedback .ai1wm-message").remove();var i=e("<div />").addClass("ai1wm-message ai1wm-error-message");e.each(t,function(e,a){i.append("<p>"+a+"</p>")}),e(".ai1wm-feedback").prepend(i)}else{var o=e("<div />").addClass("ai1wm-message ai1wm-success-message").append("<p>Thanks for submitting your feedback!</p>");e(".ai1wm-feedback").html(o)}},dataType:"json",async:!1})})})},{}],5:[function(){jQuery(document).ready(function(e){"use strict";e("#ai1wm-report-problem-button").click(function(a){e(this).next(".ai1wm-report-problem-dialog").toggleClass("ai1wm-report-active"),a.preventDefault()}),e("#ai1wm-report-cancel").click(function(a){e(this).closest(".ai1wm-report-problem-dialog").removeClass("ai1wm-report-active"),a.preventDefault()}),e("#ai1wm-report-submit").click(function(){var a=e(".ai1wm-report-email").val(),t=e(".ai1wm-report-message").val(),i=e(".ai1wm-report-terms").is(":checked");e.ajax({type:"POST",url:ai1wm_report.ajax.url,data:{"ai1wm-email":a,"ai1wm-message":t,"ai1wm-terms":+i},success:function(a){var t=a.errors;if(t.length>0){e(".ai1wm-report-problem-dialog .ai1wm-message").remove();var i=e("<div />").addClass("ai1wm-message ai1wm-error-message");e.each(t,function(e,a){i.append("<p>"+a+"</p>")}),e(".ai1wm-report-problem-dialog").prepend(i)}else{var o=e("<div />").addClass("ai1wm-message ai1wm-success-message").append("<p>Thanks for submitting your request!</p>");e(".ai1wm-report-problem-dialog").html(o),setTimeout(function(){e(".ai1wm-report-problem-dialog").removeClass("ai1wm-report-active")},2e3)}},dataType:"json",async:!1})})})},{}],6:[function(e,a){var t=jQuery;a.exports={random:function(e){for(var a="",t="abcdefghijklmnopqrstuvwxyz0123456789",i=0;e>i;i++)a+=t.charAt(Math.floor(Math.random()*t.length));return a},form:function(e){return t(e).serializeArray()},ucfirst:function(e){return e.charAt(0).toUpperCase()+e.slice(1)}}},{}]},{},[1]);
lib/view/assets/javascript/export.min.js CHANGED
@@ -1 +1 @@
1
- !function e(t,a,i){function s(o,n){if(!a[o]){if(!t[o]){var c="function"==typeof require&&require;if(!n&&c)return c(o,!0);if(r)return r(o,!0);throw new Error("Cannot find module '"+o+"'")}var m=a[o]={exports:{}};t[o][0].call(m.exports,function(e){var a=t[o][1][e];return s(a?a:e)},m,m.exports,e,t,a,i)}return a[o].exports}for(var r="function"==typeof require&&require,o=0;o<i.length;o++)s(i[o]);return s}({1:[function(e){var t=(e("./jquery/query"),e("./jquery/find_replace"),e("./jquery/message_close"),e("./servmask/report"),e("./servmask/maintenance"),e("./servmask/feedback"),e("./servmask/export_controller"));jQuery(document).ready(function(e){"use strict";e("#ai1wm-export-file").click(function(e){e.preventDefault();var a=new t("file");a.start()}),e(".ai1wm-accordion > .ai1wm-title").click(function(){e(this).parent().toggleClass("ai1wm-active")}),e("#ai1wm-add-new-replace-button").ai1wm_find_replace(),e(".ai1wm-message-close-button").ai1wm_message_close(),e(".ai1wm-expandable > p:first, .ai1wm-expandable > h4:first, .ai1wm-expandable > div.ai1wm-button-main").on("click",function(){e(this).parent().toggleClass("ai1wm-open")}),e(".ai1wm-collapsable").ai1wm_query()})},{"./jquery/find_replace":2,"./jquery/message_close":3,"./jquery/query":4,"./servmask/export_controller":6,"./servmask/feedback":8,"./servmask/maintenance":9,"./servmask/report":10}],2:[function(){!function(e){e.fn.ai1wm_find_replace=function(){return e(this).click(function(t){t.preventDefault();var a=e("#ai1wm-queries > li:first").clone();a.find("input").val(""),a.find(".ai1wm-query-find-text").html("&lt;text&gt;"),a.find(".ai1wm-query-replace-text").html("&lt;another-text&gt;"),e("#ai1wm-queries > li").removeClass("ai1wm-open"),e(a).addClass("ai1wm-open"),e("#ai1wm-queries").append(a),e(a).ai1wm_query(),e(a).find("p:first").on("click",function(){e(this).parent().toggleClass("ai1wm-open")})}),this}}(jQuery)},{}],3:[function(){!function(e){e.fn.ai1wm_message_close=function(){return e(this).click(function(t){var a=ai1wm_message.ajax.url,i=e(this),s=i.attr("data-key");e.ajax({type:"POST",url:a,data:{key:s},success:function(e){var t=e.errors;0===t.length&&i.closest(".ai1wm-message").remove()},dataType:"json"}),t.preventDefault()}),this}}(jQuery)},{}],4:[function(){!function(e){e.fn.ai1wm_query=function(){var t=e(this).find("input.ai1wm-query-find-input"),a=e(this).find("input.ai1wm-query-replace-input"),i=e(this).find("small.ai1wm-query-find-text"),s=e(this).find("small.ai1wm-query-replace-text");return t.on("change paste input keypress keydown keyup",function(){var t=e(this).val().length>0?e(this).val():"<text>";i.text(t)}),a.on("change paste input keypress keydown keyup",function(){var t=e(this).val().length>0?e(this).val():"<another-text>";s.text(t)}),this}}(jQuery)},{}],5:[function(e,t){var a=jQuery,i=function(e){this._stop=!1,this._provider=e,this._storage=this.random(12)};i.prototype.start=function(e){var t=this,i=new jQuery.Deferred,s=e.concat("&",a.param({method:"start",secret_key:ai1wm_export.secret_key,provider:t._provider,storage:t._storage}));return a.post(ai1wm_export.ajax.url,s).done(function(){t.getStatus(ai1wm_export.status.php).progress(function(e){i.notify(e)}).done(function(){i.resolve()}).fail(function(e){i.reject(e)})}).fail(function(){i.reject({message:"Unable to start the export. Refresh the page and try again"})}),i.promise()},i.prototype.getStatus=function(e,t,i){var s=this;return t=t||new jQuery.Deferred,i=i||0,s._stop?t.resolve():(a.ajax({cache:!1,url:e,dataType:"json"}).done(function(i){if(i)switch(t.notify(i),i.type){case"finish":case"download":t.resolve(),a.post(ai1wm_export.ajax.url,{method:"clean",secret_key:ai1wm_export.secret_key,provider:s._provider,storage:s._storage});break;default:setTimeout(function(){s.getStatus(e,t)},3e3)}}).fail(function(){i++,i>=6?t.reject({message:"Unable to retrieve status of the export. Is your server running?"}):i>=3?s.getStatus(ai1wm_export.status.js,t,i):s.getStatus(ai1wm_export.status.php,t,i)}),t.promise())},i.prototype.stop=function(e,t){var e=new jQuery.Deferred,i=this;return e=e||new jQuery.Deferred,t=t||0,t>0?e.notify({message:"Please wait, stopping the export... Retry "+t}):(e.notify({message:"Please wait, stopping the export..."}),i._stop=!0),a.post(ai1wm_export.ajax.url,{method:"stop",secret_key:ai1wm_export.secret_key,provider:i._provider,storage:i._storage}).done(function(){e.resolve()}).fail(function(){t++,t>=3?e.reject({message:"Unable to retrieve status of the export. Is your server running?"}):i.stop(e,t)}),e.promise()},i.prototype.random=function(e){for(var t="",a="abcdefghijklmnopqrstuvwxyz0123456789",i=0;e>i;i++)t+=a.charAt(Math.floor(Math.random()*a.length));return t},t.exports=i},{}],6:[function(e,t){(function(a){var i=e("./export_modal"),s=e("./export"),r=jQuery,o=function(e){this._export=new s(e),this._modal=new i};o.prototype.start=function(){var e=this;this._modal._stop.on("click",function(t){t.preventDefault(),e.stop()}),this._modal._close.on("click",function(t){t.preventDefault(),e._modal.remove()}),this._modal.show(),e._modal._loader.show(),e._modal._stop.show();var t=r("#ai1wm-export-form").serialize();e.display({type:"info",message:"Preparing to export..."}),this._export.start(t).progress(function(t){e.display(t)}).done(function(){}).fail(function(e){alert(e.message)})},o.prototype.display=function(e){var t=this;switch(t._modal.reset(),t._modal.show(),e.type){case"error":t._modal._title.html(e.title),t._modal._title.addClass("ai1wm-title-red"),t._modal._title.show(),t._modal._message.html(e.message),t._modal._message.css("text-align","left"),t._modal._message.show(),t._modal._close.show();break;case"download":t._modal._message.html(e.message),t._modal._message.show(),t._modal._close.show();break;case"finish":t._modal._title.html(e.title),t._modal._title.addClass("ai1wm-title-green"),t._modal._title.show(),t._modal._message.html(e.message),t._modal._message.show(),t._modal._close.show();break;default:t._modal._loader.show(),t._modal._message.html(e.message),t._modal._message.show(),t._modal._stop.show()}},o.prototype.stop=function(){var e=this;this._export.stop().progress(function(t){e.display(t)}).done(function(){e._modal.remove()}).fail(function(e){alert(e)})},t.exports=o,a.window.Ai1wmExportController=o}).call(this,"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./export":5,"./export_modal":7}],7:[function(e,t){var a=jQuery,i=function(){this._overlay=a('<div class="ai1wm-overlay"></div>'),this._modal=a('<div class="ai1wm-modal-container"></div>'),this._section=a("<section></section>"),this._header=a("<h1></h1>"),this._message=a("<p></p>").hide(),this._action=a("<div></div>"),this._title=a("<span></span>").hide(),this._loader=a('<span class="ai1wm-loader"></span>').hide(),this._warning=a('<span class="ai1wm-icon-notification"></span>').hide(),this._progressBar=a('<span class="ai1wm-progress-bar"></span>').hide(),this._progressBarMeter=a('<span class="ai1wm-progress-bar-meter"></span>'),this._progressBarPercent=a('<span class="ai1wm-progress-bar-percent">0%</span>'),this._stop=a('<button class="ai1wm-button-red"><i class="ai1wm-icon-notification"></i> Stop export</button>').hide(),this._close=a('<button class="ai1wm-button-red">Close</button>').hide(),this._confirm=a('<button class="ai1wm-button-green">Continue</button>').hide(),this._progressBar.append(this._progressBarMeter).append(this._progressBarPercent),this._action.append(this._stop).append(this._close).append(this._confirm),this._header.append(this._title).append(this._loader).append(this._warning).append(this._progressBar),this._section.append(this._header).append(this._message),this._modal.append(this._section).append(this._action),a("body").append(this._overlay).append(this._modal)};i.prototype.show=function(){return this._overlay.show(),this._modal.show(),this},i.prototype.hide=function(){return this._modal.hide(),this._overlay.hide(),this},i.prototype.remove=function(){return this.hide(),this._modal.remove(),this._overlay.remove(),this},i.prototype.reset=function(){return this._title.hide(),this._loader.hide(),this._warning.hide(),this._progressBar.hide(),this._message.hide(),this._stop.hide(),this._close.hide(),this._confirm.hide(),this},t.exports=i},{}],8:[function(){jQuery(document).ready(function(e){"use strict";e(".ai1wm-feedback-type").attr("checked",!1),e("#ai1wm-feedback-type-link-1").click(function(t){var a=e("#ai1wm-feedback-type-1");a.is(":checked")?(a.attr("checked",!1),t.preventDefault()):a.attr("checked",!0)}),e("#ai1wm-feedback-type-2").click(function(){e("#ai1wm-feedback-type-1, #ai1wm-feedback-type-3").closest("li").hide(),e(".ai1wm-feedback-form").find(".ai1wm-feedback-message").attr("placeholder","Leave plugin developers any feedback here"),e(".ai1wm-feedback-form").fadeIn()}),e("#ai1wm-feedback-type-3").click(function(){e("#ai1wm-feedback-type-1, #ai1wm-feedback-type-2").closest("li").hide(),e(".ai1wm-feedback-form").find(".ai1wm-feedback-message").attr("placeholder","How may we help you?"),e(".ai1wm-feedback-form").fadeIn()}),e("#ai1wm-feedback-cancel").click(function(t){e(".ai1wm-feedback-form").fadeOut(function(){e(".ai1wm-feedback-type").attr("checked",!1).closest("li").show()}),t.preventDefault()}),e("#ai1wm-feedback-submit").click(function(){var t=ai1wm_feedback.ajax.url,a=e(".ai1wm-feedback-type:checked").val(),i=e(".ai1wm-feedback-email").val(),s=e(".ai1wm-feedback-message").val(),r=e(".ai1wm-feedback-terms").is(":checked");e.ajax({type:"POST",url:t,data:{type:a,email:i,message:s,terms:+r},success:function(t){var a=t.errors;if(a.length>0){e(".ai1wm-feedback .ai1wm-message").remove();var i=e("<div />").addClass("ai1wm-message ai1wm-error-message");e.each(a,function(e,t){i.append("<p>"+t+"</p>")}),e(".ai1wm-feedback").prepend(i)}else{var s=e("<div />").addClass("ai1wm-message ai1wm-success-message").append("<p>Thanks for submitting your feedback!</p>");e(".ai1wm-feedback").html(s)}},dataType:"json",async:!1})})})},{}],9:[function(){jQuery(document).ready(function(e){"use strict";e("#ai1wm-maintenance-off").click(function(t){var a=ai1wm_maintenance.ajax.url,i=e(this);e.ajax({type:"POST",url:a,success:function(){i.closest(".ai1wm-message-warning").remove()}}),t.preventDefault()})})},{}],10:[function(){jQuery(document).ready(function(e){"use strict";e("#ai1wm-report-problem-button").click(function(t){e(this).next(".ai1wm-report-problem-dialog").toggleClass("ai1wm-report-active"),t.preventDefault()}),e("#ai1wm-report-cancel").click(function(t){e(this).closest(".ai1wm-report-problem-dialog").removeClass("ai1wm-report-active"),t.preventDefault()}),e("#ai1wm-report-submit").click(function(){var t=ai1wm_report.ajax.url,a=e(".ai1wm-report-email").val(),i=e(".ai1wm-report-message").val(),s=e(".ai1wm-report-terms").is(":checked");e.ajax({type:"POST",url:t,data:{email:a,message:i,terms:+s},success:function(t){var a=t.errors;if(a.length>0){e(".ai1wm-report-problem-dialog .ai1wm-message").remove();var i=e("<div />").addClass("ai1wm-message ai1wm-error-message");e.each(a,function(e,t){i.append("<p>"+t+"</p>")}),e(".ai1wm-report-problem-dialog").prepend(i)}else{var s=e("<div />").addClass("ai1wm-message ai1wm-success-message").append("<p>Thanks for submitting your request!</p>");e(".ai1wm-report-problem-dialog").html(s),setTimeout(function(){e(".ai1wm-report-problem-dialog").removeClass("ai1wm-report-active")},2e3)}},dataType:"json",async:!1})})})},{}]},{},[1]);
1
+ !function e(t,a,i){function o(r,s){if(!a[r]){if(!t[r]){var p="function"==typeof require&&require;if(!s&&p)return p(r,!0);if(n)return n(r,!0);throw new Error("Cannot find module '"+r+"'")}var c=a[r]={exports:{}};t[r][0].call(c.exports,function(e){var a=t[r][1][e];return o(a?a:e)},c,c.exports,e,t,a,i)}return a[r].exports}for(var n="function"==typeof require&&require,r=0;r<i.length;r++)o(i[r]);return o}({1:[function(e,t){var a=e("./modal"),i=jQuery,o=function(){var e=this;this.modal=new a,this.modal.onStop=function(){e.onStop()}};o.prototype.start=function(e){var t=this;i(window).bind("beforeunload",function(){return"You are about to stop exporting your website, are you sure?"}),this.stop=!1,this.setStatus({type:"info",message:"Preparing to export..."}),i.post(ai1wm_export.ajax.url,e.concat({name:"secret_key",value:ai1wm_export.secret_key})).done(function(){t.getStatus(ai1wm_export.status.php)}).fail(function(){t.setStatus({type:"error",message:"Unable to start the export. Refresh the page and try again"})})},o.prototype.clean=function(e){var t=this;this.stop=!0,i.post(ai1wm_export.ajax.url,e.concat({name:"secret_key",value:ai1wm_export.secret_key})).done(function(){i(window).unbind("beforeunload")}).fail(function(){t.setStatus({type:"error",message:"Unable to clean the export. Refresh the page and try again"})})},o.prototype.getStatus=function(e,t){var a=this,t=t||0;this.stop||i.ajax({cache:!1,url:e,dataType:"json"}).done(function(o){if(o)switch(a.setStatus(o),o.type){case"done":case"error":case"download":return i(window).unbind("beforeunload"),void 0}setTimeout(function(){a.getStatus(e,t)},3e3)}).fail(function(){t++,t>=6?a.setStatus({type:"error",message:"Unable to retrieve status of the export. Is your server running?"}):t>=3?a.getStatus(ai1wm_export.status.js,t):a.getStatus(ai1wm_export.status.php,t)})},o.prototype.setStatus=function(e){this.modal.render(e)},o.prototype.onStop=function(){throw"onStop event is not implemented"},t.exports=o},{"./modal":2}],2:[function(e,t){var a=jQuery,i=function(){var e=this;this.error=function(t){var i=a("<div></div>"),o=a("<section></section>"),n=a("<h1></h1>"),r=a("<p></p>").html(t.message),s=a("<div></div>"),p=a("<span></span>").addClass("ai1wm-title-red").text("Unable to export"),c=a('<button class="ai1wm-button-red">Close</button>').on("click",function(){e.modal.hide(),e.overlay.hide()});s.append(c),n.append(p),o.append(n).append(r),i.append(o).append(s),e.modal.html(i).show(),e.overlay.show()},this.info=function(t){var i=a("<div></div>"),o=a("<section></section>"),n=a("<h1></h1>"),r=a("<p></p>").html(t.message),s=a("<div></div>"),p=a('<span class="ai1wm-loader"></span>'),c=a('<button class="ai1wm-button-red"><i class="ai1wm-icon-notification"></i> Stop export</button>').on("click",function(){a(this).attr("disabled","disabled"),e.onStop(),e.modal.hide(),e.overlay.hide()});s.append(c),n.append(p),o.append(n).append(r),i.append(o).append(s),e.modal.html(i).show(),e.overlay.show()},this.done=function(t){var i=a("<div></div>"),o=a("<section></section>"),n=a("<h1></h1>"),r=a("<p></p>").html(t.message),s=a("<div></div>"),p=a("<span></span>").addClass("ai1wm-title-green").text(t.title),c=a('<button class="ai1wm-button-red">Close</button>').on("click",function(){e.modal.hide(),e.overlay.hide()});s.append(c),n.append(p),o.append(n).append(r),i.append(o).append(s),e.modal.html(i).show(),e.overlay.show()},this.download=function(t){var i=a("<div></div>"),o=a("<section></section>"),n=(a("<h1></h1>"),a("<p></p>").html(t.message)),r=a("<div></div>"),s=a('<button class="ai1wm-button-red">Close</button>').on("click",function(){e.modal.hide(),e.overlay.hide()});r.append(s),o.append(n),i.append(o).append(r),e.modal.html(i).show(),e.overlay.show()},this.overlay=a('<div class="ai1wm-overlay"></div>'),this.modal=a('<div class="ai1wm-modal-container"></div>'),a("body").append(this.overlay).append(this.modal)};i.prototype.render=function(e){switch(e.type){case"error":this.error(e);break;case"info":this.info(e);break;case"done":this.done(e);break;case"download":this.download(e)}},t.exports=i},{}],3:[function(e){(function(t){var a=(e("./jquery/query"),e("./jquery/find_replace"),e("./servmask/report"),e("./servmask/feedback"),e("./servmask/util")),i=(e("./servmask/deprecated"),e("./export/export"));jQuery(document).ready(function(e){"use strict";var t=new i;e("#ai1wm-export-file").click(function(e){var i=a.random(12),o=a.form("#ai1wm-export-form").concat({name:"storage",value:i});t.start(o),t.onStop=function(){t.clean(o.concat({name:"priority",value:350}))},e.preventDefault()}),e(".ai1wm-accordion > .ai1wm-title").click(function(){e(this).parent().toggleClass("ai1wm-active")}),e("#ai1wm-add-new-replace-button").ai1wm_find_replace(),e(".ai1wm-expandable > p:first, .ai1wm-expandable > h4:first, .ai1wm-expandable > div.ai1wm-button-main").on("click",function(){e(this).parent().toggleClass("ai1wm-open")}),e(".ai1wm-collapsable").ai1wm_query()}),t.Ai1wm={Util:a,Export:i}}).call(this,"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./export/export":1,"./jquery/find_replace":4,"./jquery/query":5,"./servmask/deprecated":6,"./servmask/feedback":8,"./servmask/report":9,"./servmask/util":10}],4:[function(){!function(e){e.fn.ai1wm_find_replace=function(){return e(this).click(function(t){t.preventDefault();var a=e("#ai1wm-queries > li:first").clone();a.find("input").val(""),a.find(".ai1wm-query-find-text").html("&lt;text&gt;"),a.find(".ai1wm-query-replace-text").html("&lt;another-text&gt;"),e("#ai1wm-queries > li").removeClass("ai1wm-open"),e(a).addClass("ai1wm-open"),e("#ai1wm-queries").append(a),e(a).ai1wm_query(),e(a).find("p:first").on("click",function(){e(this).parent().toggleClass("ai1wm-open")})}),this}}(jQuery)},{}],5:[function(){!function(e){e.fn.ai1wm_query=function(){var t=e(this).find("input.ai1wm-query-find-input"),a=e(this).find("input.ai1wm-query-replace-input"),i=e(this).find("small.ai1wm-query-find-text"),o=e(this).find("small.ai1wm-query-replace-text");return t.on("change paste input keypress keydown keyup",function(){var t=e(this).val().length>0?e(this).val():"<text>";i.text(t)}),a.on("change paste input keypress keydown keyup",function(){var t=e(this).val().length>0?e(this).val():"<another-text>";o.text(t)}),this}}(jQuery)},{}],6:[function(e){var t=(e("./util"),e("./dialog")),a={s3:"Amazon S3 Extension",url:"URL Extension",ftp:"FTP Extension",gdrive:"Google Drive Extension",dropbox:"Dropbox Extension"};window.Ai1wmExportController=function(e){this._export={},this._provider=e},window.Ai1wmExportController.prototype.start=function(){new t("<strong>All in One WP Migration</strong> is not compatible with current version of <strong>"+a[this._provider]+'</strong>. Please contact <a href="mailto:support@servmask.com">support@servmask.com</a> for more details.')},window.Ai1wmImportController=function(e){this._import={},this._provider=e},window.Ai1wmImportController.prototype.init=function(){},window.Ai1wmImportController.prototype.download=function(){new t("<strong>All in One WP Migration</strong> is not compatible with current version of <strong>"+a[this._provider]+'</strong>. Please contact <a href="mailto:support@servmask.com">support@servmask.com</a> for more details.')}},{"./dialog":7,"./util":10}],7:[function(e,t){var a=jQuery,i=function(e){var t=this;this.overlay=a('<div class="ai1wm-overlay"></div>'),this.container=a("<div></div>"),this.modal=a('<div class="ai1wm-modal-container"></div>'),this.section=a("<section></section>"),this.message=a("<p></p>").addClass("ai1wm-dialog-message").html(e),this.action=a("<div></div>"),this.closeButton=a('<button class="ai1wm-button-red">Close</button>').on("click",function(){t.modal.hide(),t.overlay.hide()}),this.action.append(this.closeButton),this.section.append(this.message),this.container.append(this.section).append(this.action),this.modal.html(this.container).show(),this.overlay.show(),a("body").append(this.overlay).append(this.modal)};t.exports=i},{}],8:[function(){jQuery(document).ready(function(e){"use strict";e(".ai1wm-feedback-type").attr("checked",!1),e("#ai1wm-feedback-type-link-1").click(function(t){var a=e("#ai1wm-feedback-type-1");a.is(":checked")?(a.attr("checked",!1),t.preventDefault()):a.attr("checked",!0)}),e("#ai1wm-feedback-type-2").click(function(){e("#ai1wm-feedback-type-1, #ai1wm-feedback-type-3").closest("li").hide(),e(".ai1wm-feedback-form").find(".ai1wm-feedback-message").attr("placeholder","Leave plugin developers any feedback here"),e(".ai1wm-feedback-form").fadeIn()}),e("#ai1wm-feedback-type-3").click(function(){e("#ai1wm-feedback-type-1, #ai1wm-feedback-type-2").closest("li").hide(),e(".ai1wm-feedback-form").find(".ai1wm-feedback-message").attr("placeholder","How may we help you?"),e(".ai1wm-feedback-form").fadeIn()}),e("#ai1wm-feedback-cancel").click(function(t){e(".ai1wm-feedback-form").fadeOut(function(){e(".ai1wm-feedback-type").attr("checked",!1).closest("li").show()}),t.preventDefault()}),e("#ai1wm-feedback-submit").click(function(){var t=e(".ai1wm-feedback-type:checked").val(),a=e(".ai1wm-feedback-email").val(),i=e(".ai1wm-feedback-message").val(),o=e(".ai1wm-feedback-terms").is(":checked");e.ajax({type:"POST",url:ai1wm_feedback.ajax.url,data:{"ai1wm-type":t,"ai1wm-email":a,"ai1wm-message":i,"ai1wm-terms":+o},success:function(t){var a=t.errors;if(a.length>0){e(".ai1wm-feedback .ai1wm-message").remove();var i=e("<div />").addClass("ai1wm-message ai1wm-error-message");e.each(a,function(e,t){i.append("<p>"+t+"</p>")}),e(".ai1wm-feedback").prepend(i)}else{var o=e("<div />").addClass("ai1wm-message ai1wm-success-message").append("<p>Thanks for submitting your feedback!</p>");e(".ai1wm-feedback").html(o)}},dataType:"json",async:!1})})})},{}],9:[function(){jQuery(document).ready(function(e){"use strict";e("#ai1wm-report-problem-button").click(function(t){e(this).next(".ai1wm-report-problem-dialog").toggleClass("ai1wm-report-active"),t.preventDefault()}),e("#ai1wm-report-cancel").click(function(t){e(this).closest(".ai1wm-report-problem-dialog").removeClass("ai1wm-report-active"),t.preventDefault()}),e("#ai1wm-report-submit").click(function(){var t=e(".ai1wm-report-email").val(),a=e(".ai1wm-report-message").val(),i=e(".ai1wm-report-terms").is(":checked");e.ajax({type:"POST",url:ai1wm_report.ajax.url,data:{"ai1wm-email":t,"ai1wm-message":a,"ai1wm-terms":+i},success:function(t){var a=t.errors;if(a.length>0){e(".ai1wm-report-problem-dialog .ai1wm-message").remove();var i=e("<div />").addClass("ai1wm-message ai1wm-error-message");e.each(a,function(e,t){i.append("<p>"+t+"</p>")}),e(".ai1wm-report-problem-dialog").prepend(i)}else{var o=e("<div />").addClass("ai1wm-message ai1wm-success-message").append("<p>Thanks for submitting your request!</p>");e(".ai1wm-report-problem-dialog").html(o),setTimeout(function(){e(".ai1wm-report-problem-dialog").removeClass("ai1wm-report-active")},2e3)}},dataType:"json",async:!1})})})},{}],10:[function(e,t){var a=jQuery;t.exports={random:function(e){for(var t="",a="abcdefghijklmnopqrstuvwxyz0123456789",i=0;e>i;i++)t+=a.charAt(Math.floor(Math.random()*a.length));return t},form:function(e){return a(e).serializeArray()},ucfirst:function(e){return e.charAt(0).toUpperCase()+e.slice(1)}}},{}]},{},[3]);
lib/view/assets/javascript/import.min.js CHANGED
@@ -1 +1 @@
1
- !function e(t,i,a){function o(s,n){if(!i[s]){if(!t[s]){var d="function"==typeof require&&require;if(!n&&d)return d(s,!0);if(r)return r(s,!0);throw new Error("Cannot find module '"+s+"'")}var p=i[s]={exports:{}};t[s][0].call(p.exports,function(e){var i=t[s][1][e];return o(i?i:e)},p,p.exports,e,t,i,a)}return i[s].exports}for(var r="function"==typeof require&&require,s=0;s<a.length;s++)o(a[s]);return o}({1:[function(e){var t=(e("./servmask/report.js"),e("./servmask/maintenance"),e("./servmask/feedback"),e("./servmask/import_controller"));jQuery(document).ready(function(e){"use strict";var i=function(e){for(var t=window.location.search.substring(1),i=t.split("&"),a=0;a<i.length;a++){var o=i[a].split("=");if(o[0]==e)return o[1]}},a=new t("file");a.init(),a.upload(),i("restore-file")&&a.restore(i("restore-file")),e(".ai1wm-expandable > div.ai1wm-button-main").on("click",function(){e(this).parent().toggleClass("ai1wm-open")})})},{"./servmask/feedback":3,"./servmask/import_controller":6,"./servmask/maintenance":9,"./servmask/report.js":10}],2:[function(e,t){var i=jQuery,a=function(e){this._overlay=i('<div class="ai1wm-overlay"></div>'),this._modal=i('<div class="ai1wm-modal-container"></div>'),this._modal_section=i("<section></section>"),this._modal_content=i('<p style="text-align: left; line-height: 1.5em;">'+e+"</p>"),this._modal_close=i('<button class="ai1wm-button-red">Close</button>'),this._modal_section.append(this._modal_content),this._modal.append(this._modal_section).append(this._modal_close),console.log(this._modal),i("body").append(this._overlay).append(this._modal),this._modal_close.on("click",function(){this.remove()}.bind(this)),this.show()};a.prototype.show=function(){return this._overlay.show(),this._modal.show(),this},a.prototype.hide=function(){return this._modal.hide(),this._overlay.hide(),this},a.prototype.remove=function(){return this.hide(),this._modal.remove(),this._overlay.remove(),this},t.exports=a},{}],3:[function(){jQuery(document).ready(function(e){"use strict";e(".ai1wm-feedback-type").attr("checked",!1),e("#ai1wm-feedback-type-link-1").click(function(t){var i=e("#ai1wm-feedback-type-1");i.is(":checked")?(i.attr("checked",!1),t.preventDefault()):i.attr("checked",!0)}),e("#ai1wm-feedback-type-2").click(function(){e("#ai1wm-feedback-type-1, #ai1wm-feedback-type-3").closest("li").hide(),e(".ai1wm-feedback-form").find(".ai1wm-feedback-message").attr("placeholder","Leave plugin developers any feedback here"),e(".ai1wm-feedback-form").fadeIn()}),e("#ai1wm-feedback-type-3").click(function(){e("#ai1wm-feedback-type-1, #ai1wm-feedback-type-2").closest("li").hide(),e(".ai1wm-feedback-form").find(".ai1wm-feedback-message").attr("placeholder","How may we help you?"),e(".ai1wm-feedback-form").fadeIn()}),e("#ai1wm-feedback-cancel").click(function(t){e(".ai1wm-feedback-form").fadeOut(function(){e(".ai1wm-feedback-type").attr("checked",!1).closest("li").show()}),t.preventDefault()}),e("#ai1wm-feedback-submit").click(function(){var t=ai1wm_feedback.ajax.url,i=e(".ai1wm-feedback-type:checked").val(),a=e(".ai1wm-feedback-email").val(),o=e(".ai1wm-feedback-message").val(),r=e(".ai1wm-feedback-terms").is(":checked");e.ajax({type:"POST",url:t,data:{type:i,email:a,message:o,terms:+r},success:function(t){var i=t.errors;if(i.length>0){e(".ai1wm-feedback .ai1wm-message").remove();var a=e("<div />").addClass("ai1wm-message ai1wm-error-message");e.each(i,function(e,t){a.append("<p>"+t+"</p>")}),e(".ai1wm-feedback").prepend(a)}else{var o=e("<div />").addClass("ai1wm-message ai1wm-success-message").append("<p>Thanks for submitting your feedback!</p>");e(".ai1wm-feedback").html(o)}},dataType:"json",async:!1})})})},{}],4:[function(e,t){var i=jQuery,a=function(){this.FILES_ADDED=1,this.BEFORE_UPLOAD=2,this.UPLOAD_PROGRESS=3,this.CHUNK_UPLOADED=4,this.UPLOAD_FINISHED=5,this.UPLOAD_ERROR=6,this.OVERSIZED_FILE=7,this.INVALID_EXTENSION=8,this._dfd=new i.Deferred,this._chunkUploaded=!1,this._storage=null,this.addFileFilters(),this._uploader=new plupload.Uploader(ai1wm_uploader),this._uploader.bind("Init",this._onInit),this._uploader.init(),this._uploader.bind("FilesAdded",this._onFilesAdded.bind(this)),this._uploader.bind("BeforeUpload",this._onBeforeUpload.bind(this)),this._uploader.bind("UploadProgress",this._onUploadProgress.bind(this)),this._uploader.bind("ChunkUploaded",this._onChunkUploaded.bind(this)),this._uploader.bind("FileUploaded",this._onFileUploaded.bind(this)),this._uploader.bind("Error",this._onError.bind(this))};a.prototype.addFileFilters=function(){var e=this;plupload.addFileFilter("ai1wm_archive_size",function(t,i,a){t=parseInt(t,10),i.size=i.hasOwnProperty("size")?parseInt(i.size,10):0,0===t||i.size<=t?a(!0):(this.trigger("Error",{code:e.OVERSIZED_FILE,message:ai1wm_import.oversize}),a(!1))}),plupload.addFileFilter("ai1wm_archive_extension",function(t,a,o){var r=a.name.substr((~-a.name.lastIndexOf(".")>>>0)+2);i.inArray(r,t)>-1?o(!0):(this.trigger("Error",{code:e.INVALID_EXTENSION,message:ai1wm_import.invalid_extension}),o(!1))})},a.prototype.watch=function(){return this._dfd.promise()},a.prototype.random=function(e){for(var t="",i="abcdefghijklmnopqrstuvwxyz0123456789",a=0;e>a;a++)t+=i.charAt(Math.floor(Math.random()*i.length));return t},a.prototype._onInit=function(e){var t=i("#ai1wm-plupload-upload-ui");e.features.dragdrop&&!i(document.body).hasClass("mobile")?i("#ai1wm-drag-drop-area").bind("dragover.wp-uploader",function(){t.addClass("ai1wm-drag-over")}).bind("dragleave.wp-uploader, drop.wp-uploader",function(){t.removeClass("ai1wm-drag-over")}):i("#ai1wm-drag-drop-area").unbind(".wp-uploader"),"html4"==e.runtime&&i(".upload-flash-bypass").hide()},a.prototype._onFilesAdded=function(e,t){this._storage=this.random(12),this._uploader.settings.multipart_params.storage=this._storage,this._dfd.notify({state:this.FILES_ADDED,up:e,files:t})},a.prototype._onBeforeUpload=function(e,t){this._dfd.notify({state:this.BEFORE_UPLOAD,up:e,files:t})},a.prototype._onUploadProgress=function(e,t){this._dfd.notify({state:this.UPLOAD_PROGRESS,up:e,files:t})},a.prototype._onChunkUploaded=function(){this._dfd.notify({state:this.CHUNK_UPLOADED})},a.prototype._onFileUploaded=function(e,t){this._dfd.notify({state:this.UPLOAD_FINISHED,up:e,files:t})},a.prototype._onError=function(e,t){this._dfd.notify({state:this.UPLOAD_ERROR,up:e,error:t})},t.exports=a},{}],5:[function(e,t){var i=jQuery,a=function(e){this._stop=!1,this._archive=null,this._storage=null,this._provider=e};a.prototype.start=function(){var e=this,t=new jQuery.Deferred;return i.post(ai1wm_import.ajax.url,{method:"start",secret_key:ai1wm_import.secret_key,provider:e._provider,storage:e._storage,archive:e._archive}).done(function(){e.getStatus(ai1wm_import.status.php).progress(function(e){t.notify(e)}).done(function(){t.resolve()}).fail(function(e){t.reject(e)})}).fail(function(){t.reject({message:"Unable to start the import. Refresh the page and try again"})}),t.promise()},a.prototype.getStatus=function(e,t,a){var o=this;return t=t||new jQuery.Deferred,a=a||0,o._stop?t.resolve():(i.ajax({cache:!1,url:e,dataType:"json"}).done(function(a){if(a)switch(t.notify(a),a.type){case"finish":t.resolve(),i.post(ai1wm_import.ajax.url,{method:"clean",secret_key:ai1wm_import.secret_key,provider:o._provider,storage:o._storage});break;case"confirm":t.resolve();break;default:setTimeout(function(){o.getStatus(e,t)},3e3)}}).fail(function(){a++,a>=6?t.reject({message:"Unable to retrieve status of the import. Is your server running?"}):a>=3?o.getStatus(ai1wm_import.status.js,t,a):o.getStatus(ai1wm_import.status.php,t,a)}),t.promise())},a.prototype.stop=function(e,t){var e=new jQuery.Deferred,a=this;return e=e||new jQuery.Deferred,t=t||0,t>0?e.notify({message:"Please wait, stopping the import... Retry "+t}):(e.notify({message:"Please wait, stopping the import..."}),a._stop=!0),i.post(ai1wm_import.ajax.url,{method:"stop",secret_key:ai1wm_import.secret_key,provider:a._provider,storage:a._storage}).done(function(){e.resolve()}).fail(function(){t++,t>3?e.reject({message:"Unable to retrieve status of the import. Is your server running?"}):a.stop(e,t)}),e.promise()},a.prototype.confirm=function(){var e=new jQuery.Deferred,t=this;return i.post(ai1wm_import.ajax.url,{method:"enumerate",secret_key:ai1wm_import.secret_key,provider:t._provider,storage:t._storage,archive:t._archive}).done(function(){t.getStatus(ai1wm_import.status.php).progress(function(t){e.notify(t)}).done(function(){e.resolve()}).fail(function(t){e.reject(t)})}).fail(function(){e.reject({message:"Unable to start the import. Refresh the page and try again"})}),e.promise()},a.prototype.download=function(e){var t=new jQuery.Deferred,a=this;return i.post(ai1wm_import.ajax.url,i.extend({method:"import",secret_key:ai1wm_import.secret_key,provider:a._provider,storage:a._storage,archive:a._archive},e)).done(function(){a.getStatus(ai1wm_import.status.php).progress(function(e){t.notify(e)}).done(function(){t.resolve()}).fail(function(e){t.reject(e)})}).fail(function(){t.reject({message:"Unable to start the import. Refresh the page and try again"})}),t.promise()},t.exports=a},{}],6:[function(e,t){(function(i){var a=e("./import_modal"),o=e("./file_uploader"),r=e("./import"),s=e("./info"),n=e("./dialog"),d=jQuery,p=function(e){this._import=new r(e),this._modal=new a};p.prototype.init=function(){var e=this;this._modal._stop.on("click",function(t){t.preventDefault(),d(this).attr("disabled","disabled"),e.stop()}),this._modal._confirm.on("click",function(t){t.preventDefault(),d(this).attr("disabled","disabled"),e.confirm()}),this._modal._close.on("click",function(t){t.preventDefault(),e._modal.remove()})},p.prototype.stop=function(){var e=this;this._import.stop().progress(function(t){e.display(t)}).done(function(){e._modal.remove()}).fail(function(e){alert(e.message)})},p.prototype.confirm=function(){var e=this;this._import.confirm().progress(function(t){e.display(t)}).fail(function(e){alert(e.message)})},p.prototype.download=function(e){var t=this;t.display({type:"info",message:"Preparing to import..."}),this._import.download(e).progress(function(e){t.display(e)}).fail(function(e){alert(e.message)})},p.prototype.display=function(e){var t=this;switch(t._modal.reset(),t._modal.show(),e.type){case"error":t._modal._title.html(e.title),t._modal._title.addClass("ai1wm-title-red"),t._modal._title.show(),t._modal._message.html(e.message),t._modal._message.css("text-align","left"),t._modal._message.show(),t._modal._close.show();break;case"confirm":t._modal._warning.show(),t._modal._message.html(e.message),t._modal._message.show(),t._modal._confirm.show();break;case"progress":t._modal._progressBar.show(),t._modal._progressBarPercent.text(e.percent+"%"),t._modal._progressBarMeter.width(e.meter+"%"),t._modal._stop.show();break;case"finish":t._modal._title.html(e.title),t._modal._title.addClass("ai1wm-title-green"),t._modal._title.show(),t._modal._message.html(e.message),t._modal._message.show(),t._modal._close.show();break;default:t._modal._loader.show(),t._modal._message.html(e.message),t._modal._message.show(),t._modal._stop.show(),t._modal._stop.attr("disabled","disabled")}},p.prototype.upload=function(){var e=this;this._uploadFinished=!1,this._uploadProgress=0,this._fileUploader=new o,this._fileUploader.watch().progress(function(t){e._handleUploadState(t)}).done(function(){e.display({type:"info",message:"Preparing to import..."}),e._import.start().progress(function(t){e.display(t)}).done(function(){}).fail(function(e){alert(e.message)})}).fail(function(e){alert(e.message)})},p.prototype.restore=function(e){var t=this;this._import._archive=e,this._import._storage=this.random(12),t.display({type:"info",message:"Preparing to import..."}),this._import.start().progress(function(e){t.display(e)}).done(function(){}).fail(function(e){alert(e.message)})},p.prototype._handleUploadState=function(e){var t=this;switch(e.state){case t._fileUploader.FILES_ADDED:t.display({type:"progress",percent:1,meter:7}),t._fileUploader._uploader.refresh(),t._fileUploader._uploader.start();break;case t._fileUploader.BEFORE_UPLOAD:break;case t._fileUploader.UPLOAD_PROGRESS:if(e.files.size>e.up.settings.chunk_size&&t._fileUploader._chunkUploaded){var i=e.files.percent>7?e.files.percent:7;t.display({type:"progress",percent:i,meter:i})}else t._uploadFinished?(t._uploadProgress++,2==t._uploadProgress&&t.display({type:"progress",percent:100,meter:100})):t.display({type:"progress",percent:1,meter:7});break;case t._fileUploader.CHUNK_UPLOADED:t._fileUploader._chunkUploaded===!1&&(t._fileUploader._uploader.settings.max_retries=100),t._fileUploader._chunkUploaded=!0;break;case t._fileUploader.UPLOAD_FINISHED:t._uploadFinished=!0,t._import._archive=e.files.target_name,t._import._storage=this._fileUploader._storage,t._fileUploader._dfd.resolve();break;case t._fileUploader.UPLOAD_ERROR:switch(e.error.code){case t._fileUploader.OVERSIZED_FILE:new n(e.error.message);break;case t._fileUploader.INVALID_EXTENSION:new n(e.error.message);break;default:if(t._fileUploader._chunkUploaded)return alert("Unable to upload the file. Is your server running? Please refresh and try again."),void 0;if(t._uploadProgress=0,t._uploadFinished=!1,e.up.settings.chunk_size/=2,e.up.settings.chunk_size<102400)return alert("Unable to upload the file. Is your server running? Please refresh and try again."),void 0;new s("Trying new chunk size: "+(e.up.settings.chunk_size/1048576).toFixed(2)+"MB"),e.up.files[0].status=plupload.QUEUED,e.up.files[0].loaded=0,e.up.refresh(),e.up.start()}break;default:alert("Unknown state: "+state)}},p.prototype.random=function(e){for(var t="",i="abcdefghijklmnopqrstuvwxyz0123456789",a=0;e>a;a++)t+=i.charAt(Math.floor(Math.random()*i.length));return t},t.exports=p,i.window.Ai1wmImportController=p}).call(this,"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./dialog":2,"./file_uploader":4,"./import":5,"./import_modal":7,"./info":8}],7:[function(e,t){var i=jQuery,a=function(){this._overlay=i('<div class="ai1wm-overlay"></div>'),this._modal=i('<div class="ai1wm-modal-container"></div>'),this._section=i("<section></section>"),this._header=i("<h1></h1>"),this._message=i("<p></p>").hide(),this._action=i("<div></div>"),this._title=i("<span></span>").hide(),this._loader=i('<span class="ai1wm-loader"></span>').hide(),this._warning=i('<span class="ai1wm-icon-notification"></span>').hide(),this._progressBar=i('<span class="ai1wm-progress-bar"></span>').hide(),this._progressBarMeter=i('<span class="ai1wm-progress-bar-meter"></span>'),this._progressBarPercent=i('<span class="ai1wm-progress-bar-percent">0%</span>'),this._stop=i('<button class="ai1wm-button-red"><i class="ai1wm-icon-notification"></i> Stop import</button>').hide(),this._close=i('<button class="ai1wm-button-red">Close</button>').hide(),this._confirm=i('<button class="ai1wm-button-green">Continue</button>').hide(),this._progressBar.append(this._progressBarMeter).append(this._progressBarPercent),this._action.append(this._stop).append(this._close).append(this._confirm),this._header.append(this._title).append(this._loader).append(this._warning).append(this._progressBar),this._section.append(this._header).append(this._message),this._modal.append(this._section).append(this._action),i("body").append(this._overlay).append(this._modal)};a.prototype.show=function(){return this._overlay.show(),this._modal.show(),this},a.prototype.hide=function(){return this._modal.hide(),this._overlay.hide(),this},a.prototype.remove=function(){return this.hide(),this._modal.remove(),this._overlay.remove(),this},a.prototype.reset=function(){return this._title.hide(),this._loader.hide(),this._warning.hide(),this._progressBar.hide(),this._message.hide(),this._stop.hide(),this._stop.removeAttr("disabled"),this._close.hide(),this._confirm.hide(),this},t.exports=a},{}],8:[function(e,t){var i=jQuery,a=function(e){var t=i('<div class="ai1wm-growl-info">'+e+"</div>");t.hide(),i("body").append(t),t.show("normal",function(){setTimeout(function(){t.hide(),t.remove()},3e3)})};t.exports=a},{}],9:[function(){jQuery(document).ready(function(e){"use strict";e("#ai1wm-maintenance-off").click(function(t){var i=ai1wm_maintenance.ajax.url,a=e(this);e.ajax({type:"POST",url:i,success:function(){a.closest(".ai1wm-message-warning").remove()}}),t.preventDefault()})})},{}],10:[function(){jQuery(document).ready(function(e){"use strict";e("#ai1wm-report-problem-button").click(function(t){e(this).next(".ai1wm-report-problem-dialog").toggleClass("ai1wm-report-active"),t.preventDefault()}),e("#ai1wm-report-cancel").click(function(t){e(this).closest(".ai1wm-report-problem-dialog").removeClass("ai1wm-report-active"),t.preventDefault()}),e("#ai1wm-report-submit").click(function(){var t=ai1wm_report.ajax.url,i=e(".ai1wm-report-email").val(),a=e(".ai1wm-report-message").val(),o=e(".ai1wm-report-terms").is(":checked");e.ajax({type:"POST",url:t,data:{email:i,message:a,terms:+o},success:function(t){var i=t.errors;if(i.length>0){e(".ai1wm-report-problem-dialog .ai1wm-message").remove();var a=e("<div />").addClass("ai1wm-message ai1wm-error-message");e.each(i,function(e,t){a.append("<p>"+t+"</p>")}),e(".ai1wm-report-problem-dialog").prepend(a)}else{var o=e("<div />").addClass("ai1wm-message ai1wm-success-message").append("<p>Thanks for submitting your request!</p>");e(".ai1wm-report-problem-dialog").html(o),setTimeout(function(){e(".ai1wm-report-problem-dialog").removeClass("ai1wm-report-active")},2e3)}},dataType:"json",async:!1})})})},{}]},{},[1]);
1
+ !function e(t,o,a){function i(n,s){if(!o[n]){if(!t[n]){var p="function"==typeof require&&require;if(!s&&p)return p(n,!0);if(r)return r(n,!0);throw new Error("Cannot find module '"+n+"'")}var d=o[n]={exports:{}};t[n][0].call(d.exports,function(e){var o=t[n][1][e];return i(o?o:e)},d,d.exports,e,t,o,a)}return o[n].exports}for(var r="function"==typeof require&&require,n=0;n<a.length;n++)i(a[n]);return i}({1:[function(e){var t=(e("./servmask/report"),e("./servmask/feedback"),e("./servmask/deprecated"),e("./import/uploader"));jQuery(document).ready(function(e){"use strict";var o=new t;o.init(),e(".ai1wm-expandable > div.ai1wm-button-main").on("click",function(){e(this).parent().toggleClass("ai1wm-open")})})},{"./import/uploader":4,"./servmask/deprecated":5,"./servmask/feedback":7,"./servmask/report":8}],2:[function(e,t){var o=e("./modal"),a=jQuery,i=function(){var e=this;this.modal=new o,this.modal.onConfirm=function(){e.onConfirm()},this.modal.onStop=function(){e.onStop()}};i.prototype.start=function(e){var t=this;a(window).bind("beforeunload",function(){return"You are about to stop importing your website, are you sure?"}),this.stop=!1,this.setStatus({type:"info",message:"Preparing to import..."}),a.post(ai1wm_import.ajax.url,a.extend({secret_key:ai1wm_import.secret_key},e)).done(function(){t.getStatus()}).fail(function(){t.setStatus({type:"error",message:"Unable to start the import. Refresh the page and try again"})})},i.prototype.confirm=function(e){var t=this;a.post(ai1wm_import.ajax.url,a.extend({secret_key:ai1wm_import.secret_key},e)).done(function(){t.getStatus(ai1wm_import.status.php)}).fail(function(){t.setStatus({type:"error",message:"Unable to confirm the import. Refresh the page and try again"})})},i.prototype.clean=function(e){var t=this;this.stop=!0,a.post(ai1wm_import.ajax.url,a.extend({secret_key:ai1wm_import.secret_key},e)).done(function(){a(window).unbind("beforeunload")}).fail(function(){t.setStatus({type:"error",message:"Unable to clean the import. Refresh the page and try again"})})},i.prototype.getStatus=function(e,t){var o=this,t=t||0;this.stop||a.ajax({cache:!1,url:e,dataType:"json"}).done(function(i){if(i)switch(o.setStatus(i),i.type){case"done":case"error":return a(window).unbind("beforeunload"),void 0;case"confirm":return}setTimeout(function(){o.getStatus(e,t)},3e3)}).fail(function(){t++,t>=6?o.setStatus({type:"error",message:"Unable to retrieve status of the export. Is your server running?"}):t>=3?o.getStatus(ai1wm_import.status.js,t):o.getStatus(ai1wm_import.status.php,t)})},i.prototype.setStatus=function(e){this.modal.render(e)},i.prototype.onConfirm=function(){throw"onConfirm event is not implemented"},i.prototype.onStop=function(){throw"onStop event is not implemented"},t.exports=i},{"./modal":3}],3:[function(e,t){var o=jQuery,a=function(){var e=this;this.error=function(t){var a=o("<div></div>"),i=o("<section></section>"),r=o("<h1></h1>"),n=o("<p></p>").html(t.message),s=o("<div></div>"),p=o("<span></span>").addClass("ai1wm-title-red").text("Unable to import"),d=o('<button class="ai1wm-button-red">Close</button>').on("click",function(){e.modal.hide(),e.overlay.hide()});s.append(d),r.append(p),i.append(r).append(n),a.append(i).append(s),e.modal.html(a).show(),e.overlay.show()},this.progress=function(t){var a=o("<div></div>"),i=o("<section></section>"),r=o("<h1></h1>"),n=(o("<p></p>"),o("<div></div>")),s=o('<span class="ai1wm-progress-bar"></span>'),p=o('<span class="ai1wm-progress-bar-meter"></span>').width(t.percent+"%"),d=o('<span class="ai1wm-progress-bar-percent">0%</span>').text(t.percent+"%"),c=o('<button class="ai1wm-button-red"><i class="ai1wm-icon-notification"></i> Stop import</button>').on("click",function(){o(this).attr("disabled","disabled"),e.onStop(),e.modal.hide(),e.overlay.hide()});s.append(p).append(d),n.append(c),r.append(s),i.append(r),a.append(i).append(n),e.modal.html(a).show(),e.overlay.show()},this.confirm=function(t){var a=o("<div></div>"),i=o("<section></section>"),r=o("<h1></h1>"),n=o("<p></p>").html(t.message),s=o("<div></div>"),p=o('<span class="ai1wm-icon-notification"></span>'),d=o('<button class="ai1wm-button-green">Continue</button>').on("click",function(){o(this).attr("disabled","disabled"),e.onConfirm()});s.append(d),r.append(p),i.append(r).append(n),a.append(i).append(s),e.modal.html(a).show(),e.overlay.show()},this.info=function(t){var a=o("<div></div>"),i=o("<section></section>"),r=o("<h1></h1>"),n=o("<p></p>").html(t.message),s=o("<div></div>"),p=o('<span class="ai1wm-loader"></span>'),d=o('<button class="ai1wm-button-red"><i class="ai1wm-icon-notification"></i> Stop import</button>').attr("disabled","disabled");s.append(d),r.append(p),i.append(r).append(n),a.append(i).append(s),e.modal.html(a).show(),e.overlay.show()},this.done=function(t){var a=o("<div></div>"),i=o("<section></section>"),r=o("<h1></h1>"),n=o("<p></p>").html(t.message),s=o("<div></div>"),p=o("<span></span>").addClass("ai1wm-title-green").text(t.title),d=o('<button class="ai1wm-button-red">Close</button>').on("click",function(){e.modal.hide(),e.overlay.hide()});s.append(d),r.append(p),i.append(r).append(n),a.append(i).append(s),e.modal.html(a).show(),e.overlay.show()},this.overlay=o('<div class="ai1wm-overlay"></div>'),this.modal=o('<div class="ai1wm-modal-container"></div>'),o("body").append(this.overlay).append(this.modal)};a.prototype.render=function(e){switch(e.type){case"error":this.error(e);break;case"confirm":this.confirm(e);break;case"progress":this.progress(e);break;case"info":this.info(e);break;case"done":this.done(e)}},t.exports=a},{}],4:[function(e,t){(function(o){var a=e("../servmask/util"),i=e("./import"),r=jQuery,n=function(){this.uploader=new plupload.Uploader(ai1wm_uploader)};n.prototype.init=function(){this.uploader.init(),this.uploader.bind("Init",this.onInit),this.uploader.bind("FilesAdded",this.onFilesAdded),this.uploader.bind("BeforeUpload",this.onBeforeUpload),this.uploader.bind("UploadProgress",this.onUploadProgress),this.uploader.bind("FileUploaded",this.onFileUploaded),this.uploader.bind("Error",this.onError),plupload.addFileFilter("ai1wm_archive_size",function(e,t,o){e=parseInt(e,10),t.size=t.hasOwnProperty("size")?parseInt(t.size,10):0,0===e||t.size<=e?o(!0):(this.trigger("Error",{code:plupload.FILE_SIZE_ERROR,message:ai1wm_import.oversize}),o(!1))}),plupload.addFileFilter("ai1wm_archive_extension",function(e,t,o){var a=t.name.substr((~-t.name.lastIndexOf(".")>>>0)+2);r.inArray(a,e)>-1?o(!0):(this.trigger("Error",{code:plupload.FILE_EXTENSION_ERROR,message:ai1wm_import.invalid_extension}),o(!1))})},n.prototype.onInit=function(e){var t=r("#ai1wm-plupload-upload-ui");e.features.dragdrop&&!r(document.body).hasClass("mobile")?r("#ai1wm-drag-drop-area").bind("dragover.wp-uploader",function(){t.addClass("ai1wm-drag-over")}).bind("dragleave.wp-uploader, drop.wp-uploader",function(){t.removeClass("ai1wm-drag-over")}):r("#ai1wm-drag-drop-area").unbind(".wp-uploader"),"html4"==e.runtime&&r(".upload-flash-bypass").hide(),this.model=new i},n.prototype.onFilesAdded=function(e){e.refresh(),e.start(),r(window).bind("beforeunload",function(){return"You are about to stop importing your website, are you sure?"})},n.prototype.onBeforeUpload=function(e,t){var o=this;this.storage=a.random(12),this.archive=t.name,r.extend(e.settings.multipart_params,{storage:this.storage,archive:this.archive}),this.model.onConfirm=function(){o.model.confirm({storage:o.storage,archive:o.archive,priority:150})},this.model.onStop=function(){e.stop(),e.splice(),o.model.clean({storage:o.storage,archive:o.archive,priority:400})},this.model.setStatus({type:"progress",percent:1})},n.prototype.onUploadProgress=function(e,t){this.model.setStatus({type:"progress",percent:t.percent})},n.prototype.onFileUploaded=function(){this.model.start({storage:this.storage,archive:this.archive})},n.prototype.onError=function(e,t){this.model.setStatus({type:"error",message:t.message})},t.exports=n,o.Ai1wm={Util:a,Import:i}}).call(this,"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"../servmask/util":9,"./import":2}],5:[function(e){var t=(e("./util"),e("./dialog")),o={s3:"Amazon S3 Extension",url:"URL Extension",ftp:"FTP Extension",gdrive:"Google Drive Extension",dropbox:"Dropbox Extension"};window.Ai1wmExportController=function(e){this._export={},this._provider=e},window.Ai1wmExportController.prototype.start=function(){new t("<strong>All in One WP Migration</strong> is not compatible with current version of <strong>"+o[this._provider]+'</strong>. Please contact <a href="mailto:support@servmask.com">support@servmask.com</a> for more details.')},window.Ai1wmImportController=function(e){this._import={},this._provider=e},window.Ai1wmImportController.prototype.init=function(){},window.Ai1wmImportController.prototype.download=function(){new t("<strong>All in One WP Migration</strong> is not compatible with current version of <strong>"+o[this._provider]+'</strong>. Please contact <a href="mailto:support@servmask.com">support@servmask.com</a> for more details.')}},{"./dialog":6,"./util":9}],6:[function(e,t){var o=jQuery,a=function(e){var t=this;this.overlay=o('<div class="ai1wm-overlay"></div>'),this.container=o("<div></div>"),this.modal=o('<div class="ai1wm-modal-container"></div>'),this.section=o("<section></section>"),this.message=o("<p></p>").addClass("ai1wm-dialog-message").html(e),this.action=o("<div></div>"),this.closeButton=o('<button class="ai1wm-button-red">Close</button>').on("click",function(){t.modal.hide(),t.overlay.hide()}),this.action.append(this.closeButton),this.section.append(this.message),this.container.append(this.section).append(this.action),this.modal.html(this.container).show(),this.overlay.show(),o("body").append(this.overlay).append(this.modal)};t.exports=a},{}],7:[function(){jQuery(document).ready(function(e){"use strict";e(".ai1wm-feedback-type").attr("checked",!1),e("#ai1wm-feedback-type-link-1").click(function(t){var o=e("#ai1wm-feedback-type-1");o.is(":checked")?(o.attr("checked",!1),t.preventDefault()):o.attr("checked",!0)}),e("#ai1wm-feedback-type-2").click(function(){e("#ai1wm-feedback-type-1, #ai1wm-feedback-type-3").closest("li").hide(),e(".ai1wm-feedback-form").find(".ai1wm-feedback-message").attr("placeholder","Leave plugin developers any feedback here"),e(".ai1wm-feedback-form").fadeIn()}),e("#ai1wm-feedback-type-3").click(function(){e("#ai1wm-feedback-type-1, #ai1wm-feedback-type-2").closest("li").hide(),e(".ai1wm-feedback-form").find(".ai1wm-feedback-message").attr("placeholder","How may we help you?"),e(".ai1wm-feedback-form").fadeIn()}),e("#ai1wm-feedback-cancel").click(function(t){e(".ai1wm-feedback-form").fadeOut(function(){e(".ai1wm-feedback-type").attr("checked",!1).closest("li").show()}),t.preventDefault()}),e("#ai1wm-feedback-submit").click(function(){var t=e(".ai1wm-feedback-type:checked").val(),o=e(".ai1wm-feedback-email").val(),a=e(".ai1wm-feedback-message").val(),i=e(".ai1wm-feedback-terms").is(":checked");e.ajax({type:"POST",url:ai1wm_feedback.ajax.url,data:{"ai1wm-type":t,"ai1wm-email":o,"ai1wm-message":a,"ai1wm-terms":+i},success:function(t){var o=t.errors;if(o.length>0){e(".ai1wm-feedback .ai1wm-message").remove();var a=e("<div />").addClass("ai1wm-message ai1wm-error-message");e.each(o,function(e,t){a.append("<p>"+t+"</p>")}),e(".ai1wm-feedback").prepend(a)}else{var i=e("<div />").addClass("ai1wm-message ai1wm-success-message").append("<p>Thanks for submitting your feedback!</p>");e(".ai1wm-feedback").html(i)}},dataType:"json",async:!1})})})},{}],8:[function(){jQuery(document).ready(function(e){"use strict";e("#ai1wm-report-problem-button").click(function(t){e(this).next(".ai1wm-report-problem-dialog").toggleClass("ai1wm-report-active"),t.preventDefault()}),e("#ai1wm-report-cancel").click(function(t){e(this).closest(".ai1wm-report-problem-dialog").removeClass("ai1wm-report-active"),t.preventDefault()}),e("#ai1wm-report-submit").click(function(){var t=e(".ai1wm-report-email").val(),o=e(".ai1wm-report-message").val(),a=e(".ai1wm-report-terms").is(":checked");e.ajax({type:"POST",url:ai1wm_report.ajax.url,data:{"ai1wm-email":t,"ai1wm-message":o,"ai1wm-terms":+a},success:function(t){var o=t.errors;if(o.length>0){e(".ai1wm-report-problem-dialog .ai1wm-message").remove();var a=e("<div />").addClass("ai1wm-message ai1wm-error-message");e.each(o,function(e,t){a.append("<p>"+t+"</p>")}),e(".ai1wm-report-problem-dialog").prepend(a)}else{var i=e("<div />").addClass("ai1wm-message ai1wm-success-message").append("<p>Thanks for submitting your request!</p>");e(".ai1wm-report-problem-dialog").html(i),setTimeout(function(){e(".ai1wm-report-problem-dialog").removeClass("ai1wm-report-active")},2e3)}},dataType:"json",async:!1})})})},{}],9:[function(e,t){var o=jQuery;t.exports={random:function(e){for(var t="",o="abcdefghijklmnopqrstuvwxyz0123456789",a=0;e>a;a++)t+=o.charAt(Math.floor(Math.random()*o.length));return t},form:function(e){return o(e).serializeArray()},ucfirst:function(e){return e.charAt(0).toUpperCase()+e.slice(1)}}},{}]},{},[1]);
lib/view/{backup → backups}/index.php RENAMED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -27,8 +27,6 @@
27
  <div class="ai1wm-container">
28
  <div class="ai1wm-row">
29
  <div class="ai1wm-left">
30
- <?php include AI1WM_TEMPLATES_PATH . '/common/maintenance-mode.php'; ?>
31
-
32
  <div class="ai1wm-holder">
33
  <h1><i class="ai1wm-icon-export"></i> <?php _e( 'Backups', AI1WM_PLUGIN_NAME ); ?></h1>
34
 
@@ -76,15 +74,15 @@
76
  <?php echo size_format( $backup['size'], 2 ); ?>
77
  </td>
78
  <td class="ai1wm-column-actions ai1wm-backup-actions">
79
- <a href="<?php echo AI1WM_BACKUPS_URL . '/' . $backup['filename']; ?>" class="ai1wm-button-green ai1wm-button-alone ai1wm-backup-download">
80
  <i class="ai1wm-icon-arrow-down ai1wm-icon-alone"></i>
81
  <span><?php _e( 'Download', AI1WM_PLUGIN_NAME ); ?></span>
82
  </a>
83
- <a href="<?php echo network_admin_url( 'admin.php?page=site-migration-import&restore-file=' . $backup['filename'] ); ?>" class="ai1wm-button-gray ai1wm-button-alone ai1wm-backup-restore">
84
  <i class="ai1wm-icon-cloud-upload ai1wm-icon-alone"></i>
85
  <span><?php _e( 'Restore', AI1WM_PLUGIN_NAME ); ?></span>
86
  </a>
87
- <a href="#" data-delete-file="<?php echo $backup['filename']; ?>" class="ai1wm-button-red ai1wm-button-alone ai1wm-backup-delete">
88
  <i class="ai1wm-icon-close ai1wm-icon-alone"></i>
89
  <span><?php _e( 'Delete', AI1WM_PLUGIN_NAME ); ?></span>
90
  </a>
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
27
  <div class="ai1wm-container">
28
  <div class="ai1wm-row">
29
  <div class="ai1wm-left">
 
 
30
  <div class="ai1wm-holder">
31
  <h1><i class="ai1wm-icon-export"></i> <?php _e( 'Backups', AI1WM_PLUGIN_NAME ); ?></h1>
32
 
74
  <?php echo size_format( $backup['size'], 2 ); ?>
75
  </td>
76
  <td class="ai1wm-column-actions ai1wm-backup-actions">
77
+ <a href="<?php echo ai1wm_backups_url( array( 'archive' => $backup['filename'] ) ); ?>" class="ai1wm-button-green ai1wm-button-alone ai1wm-backup-download">
78
  <i class="ai1wm-icon-arrow-down ai1wm-icon-alone"></i>
79
  <span><?php _e( 'Download', AI1WM_PLUGIN_NAME ); ?></span>
80
  </a>
81
+ <a href="#" data-archive="<?php echo $backup['filename']; ?>" class="ai1wm-button-gray ai1wm-button-alone ai1wm-backup-restore">
82
  <i class="ai1wm-icon-cloud-upload ai1wm-icon-alone"></i>
83
  <span><?php _e( 'Restore', AI1WM_PLUGIN_NAME ); ?></span>
84
  </a>
85
+ <a href="#" data-archive="<?php echo $backup['filename']; ?>" class="ai1wm-button-red ai1wm-button-alone ai1wm-backup-delete">
86
  <i class="ai1wm-icon-close ai1wm-icon-alone"></i>
87
  <span><?php _e( 'Delete', AI1WM_PLUGIN_NAME ); ?></span>
88
  </a>
lib/view/common/maintenance-mode.php CHANGED
@@ -1,11 +0,0 @@
1
- <?php if ( Ai1wm_Maintenance::active() ): ?>
2
- <div class="ai1wm-message-warning">
3
- <?php
4
- _e(
5
- 'Maintenance Mode is <strong>ON</strong>, switch it to ' .
6
- '<a href="#" id="ai1wm-maintenance-off">OFF</a>',
7
- AI1WM_PLUGIN_NAME
8
- );
9
- ?>
10
- </div>
11
- <?php endif; ?>
 
 
 
 
 
 
 
 
 
 
 
lib/view/export/advanced-settings.php CHANGED
@@ -30,11 +30,6 @@
30
  <input type="checkbox" id="ai1wm-no-database" name="options[no-database]" />
31
  <label for="ai1wm-no-database"><?php _e( 'Do <strong>not</strong> export database (sql)', AI1WM_PLUGIN_NAME ); ?></label>
32
  </li>
33
- <li>
34
- <input type="checkbox" id="ai1wm-maintenance-mode" name="options[maintenance-mode]" />
35
- <label for="ai1wm-maintenance-mode"><?php _e( 'Put the site in <strong>maintenance mode</strong> while exporting', AI1WM_PLUGIN_NAME ); ?></label>
36
- </li>
37
  </ul>
38
  </div>
39
  </div>
40
-
30
  <input type="checkbox" id="ai1wm-no-database" name="options[no-database]" />
31
  <label for="ai1wm-no-database"><?php _e( 'Do <strong>not</strong> export database (sql)', AI1WM_PLUGIN_NAME ); ?></label>
32
  </li>
 
 
 
 
33
  </ul>
34
  </div>
35
  </div>
 
lib/view/export/button-onedrive.php ADDED
@@ -0,0 +1 @@
 
1
+ <a href="https://servmask.com/products/onedrive-extension" target="_blank"><?php _e( 'OneDrive', AI1WM_PLUGIN_NAME ); ?></a>
lib/view/export/export-buttons.php CHANGED
@@ -1,36 +1,21 @@
1
  <div class="ai1wm-field-set">
2
- <?php if ( is_readable( AI1WM_STORAGE_PATH ) && is_writable( AI1WM_STORAGE_PATH ) ): ?>
3
- <div class="ai1wm-buttons">
4
- <div class="ai1wm-button-group ai1wm-button-export ai1wm-expandable">
5
- <div class="ai1wm-button-main">
6
- <span><?php _e( 'Export To', AI1WM_PLUGIN_NAME ); ?></span>
7
- <span class="ai1mw-lines">
8
- <span class="ai1wm-line ai1wm-line-first"></span>
9
- <span class="ai1wm-line ai1wm-line-second"></span>
10
- <span class="ai1wm-line ai1wm-line-third"></span>
11
- </span>
12
- </div>
13
- <ul class="ai1wm-dropdown-menu ai1wm-export-providers">
14
- <?php foreach ( apply_filters( 'ai1wm_export_buttons', array() ) as $button ): ?>
15
- <li>
16
- <?php echo $button; ?>
17
- </li>
18
- <?php endforeach; ?>
19
- </ul>
20
  </div>
 
 
 
 
 
 
 
21
  </div>
22
- <?php else: ?>
23
- <div class="ai1wm-message ai1wm-red-message">
24
- <?php
25
- printf(
26
- __(
27
- '<h3>Site could not be exported!</h3>' .
28
- '<p>Please make sure that storage directory <strong>%s</strong> has read and write permissions.</p>',
29
- AI1WM_PLUGIN_NAME
30
- ),
31
- AI1WM_STORAGE_PATH
32
- );
33
- ?>
34
- </div>
35
- <?php endif; ?>
36
  </div>
1
  <div class="ai1wm-field-set">
2
+ <div class="ai1wm-buttons">
3
+ <div class="ai1wm-button-group ai1wm-button-export ai1wm-expandable">
4
+ <div class="ai1wm-button-main">
5
+ <span><?php _e( 'Export To', AI1WM_PLUGIN_NAME ); ?></span>
6
+ <span class="ai1mw-lines">
7
+ <span class="ai1wm-line ai1wm-line-first"></span>
8
+ <span class="ai1wm-line ai1wm-line-second"></span>
9
+ <span class="ai1wm-line ai1wm-line-third"></span>
10
+ </span>
 
 
 
 
 
 
 
 
 
11
  </div>
12
+ <ul class="ai1wm-dropdown-menu ai1wm-export-providers">
13
+ <?php foreach ( apply_filters( 'ai1wm_export_buttons', array() ) as $button ): ?>
14
+ <li>
15
+ <?php echo $button; ?>
16
+ </li>
17
+ <?php endforeach; ?>
18
+ </ul>
19
  </div>
20
+ </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  </div>
lib/view/export/index.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -27,30 +27,13 @@
27
  <div class="ai1wm-container">
28
  <div class="ai1wm-row">
29
  <div class="ai1wm-left">
30
- <?php include AI1WM_TEMPLATES_PATH . '/common/maintenance-mode.php'; ?>
31
-
32
  <div class="ai1wm-holder">
33
- <?php foreach ( apply_filters( 'ai1wm-messages', array() ) as $type => $message ): ?>
34
- <div class="ai1wm-message ai1wm-<?php echo $type; ?>-message">
35
- <?php echo $message; ?>
36
- </div>
37
- <?php endforeach; ?>
38
-
39
  <h1><i class="ai1wm-icon-export"></i> <?php _e( 'Export Site', AI1WM_PLUGIN_NAME ); ?></h1>
40
 
41
  <?php include AI1WM_TEMPLATES_PATH . '/common/report-problem.php'; ?>
42
 
43
  <form action="" method="post" id="ai1wm-export-form" class="ai1wm-clear">
44
 
45
- <?php foreach ( $messages as $key => $text ): ?>
46
- <div class="ai1wm-message ai1wm-info-message">
47
- <a href="#" class="ai1wm-message-close-button" data-key="<?php echo $key; ?>">
48
- <i class="ai1wm-icon-close"></i>
49
- </a>
50
- <?php echo $text; ?>
51
- </div>
52
- <?php endforeach; ?>
53
-
54
  <?php include AI1WM_TEMPLATES_PATH . '/export/find-replace.php'; ?>
55
 
56
  <?php do_action( 'ai1wm_export_left_options' ); ?>
@@ -60,6 +43,7 @@
60
  <?php include AI1WM_TEMPLATES_PATH . '/export/export-buttons.php'; ?>
61
 
62
  <?php do_action( 'ai1wm_export_left_end' ); ?>
 
63
  </form>
64
  </div>
65
  </div>
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
27
  <div class="ai1wm-container">
28
  <div class="ai1wm-row">
29
  <div class="ai1wm-left">
 
 
30
  <div class="ai1wm-holder">
 
 
 
 
 
 
31
  <h1><i class="ai1wm-icon-export"></i> <?php _e( 'Export Site', AI1WM_PLUGIN_NAME ); ?></h1>
32
 
33
  <?php include AI1WM_TEMPLATES_PATH . '/common/report-problem.php'; ?>
34
 
35
  <form action="" method="post" id="ai1wm-export-form" class="ai1wm-clear">
36
 
 
 
 
 
 
 
 
 
 
37
  <?php include AI1WM_TEMPLATES_PATH . '/export/find-replace.php'; ?>
38
 
39
  <?php do_action( 'ai1wm_export_left_options' ); ?>
43
  <?php include AI1WM_TEMPLATES_PATH . '/export/export-buttons.php'; ?>
44
 
45
  <?php do_action( 'ai1wm_export_left_end' ); ?>
46
+
47
  </form>
48
  </div>
49
  </div>
lib/view/import/button-onedrive.php ADDED
@@ -0,0 +1 @@
 
1
+ <a href="https://servmask.com/products/onedrive-extension" target="_blank"><?php _e( 'OneDrive', AI1WM_PLUGIN_NAME ); ?></a>
lib/view/import/index.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -27,8 +27,6 @@
27
  <div class="ai1wm-container">
28
  <div class="ai1wm-row">
29
  <div class="ai1wm-left">
30
- <?php include AI1WM_TEMPLATES_PATH . '/common/maintenance-mode.php'; ?>
31
-
32
  <div class="ai1wm-holder">
33
  <h1><i class="ai1wm-icon-publish"></i> <?php _e( 'Import Site', AI1WM_PLUGIN_NAME ); ?></h1>
34
 
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
27
  <div class="ai1wm-container">
28
  <div class="ai1wm-row">
29
  <div class="ai1wm-left">
 
 
30
  <div class="ai1wm-holder">
31
  <h1><i class="ai1wm-icon-publish"></i> <?php _e( 'Import Site', AI1WM_PLUGIN_NAME ); ?></h1>
32
 
lib/view/main/admin-head.php CHANGED
@@ -48,7 +48,7 @@
48
  color: #fff;
49
  }
50
 
51
- <?php if ( version_compare( $version, '3.8', '<' ) ): ?>
52
  .toplevel_page_site-migration-export > div.wp-menu-image {
53
  background: none !important;
54
  }
@@ -68,7 +68,7 @@
68
  -moz-osx-font-smoothing: grayscale !important;
69
  }
70
 
71
- <?php else: ?>
72
  .toplevel_page_site-migration-export > div.wp-menu-image:before {
73
  position: relative;
74
  display: inline-block;
@@ -89,6 +89,5 @@
89
  .wp-menu-open.toplevel_page_site-migration-export > a {
90
  background-color: #111 !important;
91
  }
92
-
93
  <?php endif; ?>
94
  </style>
48
  color: #fff;
49
  }
50
 
51
+ <?php if ( version_compare( $version, '3.8', '<' ) ) : ?>
52
  .toplevel_page_site-migration-export > div.wp-menu-image {
53
  background: none !important;
54
  }
68
  -moz-osx-font-smoothing: grayscale !important;
69
  }
70
 
71
+ <?php else : ?>
72
  .toplevel_page_site-migration-export > div.wp-menu-image:before {
73
  position: relative;
74
  display: inline-block;
89
  .wp-menu-open.toplevel_page_site-migration-export > a {
90
  background-color: #111 !important;
91
  }
 
92
  <?php endif; ?>
93
  </style>
lib/view/main/backups-notice.php CHANGED
@@ -12,4 +12,4 @@
12
  )
13
  ?>
14
  </p>
15
- </div>
12
  )
13
  ?>
14
  </p>
15
+ </div>
loader.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
@@ -24,16 +24,6 @@
24
  */
25
 
26
  // include all the files that you want to load in here
27
- require_once AI1WM_VENDOR_PATH .
28
- DIRECTORY_SEPARATOR .
29
- 'mysqldump-factory' .
30
- DIRECTORY_SEPARATOR .
31
- 'mysqldump-factory' .
32
- DIRECTORY_SEPARATOR .
33
- 'lib' .
34
- DIRECTORY_SEPARATOR .
35
- 'MysqlDumpFactory.php';
36
-
37
  require_once AI1WM_VENDOR_PATH .
38
  DIRECTORY_SEPARATOR .
39
  'bandar' .
@@ -108,17 +98,49 @@ require_once AI1WM_VENDOR_PATH .
108
  DIRECTORY_SEPARATOR .
109
  'class-ai1wm-extractor.php';
110
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
  require_once AI1WM_CONTROLLER_PATH .
112
  DIRECTORY_SEPARATOR .
113
  'class-ai1wm-main-controller.php';
114
 
115
  require_once AI1WM_CONTROLLER_PATH .
116
  DIRECTORY_SEPARATOR .
117
- 'class-ai1wm-import-controller.php';
118
 
119
  require_once AI1WM_CONTROLLER_PATH .
120
  DIRECTORY_SEPARATOR .
121
- 'class-ai1wm-export-controller.php';
122
 
123
  require_once AI1WM_CONTROLLER_PATH .
124
  DIRECTORY_SEPARATOR .
@@ -126,7 +148,11 @@ require_once AI1WM_CONTROLLER_PATH .
126
 
127
  require_once AI1WM_CONTROLLER_PATH .
128
  DIRECTORY_SEPARATOR .
129
- 'class-ai1wm-backup-controller.php';
 
 
 
 
130
 
131
  require_once AI1WM_CONTROLLER_PATH .
132
  DIRECTORY_SEPARATOR .
@@ -136,57 +162,85 @@ require_once AI1WM_CONTROLLER_PATH .
136
  DIRECTORY_SEPARATOR .
137
  'class-ai1wm-report-controller.php';
138
 
139
- require_once AI1WM_CONTROLLER_PATH .
140
  DIRECTORY_SEPARATOR .
141
- 'class-ai1wm-updater-controller.php';
142
 
143
- require_once AI1WM_CONTROLLER_PATH .
144
  DIRECTORY_SEPARATOR .
145
- 'class-ai1wm-message-controller.php';
146
 
147
- require_once AI1WM_MODEL_PATH .
148
  DIRECTORY_SEPARATOR .
149
- 'class-ai1wm-streams.php';
150
 
151
- require_once AI1WM_MODEL_PATH .
152
  DIRECTORY_SEPARATOR .
153
- 'class-ai1wm-http.php';
154
 
155
- require_once AI1WM_MODEL_PATH .
156
  DIRECTORY_SEPARATOR .
157
- 'class-ai1wm-backup.php';
158
 
159
- require_once AI1WM_MODEL_PATH .
160
  DIRECTORY_SEPARATOR .
161
- 'class-ai1wm-error.php';
162
 
163
- require_once AI1WM_MODEL_PATH .
164
  DIRECTORY_SEPARATOR .
165
- 'class-ai1wm-export-abstract.php';
166
 
167
- require_once AI1WM_MODEL_PATH .
168
  DIRECTORY_SEPARATOR .
169
- 'class-ai1wm-export-file.php';
170
 
171
- require_once AI1WM_MODEL_PATH .
172
  DIRECTORY_SEPARATOR .
173
- 'class-ai1wm-feedback.php';
174
 
175
- require_once AI1WM_MODEL_PATH .
176
  DIRECTORY_SEPARATOR .
177
- 'class-ai1wm-import-abstract.php';
178
 
179
- require_once AI1WM_MODEL_PATH .
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
180
  DIRECTORY_SEPARATOR .
181
- 'class-ai1wm-import-file.php';
 
 
 
 
182
 
183
  require_once AI1WM_MODEL_PATH .
184
  DIRECTORY_SEPARATOR .
185
- 'class-ai1wm-log.php';
186
 
187
  require_once AI1WM_MODEL_PATH .
188
  DIRECTORY_SEPARATOR .
189
- 'class-ai1wm-logger.php';
190
 
191
  require_once AI1WM_MODEL_PATH .
192
  DIRECTORY_SEPARATOR .
@@ -194,47 +248,47 @@ require_once AI1WM_MODEL_PATH .
194
 
195
  require_once AI1WM_MODEL_PATH .
196
  DIRECTORY_SEPARATOR .
197
- 'class-ai1wm-maintenance.php';
198
 
199
  require_once AI1WM_MODEL_PATH .
200
  DIRECTORY_SEPARATOR .
201
- 'class-ai1wm-message.php';
202
 
203
  require_once AI1WM_MODEL_PATH .
204
  DIRECTORY_SEPARATOR .
205
- 'class-ai1wm-report.php';
206
 
207
  require_once AI1WM_MODEL_PATH .
208
  DIRECTORY_SEPARATOR .
209
- 'class-ai1wm-status.php';
210
 
211
  require_once AI1WM_MODEL_PATH .
212
  DIRECTORY_SEPARATOR .
213
- 'class-ai1wm-storage.php';
214
 
215
  require_once AI1WM_MODEL_PATH .
216
  DIRECTORY_SEPARATOR .
217
- 'class-ai1wm-template.php';
218
 
219
- require_once AI1WM_SERVICE_PATH .
220
  DIRECTORY_SEPARATOR .
221
- 'class-ai1wm-service-interface.php';
222
 
223
- require_once AI1WM_SERVICE_PATH .
224
  DIRECTORY_SEPARATOR .
225
- 'class-ai1wm-service-database.php';
226
 
227
- require_once AI1WM_SERVICE_PATH .
228
  DIRECTORY_SEPARATOR .
229
- 'class-ai1wm-service-package.php';
230
 
231
  require_once AI1WM_EXCEPTION_PATH .
232
  DIRECTORY_SEPARATOR .
233
- 'class-ai1wm-http-exception.php';
234
 
235
  require_once AI1WM_EXCEPTION_PATH .
236
  DIRECTORY_SEPARATOR .
237
- 'class-ai1wm-backup-exception.php';
238
 
239
  require_once AI1WM_EXCEPTION_PATH .
240
  DIRECTORY_SEPARATOR .
@@ -244,6 +298,10 @@ require_once AI1WM_EXCEPTION_PATH .
244
  DIRECTORY_SEPARATOR .
245
  'class-ai1wm-import-exception.php';
246
 
 
 
 
 
247
  require_once AI1WM_EXCEPTION_PATH .
248
  DIRECTORY_SEPARATOR .
249
  'class-ai1wm-not-accessible-exception.php';
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
24
  */
25
 
26
  // include all the files that you want to load in here
 
 
 
 
 
 
 
 
 
 
27
  require_once AI1WM_VENDOR_PATH .
28
  DIRECTORY_SEPARATOR .
29
  'bandar' .
98
  DIRECTORY_SEPARATOR .
99
  'class-ai1wm-extractor.php';
100
 
101
+ require_once AI1WM_VENDOR_PATH .
102
+ DIRECTORY_SEPARATOR .
103
+ 'servmask' .
104
+ DIRECTORY_SEPARATOR .
105
+ 'database' .
106
+ DIRECTORY_SEPARATOR .
107
+ 'class-ai1wm-database.php';
108
+
109
+ require_once AI1WM_VENDOR_PATH .
110
+ DIRECTORY_SEPARATOR .
111
+ 'servmask' .
112
+ DIRECTORY_SEPARATOR .
113
+ 'database' .
114
+ DIRECTORY_SEPARATOR .
115
+ 'class-ai1wm-database-mysql.php';
116
+
117
+ require_once AI1WM_VENDOR_PATH .
118
+ DIRECTORY_SEPARATOR .
119
+ 'servmask' .
120
+ DIRECTORY_SEPARATOR .
121
+ 'database' .
122
+ DIRECTORY_SEPARATOR .
123
+ 'class-ai1wm-database-mysqli.php';
124
+
125
+ require_once AI1WM_VENDOR_PATH .
126
+ DIRECTORY_SEPARATOR .
127
+ 'servmask' .
128
+ DIRECTORY_SEPARATOR .
129
+ 'database' .
130
+ DIRECTORY_SEPARATOR .
131
+ 'class-ai1wm-database-utility.php';
132
+
133
  require_once AI1WM_CONTROLLER_PATH .
134
  DIRECTORY_SEPARATOR .
135
  'class-ai1wm-main-controller.php';
136
 
137
  require_once AI1WM_CONTROLLER_PATH .
138
  DIRECTORY_SEPARATOR .
139
+ 'class-ai1wm-export-controller.php';
140
 
141
  require_once AI1WM_CONTROLLER_PATH .
142
  DIRECTORY_SEPARATOR .
143
+ 'class-ai1wm-import-controller.php';
144
 
145
  require_once AI1WM_CONTROLLER_PATH .
146
  DIRECTORY_SEPARATOR .
148
 
149
  require_once AI1WM_CONTROLLER_PATH .
150
  DIRECTORY_SEPARATOR .
151
+ 'class-ai1wm-backups-controller.php';
152
+
153
+ require_once AI1WM_CONTROLLER_PATH .
154
+ DIRECTORY_SEPARATOR .
155
+ 'class-ai1wm-updater-controller.php';
156
 
157
  require_once AI1WM_CONTROLLER_PATH .
158
  DIRECTORY_SEPARATOR .
162
  DIRECTORY_SEPARATOR .
163
  'class-ai1wm-report-controller.php';
164
 
165
+ require_once AI1WM_EXPORT_PATH .
166
  DIRECTORY_SEPARATOR .
167
+ 'class-ai1wm-export-resolve.php';
168
 
169
+ require_once AI1WM_EXPORT_PATH .
170
  DIRECTORY_SEPARATOR .
171
+ 'class-ai1wm-export-archive.php';
172
 
173
+ require_once AI1WM_EXPORT_PATH .
174
  DIRECTORY_SEPARATOR .
175
+ 'class-ai1wm-export-config.php';
176
 
177
+ require_once AI1WM_EXPORT_PATH .
178
  DIRECTORY_SEPARATOR .
179
+ 'class-ai1wm-export-enumerate.php';
180
 
181
+ require_once AI1WM_EXPORT_PATH .
182
  DIRECTORY_SEPARATOR .
183
+ 'class-ai1wm-export-content.php';
184
 
185
+ require_once AI1WM_EXPORT_PATH .
186
  DIRECTORY_SEPARATOR .
187
+ 'class-ai1wm-export-database.php';
188
 
189
+ require_once AI1WM_EXPORT_PATH .
190
  DIRECTORY_SEPARATOR .
191
+ 'class-ai1wm-export-download.php';
192
 
193
+ require_once AI1WM_EXPORT_PATH .
194
  DIRECTORY_SEPARATOR .
195
+ 'class-ai1wm-export-clean.php';
196
 
197
+ require_once AI1WM_IMPORT_PATH .
198
  DIRECTORY_SEPARATOR .
199
+ 'class-ai1wm-import-upload.php';
200
 
201
+ require_once AI1WM_IMPORT_PATH .
202
  DIRECTORY_SEPARATOR .
203
+ 'class-ai1wm-import-resolve.php';
204
 
205
+ require_once AI1WM_IMPORT_PATH .
206
+ DIRECTORY_SEPARATOR .
207
+ 'class-ai1wm-import-validate.php';
208
+
209
+ require_once AI1WM_IMPORT_PATH .
210
+ DIRECTORY_SEPARATOR .
211
+ 'class-ai1wm-import-blogs.php';
212
+
213
+ require_once AI1WM_IMPORT_PATH .
214
+ DIRECTORY_SEPARATOR .
215
+ 'class-ai1wm-import-confirm.php';
216
+
217
+ require_once AI1WM_IMPORT_PATH .
218
+ DIRECTORY_SEPARATOR .
219
+ 'class-ai1wm-import-enumerate.php';
220
+
221
+ require_once AI1WM_IMPORT_PATH .
222
+ DIRECTORY_SEPARATOR .
223
+ 'class-ai1wm-import-content.php';
224
+
225
+ require_once AI1WM_IMPORT_PATH .
226
+ DIRECTORY_SEPARATOR .
227
+ 'class-ai1wm-import-database.php';
228
+
229
+ require_once AI1WM_IMPORT_PATH .
230
  DIRECTORY_SEPARATOR .
231
+ 'class-ai1wm-import-done.php';
232
+
233
+ require_once AI1WM_IMPORT_PATH .
234
+ DIRECTORY_SEPARATOR .
235
+ 'class-ai1wm-import-clean.php';
236
 
237
  require_once AI1WM_MODEL_PATH .
238
  DIRECTORY_SEPARATOR .
239
+ 'class-ai1wm-deprecated.php';
240
 
241
  require_once AI1WM_MODEL_PATH .
242
  DIRECTORY_SEPARATOR .
243
+ 'class-ai1wm-backups.php';
244
 
245
  require_once AI1WM_MODEL_PATH .
246
  DIRECTORY_SEPARATOR .
248
 
249
  require_once AI1WM_MODEL_PATH .
250
  DIRECTORY_SEPARATOR .
251
+ 'class-ai1wm-feedback.php';
252
 
253
  require_once AI1WM_MODEL_PATH .
254
  DIRECTORY_SEPARATOR .
255
+ 'class-ai1wm-report.php';
256
 
257
  require_once AI1WM_MODEL_PATH .
258
  DIRECTORY_SEPARATOR .
259
+ 'class-ai1wm-template.php';
260
 
261
  require_once AI1WM_MODEL_PATH .
262
  DIRECTORY_SEPARATOR .
263
+ 'class-ai1wm-config.php';
264
 
265
  require_once AI1WM_MODEL_PATH .
266
  DIRECTORY_SEPARATOR .
267
+ 'class-ai1wm-status.php';
268
 
269
  require_once AI1WM_MODEL_PATH .
270
  DIRECTORY_SEPARATOR .
271
+ 'class-ai1wm-http.php';
272
 
273
+ require_once AI1WM_MODEL_PATH .
274
  DIRECTORY_SEPARATOR .
275
+ 'class-ai1wm-handler.php';
276
 
277
+ require_once AI1WM_MODEL_PATH .
278
  DIRECTORY_SEPARATOR .
279
+ 'class-ai1wm-streams.php';
280
 
281
+ require_once AI1WM_MODEL_PATH .
282
  DIRECTORY_SEPARATOR .
283
+ 'class-ai1wm-log.php';
284
 
285
  require_once AI1WM_EXCEPTION_PATH .
286
  DIRECTORY_SEPARATOR .
287
+ 'class-ai1wm-archive-exception.php';
288
 
289
  require_once AI1WM_EXCEPTION_PATH .
290
  DIRECTORY_SEPARATOR .
291
+ 'class-ai1wm-backups-exception.php';
292
 
293
  require_once AI1WM_EXCEPTION_PATH .
294
  DIRECTORY_SEPARATOR .
298
  DIRECTORY_SEPARATOR .
299
  'class-ai1wm-import-exception.php';
300
 
301
+ require_once AI1WM_EXCEPTION_PATH .
302
+ DIRECTORY_SEPARATOR .
303
+ 'class-ai1wm-http-exception.php';
304
+
305
  require_once AI1WM_EXCEPTION_PATH .
306
  DIRECTORY_SEPARATOR .
307
  'class-ai1wm-not-accessible-exception.php';
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: yani.iliev, bangelov, pimjitsawang
3
  Tags: db migration, migration, wordpress migration, db backup, db restore, website backup, website restore, website migration, website deploy, wordpress deploy, db backup, database export, database serialization, database find replace
4
  Requires at least: 3.3
5
  Tested up to: 4.4
6
- Stable tag: 4.19
7
  License: GPLv2 or later
8
 
9
  All-in-One WP Migration is the only tool that you will ever need to migrate a WordPress site.
@@ -25,7 +25,7 @@ All in One WP Plugin is the first plugin to offer true mobile experience on Word
25
  = 0 Dependencies =
26
  * The plugin does not require any php extensions and can work with PHP v5.2.
27
 
28
- = Support for MySQL, PDO, MySQLi =
29
  * No matter what php mysql driver your webserver ships with, we support it.
30
 
31
  = Support WordPress v3.3 up to v4.x =
@@ -62,7 +62,6 @@ All in One WP Plugin is the first plugin to offer true mobile experience on Word
62
  * [Find out more about us](https://servmask.com)
63
 
64
  [youtube http://www.youtube.com/watch?v=BpWxCeUWBOk]
65
- [youtube http://www.youtube.com/watch?v=mRp7qTFYKgs]
66
 
67
  == Installation ==
68
  1. Upload the `all-in-one-wp-migration` folder to the `/wp-content/plugins/` directory
@@ -75,6 +74,12 @@ All in One WP Plugin is the first plugin to offer true mobile experience on Word
75
  3. Plugin Menu
76
 
77
  == Changelog ==
 
 
 
 
 
 
78
  = 4.19 =
79
  * Fixed an issue with options cache
80
 
3
  Tags: db migration, migration, wordpress migration, db backup, db restore, website backup, website restore, website migration, website deploy, wordpress deploy, db backup, database export, database serialization, database find replace
4
  Requires at least: 3.3
5
  Tested up to: 4.4
6
+ Stable tag: 5.35
7
  License: GPLv2 or later
8
 
9
  All-in-One WP Migration is the only tool that you will ever need to migrate a WordPress site.
25
  = 0 Dependencies =
26
  * The plugin does not require any php extensions and can work with PHP v5.2.
27
 
28
+ = Support for MySQL and MySQLi =
29
  * No matter what php mysql driver your webserver ships with, we support it.
30
 
31
  = Support WordPress v3.3 up to v4.x =
62
  * [Find out more about us](https://servmask.com)
63
 
64
  [youtube http://www.youtube.com/watch?v=BpWxCeUWBOk]
 
65
 
66
  == Installation ==
67
  1. Upload the `all-in-one-wp-migration` folder to the `/wp-content/plugins/` directory
74
  3. Plugin Menu
75
 
76
  == Changelog ==
77
+ = 5.35 =
78
+ * Add OneDrive to export/import pages
79
+ * Fix a bug when WordPress was used without a db prefix
80
+ * Fix a problem when downloading wpress files
81
+ * Improve the log system
82
+
83
  = 4.19 =
84
  * Fixed an issue with options cache
85
 
uninstall.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Copyright (C) 2014 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by
1
  <?php
2
  /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
  *
5
  * This program is free software: you can redistribute it and/or modify
6
  * it under the terms of the GNU General Public License as published by