ManageWP Worker - Version 4.0.1

Version Description

= 3.9.30 = Worker plugin is now fully compatible with WordPress 4.0, adding websites is now easier and we have made fixes and improvements in Backup and Clone tools

= 3.9.29 = Worker plugin is 36% faster and uses 83% less memory. Backup tool no longer relies on WordPress cron

= 3.9.28 = It is now possible to control WordPress automatic background updates for plugins and themes!

= 3.9.27 = We have added compatibility with Better WP Security. Also, it is now possible to backup and clone to SFTP

Download this release

Release Info

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

Code changes from version 3.9.30 to 4.0.1

Files changed (152) hide show
  1. functions.php +1482 -576
  2. init.php +252 -2071
  3. publickeys/managewp.pub +9 -9
  4. publickeys/managewp_d.pub +9 -9
  5. publickeys/{ManageWP_mt.pub → managewp_mt.pub} +9 -9
  6. publickeys/managewp_t.pub +9 -9
  7. publickeys/partner1.pub +9 -9
  8. publickeys/partner10.pub +9 -9
  9. publickeys/partner11.pub +9 -9
  10. publickeys/partner12.pub +9 -9
  11. publickeys/partner13.pub +9 -9
  12. publickeys/partner14.pub +9 -9
  13. publickeys/partner15.pub +9 -9
  14. publickeys/partner16.pub +9 -9
  15. publickeys/partner17.pub +9 -9
  16. publickeys/partner2.pub +9 -9
  17. publickeys/partner3.pub +9 -9
  18. publickeys/partner4.pub +8 -8
  19. publickeys/partner5.pub +9 -9
  20. publickeys/partner6.pub +9 -9
  21. publickeys/partner7.pub +9 -9
  22. publickeys/partner8.pub +9 -9
  23. publickeys/partner9.pub +9 -9
  24. readme.txt +385 -380
  25. src/Dropbox/certs/trusted-certs.crt +1395 -1395
  26. src/Google/Auth/OAuth2.php +1 -0
  27. src/Google/IO/cacerts.pem +738 -738
  28. src/LICENSE +360 -360
  29. src/MMB/Backup.php +244 -462
  30. src/MMB/Core.php +117 -484
  31. src/MMB/Helper.php +16 -117
  32. src/MMB/Installer.php +4 -5
  33. src/MMB/Link.php +0 -172
  34. src/MMB/Post.php +0 -1
  35. src/MMB/Security.php +0 -384
  36. src/MMB/Stats.php +99 -255
  37. src/MMB/Updater.php +10 -10
  38. src/MMB/Widget.php +0 -44
  39. src/MMB/img/mwp.png +0 -0
  40. src/MWP/Action/Abstract.php +23 -0
  41. src/MWP/Action/ConnectWebsite.php +56 -0
  42. src/MWP/Action/Definition.php +72 -0
  43. src/MWP/Action/Exception.php +13 -0
  44. src/MWP/Action/GetState.php +280 -0
  45. src/MWP/Action/Registry.php +39 -0
  46. src/MWP/Backup/ArrayHelper.php +8 -0
  47. src/MWP/Backup/Buffer/File.php +8 -0
  48. src/MWP/Backup/Database.php +8 -0
  49. src/MWP/Backup/Exception.php +8 -0
  50. src/MWP/Backup/MysqlDump/DumpFactory.php +8 -0
  51. src/MWP/Backup/MysqlDump/MysqlDump.php +8 -0
  52. src/MWP/Backup/MysqlDump/QuerySequenceDump.php +8 -0
  53. src/MWP/Backup/MysqlDump/ShellDump.php +8 -0
  54. src/MWP/Backup/Writer/GzipWriter.php +8 -0
  55. src/MWP/Backup/Writer/PlainWriter.php +8 -0
  56. src/MWP/Backup/Writer/WriterFactory.php +8 -0
  57. src/MWP/Backup/Writer/WriterInterface.php +8 -0
  58. src/MWP/Crypter/Factory.php +31 -0
  59. src/MWP/Crypter/Interface.php +36 -0
  60. src/MWP/Crypter/OpenSslCrypter.php +58 -0
  61. src/MWP/Crypter/PhpSecLibCrypter.php +62 -0
  62. src/MWP/Debug/ErrorCatcher.php +21 -2
  63. src/MWP/Debug/EvalErrorHandler.php +32 -0
  64. src/MWP/Debug/FatalErrorException.php +22 -0
  65. src/MWP/Event/AbstractRequest.php +67 -0
  66. src/MWP/Event/ActionException.php +78 -0
  67. src/MWP/Event/ActionRequest.php +53 -0
  68. src/MWP/Event/ActionResponse.php +79 -0
  69. src/MWP/Event/Events.php +58 -0
  70. src/MWP/Event/MasterRequest.php +35 -0
  71. src/MWP/Event/MasterResponse.php +41 -0
  72. src/MWP/Event/PublicRequest.php +13 -0
  73. src/MWP/EventListener/ActionException/SetExceptionData.php +57 -0
  74. src/MWP/EventListener/ActionRequest/SetSettings.php +49 -0
  75. src/MWP/EventListener/ActionResponse/ChainState.php +43 -0
  76. src/MWP/EventListener/ActionResponse/SetActionData.php +24 -0
  77. src/MWP/EventListener/ActionResponse/SetLegacyPhpExecutionData.php +51 -0
  78. src/MWP/EventListener/ActionResponse/SetLegacyWebsiteConnectionData.php +55 -0
  79. src/MWP/EventListener/EncodeMasterResponse.php +39 -0
  80. src/MWP/EventListener/MasterRequest/AttachJsonMessageHandler.php +43 -0
  81. src/MWP/EventListener/MasterRequest/AuthenticateLegacyRequest.php +69 -0
  82. src/MWP/EventListener/MasterRequest/AuthenticateRequest.php +66 -0
  83. src/MWP/EventListener/MasterRequest/RemoveUsernameParam.php +35 -0
  84. src/MWP/EventListener/MasterRequest/SetCurrentUser.php +64 -0
  85. src/MWP/EventListener/MasterRequest/SetErrorHandler.php +177 -0
  86. src/MWP/EventListener/MasterRequest/VerifyConnectionInfo.php +73 -0
  87. src/MWP/EventListener/MasterRequest/VerifyNonce.php +48 -0
  88. src/MWP/EventListener/PublicRequest/AutomaticLogin.php +145 -0
  89. src/MWP/EventListener/PublicRequest/BrandContactSupport.php +222 -0
  90. src/MWP/EventListener/PublicRequest/DisableEditor.php +43 -0
  91. src/MWP/EventListener/PublicRequest/SetHitCounter.php +106 -0
  92. src/MWP/EventListener/PublicRequest/SetPluginInfo.php +144 -0
  93. src/MWP/Extension/HitCounter.php +76 -0
  94. src/MWP/Http/JsonResponse.php +23 -0
  95. src/MWP/Http/LegacyWorkerResponse.php +20 -0
  96. src/MWP/Http/RedirectResponse.php +34 -0
  97. src/MWP/Http/Response.php +66 -0
  98. src/MWP/Http/ResponseInterface.php +34 -0
  99. src/MWP/Monolog/Handler/JsonMessageHandler.php +49 -0
  100. src/MWP/Monolog/Processor/ExceptionProcessor.php +8 -0
  101. src/MWP/Monolog/Processor/ProcessProcessor.php +8 -0
  102. src/MWP/Monolog/Processor/TimeUsageProcessor.php +8 -0
  103. src/MWP/Parser/DefinitionTokenizer.php +8 -0
  104. src/MWP/Progress/Abstract.php +8 -0
  105. src/MWP/Progress/CurlCallbackInterface.php +8 -0
  106. src/MWP/Progress/Download.php +8 -0
  107. src/MWP/Progress/Upload.php +8 -0
  108. src/MWP/Security/Exception/NonceAlreadyUsed.php +14 -0
  109. src/MWP/Security/Exception/NonceExpired.php +14 -0
  110. src/MWP/Security/Exception/NonceFormatInvalid.php +14 -0
  111. src/MWP/Security/HashNonce.php +8 -0
  112. src/MWP/Security/NonceInterface.php +8 -0
  113. src/MWP/Security/NonceManager.php +72 -0
  114. src/MWP/ServiceContainer/Abstract.php +490 -0
  115. src/MWP/ServiceContainer/ContainerAwareInterface.php +14 -0
  116. src/MWP/ServiceContainer/Interface.php +141 -0
  117. src/MWP/ServiceContainer/Production.php +293 -0
  118. src/MWP/Signer/Factory.php +31 -0
  119. src/MWP/Signer/Interface.php +21 -0
  120. src/MWP/Signer/OpenSslSigner.php +54 -0
  121. src/MWP/Signer/PhpSecLibSigner.php +37 -0
  122. src/MWP/Updater/AutoUpdateManager.php +62 -0
  123. src/MWP/Updater/CoreUpdate.php +24 -0
  124. src/MWP/Updater/PluginUpdate.php +45 -0
  125. src/MWP/Updater/ThemeUpdate.php +34 -0
  126. src/MWP/Updater/UpdateManager.php +168 -0
  127. src/MWP/WordPress/Context.php +674 -0
  128. src/MWP/WordPress/HookProxy.php +47 -0
  129. src/MWP/WordPress/Provider/Interface.php +14 -0
  130. src/MWP/WordPress/Provider/Plugin.php +118 -0
  131. src/MWP/WordPress/Provider/Theme.php +92 -0
  132. src/MWP/WordPress/Query/Abstract.php +41 -0
  133. src/MWP/WordPress/Query/Comment.php +28 -0
  134. src/MWP/WordPress/Query/Interface.php +19 -0
  135. src/MWP/WordPress/Query/Post.php +59 -0
  136. src/MWP/WordPress/Query/User.php +28 -0
  137. src/MWP/Worker/ActionResponse.php +28 -0
  138. src/MWP/Worker/Brand.php +210 -0
  139. src/MWP/Worker/Configuration.php +60 -0
  140. src/MWP/Worker/Exception.php +87 -0
  141. src/MWP/Worker/Installer.php +140 -0
  142. src/MWP/Worker/Kernel.php +203 -0
  143. src/MWP/Worker/Request.php +332 -0
  144. src/MWP/Worker/RequestStack.php +89 -0
  145. src/MWP/Worker/ResponseCallback.php +34 -0
  146. src/Monolog/ErrorHandler.php +3 -5
  147. src/PHPSecLib/openssl.cnf +6 -6
  148. src/Symfony/EventDispatcher/Event.php +62 -0
  149. src/Symfony/EventDispatcher/EventDispatcher.php +177 -0
  150. src/Symfony/EventDispatcher/EventDispatcherInterface.php +94 -0
  151. src/Symfony/EventDispatcher/EventSubscriberInterface.php +48 -0
  152. version +2 -2
functions.php CHANGED
@@ -1,576 +1,1482 @@
1
- <?php
2
-
3
- function mwp_autoload($class)
4
- {
5
- if (substr($class, 0, 8) === 'Dropbox_'
6
- || substr($class, 0, 8) === 'Symfony_'
7
- || substr($class, 0, 8) === 'Monolog_'
8
- || substr($class, 0, 5) === 'Gelf_'
9
- || substr($class, 0, 4) === 'MWP_'
10
- || substr($class, 0, 4) === 'MMB_'
11
- || substr($class, 0, 3) === 'S3_'
12
- ) {
13
- $file = dirname(__FILE__).'/src/'.str_replace('_', '/', $class).'.php';
14
- if (file_exists($file)) {
15
- include_once $file;
16
- }
17
- }
18
- }
19
-
20
- function mwp_register_autoload_google()
21
- {
22
- static $registered;
23
-
24
- if ($registered) {
25
- return;
26
- } else {
27
- $registered = true;
28
- }
29
-
30
- if (version_compare(PHP_VERSION, '5.3', '<')) {
31
- spl_autoload_register('mwp_autoload_google');
32
- } else {
33
- spl_autoload_register('mwp_autoload_google', true, true);
34
- }
35
- }
36
-
37
- function mwp_autoload_google($class)
38
- {
39
- if (substr($class, 0, 7) === 'Google_') {
40
- $file = dirname(__FILE__).'/src/'.str_replace('_', '/', $class).'.php';
41
- if (file_exists($file)) {
42
- include_once $file;
43
- }
44
- }
45
- }
46
-
47
- function mwp_container()
48
- {
49
- static $container;
50
-
51
- if ($container === null) {
52
- $parameters = get_option('mwp_container_parameters', array());
53
- $container = new MMB_Container($parameters);
54
- }
55
-
56
- return $container;
57
- }
58
-
59
- /**
60
- * @return Monolog_Psr_LoggerInterface
61
- */
62
- function mwp_logger()
63
- {
64
- static $mwp_logger;
65
- if (!get_option('mwp_debug_enable', false)) {
66
- if ($mwp_logger === null) {
67
- $mwp_logger = new Monolog_Logger('worker', array(new Monolog_Handler_NullHandler()));
68
- }
69
-
70
- return $mwp_logger;
71
- }
72
- if ($mwp_logger instanceof Monolog_Logger) {
73
- return $mwp_logger;
74
- }
75
- if ($mwp_logger === null) {
76
- $mwp_logger = true;
77
- $logger = mwp_container()->getLogger();
78
- Monolog_Registry::addLogger($logger, 'worker');
79
-
80
- $errorHandler = new Monolog_ErrorHandler($logger);
81
- $errorHandler->registerErrorHandler();
82
- $errorHandler->registerExceptionHandler();
83
- $errorHandler->registerFatalHandler(null, 1024);
84
- }
85
-
86
- return Monolog_Registry::getInstance('worker');
87
- }
88
-
89
- /**
90
- * @param $appKey
91
- * @param $appSecret
92
- * @param $token
93
- * @param $tokenSecret
94
- *
95
- * @return Dropbox_Client
96
- */
97
- function mwp_dropbox_oauth_factory($appKey, $appSecret, $token, $tokenSecret = null)
98
- {
99
- if ($tokenSecret) {
100
- $oauthToken = 'OAuth oauth_version="1.0", oauth_signature_method="PLAINTEXT", oauth_consumer_key="'.$appKey.'", oauth_token="'.$token.'", oauth_signature="'.$appSecret.'&'.$tokenSecret.'"';
101
- $clientIdentifier = $token;
102
- } else {
103
- $oauthToken = 'Bearer '.$token;
104
- $clientIdentifier = 'PHP-ManageWp/1.0';
105
- }
106
-
107
- return new Dropbox_Client($oauthToken, $clientIdentifier);
108
- }
109
-
110
- function mwp_format_memory_limit($limit)
111
- {
112
- if ((string) (int) $limit === (string) $limit) {
113
- // The number is numeric.
114
- return mwp_format_bytes($limit);
115
- }
116
-
117
- $units = strtolower(substr($limit, -1));
118
-
119
- if (!in_array($units, array('b', 'k', 'm', 'g'))) {
120
- // Invalid size unit.
121
- return $limit;
122
- }
123
-
124
- $number = substr($limit, 0, -1);
125
-
126
- if ((string) (int) $number !== $number) {
127
- // The number isn't numeric.
128
- return $number;
129
- }
130
-
131
- switch ($units) {
132
- case 'g':
133
- return $number.' GB';
134
- case 'm':
135
- return $number.' MB';
136
- case 'k':
137
- return $number.' KB';
138
- case 'b':
139
- default:
140
- return $number.' B';
141
- }
142
- }
143
-
144
-
145
- function mwp_format_bytes($bytes)
146
- {
147
- $bytes = (int) $bytes;
148
-
149
- if ($bytes > 1024 * 1024 * 1024) {
150
- return round($bytes / 1024 / 1024 / 1024, 2).' GB';
151
- } elseif ($bytes > 1024 * 1024) {
152
- return round($bytes / 1024 / 1024, 2).' MB';
153
- } elseif ($bytes > 1024) {
154
- return round($bytes / 1024, 2).' KB';
155
- }
156
-
157
- return $bytes.' B';
158
- }
159
-
160
- function mwp_log_warnings()
161
- {
162
- // If mbstring.func_overload is set, it changes the behavior of the standard string functions in
163
- // ways that makes external libraries like Dropbox break.
164
- $mbstring_func_overload = ini_get("mbstring.func_overload");
165
- if ($mbstring_func_overload & 2 == 2) {
166
- mwp_logger()->warning('"mbstring.func_overload" changes the behavior of the standard string functions in ways that makes external libraries like Dropbox break');
167
- }
168
-
169
- if (strlen((string) PHP_INT_MAX) < 19) {
170
- // Looks like we're running on a 32-bit build of PHP. This could cause problems because some of the numbers
171
- // we use (file sizes, quota, etc) can be larger than 32-bit ints can handle.
172
- mwp_logger()->warning("Some external libraries rely on 64-bit integers, but it looks like we're running on a version of PHP that doesn't support 64-bit integers (PHP_INT_MAX=".((string) PHP_INT_MAX).").");
173
- }
174
- }
175
-
176
- function search_posts_by_term($params = false)
177
- {
178
-
179
- global $wpdb, $current_user;
180
-
181
- $search_type = trim($params['search_type']);
182
- $search_term = strtolower(trim($params['search_term']));
183
- switch ($search_type) {
184
- case 'page_post':
185
- $num_posts = 10;
186
- $num_content_char = 30;
187
-
188
- $term_orig = trim($params['search_term']);
189
-
190
- $term_base = addslashes(trim($params['search_term']));
191
-
192
- $query = "SELECT *
193
- FROM $wpdb->posts
194
- WHERE $wpdb->posts.post_status = 'publish'
195
- AND ($wpdb->posts.post_title LIKE '%$term_base%'
196
- OR $wpdb->posts.post_content LIKE '%$term_base%')
197
- ORDER BY $wpdb->posts.post_modified DESC
198
- LIMIT 0, $num_posts
199
- ";
200
-
201
- $posts_array = $wpdb->get_results($query);
202
-
203
- $ret_posts = array();
204
-
205
- foreach ($posts_array as $post) {
206
- //highlight searched term
207
-
208
- if (substr_count(strtolower($post->post_title), strtolower($term_orig))) {
209
- $str_position_start = strpos(strtolower($post->post_title), strtolower($term_orig));
210
-
211
- $post->post_title = substr($post->post_title, 0, $str_position_start).'<b>'.
212
- substr($post->post_title, $str_position_start, strlen($term_orig)).'</b>'.
213
- substr($post->post_title, $str_position_start + strlen($term_orig));
214
-
215
- }
216
- $post->post_content = html_entity_decode($post->post_content);
217
-
218
- $post->post_content = strip_tags($post->post_content);
219
-
220
-
221
- if (substr_count(strtolower($post->post_content), strtolower($term_orig))) {
222
- $str_position_start = strpos(strtolower($post->post_content), strtolower($term_orig));
223
-
224
- $start = $str_position_start > $num_content_char ? $str_position_start - $num_content_char : 0;
225
- $first_len = $str_position_start > $num_content_char ? $num_content_char : $str_position_start;
226
-
227
- $start_substring = $start > 0 ? '...' : '';
228
- $post->post_content = $start_substring.substr($post->post_content, $start, $first_len).'<b>'.
229
- substr($post->post_content, $str_position_start, strlen($term_orig)).'</b>'.
230
- substr($post->post_content, $str_position_start + strlen($term_orig), $num_content_char).'...';
231
-
232
-
233
- } else {
234
- $post->post_content = substr($post->post_content, 0, 50).'...';
235
- }
236
-
237
- $ret_posts[] = array(
238
- 'ID' => $post->ID,
239
- 'post_permalink' => get_permalink($post->ID),
240
- 'post_date' => $post->post_date,
241
- 'post_title' => $post->post_title,
242
- 'post_content' => $post->post_content,
243
- 'post_modified' => $post->post_modified,
244
- 'comment_count' => $post->comment_count,
245
- );
246
- }
247
- mmb_response($ret_posts, true);
248
- break;
249
-
250
- case 'plugin':
251
- $plugins = get_option('active_plugins');
252
-
253
- if (!function_exists('get_plugin_data')) {
254
- include_once(ABSPATH.'/wp-admin/includes/plugin.php');
255
- }
256
-
257
- $have_plugin = array();
258
- foreach ($plugins as $plugin) {
259
- $pl = WP_PLUGIN_DIR.'/'.$plugin;
260
- $pl_extended = get_plugin_data($pl);
261
- $pl_name = $pl_extended['Name'];
262
- if (strpos(strtolower($pl_name), $search_term) > -1) {
263
-
264
- $have_plugin[] = $pl_name;
265
- }
266
- }
267
- if ($have_plugin) {
268
- mmb_response($have_plugin, true);
269
- } else {
270
- mmb_response('Not found', false);
271
- }
272
- break;
273
- case 'theme':
274
- $theme = strtolower(get_option('stylesheet'));
275
- $tm = ABSPATH.'wp-content/themes/'.$theme.'/style.css';
276
- $tm_extended = get_theme_data($tm);
277
- $tm_name = $tm_extended['Name'];
278
- $have_theme = array();
279
- if (strpos(strtolower($tm_name), $search_term) > -1) {
280
- $have_theme[] = $tm_name;
281
- mmb_response($have_theme, true);
282
- } else {
283
- mmb_response('Not found', false);
284
- }
285
- break;
286
- default:
287
- mmb_response('Not found', false);
288
- }
289
- }
290
-
291
- function mmb_add_action($action = false, $callback = false)
292
- {
293
- if (!$action || !$callback) {
294
- return;
295
- }
296
-
297
- global $mmb_actions;
298
-
299
- if (!is_callable($callback)) {
300
- wp_die('The provided argument is not a valid callback');
301
- }
302
-
303
- if (isset($mmb_actions[$action])) {
304
- wp_die('Cannot redeclare ManageWP action "'.$action.'".');
305
- }
306
-
307
- $mmb_actions[$action] = $callback;
308
- }
309
-
310
- function mmb_get_extended_info($stats)
311
- {
312
- $params = get_option('mmb_stats_filter');
313
- $filter = isset($params['plugins']['cleanup']) ? $params['plugins']['cleanup'] : array();
314
- $stats['num_revisions'] = mmb_num_revisions($filter['revisions']);
315
- //$stats['num_revisions'] = 5;
316
- $stats['overhead'] = mmb_handle_overhead(false);
317
- $stats['num_spam_comments'] = mmb_num_spam_comments();
318
-
319
- return $stats;
320
- }
321
-
322
- /* Revisions */
323
- function cleanup_delete_worker($params = array())
324
- {
325
- $revision_params = get_option('mmb_stats_filter');
326
- $revision_filter = isset($revision_params['plugins']['cleanup']) ? $revision_params['plugins']['cleanup'] : array();
327
-
328
- $params_array = explode('_', $params['actions']);
329
- $return_array = array();
330
-
331
- foreach ($params_array as $param) {
332
- switch ($param) {
333
- case 'revision':
334
- if (mmb_delete_all_revisions($revision_filter['revisions'])) {
335
- $return_array['revision'] = 'OK';
336
- } else {
337
- $return_array['revision_error'] = 'OK, nothing to do';
338
- }
339
- break;
340
- case 'overhead':
341
- if (mmb_handle_overhead(true)) {
342
- $return_array['overhead'] = 'OK';
343
- } else {
344
- $return_array['overhead_error'] = 'OK, nothing to do';
345
- }
346
- break;
347
- case 'comment':
348
- if (mmb_delete_spam_comments()) {
349
- $return_array['comment'] = 'OK';
350
- } else {
351
- $return_array['comment_error'] = 'OK, nothing to do';
352
- }
353
- break;
354
- default:
355
- break;
356
- }
357
-
358
- }
359
-
360
- unset($params);
361
-
362
- mmb_response($return_array, true);
363
- }
364
-
365
- function mmb_num_revisions($filter)
366
- {
367
- global $wpdb;
368
-
369
- $allRevisions = $wpdb->get_results("SELECT ID, post_name FROM {$wpdb->posts} WHERE post_type = 'revision'", ARRAY_A);
370
-
371
- $revisionsToDelete = 0;
372
- $revisionsToKeepCount = array();
373
-
374
- if (isset($filter['num_to_keep']) && !empty($filter['num_to_keep'])) {
375
- $num_rev = str_replace("r_", "", $filter['num_to_keep']);
376
-
377
- foreach ($allRevisions as $revision) {
378
- $revisionsToKeepCount[$revision['post_name']] = isset($revisionsToKeepCount[$revision['post_name']])
379
- ? $revisionsToKeepCount[$revision['post_name']] + 1
380
- : 1;
381
-
382
- if ($revisionsToKeepCount[$revision['post_name']] > $num_rev) {
383
- ++$revisionsToDelete;
384
- }
385
- }
386
- } else {
387
- $revisionsToDelete = count($allRevisions);
388
- }
389
-
390
- return $revisionsToDelete;
391
- }
392
-
393
- function mmb_select_all_revisions()
394
- {
395
- global $wpdb;
396
- $sql = "SELECT * FROM $wpdb->posts WHERE post_type = 'revision'";
397
- $revisions = $wpdb->get_results($sql);
398
-
399
- return $revisions;
400
- }
401
-
402
- function mmb_delete_all_revisions($filter)
403
- {
404
- global $wpdb;
405
- $where = '';
406
- $keep = isset($filter['num_to_keep']) ? $filter['num_to_keep'] : false;
407
- if ($keep) {
408
- $num_rev = str_replace("r_", "", $keep);
409
- $allRevisions = $wpdb->get_results("SELECT ID, post_name FROM {$wpdb->posts} WHERE post_type = 'revision' ORDER BY post_date DESC", ARRAY_A);
410
- $revisionsToKeep = array(0 => 0);
411
- $revisionsToKeepCount = array();
412
-
413
- foreach ($allRevisions as $revision) {
414
- $revisionsToKeepCount[$revision['post_name']] = isset($revisionsToKeepCount[$revision['post_name']])
415
- ? $revisionsToKeepCount[$revision['post_name']] + 1
416
- : 1;
417
-
418
- if ($revisionsToKeepCount[$revision['post_name']] <= $num_rev) {
419
- $revisionsToKeep[] = $revision['ID'];
420
- }
421
- }
422
-
423
- $notInQuery = join(', ', $revisionsToKeep);
424
-
425
- $where = "AND a.ID NOT IN ({$notInQuery})";
426
- }
427
-
428
- $sql = "DELETE a,b,c FROM $wpdb->posts a LEFT JOIN $wpdb->term_relationships b ON (a.ID = b.object_id) LEFT JOIN $wpdb->postmeta c ON (a.ID = c.post_id) WHERE a.post_type = 'revision' {$where}";
429
-
430
- $revisions = $wpdb->query($sql);
431
-
432
- return $revisions;
433
- }
434
-
435
- function mmb_handle_overhead($clear = false)
436
- {
437
- /** @var wpdb $wpdb */
438
- global $wpdb;
439
- $query = 'SHOW TABLE STATUS';
440
- $tables = $wpdb->get_results($query, ARRAY_A);
441
- $total_gain = 0;
442
- $table_string = '';
443
- foreach ($tables as $table) {
444
- if (isset($table['Engine']) && $table['Engine'] === 'MyISAM') {
445
- if ($wpdb->base_prefix != $wpdb->prefix) {
446
- if (preg_match('/^'.$wpdb->prefix.'*/Ui', $table['Name'])) {
447
- if ($table['Data_free'] > 0) {
448
- $total_gain += $table['Data_free'] / 1024;
449
- $table_string .= $table['Name'].",";
450
- }
451
- }
452
- } else {
453
- if (preg_match('/^'.$wpdb->prefix.'[0-9]{1,20}_*/Ui', $table['Name'])) {
454
- continue;
455
- } else {
456
- if ($table['Data_free'] > 0) {
457
- $total_gain += $table['Data_free'] / 1024;
458
- $table_string .= $table['Name'].",";
459
- }
460
- }
461
- }
462
- // @todo check if the cleanup was successful, if not, set a flag always skip innodb cleanup
463
- //} elseif (isset($table['Engine']) && $table['Engine'] == 'InnoDB') {
464
- // $innodb_file_per_table = $wpdb->get_results("SHOW VARIABLES LIKE 'innodb_file_per_table'");
465
- // if (isset($innodb_file_per_table[0]->Value) && $innodb_file_per_table[0]->Value === "ON") {
466
- // if ($table['Data_free'] > 0) {
467
- // $total_gain += $table['Data_free'] / 1024;
468
- // $table_string .= $table['Name'].",";
469
- // }
470
- // }
471
- }
472
- }
473
-
474
- if ($clear) {
475
- $table_string = substr($table_string, 0, strlen($table_string) - 1); //remove last ,
476
- $table_string = rtrim($table_string);
477
- $query = "OPTIMIZE TABLE $table_string";
478
- $optimize = $wpdb->query($query);
479
-
480
- return (bool) $optimize;
481
- } else {
482
- return round($total_gain, 3);
483
- }
484
- }
485
-
486
-
487
- /* Spam Comments */
488
- function mmb_num_spam_comments()
489
- {
490
- global $wpdb;
491
- $sql = "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = 'spam'";
492
- $num_spams = $wpdb->get_var($sql);
493
-
494
- return $num_spams;
495
- }
496
-
497
- function mmb_delete_spam_comments()
498
- {
499
- global $wpdb;
500
- $spam = 1;
501
- $total = 0;
502
- while (!empty($spam)) {
503
- $getCommentIds = "SELECT comment_ID FROM $wpdb->comments WHERE comment_approved = 'spam' LIMIT 200";
504
- $spam = $wpdb->get_results($getCommentIds);
505
- foreach ($spam as $comment) {
506
- wp_delete_comment($comment->comment_ID, true);
507
- }
508
- $total += count($spam);
509
- if (!empty($spam)) {
510
- usleep(100000);
511
- }
512
- }
513
-
514
- return $total;
515
- }
516
-
517
- function mmb_get_spam_comments()
518
- {
519
- global $wpdb;
520
- $sql = "SELECT * FROM $wpdb->comments as a LEFT JOIN $wpdb->commentmeta as b WHERE a.comment_ID = b.comment_id AND a.comment_approved = 'spam'";
521
- $spams = $wpdb->get_results($sql);
522
-
523
- return $spams;
524
- }
525
-
526
- function mwp_is_nio_shell_available()
527
- {
528
- static $check;
529
- if (isset($check)) {
530
- return $check;
531
- }
532
- try {
533
- $process = new Symfony_Process_Process("cd .", dirname(__FILE__), array(), null, 1);
534
- $process->run();
535
- $check = $process->isSuccessful();
536
- } catch (Exception $e) {
537
- $check = false;
538
- }
539
-
540
- return $check;
541
- }
542
-
543
- function mwp_is_shell_available()
544
- {
545
- if (mwp_is_safe_mode()) {
546
- return false;
547
- }
548
- if (!function_exists('proc_open') || !function_exists('escapeshellarg')) {
549
- return false;
550
- }
551
-
552
- if (extension_loaded('suhosin') && $suhosin = ini_get('suhosin.executor.func.blacklist')) {
553
- $suhosin = explode(',', $suhosin);
554
- $blacklist = array_map('trim', $suhosin);
555
- $blacklist = array_map('strtolower', $blacklist);
556
- if (in_array('proc_open', $blacklist)) {
557
- return false;
558
- }
559
- }
560
-
561
- if (!mwp_is_nio_shell_available()) {
562
- return false;
563
- }
564
-
565
- return true;
566
- }
567
-
568
- function mwp_is_safe_mode()
569
- {
570
- $value = ini_get("safe_mode");
571
- if ((int) $value === 0 || strtolower($value) === "off") {
572
- return false;
573
- }
574
-
575
- return true;
576
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ function mwp_autoload($class)
4
+ {
5
+ if (substr($class, 0, 8) === 'Dropbox_'
6
+ || substr($class, 0, 8) === 'Symfony_'
7
+ || substr($class, 0, 8) === 'Monolog_'
8
+ || substr($class, 0, 5) === 'Gelf_'
9
+ || substr($class, 0, 4) === 'MWP_'
10
+ || substr($class, 0, 4) === 'MMB_'
11
+ || substr($class, 0, 3) === 'S3_'
12
+ ) {
13
+ $file = dirname(__FILE__).'/src/'.str_replace('_', '/', $class).'.php';
14
+ if (file_exists($file)) {
15
+ include_once $file;
16
+ }
17
+ }
18
+ }
19
+
20
+ function mwp_register_autoload_google()
21
+ {
22
+ static $registered;
23
+
24
+ if ($registered) {
25
+ return;
26
+ } else {
27
+ $registered = true;
28
+ }
29
+
30
+ if (version_compare(PHP_VERSION, '5.3', '<')) {
31
+ spl_autoload_register('mwp_autoload_google');
32
+ } else {
33
+ spl_autoload_register('mwp_autoload_google', true, true);
34
+ }
35
+ }
36
+
37
+ function mwp_autoload_google($class)
38
+ {
39
+ if (substr($class, 0, 7) === 'Google_') {
40
+ $file = dirname(__FILE__).'/src/'.str_replace('_', '/', $class).'.php';
41
+ if (file_exists($file)) {
42
+ include_once $file;
43
+ }
44
+ }
45
+ }
46
+
47
+ /**
48
+ * @return Monolog_Psr_LoggerInterface
49
+ */
50
+ function mwp_logger()
51
+ {
52
+ return mwp_container()->getLogger();
53
+ }
54
+
55
+ /**
56
+ * @return MWP_WordPress_Context
57
+ */
58
+ function mwp_context()
59
+ {
60
+ return mwp_container()->getWordPressContext();
61
+ }
62
+
63
+ /**
64
+ * @param $appKey
65
+ * @param $appSecret
66
+ * @param $token
67
+ * @param $tokenSecret
68
+ *
69
+ * @return Dropbox_Client
70
+ */
71
+ function mwp_dropbox_oauth_factory($appKey, $appSecret, $token, $tokenSecret = null)
72
+ {
73
+ if ($tokenSecret) {
74
+ $oauthToken = 'OAuth oauth_version="1.0", oauth_signature_method="PLAINTEXT", oauth_consumer_key="'.$appKey.'", oauth_token="'.$token.'", oauth_signature="'.$appSecret.'&'.$tokenSecret.'"';
75
+ $clientIdentifier = $token;
76
+ } else {
77
+ $oauthToken = 'Bearer '.$token;
78
+ $clientIdentifier = 'PHP-ManageWp/1.0';
79
+ }
80
+
81
+ return new Dropbox_Client($oauthToken, $clientIdentifier);
82
+ }
83
+
84
+ function mwp_format_memory_limit($limit)
85
+ {
86
+ if ((string) (int) $limit === (string) $limit) {
87
+ // The number is numeric.
88
+ return mwp_format_bytes($limit);
89
+ }
90
+
91
+ $units = strtolower(substr($limit, -1));
92
+
93
+ if (!in_array($units, array('b', 'k', 'm', 'g'))) {
94
+ // Invalid size unit.
95
+ return $limit;
96
+ }
97
+
98
+ $number = substr($limit, 0, -1);
99
+
100
+ if ((string) (int) $number !== $number) {
101
+ // The number isn't numeric.
102
+ return $number;
103
+ }
104
+
105
+ switch ($units) {
106
+ case 'g':
107
+ return $number.' GB';
108
+ case 'm':
109
+ return $number.' MB';
110
+ case 'k':
111
+ return $number.' KB';
112
+ case 'b':
113
+ default:
114
+ return $number.' B';
115
+ }
116
+ }
117
+
118
+ function mwp_format_bytes($bytes)
119
+ {
120
+ $bytes = (int) $bytes;
121
+
122
+ if ($bytes > 1024 * 1024 * 1024) {
123
+ return round($bytes / 1024 / 1024 / 1024, 2).' GB';
124
+ } elseif ($bytes > 1024 * 1024) {
125
+ return round($bytes / 1024 / 1024, 2).' MB';
126
+ } elseif ($bytes > 1024) {
127
+ return round($bytes / 1024, 2).' KB';
128
+ }
129
+
130
+ return $bytes.' B';
131
+ }
132
+
133
+ function mwp_log_warnings()
134
+ {
135
+ // If mbstring.func_overload is set, it changes the behavior of the standard string functions in
136
+ // ways that makes external libraries like Dropbox break.
137
+ $mbstring_func_overload = ini_get("mbstring.func_overload");
138
+ if ($mbstring_func_overload & 2 == 2) {
139
+ mwp_logger()->warning('"mbstring.func_overload" changes the behavior of the standard string functions in ways that makes external libraries like Dropbox break');
140
+ }
141
+
142
+ if (strlen((string) PHP_INT_MAX) < 19) {
143
+ // Looks like we're running on a 32-bit build of PHP. This could cause problems because some of the numbers
144
+ // we use (file sizes, quota, etc) can be larger than 32-bit ints can handle.
145
+ mwp_logger()->warning("Some external libraries rely on 64-bit integers, but it looks like we're running on a version of PHP that doesn't support 64-bit integers (PHP_INT_MAX=".((string) PHP_INT_MAX).").");
146
+ }
147
+ }
148
+
149
+ function mmb_get_extended_info($stats)
150
+ {
151
+ $params = get_option('mmb_stats_filter');
152
+ $filter = isset($params['plugins']['cleanup']) ? $params['plugins']['cleanup'] : array();
153
+ $stats['num_revisions'] = mmb_num_revisions($filter['revisions']);
154
+ //$stats['num_revisions'] = 5;
155
+ $stats['overhead'] = mmb_handle_overhead(false);
156
+ $stats['num_spam_comments'] = mmb_num_spam_comments();
157
+
158
+ return $stats;
159
+ }
160
+
161
+ /* Revisions */
162
+ function cleanup_delete_worker($params = array())
163
+ {
164
+ $revision_params = get_option('mmb_stats_filter');
165
+ $revision_filter = isset($revision_params['plugins']['cleanup']) ? $revision_params['plugins']['cleanup'] : array();
166
+
167
+ $params_array = explode('_', $params['actions']);
168
+ $return_array = array();
169
+
170
+ foreach ($params_array as $param) {
171
+ switch ($param) {
172
+ case 'revision':
173
+ if (mmb_delete_all_revisions($revision_filter['revisions'])) {
174
+ $return_array['revision'] = 'OK';
175
+ } else {
176
+ $return_array['revision_error'] = 'OK, nothing to do';
177
+ }
178
+ break;
179
+ case 'overhead':
180
+ if (mmb_handle_overhead(true)) {
181
+ $return_array['overhead'] = 'OK';
182
+ } else {
183
+ $return_array['overhead_error'] = 'OK, nothing to do';
184
+ }
185
+ break;
186
+ case 'comment':
187
+ if (mmb_delete_spam_comments()) {
188
+ $return_array['comment'] = 'OK';
189
+ } else {
190
+ $return_array['comment_error'] = 'OK, nothing to do';
191
+ }
192
+ break;
193
+ default:
194
+ break;
195
+ }
196
+ }
197
+
198
+ unset($params);
199
+
200
+ mmb_response($return_array, true);
201
+ }
202
+
203
+ function mmb_num_revisions($filter)
204
+ {
205
+ global $wpdb;
206
+
207
+ $allRevisions = $wpdb->get_results("SELECT ID, post_name FROM {$wpdb->posts} WHERE post_type = 'revision'", ARRAY_A);
208
+
209
+ $revisionsToDelete = 0;
210
+ $revisionsToKeepCount = array();
211
+
212
+ if (isset($filter['num_to_keep']) && !empty($filter['num_to_keep'])) {
213
+ $num_rev = str_replace("r_", "", $filter['num_to_keep']);
214
+
215
+ foreach ($allRevisions as $revision) {
216
+ $revisionsToKeepCount[$revision['post_name']] = isset($revisionsToKeepCount[$revision['post_name']])
217
+ ? $revisionsToKeepCount[$revision['post_name']] + 1
218
+ : 1;
219
+
220
+ if ($revisionsToKeepCount[$revision['post_name']] > $num_rev) {
221
+ ++$revisionsToDelete;
222
+ }
223
+ }
224
+ } else {
225
+ $revisionsToDelete = count($allRevisions);
226
+ }
227
+
228
+ return $revisionsToDelete;
229
+ }
230
+
231
+ function mmb_select_all_revisions()
232
+ {
233
+ global $wpdb;
234
+ $sql = "SELECT * FROM $wpdb->posts WHERE post_type = 'revision'";
235
+ $revisions = $wpdb->get_results($sql);
236
+
237
+ return $revisions;
238
+ }
239
+
240
+ function mmb_delete_all_revisions($filter)
241
+ {
242
+ global $wpdb;
243
+ $where = '';
244
+ $keep = isset($filter['num_to_keep']) ? $filter['num_to_keep'] : false;
245
+ if ($keep) {
246
+ $num_rev = str_replace("r_", "", $keep);
247
+ $allRevisions = $wpdb->get_results("SELECT ID, post_name FROM {$wpdb->posts} WHERE post_type = 'revision' ORDER BY post_date DESC", ARRAY_A);
248
+ $revisionsToKeep = array(0 => 0);
249
+ $revisionsToKeepCount = array();
250
+
251
+ foreach ($allRevisions as $revision) {
252
+ $revisionsToKeepCount[$revision['post_name']] = isset($revisionsToKeepCount[$revision['post_name']])
253
+ ? $revisionsToKeepCount[$revision['post_name']] + 1
254
+ : 1;
255
+
256
+ if ($revisionsToKeepCount[$revision['post_name']] <= $num_rev) {
257
+ $revisionsToKeep[] = $revision['ID'];
258
+ }
259
+ }
260
+
261
+ $notInQuery = join(', ', $revisionsToKeep);
262
+
263
+ $where = "AND a.ID NOT IN ({$notInQuery})";
264
+ }
265
+
266
+ $sql = "DELETE a,b,c FROM $wpdb->posts a LEFT JOIN $wpdb->term_relationships b ON (a.ID = b.object_id) LEFT JOIN $wpdb->postmeta c ON (a.ID = c.post_id) WHERE a.post_type = 'revision' {$where}";
267
+
268
+ $revisions = $wpdb->query($sql);
269
+
270
+ return $revisions;
271
+ }
272
+
273
+ function mmb_handle_overhead($clear = false)
274
+ {
275
+ /** @var wpdb $wpdb */
276
+ global $wpdb;
277
+ $query = 'SHOW TABLE STATUS';
278
+ $tables = $wpdb->get_results($query, ARRAY_A);
279
+ $total_gain = 0;
280
+ $table_string = '';
281
+ foreach ($tables as $table) {
282
+ if (isset($table['Engine']) && $table['Engine'] === 'MyISAM') {
283
+ if ($wpdb->base_prefix != $wpdb->prefix) {
284
+ if (preg_match('/^'.$wpdb->prefix.'*/Ui', $table['Name'])) {
285
+ if ($table['Data_free'] > 0) {
286
+ $total_gain += $table['Data_free'] / 1024;
287
+ $table_string .= $table['Name'].",";
288
+ }
289
+ }
290
+ } else {
291
+ if (preg_match('/^'.$wpdb->prefix.'[0-9]{1,20}_*/Ui', $table['Name'])) {
292
+ continue;
293
+ } else {
294
+ if ($table['Data_free'] > 0) {
295
+ $total_gain += $table['Data_free'] / 1024;
296
+ $table_string .= $table['Name'].",";
297
+ }
298
+ }
299
+ }
300
+ // @todo check if the cleanup was successful, if not, set a flag always skip innodb cleanup
301
+ //} elseif (isset($table['Engine']) && $table['Engine'] == 'InnoDB') {
302
+ // $innodb_file_per_table = $wpdb->get_results("SHOW VARIABLES LIKE 'innodb_file_per_table'");
303
+ // if (isset($innodb_file_per_table[0]->Value) && $innodb_file_per_table[0]->Value === "ON") {
304
+ // if ($table['Data_free'] > 0) {
305
+ // $total_gain += $table['Data_free'] / 1024;
306
+ // $table_string .= $table['Name'].",";
307
+ // }
308
+ // }
309
+ }
310
+ }
311
+
312
+ if ($clear) {
313
+ $table_string = substr($table_string, 0, strlen($table_string) - 1); //remove last ,
314
+ $table_string = rtrim($table_string);
315
+ $query = "OPTIMIZE TABLE $table_string";
316
+ $optimize = $wpdb->query($query);
317
+
318
+ return (bool) $optimize;
319
+ } else {
320
+ return round($total_gain, 3);
321
+ }
322
+ }
323
+
324
+ /* Spam Comments */
325
+ function mmb_num_spam_comments()
326
+ {
327
+ global $wpdb;
328
+ $sql = "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = 'spam'";
329
+ $num_spams = $wpdb->get_var($sql);
330
+
331
+ return $num_spams;
332
+ }
333
+
334
+ function mmb_delete_spam_comments()
335
+ {
336
+ global $wpdb;
337
+ $spam = 1;
338
+ $total = 0;
339
+ while (!empty($spam)) {
340
+ $getCommentIds = "SELECT comment_ID FROM $wpdb->comments WHERE comment_approved = 'spam' LIMIT 200";
341
+ $spam = $wpdb->get_results($getCommentIds);
342
+ foreach ($spam as $comment) {
343
+ wp_delete_comment($comment->comment_ID, true);
344
+ }
345
+ $total += count($spam);
346
+ if (!empty($spam)) {
347
+ usleep(100000);
348
+ }
349
+ }
350
+
351
+ return $total;
352
+ }
353
+
354
+ function mmb_get_spam_comments()
355
+ {
356
+ global $wpdb;
357
+ $sql = "SELECT * FROM $wpdb->comments as a LEFT JOIN $wpdb->commentmeta as b WHERE a.comment_ID = b.comment_id AND a.comment_approved = 'spam'";
358
+ $spams = $wpdb->get_results($sql);
359
+
360
+ return $spams;
361
+ }
362
+
363
+ function mwp_is_nio_shell_available()
364
+ {
365
+ static $check;
366
+ if (isset($check)) {
367
+ return $check;
368
+ }
369
+ try {
370
+ $process = new Symfony_Process_Process("cd .", dirname(__FILE__), array(), null, 1);
371
+ $process->run();
372
+ $check = $process->isSuccessful();
373
+ } catch (Exception $e) {
374
+ $check = false;
375
+ }
376
+
377
+ return $check;
378
+ }
379
+
380
+ function mwp_is_shell_available()
381
+ {
382
+ if (mwp_is_safe_mode()) {
383
+ return false;
384
+ }
385
+ if (!function_exists('proc_open') || !function_exists('escapeshellarg')) {
386
+ return false;
387
+ }
388
+
389
+ if (extension_loaded('suhosin') && $suhosin = ini_get('suhosin.executor.func.blacklist')) {
390
+ $suhosin = explode(',', $suhosin);
391
+ $blacklist = array_map('trim', $suhosin);
392
+ $blacklist = array_map('strtolower', $blacklist);
393
+ if (in_array('proc_open', $blacklist)) {
394
+ return false;
395
+ }
396
+ }
397
+
398
+ if (!mwp_is_nio_shell_available()) {
399
+ return false;
400
+ }
401
+
402
+ return true;
403
+ }
404
+
405
+ function mwp_get_disabled_functions()
406
+ {
407
+ $list = array_merge(explode(',', ini_get('disable_functions')), explode(',', ini_get('suhosin.executor.func.blacklist')));
408
+ $list = array_map('trim', $list);
409
+ $list = array_map('strtolower', $list);
410
+ $list = array_filter($list);
411
+
412
+ return $list;
413
+ }
414
+
415
+ function mwp_is_safe_mode()
416
+ {
417
+ $value = ini_get("safe_mode");
418
+ if ((int) $value === 0 || strtolower($value) === "off") {
419
+ return false;
420
+ }
421
+
422
+ return true;
423
+ }
424
+
425
+ // Everything below was moved from init.php
426
+
427
+ function mmb_parse_request()
428
+ {
429
+ global $mmb_core, $wp_db_version, $_wp_using_ext_object_cache, $_mwp_data, $_mwp_auth;
430
+ $_wp_using_ext_object_cache = false;
431
+ @set_time_limit(1200);
432
+
433
+ if (isset($_mwp_data['setting'])) {
434
+ if (array_key_exists("dataown", $_mwp_data['setting'])) {
435
+ $oldconfiguration = array("dataown" => $_mwp_data['setting']['dataown']);
436
+ $mmb_core->save_options($oldconfiguration);
437
+ unset($_mwp_data['setting']['dataown']);
438
+ }
439
+
440
+ $configurationService = new MWP_Configuration_Service();
441
+ $configuration = new MWP_Configuration_Conf($_mwp_data['setting']);
442
+ $configurationService->saveConfiguration($configuration);
443
+ }
444
+
445
+ if ($_mwp_data['action'] === 'add_site') {
446
+ mmb_add_site($_mwp_data['params']);
447
+ mmb_response('You should never see this.', false);
448
+ }
449
+
450
+ /* in case database upgrade required, do database backup and perform upgrade ( wordpress wp_upgrade() function ) */
451
+ if (strlen(trim($wp_db_version)) && !defined('ACX_PLUGIN_DIR')) {
452
+ if (get_option('db_version') != $wp_db_version) {
453
+ /* in multisite network, please update database manualy */
454
+ if (!is_multisite()) {
455
+ if (!function_exists('wp_upgrade')) {
456
+ include_once ABSPATH.'wp-admin/includes/upgrade.php';
457
+ }
458
+
459
+ ob_clean();
460
+ @wp_upgrade();
461
+ @do_action('after_db_upgrade');
462
+ ob_end_clean();
463
+ }
464
+ }
465
+ }
466
+
467
+ if (isset($_mwp_data['params']['secure'])) {
468
+ if (is_array($_mwp_data['params']['secure'])) {
469
+ $secureParams = $_mwp_data['params']['secure'];
470
+ foreach ($secureParams as $key => $value) {
471
+ $secureParams[$key] = base64_decode($value);
472
+ }
473
+ $_mwp_data['params']['secure'] = $secureParams;
474
+ } else {
475
+ $_mwp_data['params']['secure'] = base64_decode($_mwp_data['params']['secure']);
476
+ }
477
+ if ($decrypted = $mmb_core->_secure_data($_mwp_data['params']['secure'])) {
478
+ $decrypted = maybe_unserialize($decrypted);
479
+ if (is_array($decrypted)) {
480
+ foreach ($decrypted as $key => $val) {
481
+ if (!is_numeric($key)) {
482
+ $_mwp_data['params'][$key] = $val;
483
+ }
484
+ }
485
+ unset($_mwp_data['params']['secure']);
486
+ } else {
487
+ $_mwp_data['params']['secure'] = $decrypted;
488
+ }
489
+ }
490
+
491
+ if (!$decrypted && $mmb_core->get_random_signature() !== false) {
492
+ require_once dirname(__FILE__).'/src/PHPSecLib/Crypt/AES.php';
493
+ $cipher = new Crypt_AES(CRYPT_AES_MODE_ECB);
494
+ $cipher->setKey($mmb_core->get_random_signature());
495
+ $decrypted = $cipher->decrypt($_mwp_data['params']['secure']);
496
+ $_mwp_data['params']['account_info'] = json_decode($decrypted, true);
497
+ }
498
+ }
499
+
500
+ $logData = array(
501
+ 'action' => $_mwp_data['action'],
502
+ 'action_parameters' => $_mwp_data['params'],
503
+ 'action_settings' => $_mwp_data['setting'],
504
+ );
505
+
506
+ if (!empty($_mwp_data['setting'])) {
507
+ $logData['settings'] = $_mwp_data['setting'];
508
+ }
509
+
510
+ mwp_logger()->debug('Master request: "{action}"', $logData);
511
+ }
512
+
513
+ function mmb_response($response = false, $success = true)
514
+ {
515
+ mwp_logger()->debug('Master response: {action_response_status}', array(
516
+ 'action_response_status' => $success ? 'success' : 'error',
517
+ 'action_response' => $response,
518
+ 'headers_sent' => headers_sent(),
519
+ ));
520
+
521
+ if (!$success) {
522
+ if (!is_scalar($response)) {
523
+ $response = json_encode($response);
524
+ }
525
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::GENERAL_ERROR, $response);
526
+ }
527
+
528
+ throw new MWP_Worker_ActionResponse($response);
529
+ }
530
+
531
+ function mmb_remove_site($params)
532
+ {
533
+ extract($params);
534
+ global $mmb_core;
535
+ $mmb_core->deactivate($deactivate);
536
+
537
+ include_once ABSPATH.'wp-admin/includes/plugin.php';
538
+ $plugin_slug = 'worker/init.php';
539
+
540
+ if ($deactivate) {
541
+ deactivate_plugins($plugin_slug, true);
542
+ } else {
543
+ // Prolong the worker deactivation upon site removal.
544
+ update_option('mmb_worker_activation_time', time());
545
+ }
546
+
547
+ if (!is_plugin_active($plugin_slug)) {
548
+ mmb_response(
549
+ array(
550
+ 'deactivated' => 'Site removed successfully. <br /><br />ManageWP Worker plugin successfully deactivated.',
551
+ ),
552
+ true
553
+ );
554
+ } else {
555
+ mmb_response(
556
+ array(
557
+ 'removed_data' => 'Site removed successfully. <br /><br /><b>ManageWP Worker plugin was not deactivated.</b>',
558
+ ),
559
+ true
560
+ );
561
+ }
562
+ }
563
+
564
+ function mmb_stats_get($params)
565
+ {
566
+ global $mmb_core;
567
+ $mmb_core->get_stats_instance();
568
+
569
+ mwp_context()->requireWpRewrite();
570
+ mwp_context()->requireTaxonomies();
571
+ mwp_context()->requirePostTypes();
572
+ mwp_context()->requireTheme();
573
+
574
+ $data = array_merge($mmb_core->stats_instance->get($params), mmb_pre_init_stats($params));
575
+ mmb_response($data, true);
576
+ }
577
+
578
+ function mmb_worker_header()
579
+ {
580
+ global $mmb_core, $current_user;
581
+
582
+ if (!headers_sent()) {
583
+ if (isset($current_user->ID)) {
584
+ $expiration = time() + apply_filters('auth_cookie_expiration', 10800, $current_user->ID, false);
585
+ } else {
586
+ $expiration = time() + 10800;
587
+ }
588
+
589
+ setcookie(MMB_XFRAME_COOKIE, md5(MMB_XFRAME_COOKIE), $expiration, COOKIEPATH, COOKIE_DOMAIN, false, true);
590
+ $_COOKIE[MMB_XFRAME_COOKIE] = md5(MMB_XFRAME_COOKIE);
591
+ }
592
+ }
593
+
594
+ function mmb_pre_init_stats($params)
595
+ {
596
+ global $mmb_core;
597
+
598
+ mwp_context()->requireWpRewrite();
599
+ mwp_context()->requireTaxonomies();
600
+ mwp_context()->requirePostTypes();
601
+ mwp_context()->requireTheme();
602
+
603
+ $mmb_core->get_stats_instance();
604
+
605
+ return $mmb_core->stats_instance->pre_init_stats($params);
606
+ }
607
+
608
+ function mwp_datasend($params = array())
609
+ {
610
+ global $mmb_core, $_mmb_item_filter, $_mmb_options;
611
+
612
+ $_mmb_remoteurl = get_option('home');
613
+ $_mmb_remoteown = isset($_mmb_options['dataown']) && !empty($_mmb_options['dataown']) ? $_mmb_options['dataown'] : false;
614
+
615
+ if (empty($_mmb_remoteown)) {
616
+ return;
617
+ }
618
+
619
+ $_mmb_item_filter['pre_init_stats'] = array('core_update', 'hit_counter', 'comments', 'backups', 'posts', 'drafts', 'scheduled', 'site_statistics');
620
+ $_mmb_item_filter['get'] = array('updates', 'errors');
621
+ $mmb_core->get_stats_instance();
622
+
623
+ $filter = array(
624
+ 'refresh' => 'transient',
625
+ 'item_filter' => array(
626
+ 'get_stats' => array(
627
+ array('updates', array('plugins' => true, 'themes' => true, 'premium' => true)),
628
+ array('core_update', array('core' => true)),
629
+ array('posts', array('numberposts' => 5)),
630
+ array('drafts', array('numberposts' => 5)),
631
+ array('scheduled', array('numberposts' => 5)),
632
+ array('hit_counter'),
633
+ array('comments', array('numberposts' => 5)),
634
+ array('backups'),
635
+ 'plugins' => array(
636
+ 'cleanup' => array(
637
+ 'overhead' => array(),
638
+ 'revisions' => array('num_to_keep' => 'r_5'),
639
+ 'spam' => array(),
640
+ ),
641
+ ),
642
+ ),
643
+ ),
644
+ );
645
+
646
+ $pre_init_data = $mmb_core->stats_instance->pre_init_stats($filter);
647
+ $init_data = $mmb_core->stats_instance->get($filter);
648
+
649
+ $data = array_merge($init_data, $pre_init_data);
650
+ $data['server_ip'] = $_SERVER['SERVER_ADDR'];
651
+ $data['uhost'] = php_uname('n');
652
+ $hash = $mmb_core->get_secure_hash();
653
+
654
+ if (mwp_datasend_trigger($data)) { // adds trigger to check if really need to send something
655
+ $configurationService = new MWP_Configuration_Service();
656
+ $configuration = $configurationService->getConfiguration();
657
+
658
+ set_transient("mwp_cache_notifications", $data);
659
+ set_transient("mwp_cache_notifications_time", time());
660
+
661
+ $datasend['datasend'] = $mmb_core->encrypt_data($data);
662
+ $datasend['sitehome'] = base64_encode($_mmb_remoteown.'[]'.$_mmb_remoteurl);
663
+ $datasend['sitehash'] = md5($hash.$_mmb_remoteown.$_mmb_remoteurl);
664
+ $datasend['setting_checksum_order'] = implode(",", array_keys($configuration->getVariables()));
665
+ $datasend['setting_checksum'] = md5(json_encode($configuration->toArray()));
666
+ if (!class_exists('WP_Http')) {
667
+ include_once ABSPATH.WPINC.'/class-http.php';
668
+ }
669
+
670
+ $remote = array();
671
+ $remote['body'] = $datasend;
672
+ $remote['timeout'] = 20;
673
+
674
+ $result = wp_remote_post($configuration->getMasterCronUrl(), $remote);
675
+ if (!is_wp_error($result)) {
676
+ if (isset($result['body']) && !empty($result['body'])) {
677
+ $settings = @unserialize($result['body']);
678
+ /* rebrand worker or set default */
679
+ $brand = '';
680
+ if ($settings['worker_brand']) {
681
+ $brand = $settings['worker_brand'];
682
+ }
683
+ update_option("mwp_worker_brand", $brand);
684
+ /* change worker version */
685
+ $w_version = @$settings['worker_updates']['version'];
686
+ $w_url = @$settings['worker_updates']['url'];
687
+ if (version_compare($GLOBALS['MMB_WORKER_VERSION'], $w_version, '<')) {
688
+ //automatic update
689
+ $mmb_core->update_worker_plugin(array("download_url" => $w_url));
690
+ }
691
+
692
+ if (!empty($settings['mwp_worker_configuration'])) {
693
+ require_once dirname(__FILE__).'/src/PHPSecLib/Crypt/RSA.php';
694
+ $rsa = new Crypt_RSA();
695
+ $keyName = $configuration->getKeyName();
696
+ $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
697
+ $rsa->loadKey(file_get_contents(dirname(__FILE__)."/publickeys/$keyName.pub")); // public key
698
+ $signature = base64_decode($settings['mwp_worker_configuration_signature']);
699
+ if ($rsa->verify(json_encode($settings['mwp_worker_configuration']), $signature)) {
700
+ $configuration = new MWP_Configuration_Conf($settings['mwp_worker_configuration']);
701
+ $configurationService->saveConfiguration($configuration);
702
+ }
703
+ }
704
+ }
705
+ } else {
706
+ //$mmb_core->_log($result);
707
+ }
708
+ }
709
+ }
710
+
711
+ // trigger function, returns true if notifications should be sent
712
+ function mwp_datasend_trigger($stats)
713
+ {
714
+ $configurationService = new MWP_Configuration_Service();
715
+ $configuration = $configurationService->getConfiguration();
716
+
717
+ $cachedData = get_transient("mwp_cache_notifications");
718
+ $cacheTime = (int) get_transient("mwp_cache_notifications_time");
719
+
720
+ $returnValue = false;
721
+ if (false == $cachedData || empty($configuration)) {
722
+ $returnValue = true;
723
+ }
724
+ /**
725
+ * Cache lifetime check
726
+ */
727
+ if (!$returnValue) {
728
+ $now = time();
729
+ if ($now - $configuration->getNotiCacheLifeTime() >= $cacheTime) {
730
+ $returnValue = true;
731
+ }
732
+ }
733
+
734
+ /**
735
+ * Themes difference check section
736
+ * First check if array differ in size. If same size,then check values difference
737
+ */
738
+ if (!$returnValue && empty($stats['upgradable_themes']) != empty($cachedData['upgradable_themes'])) {
739
+ $returnValue = true;
740
+ }
741
+ if (!$returnValue && !empty($stats['upgradable_themes'])) {
742
+ $themesArr = mwp_std_to_array($stats['upgradable_themes']);
743
+ $cachedThemesArr = mwp_std_to_array($cachedData['upgradable_themes']);
744
+ if ($themesArr != $cachedThemesArr) {
745
+ $returnValue = true;
746
+ }
747
+ }
748
+
749
+ /**
750
+ * Plugins difference check section
751
+ * First check if array differ in size. If same size,then check values difference
752
+ */
753
+ if (!$returnValue && empty($stats['upgradable_plugins']) != empty($cachedData['upgradable_plugins'])) {
754
+ $returnValue = true;
755
+ }
756
+
757
+ if (!$returnValue && !empty($stats['upgradable_plugins'])) { //we have hear stdclass
758
+ $pluginsArr = mwp_std_to_array($stats['upgradable_plugins']);
759
+ $cachedPluginsArr = mwp_std_to_array($cachedData['upgradable_plugins']);
760
+ if ($pluginsArr != $cachedPluginsArr) {
761
+ $returnValue = true;
762
+ }
763
+ }
764
+
765
+ /**
766
+ * Premium difference check section
767
+ * First check if array differ in size. If same size,then check values difference
768
+ */
769
+ if (!$returnValue && empty($stats['premium_updates']) != empty($cachedData['premium_updates'])) {
770
+ $returnValue = true;
771
+ }
772
+ if (!$returnValue && !empty($stats['premium_updates'])) {
773
+ $premiumArr = mwp_std_to_array($stats['premium_updates']);
774
+ $cachedPremiumArr = mwp_std_to_array($cachedData['premium_updates']);
775
+ if ($premiumArr != $cachedPremiumArr) {
776
+ $returnValue = true;
777
+ }
778
+ }
779
+ /**
780
+ * Comments
781
+ * Check if we have configs first, then check trasholds
782
+ */
783
+ if (!$returnValue && (int) $stats['num_spam_comments'] >= $configuration->getNotiTresholdSpamComments() && $stats['num_spam_comments'] != (int) $cachedData['num_spam_comments']) {
784
+ $returnValue = true;
785
+ }
786
+ if (!$returnValue && (int) $stats['num_spam_comments'] < (int) $cachedData['num_spam_comments']) {
787
+ $returnValue = true;
788
+ }
789
+
790
+ if (!$returnValue && !empty($stats['comments'])) {
791
+ if (!empty($stats['comments']['pending']) && count($stats['comments']['pending']) >= $configuration->getNotiTresholdPendingComments()) {
792
+ $pendingArr = mwp_std_to_array($stats['comments']['pending']);
793
+ $cachedPendingArr = mwp_std_to_array($cachedData['comments']['pending']);
794
+ if ($pendingArr != $cachedPendingArr) {
795
+ $returnValue = true;
796
+ }
797
+ }
798
+
799
+ if (!empty($stats['comments']['approved']) && count($stats['comments']['approved']) >= $configuration->getNotiTresholdApprovedComments()) {
800
+ $approvedArr = mwp_std_to_array($stats['comments']['approved']);
801
+ $cachedApprovedArr = mwp_std_to_array($cachedData['comments']['approved']);
802
+ if ($approvedArr != $cachedApprovedArr) {
803
+ $returnValue = true;
804
+ }
805
+ }
806
+ }
807
+
808
+ /**
809
+ * Drafts, posts
810
+ */
811
+
812
+ if (!$returnValue && !empty($stats['drafts']) && count($stats['drafts']) >= $configuration->getNotiTresholdDrafts()) {
813
+ if (count($stats['drafts']) > $configuration->getNotiTresholdDrafts() && empty($cachedData['drafts'])) {
814
+ $returnValue = true;
815
+ } else {
816
+ $draftsArr = mwp_std_to_array($stats['drafts']);
817
+ $cachedDraftsArr = mwp_std_to_array($cachedData['drafts']);
818
+ if ($draftsArr != $cachedDraftsArr) {
819
+ $returnValue = true;
820
+ }
821
+ }
822
+ }
823
+
824
+ if (!$returnValue && !empty($stats['posts']) && count($stats['posts']) >= $configuration->getNotiTresholdPosts()) {
825
+ if (count($stats['posts']) > $configuration->getNotiTresholdPosts() && empty($cachedData['posts'])) {
826
+ $returnValue = true;
827
+ } else {
828
+ $postsArr = mwp_std_to_array($stats['posts']);
829
+ $cachedPostsArr = mwp_std_to_array($cachedData['posts']);
830
+ if ($postsArr != $cachedPostsArr) {
831
+ $returnValue = true;
832
+ }
833
+ }
834
+ }
835
+
836
+ /**
837
+ * Core updates & backups
838
+ */
839
+ if (!$returnValue && empty($stats['core_updates']) != empty($cachedData['core_updates'])) {
840
+ $returnValue = true;
841
+ }
842
+ if (!$returnValue && !empty($stats['core_updates'])) {
843
+ $coreArr = mwp_std_to_array($stats['core_updates']);
844
+ $cachedCoreArr = mwp_std_to_array($cachedData['core_updates']);
845
+ if ($coreArr != $cachedCoreArr) {
846
+ $returnValue = true;
847
+ }
848
+ }
849
+
850
+ if (!$returnValue && empty($stats['mwp_backups']) != empty($cachedData['mwp_backups'])) {
851
+ $returnValue = true;
852
+ }
853
+ if (!$returnValue && !empty($stats['mwp_backups'])) {
854
+ $backupArr = mwp_std_to_array($stats['mwp_backups']);
855
+ $cachedBackupArr = mwp_std_to_array($cachedData['mwp_backups']);
856
+ if ($backupArr != $cachedBackupArr) {
857
+ $returnValue = true;
858
+ }
859
+ }
860
+
861
+ return $returnValue;
862
+ }
863
+
864
+ function mwp_std_to_array($obj)
865
+ {
866
+ if (is_object($obj)) {
867
+ $objArr = clone $obj;
868
+ } else {
869
+ $objArr = $obj;
870
+ }
871
+ if (!empty($objArr)) {
872
+ foreach ($objArr as &$element) {
873
+ if ($element instanceof stdClass || is_array($element)) {
874
+ $element = mwp_std_to_array($element);
875
+ }
876
+ }
877
+ $objArr = (array) $objArr;
878
+ }
879
+
880
+ return $objArr;
881
+ }
882
+
883
+ function mmb_post_create($params)
884
+ {
885
+ global $mmb_core;
886
+
887
+ mwp_context()->requireWpRewrite();
888
+ mwp_context()->requireTaxonomies();
889
+ mwp_context()->requirePostTypes();
890
+
891
+ $mmb_core->get_post_instance();
892
+ $return = $mmb_core->post_instance->create($params);
893
+ if (is_int($return)) {
894
+ mmb_response($return, true);
895
+ } else {
896
+ if (isset($return['error'])) {
897
+ mmb_response($return['error'], false);
898
+ } else {
899
+ mmb_response($return, false);
900
+ }
901
+ }
902
+ }
903
+
904
+ function mmb_change_post_status($params)
905
+ {
906
+ global $mmb_core;
907
+ $mmb_core->get_post_instance();
908
+ $return = $mmb_core->post_instance->change_status($params);
909
+ if (is_wp_error($return)) {
910
+ mmb_response($return->get_error_message(), false);
911
+ } elseif (empty($return)) {
912
+ mmb_response("Post status can not be changed", false);
913
+ } else {
914
+ mmb_response($return, true);
915
+ }
916
+ }
917
+
918
+ function mmb_backup_now($params)
919
+ {
920
+ global $mmb_core;
921
+
922
+ $mmb_core->get_backup_instance();
923
+ $return = $mmb_core->backup_instance->backup($params);
924
+
925
+ if (is_array($return) && array_key_exists('error', $return)) {
926
+ mmb_response($return['error'], false);
927
+ } else {
928
+ mmb_response($return, true);
929
+ }
930
+ }
931
+
932
+ function mwp_ping_backup($params)
933
+ {
934
+ global $mmb_core;
935
+
936
+ $mmb_core->get_backup_instance();
937
+ $return = $mmb_core->backup_instance->ping_backup($params);
938
+
939
+ if (is_array($return) && array_key_exists('error', $return)) {
940
+ mmb_response($return['error'], false);
941
+ } else {
942
+ mmb_response($return, true);
943
+ }
944
+ }
945
+
946
+ function mmb_run_task_now($params)
947
+ {
948
+ global $mmb_core;
949
+ $mmb_core->get_backup_instance();
950
+
951
+ $task_name = isset($params['task_name']) ? $params['task_name'] : false;
952
+ $google_drive_token = isset($params['google_drive_token']) ? $params['google_drive_token'] : false;
953
+ $resultUuid = !empty($params['resultUuid']) ? $params['resultUuid'] : false;
954
+
955
+ if ($task_name) {
956
+ $return = $mmb_core->backup_instance->task_now($task_name, $google_drive_token, $resultUuid);
957
+ if (is_array($return) && array_key_exists('error', $return)) {
958
+ mmb_response($return['error'], false);
959
+ } else {
960
+ mmb_response($return, true);
961
+ }
962
+ } else {
963
+ mmb_response("Task name is not provided.", false);
964
+ }
965
+ }
966
+
967
+ function mmb_get_backup_req($params)
968
+ {
969
+ global $mmb_core;
970
+ $mmb_core->get_stats_instance();
971
+ $return = $mmb_core->stats_instance->get_backup_req($params);
972
+
973
+ mmb_response($return, true);
974
+ }
975
+
976
+ // Fires when Backup Now, or some backup task is saved.
977
+ function mmb_scheduled_backup($params)
978
+ {
979
+ global $mmb_core;
980
+ $mmb_core->get_backup_instance();
981
+ $return = $mmb_core->backup_instance->set_backup_task($params);
982
+ mmb_response($return, $return);
983
+ }
984
+
985
+ function mmm_delete_backup($params)
986
+ {
987
+ global $mmb_core;
988
+ $mmb_core->get_backup_instance();
989
+ $return = $mmb_core->backup_instance->delete_backup($params);
990
+ mmb_response($return, $return);
991
+ }
992
+
993
+ function mmb_restore_now($params)
994
+ {
995
+ global $mmb_core;
996
+ $mmb_core->get_backup_instance();
997
+ $return = $mmb_core->backup_instance->restore($params);
998
+ if (is_array($return) && array_key_exists('error', $return)) {
999
+ mmb_response($return['error'], false);
1000
+ } else {
1001
+ mmb_response($return, true);
1002
+ }
1003
+ }
1004
+
1005
+ function mmb_remote_backup_now($params)
1006
+ {
1007
+ global $mmb_core;
1008
+ $backup_instance = $mmb_core->get_backup_instance();
1009
+ $return = $mmb_core->backup_instance->remote_backup_now($params);
1010
+ if (is_array($return) && array_key_exists('error', $return)) {
1011
+ mmb_response($return['error'], false);
1012
+ } else {
1013
+ mmb_response($return, true);
1014
+ }
1015
+ }
1016
+
1017
+ function mmb_run_forked_action()
1018
+ {
1019
+ if (!isset($_POST['mmb_fork_nonce'])) {
1020
+ return false;
1021
+ }
1022
+
1023
+ $originalUser = wp_get_current_user();
1024
+ $usernameUsed = array_key_exists('username', $_POST) ? $_POST : null;
1025
+
1026
+ if ($usernameUsed && !is_user_logged_in()) {
1027
+ $user = function_exists('get_user_by') ? get_user_by('login', $_POST['username']) : get_user_by('login', $_POST['username']);
1028
+ }
1029
+
1030
+ if (isset($user) && isset($user->ID)) {
1031
+ wp_set_current_user($user->ID);
1032
+ // Compatibility with All In One Security
1033
+ update_user_meta($user->ID, 'last_login_time', current_time('mysql'));
1034
+ }
1035
+
1036
+ if (!wp_verify_nonce($_POST['mmb_fork_nonce'], 'mmb-fork-nonce')) {
1037
+ wp_set_current_user($originalUser->ID);
1038
+
1039
+ return false;
1040
+ }
1041
+
1042
+ $public_key = get_option('_worker_public_key');
1043
+ if (!isset($_POST['public_key']) || $public_key !== $_POST['public_key']) {
1044
+ wp_set_current_user($originalUser->ID);
1045
+
1046
+ return false;
1047
+ }
1048
+ $args = @json_decode(stripslashes($_POST['args']), true);
1049
+ $args['forked'] = true;
1050
+
1051
+ if (!isset($args)) {
1052
+ wp_set_current_user($originalUser->ID);
1053
+
1054
+ return false;
1055
+ }
1056
+ $cron_action = isset($_POST['mwp_forked_action']) ? $_POST['mwp_forked_action'] : false;
1057
+ if ($cron_action) {
1058
+ do_action($cron_action, $args);
1059
+ }
1060
+ //unset($_POST['public_key']);
1061
+ unset($_POST['mmb_fork_nonce']);
1062
+ unset($_POST['args']);
1063
+ unset($_POST['mwp_forked_action']);
1064
+
1065
+ wp_set_current_user($originalUser->ID);
1066
+
1067
+ return true;
1068
+ }
1069
+
1070
+ function mmb_update_worker_plugin($params)
1071
+ {
1072
+ global $mmb_core;
1073
+ mmb_response($mmb_core->update_worker_plugin($params), true);
1074
+ }
1075
+
1076
+ function mmb_install_addon($params)
1077
+ {
1078
+ global $mmb_core;
1079
+
1080
+ mwp_context()->requireTheme();
1081
+ mwp_load_required_components();
1082
+
1083
+ $mmb_core->get_installer_instance();
1084
+ $return = $mmb_core->installer_instance->install_remote_file($params);
1085
+ mmb_response($return, true);
1086
+ }
1087
+
1088
+ function mmb_do_upgrade($params)
1089
+ {
1090
+ global $mmb_core, $mmb_upgrading;
1091
+
1092
+ mwp_context()->requireTheme();
1093
+
1094
+ $mmb_core->get_installer_instance();
1095
+ $return = $mmb_core->installer_instance->do_upgrade($params);
1096
+ mmb_response($return, true);
1097
+ }
1098
+
1099
+ function mmb_get_comments($params)
1100
+ {
1101
+ global $mmb_core;
1102
+ $mmb_core->get_comment_instance();
1103
+ $return = $mmb_core->comment_instance->get_comments($params);
1104
+ if (is_array($return) && array_key_exists('error', $return)) {
1105
+ mmb_response($return['error'], false);
1106
+ } else {
1107
+ mmb_response($return, true);
1108
+ }
1109
+ }
1110
+
1111
+ function mmb_bulk_action_comments($params)
1112
+ {
1113
+ global $mmb_core;
1114
+ $mmb_core->get_comment_instance();
1115
+
1116
+ $return = $mmb_core->comment_instance->bulk_action_comments($params);
1117
+ if (is_array($return) && array_key_exists('error', $return)) {
1118
+ mmb_response($return['error'], false);
1119
+ } else {
1120
+ mmb_response($return, true);
1121
+ }
1122
+ }
1123
+
1124
+ function mmb_reply_comment($params)
1125
+ {
1126
+ global $mmb_core;
1127
+ $mmb_core->get_comment_instance();
1128
+
1129
+ $return = $mmb_core->comment_instance->reply_comment($params);
1130
+ if (is_array($return) && array_key_exists('error', $return)) {
1131
+ mmb_response($return['error'], false);
1132
+ } else {
1133
+ mmb_response($return, true);
1134
+ }
1135
+ }
1136
+
1137
+ function mmb_add_user($params)
1138
+ {
1139
+ global $mmb_core;
1140
+ $mmb_core->get_user_instance();
1141
+ $return = $mmb_core->user_instance->add_user($params);
1142
+ if (is_array($return) && array_key_exists('error', $return)) {
1143
+ mmb_response($return['error'], false);
1144
+ } else {
1145
+ mmb_response($return, true);
1146
+ }
1147
+ }
1148
+
1149
+ function mmb_get_users($params)
1150
+ {
1151
+ global $mmb_core;
1152
+ $mmb_core->get_user_instance();
1153
+ $return = $mmb_core->user_instance->get_users($params);
1154
+ if (is_array($return) && array_key_exists('error', $return)) {
1155
+ mmb_response($return['error'], false);
1156
+ } else {
1157
+ mmb_response($return, true);
1158
+ }
1159
+ }
1160
+
1161
+ function mmb_edit_users($params)
1162
+ {
1163
+ global $mmb_core;
1164
+ $mmb_core->get_user_instance();
1165
+ $users = $mmb_core->user_instance->edit_users($params);
1166
+ $response = 'User updated.';
1167
+ $check_error = false;
1168
+ foreach ($users as $username => $user) {
1169
+ $check_error = array_key_exists('error', $user);
1170
+ if ($check_error) {
1171
+ $response = $username.': '.$user['error'];
1172
+ }
1173
+ }
1174
+ mmb_response($response, !$check_error);
1175
+ }
1176
+
1177
+ function mmb_get_posts($params)
1178
+ {
1179
+ global $mmb_core;
1180
+ $mmb_core->get_post_instance();
1181
+
1182
+ $return = $mmb_core->post_instance->get_posts($params);
1183
+ if (is_array($return) && array_key_exists('error', $return)) {
1184
+ mmb_response($return['error'], false);
1185
+ } else {
1186
+ mmb_response($return, true);
1187
+ }
1188
+ }
1189
+
1190
+ function mmb_delete_post($params)
1191
+ {
1192
+ global $mmb_core;
1193
+ $mmb_core->get_post_instance();
1194
+
1195
+ $return = $mmb_core->post_instance->delete_post($params);
1196
+ if (is_array($return) && array_key_exists('error', $return)) {
1197
+ mmb_response($return['error'], false);
1198
+ } else {
1199
+ mmb_response($return, true);
1200
+ }
1201
+ }
1202
+
1203
+ function mmb_delete_posts($params)
1204
+ {
1205
+ global $mmb_core;
1206
+ $mmb_core->get_post_instance();
1207
+
1208
+ $return = $mmb_core->post_instance->delete_posts($params);
1209
+ if (is_array($return) && array_key_exists('error', $return)) {
1210
+ mmb_response($return['error'], false);
1211
+ } else {
1212
+ mmb_response($return, true);
1213
+ }
1214
+ }
1215
+
1216
+ function mmb_get_pages($params)
1217
+ {
1218
+ global $mmb_core;
1219
+ $mmb_core->get_post_instance();
1220
+
1221
+ $return = $mmb_core->post_instance->get_pages($params);
1222
+ if (is_array($return) && array_key_exists('error', $return)) {
1223
+ mmb_response($return['error'], false);
1224
+ } else {
1225
+ mmb_response($return, true);
1226
+ }
1227
+ }
1228
+
1229
+ function mmb_delete_page($params)
1230
+ {
1231
+ global $mmb_core;
1232
+ $mmb_core->get_post_instance();
1233
+
1234
+ $return = $mmb_core->post_instance->delete_page($params);
1235
+ if (is_array($return) && array_key_exists('error', $return)) {
1236
+ mmb_response($return['error'], false);
1237
+ } else {
1238
+ mmb_response($return, true);
1239
+ }
1240
+ }
1241
+
1242
+ function mmb_iframe_plugins_fix($update_actions)
1243
+ {
1244
+ foreach ($update_actions as $key => $action) {
1245
+ $update_actions[$key] = str_replace('target="_parent"', '', $action);
1246
+ }
1247
+
1248
+ return $update_actions;
1249
+ }
1250
+
1251
+ function mmb_execute_php_code($params)
1252
+ {
1253
+ ob_start();
1254
+ $errorHandler = new MWP_Debug_EvalErrorHandler();
1255
+ set_error_handler(array($errorHandler, 'handleError'));
1256
+ $returnValue = eval($params['code']);
1257
+ $errors = $errorHandler->getErrorMessages();
1258
+ restore_error_handler();
1259
+ $return = array('output' => ob_get_clean(), 'returnValue' => $returnValue);
1260
+
1261
+ if (count($errors)) {
1262
+ $return['errorLog'] = $errors;
1263
+ }
1264
+
1265
+ $lastError = error_get_last();
1266
+ $fatalError = null;
1267
+
1268
+ if (($lastError !== null)
1269
+ && ($lastError['type'] & (E_PARSE | E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR))
1270
+ && (strpos($lastError['file'], __FILE__) !== false)
1271
+ && (strpos($lastError['file'], 'eval()') !== false)
1272
+ ) {
1273
+ $return['fatalError'] = $lastError;
1274
+ }
1275
+
1276
+ mmb_response($return, true);
1277
+ }
1278
+
1279
+ function mmb_more_reccurences($schedules)
1280
+ {
1281
+ $schedules['halfminute'] = array('interval' => 30, 'display' => 'Once in a half minute');
1282
+ $schedules['minutely'] = array('interval' => 60, 'display' => 'Once in a minute');
1283
+ $schedules['fiveminutes'] = array('interval' => 300, 'display' => 'Once every five minutes');
1284
+ $schedules['tenminutes'] = array('interval' => 600, 'display' => 'Once every ten minutes');
1285
+ $schedules['sixhours'] = array('interval' => 21600, 'display' => 'Every six hours');
1286
+ $schedules['fourhours'] = array('interval' => 14400, 'display' => 'Every four hours');
1287
+ $schedules['threehours'] = array('interval' => 10800, 'display' => 'Every three hours');
1288
+
1289
+ return $schedules;
1290
+ }
1291
+
1292
+ function mmb_call_scheduled_remote_upload($args)
1293
+ {
1294
+ global $mmb_core, $_wp_using_ext_object_cache;
1295
+ $_wp_using_ext_object_cache = false;
1296
+
1297
+ $mmb_core->get_backup_instance();
1298
+ if (isset($args['task_name'])) {
1299
+ $mmb_core->backup_instance->remote_backup_now($args);
1300
+ }
1301
+ }
1302
+
1303
+ function mwp_check_notifications()
1304
+ {
1305
+ global $mmb_core, $_wp_using_ext_object_cache;
1306
+ $_wp_using_ext_object_cache = false;
1307
+
1308
+ $mmb_core->get_stats_instance();
1309
+ $mmb_core->stats_instance->check_notifications();
1310
+ }
1311
+
1312
+ function mmb_get_plugins_themes($params)
1313
+ {
1314
+ global $mmb_core;
1315
+
1316
+ mwp_context()->requireTheme();
1317
+
1318
+ $mmb_core->get_installer_instance();
1319
+ $return = $mmb_core->installer_instance->get($params);
1320
+ mmb_response($return, true);
1321
+ }
1322
+
1323
+ function mmb_get_autoupdate_plugins_themes($params)
1324
+ {
1325
+ mwp_context()->requireTheme();
1326
+
1327
+ $return = MMB_Updater::getSettings($params);
1328
+ mmb_response($return, true);
1329
+ }
1330
+
1331
+ function mmb_edit_plugins_themes($params)
1332
+ {
1333
+ global $mmb_core;
1334
+ $mmb_core->get_installer_instance();
1335
+ $return = $mmb_core->installer_instance->edit($params);
1336
+ mmb_response($return, true);
1337
+ }
1338
+
1339
+ function mmb_edit_autoupdate_plugins_themes($params)
1340
+ {
1341
+ $return = MMB_Updater::setSettings($params);
1342
+ mmb_response($return, true);
1343
+ }
1344
+
1345
+ function mmb_worker_brand($params)
1346
+ {
1347
+ update_option("mwp_worker_brand", $params['brand']);
1348
+ mmb_response(true, true);
1349
+ }
1350
+
1351
+ function mmb_maintenance_mode($params)
1352
+ {
1353
+ global $wp_object_cache;
1354
+
1355
+ $default = get_option('mwp_maintenace_mode');
1356
+ $params = empty($default) ? $params : array_merge($default, $params);
1357
+ update_option("mwp_maintenace_mode", $params);
1358
+
1359
+ if (!empty($wp_object_cache)) {
1360
+ @$wp_object_cache->flush();
1361
+ }
1362
+ mmb_response(true, true);
1363
+ }
1364
+
1365
+ function mmb_plugin_actions()
1366
+ {
1367
+ global $pagenow, $current_user, $mmode;
1368
+ if (!is_admin() && !in_array($pagenow, array('wp-login.php'))) {
1369
+ $mmode = get_option('mwp_maintenace_mode');
1370
+ if (!empty($mmode)) {
1371
+ if (isset($mmode['active']) && $mmode['active'] == true) {
1372
+ if (isset($current_user->data) && !empty($current_user->data) && isset($mmode['hidecaps']) && !empty($mmode['hidecaps'])) {
1373
+ $usercaps = array();
1374
+ if (isset($current_user->caps) && !empty($current_user->caps)) {
1375
+ $usercaps = $current_user->caps;
1376
+ }
1377
+ foreach ($mmode['hidecaps'] as $cap => $hide) {
1378
+ if (!$hide) {
1379
+ continue;
1380
+ }
1381
+
1382
+ foreach ($usercaps as $ucap => $val) {
1383
+ if ($ucap == $cap) {
1384
+ ob_end_clean();
1385
+ ob_end_flush();
1386
+ die($mmode['template']);
1387
+ }
1388
+ }
1389
+ }
1390
+ } else {
1391
+ die($mmode['template']);
1392
+ }
1393
+ }
1394
+ }
1395
+ }
1396
+
1397
+ if (file_exists(dirname(__FILE__).'/log')) {
1398
+ unlink(dirname(__FILE__).'/log');
1399
+ }
1400
+ }
1401
+
1402
+ function mwp_return_core_reference()
1403
+ {
1404
+ global $mmb_core, $mmb_core_backup;
1405
+ if (!$mmb_core instanceof MMB_Core) {
1406
+ $mmb_core = $mmb_core_backup;
1407
+ }
1408
+ }
1409
+
1410
+ function mwb_edit_redirect_override($location = false, $comment_id = false)
1411
+ {
1412
+ if (isset($_COOKIE[MMB_XFRAME_COOKIE])) {
1413
+ $location = get_site_url().'/wp-admin/edit-comments.php';
1414
+ }
1415
+
1416
+ return $location;
1417
+ }
1418
+
1419
+ function mwp_set_plugin_priority()
1420
+ {
1421
+ $pluginBasename = 'worker/init.php';
1422
+ $activePlugins = get_option('active_plugins');
1423
+
1424
+ if (reset($activePlugins) === $pluginBasename) {
1425
+ return;
1426
+ }
1427
+
1428
+ $workerKey = array_search($pluginBasename, $activePlugins);
1429
+
1430
+ if ($workerKey === false) {
1431
+ return;
1432
+ }
1433
+
1434
+ unset($activePlugins[$workerKey]);
1435
+ array_unshift($activePlugins, $pluginBasename);
1436
+ update_option('active_plugins', array_values($activePlugins));
1437
+ }
1438
+
1439
+ /**
1440
+ * @return MMB_Core
1441
+ */
1442
+ function mwp_core()
1443
+ {
1444
+ static $core;
1445
+
1446
+ global $mmb_core;
1447
+
1448
+ if (!$mmb_core instanceof MMB_Core) {
1449
+ $mmb_core = new MMB_Core();
1450
+ $core = $mmb_core;
1451
+ }
1452
+
1453
+ return $core;
1454
+ }
1455
+
1456
+ /**
1457
+ * Auto-loads classes that may not exists after this plugin's update.
1458
+ */
1459
+ function mwp_load_required_components()
1460
+ {
1461
+ class_exists('MWP_Http_ResponseInterface');
1462
+ class_exists('MWP_Http_Response');
1463
+ class_exists('MWP_Http_LegacyWorkerResponse');
1464
+ class_exists('MWP_Http_JsonResponse');
1465
+ class_exists('MWP_Worker_ActionResponse');
1466
+ class_exists('MWP_Worker_Exception');
1467
+ class_exists('MWP_Event_ActionResponse');
1468
+ class_exists('MWP_Event_MasterResponse');
1469
+ }
1470
+
1471
+ function mmb_change_comment_status($params)
1472
+ {
1473
+ global $mmb_core;
1474
+ $mmb_core->get_comment_instance();
1475
+ $return = $mmb_core->comment_instance->change_status($params);
1476
+ if ($return) {
1477
+ $mmb_core->get_stats_instance();
1478
+ mmb_response($mmb_core->stats_instance->get_comments_stats($params), true);
1479
+ } else {
1480
+ mmb_response('Comment not updated', false);
1481
+ }
1482
+ }
init.php CHANGED
@@ -1,2071 +1,252 @@
1
- <?php
2
- /*
3
- Plugin Name: ManageWP - Worker
4
- Plugin URI: https://managewp.com
5
- Description: ManageWP Worker plugin allows you to manage your WordPress sites from one dashboard. Visit <a href="https://managewp.com">ManageWP.com</a> for more information.
6
- Version: 3.9.30
7
- Author: ManageWP
8
- Author URI: https://managewp.com
9
- License: GPL2
10
- */
11
-
12
- /*************************************************************
13
- * init.php
14
- * Initialize the communication with master
15
- * Copyright (c) 2011 Prelovac Media
16
- * www.prelovac.com
17
- **************************************************************/
18
- if (!defined('ABSPATH')) {
19
- exit;
20
- }
21
-
22
- if (!defined('MMB_WORKER_VERSION')) {
23
- define('MMB_WORKER_VERSION', '3.9.30');
24
- }
25
-
26
- $GLOBALS['MMB_WORKER_VERSION'] = '3.9.30';
27
- $GLOBALS['MMB_WORKER_REVISION'] = '2014-11-24 00:00:00';
28
-
29
- /**
30
- * Reserved memory for fatal error handling execution context.
31
- */
32
- $GLOBALS['mwp_reserved_memory'] = str_repeat(' ', 1024 * 20);
33
- /**
34
- * If we ever get only partially upgraded due to a server error or misconfiguration,
35
- * attempt to disable the plugin and notify the site's administrator via email.
36
- */
37
- function mwp_fail_safe()
38
- {
39
- $GLOBALS['mwp_reserved_memory'] = null;
40
-
41
- $lastError = error_get_last();
42
-
43
- if (!$lastError || $lastError['type'] !== E_ERROR) {
44
- return;
45
- }
46
-
47
- $activePlugins = get_option('active_plugins');
48
- $workerIndex = array_search(plugin_basename(__FILE__), $activePlugins);
49
- if ($workerIndex === false) {
50
- // Plugin is not yet enabled, possibly in activation context.
51
- return;
52
- }
53
-
54
- $errorSource = realpath($lastError['file']);
55
- // We might be in eval() context.
56
- if (!$errorSource) {
57
- return;
58
- }
59
-
60
- // The only fatal error that we would get would be a 'Class 'X' not found in ...', so look out only for those messages.
61
- if (!preg_match('/^Class \'[^\']+\' not found$/', $lastError['message'])) {
62
- return;
63
- }
64
-
65
- // Only look for files that belong to this plugin.
66
- $pluginBase = realpath(dirname(__FILE__));
67
- if (stripos($errorSource, $pluginBase) !== 0) {
68
- return;
69
- }
70
-
71
- unset($activePlugins[$workerIndex]);
72
- // Reset indexes.
73
- $activePlugins = array_values($activePlugins);
74
- update_option('active_plugins', $activePlugins);
75
-
76
- // We probably won't have access to the wp_mail function.
77
- $mailFn = function_exists('wp_mail') ? 'wp_mail' : 'mail';
78
- $siteUrl = get_option('siteurl');
79
- $title = sprintf("ManageWP Worker deactivated on %s", $siteUrl);
80
- $to = get_option('admin_email');
81
- $brand = get_option('mwp_worker_brand');
82
- if (!empty($brand['admin_email'])) {
83
- $to = $brand['admin_email'];
84
- }
85
-
86
- $fullError = print_r($lastError, 1);
87
- $workerSettings = get_option('wrksettings');
88
- $userID = 0;
89
- if (!empty($workerSettings['dataown'])) {
90
- $userID = (int) $workerSettings['dataown'];
91
- }
92
- $body = sprintf('Worker deactivation due to an error. The site that was deactivated - %s. User email - %s (UserID: %s). The error that caused this: %s', $siteUrl, $to, $userID, $fullError);
93
- $mailFn('support@managewp.com', $title, $body);
94
-
95
- // If we're inside a cron scope, don't attempt to hide this error.
96
- if (defined('DOING_CRON') && DOING_CRON) {
97
- return;
98
- }
99
-
100
- // If we're inside a normal request scope, we apologize. Retry the request so user doesn't have to see an ugly error page.
101
- if (!empty($_SERVER['REQUEST_URI'])) {
102
- $siteUrl .= $_SERVER['REQUEST_URI'];
103
- }
104
- if (headers_sent()) {
105
- // The headers are probably sent if the PHP configuration has the 'display_errors' directive enabled. In that case try a meta redirect.
106
- echo sprintf('<meta http-equiv="refresh" content="0; url=%s">', htmlspecialchars($siteUrl, ENT_QUOTES));
107
- } else {
108
- header('Location: '.htmlspecialchars($siteUrl, ENT_QUOTES));
109
- }
110
- exit;
111
- }
112
-
113
- register_shutdown_function('mwp_fail_safe');
114
-
115
- require_once dirname(__FILE__).'/functions.php';
116
-
117
- if (!defined('MMB_XFRAME_COOKIE')) {
118
- $siteurl = function_exists('get_site_option') ? get_site_option('siteurl') : get_option('siteurl');
119
- define('MMB_XFRAME_COOKIE', $xframe = 'wordpress_'.md5($siteurl).'_xframe');
120
- }
121
-
122
- global $wpdb, $mmb_plugin_dir, $mmb_plugin_url, $wp_version, $mmb_filters, $_mmb_item_filter;
123
- if (version_compare(PHP_VERSION, '5.2.0', '<')) // min version 5 supported
124
- {
125
- exit("<p>ManageWP Worker plugin requires PHP 5.2 or higher.</p>");
126
- }
127
-
128
- if (version_compare(PHP_VERSION, '5.3', '<')) {
129
- spl_autoload_register('mwp_autoload');
130
- } else {
131
- // The prepend parameter was added in PHP 5.3.0
132
- spl_autoload_register('mwp_autoload', true, true);
133
- }
134
-
135
- // Will register the logger as the error handler.
136
- mwp_logger();
137
-
138
- $mmb_wp_version = $wp_version;
139
- $mmb_plugin_dir = WP_PLUGIN_DIR.'/'.basename(dirname(__FILE__));
140
- $mmb_plugin_url = WP_PLUGIN_URL.'/'.basename(dirname(__FILE__));
141
-
142
- define('MWP_SHOW_LOG', false);
143
- // <stats.class.php>
144
- add_filter('mwp_website_add', 'MMB_Stats::readd_alerts');
145
- // <backup.class.php>
146
- define('MWP_BACKUP_DIR', WP_CONTENT_DIR.'/managewp/backups');
147
- define('MWP_DB_DIR', MWP_BACKUP_DIR.'/mwp_db');
148
-
149
- mmb_add_action('search_posts_by_term', 'search_posts_by_term');
150
- add_filter('mmb_stats_filter', 'mmb_get_extended_info');
151
- mmb_add_action('cleanup_delete', 'cleanup_delete_worker');
152
- add_action('plugins_loaded', 'mwp_return_core_reference', 1);
153
- // <widget.class.php>
154
- $mwp_worker_brand = get_option("mwp_worker_brand");
155
- $worker_brand = 0;
156
- if (is_array($mwp_worker_brand)) {
157
- if ($mwp_worker_brand['name'] || $mwp_worker_brand['desc'] || $mwp_worker_brand['author'] || $mwp_worker_brand['author_url']) {
158
- $worker_brand = 1;
159
- }
160
- }
161
- if (!$worker_brand) {
162
- add_action('widgets_init', create_function('', 'return register_widget("MMB_Widget");'));
163
- }
164
-
165
- if (!function_exists('mmb_parse_data')) {
166
- function mmb_parse_data($data = array())
167
- {
168
- if (empty($data)) {
169
- return $data;
170
- }
171
-
172
- $data = (array) $data;
173
- if (isset($data['params'])) {
174
- $data['params'] = mmb_filter_params($data['params']);
175
- }
176
-
177
- $postkeys = array('action', 'params', 'id', 'signature', 'setting', 'add_site_signature_id', 'add_site_signature');
178
-
179
- if (!empty($data)) {
180
- foreach ($data as $key => $items) {
181
- if (!in_array($key, $postkeys)) {
182
- unset($data[$key]);
183
- }
184
- }
185
- }
186
-
187
- return $data;
188
- }
189
- }
190
-
191
- if (!function_exists('mmb_filter_params')) {
192
- function mmb_filter_params($array = array())
193
- {
194
-
195
- $filter = array('current_user', 'wpdb');
196
- $return = array();
197
- foreach ($array as $key => $val) {
198
- if (!is_int($key) && in_array($key, $filter)) {
199
- continue;
200
- }
201
-
202
- if (is_array($val)) {
203
- $return[$key] = mmb_filter_params($val);
204
- } else {
205
- $return[$key] = $val;
206
- }
207
- }
208
-
209
- return $return;
210
- }
211
- }
212
- if (!function_exists('mmb_authenticate')) {
213
- function mmb_authenticate()
214
- {
215
- global $_mwp_data, $_mwp_auth, $mmb_core, $HTTP_RAW_POST_DATA;
216
- $compat = false;
217
- $compatActive = false;
218
- $contentType = empty($_SERVER['CONTENT_TYPE']) ? false : $_SERVER['CONTENT_TYPE'];
219
-
220
- if ($compat && empty($_SERVER['HTTP_MWP_ACTION']) && $contentType === 'application/json') {
221
- $compatActive = true;
222
- }
223
-
224
- if (empty($_SERVER['HTTP_MWP_ACTION']) && !$compatActive) {
225
- return;
226
- }
227
-
228
- if (!isset($HTTP_RAW_POST_DATA)) {
229
- $HTTP_RAW_POST_DATA = file_get_contents('php://input');
230
- }
231
- $_mwp_data = json_decode($HTTP_RAW_POST_DATA, true);
232
-
233
- if (!$_mwp_data) {
234
- return;
235
- }
236
- $_mwp_data = mmb_parse_data($_mwp_data);
237
-
238
- if ($compatActive) {
239
- if (empty($_mwp_data['action'])) {
240
- return;
241
- }
242
- $_mwp_data['signature'] = base64_decode($_mwp_data['signature']);
243
- } else {
244
- $_mwp_data['action'] = $_SERVER['HTTP_MWP_ACTION'];
245
- $_mwp_data['id'] = isset($_SERVER['HTTP_MWP_MESSAGE_ID']) ? $_SERVER['HTTP_MWP_MESSAGE_ID'] : "";
246
- $_mwp_data['signature'] = isset($_SERVER['HTTP_MWP_SIGNATURE']) ? base64_decode($_SERVER['HTTP_MWP_SIGNATURE']) : '';
247
- }
248
-
249
- $usernameUsed = array_key_exists('username', $_mwp_data['params']) ? $_mwp_data['params']['username'] : null;
250
- if (empty($_mwp_data['params']['username']) || !$mmb_core->check_if_user_exists($_mwp_data['params']['username'])) {
251
- $filter = array(
252
- 'user_roles' => array(
253
- 'administrator'
254
- ),
255
- 'username' => '',
256
- 'username_filter' => '',
257
- );
258
- $users = $mmb_core->get_user_instance()->get_users($filter);
259
-
260
- if (empty($users['users'])) {
261
- mmb_response('We could not find an administrator user to use. Please contact support.', false);
262
- }
263
-
264
- $_mwp_data['params']['username'] = $users['users'][0]['user_login'];
265
- }
266
-
267
- if (isset($_mwp_data['params']['username']) && !is_user_logged_in()) {
268
- $user = function_exists('get_user_by') ? get_user_by('login', $_mwp_data['params']['username']) : get_user_by('login', $_mwp_data['params']['username']);
269
- }
270
-
271
- if ($_mwp_data['action'] === 'add_site') {
272
- $_mwp_auth = mwp_add_site_verify_signature($_mwp_data, $usernameUsed);
273
- if (isset($user)) {
274
- $GLOBALS['mwp_user_id'] = $user->ID;
275
- }
276
-
277
- return;
278
- } else {
279
- $_mwp_auth = $mmb_core->authenticate_message($_mwp_data['action'].$_mwp_data['id'], $_mwp_data['signature'], $_mwp_data['id']);
280
- }
281
-
282
- if ($_mwp_auth !== true) {
283
- mmb_response($_mwp_auth['error'], false);
284
- }
285
-
286
- if (isset($user)) {
287
- wp_set_current_user($user->ID);
288
- // Compatibility with All In One Security
289
- update_user_meta($user->ID, 'last_login_time', current_time('mysql'));
290
- }
291
-
292
- if (defined('ALTERNATE_WP_CRON') && !defined('DOING_AJAX') && ALTERNATE_WP_CRON === true) {
293
- define('DOING_AJAX', true);
294
- }
295
- }
296
- }
297
-
298
- if (!function_exists("mwp_add_site_verify_signature")) {
299
- function mwp_add_site_verify_signature($_mwp_data, $posted_username = null)
300
- {
301
- global $mmb_plugin_dir;
302
-
303
- $nonce = new MWP_Security_HashNonce();
304
- $nonce->setValue($_mwp_data['id']);
305
- if (!$nonce->verify()) {
306
- $_mwp_auth = array(
307
- 'error' => 'Invalid nonce used. Please contact support'
308
- );
309
- mmb_response($_mwp_auth['error'], false);
310
- } else {
311
-
312
- if (!empty($_mwp_data['add_site_signature']) && !empty($_mwp_data['add_site_signature_id'])) {
313
- $signature = base64_decode($_mwp_data['add_site_signature']);
314
- $signature_id = $_mwp_data['add_site_signature_id'];
315
- $plaintext = array();
316
- $plaintext['setting'] = $_mwp_data['setting'];
317
- $plaintext['params'] = $_mwp_data['params'];
318
- if (isset($posted_username)) {
319
- $plaintext['params']['username'] = $posted_username;
320
- }
321
- if (file_exists($mmb_plugin_dir.'/publickeys/'.$signature_id.'.pub')) {
322
- $plaintext = json_encode($plaintext);
323
- require_once dirname(__FILE__).'/src/PHPSecLib/Crypt/RSA.php';
324
- $rsa = new Crypt_RSA();
325
- $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
326
- $rsa->loadKey(file_get_contents($mmb_plugin_dir.'/publickeys/'.$signature_id.'.pub')); // public key
327
- $_mwp_auth = $rsa->verify($plaintext, $signature);
328
- } else {
329
- $_mwp_auth = false; // we don't have key
330
- }
331
- } else {
332
- $_mwp_auth = false;
333
- }
334
-
335
- if ($_mwp_auth !== true) {
336
- $_mwp_auth = array(
337
- 'error' => 'Invalid message signature. Deactivate and activate the ManageWP Worker plugin on this site, then re-add it to your ManageWP account.'
338
- );
339
- mmb_response($_mwp_auth['error'], false);
340
- }
341
- }
342
-
343
- return $_mwp_auth;
344
- }
345
- }
346
-
347
- if (!function_exists('mmb_parse_request')) {
348
- function mmb_parse_request()
349
- {
350
- global $mmb_core, $wp_db_version, $wpmu_version, $_wp_using_ext_object_cache, $_mwp_data, $_mwp_auth;
351
- if (empty($_mwp_auth)) {
352
- MMB_Stats::set_hit_count();
353
-
354
- return;
355
- }
356
- ob_start();
357
- $_wp_using_ext_object_cache = false;
358
- @set_time_limit(1200);
359
-
360
- if (isset($_mwp_data['setting'])) {
361
- if (array_key_exists("dataown", $_mwp_data['setting'])) {
362
- $oldconfiguration = array("dataown" => $_mwp_data['setting']['dataown']);
363
- $mmb_core->save_options($oldconfiguration);
364
- unset($_mwp_data['setting']['dataown']);
365
- }
366
-
367
- $configurationService = new MWP_Configuration_Service();
368
- $configuration = new MWP_Configuration_Conf($_mwp_data['setting']);
369
- $configurationService->saveConfiguration($configuration);
370
- }
371
-
372
- if ($_mwp_data['action'] === 'add_site') {
373
- mmb_add_site($_mwp_data['params']);
374
- mmb_response('You should never see this.', false);
375
- }
376
-
377
- /* in case database upgrade required, do database backup and perform upgrade ( wordpress wp_upgrade() function ) */
378
- if (strlen(trim($wp_db_version)) && !defined('ACX_PLUGIN_DIR')) {
379
- if (get_option('db_version') != $wp_db_version) {
380
- /* in multisite network, please update database manualy */
381
- if (empty($wpmu_version) || (function_exists('is_multisite') && !is_multisite())) {
382
- if (!function_exists('wp_upgrade')) {
383
- include_once(ABSPATH.'wp-admin/includes/upgrade.php');
384
- }
385
-
386
- ob_clean();
387
- @wp_upgrade();
388
- @do_action('after_db_upgrade');
389
- ob_end_clean();
390
- }
391
- }
392
- }
393
-
394
- if (isset($_mwp_data['params']['secure'])) {
395
- if (is_array($_mwp_data['params']['secure'])) {
396
- $secureParams = $_mwp_data['params']['secure'];
397
- foreach ($secureParams as $key => $value) {
398
- $secureParams[$key] = base64_decode($value);
399
- }
400
- $_mwp_data['params']['secure'] = $secureParams;
401
- } else {
402
- $_mwp_data['params']['secure'] = base64_decode($_mwp_data['params']['secure']);
403
- }
404
- if ($decrypted = $mmb_core->_secure_data($_mwp_data['params']['secure'])) {
405
- $decrypted = maybe_unserialize($decrypted);
406
- if (is_array($decrypted)) {
407
- foreach ($decrypted as $key => $val) {
408
- if (!is_numeric($key)) {
409
- $_mwp_data['params'][$key] = $val;
410
- }
411
- }
412
- unset($_mwp_data['params']['secure']);
413
- } else {
414
- $_mwp_data['params']['secure'] = $decrypted;
415
- }
416
- }
417
-
418
- if (!$decrypted && $mmb_core->get_random_signature() !== false) {
419
- require_once dirname(__FILE__).'/src/PHPSecLib/Crypt/AES.php';
420
- $cipher = new Crypt_AES(CRYPT_AES_MODE_ECB);
421
- $cipher->setKey($mmb_core->get_random_signature());
422
- $decrypted = $cipher->decrypt($_mwp_data['params']['secure']);
423
- $_mwp_data['params']['account_info'] = json_decode($decrypted, true);
424
- }
425
-
426
- }
427
-
428
- $logData = array(
429
- 'action' => $_mwp_data['action'],
430
- 'action_parameters' => $_mwp_data['params'],
431
- 'action_settings' => $_mwp_data['setting'],
432
- );
433
-
434
- if (!empty($_mwp_data['setting'])) {
435
- $logData['settings'] = $_mwp_data['setting'];
436
- }
437
-
438
- mwp_logger()->debug('Master request: "{action}"', $logData);
439
-
440
- if (!$mmb_core->register_action_params($_mwp_data['action'], $_mwp_data['params'])) {
441
- global $_mmb_plugin_actions;
442
- $_mmb_plugin_actions[$_mwp_data['action']] = $_mwp_data['params'];
443
- }
444
-
445
- ob_end_clean();
446
- }
447
- }
448
- /* Main response function */
449
- if (!function_exists('mmb_response')) {
450
-
451
- function mmb_response($response = false, $success = true)
452
- {
453
- $return = array();
454
-
455
- if ((is_array($response) && empty($response)) || (!is_array($response) && strlen($response) == 0)) {
456
- $return['error'] = 'Empty response.';
457
- } else {
458
- if ($success) {
459
- $return['success'] = $response;
460
- } else {
461
- $return['error'] = $response;
462
- }
463
- }
464
-
465
- if (!headers_sent()) {
466
- header('HTTP/1.0 200 OK');
467
- header('Content-Type: text/plain');
468
- }
469
-
470
- mwp_logger()->debug('Master response: {action_response_status}', array(
471
- 'action_response_status' => $success ? 'success' : 'error',
472
- 'action_response' => $return,
473
- 'headers_sent' => headers_sent(),
474
- ));
475
-
476
- exit("<MWPHEADER>".base64_encode(serialize($return))."<ENDMWPHEADER>");
477
- }
478
- }
479
-
480
-
481
- if (!function_exists('mmb_add_site')) {
482
- function mmb_add_site($params)
483
- {
484
- global $mmb_core;
485
- $num = extract($params);
486
-
487
- if ($num) {
488
- if (!get_option('_worker_public_key')) {
489
- $public_key = base64_decode($public_key);
490
-
491
- if (function_exists('openssl_verify')) {
492
- $verify = openssl_verify($action.$id, base64_decode($signature), $public_key);
493
- if ($verify == 1) {
494
- $mmb_core->set_master_public_key($public_key);
495
- //$mmb_core->set_worker_message_id($id);
496
-
497
-
498
- $mmb_core->get_stats_instance();
499
- if (isset($notifications) && is_array($notifications) && !empty($notifications)) {
500
- $mmb_core->stats_instance->set_notifications($notifications);
501
- }
502
- if (isset($brand) && is_array($brand) && !empty($brand)) {
503
- update_option('mwp_worker_brand', $brand);
504
- }
505
-
506
- if (isset($add_settigns) && is_array($add_settigns) && !empty($add_settigns)) {
507
- apply_filters('mwp_website_add', $add_settigns);
508
- }
509
-
510
- mmb_response($mmb_core->stats_instance->get_initial_stats(), true);
511
- } else {
512
- if ($verify == 0) {
513
-
514
- //mmb_response('Site could not be added. OpenSSL verification error: "'.openssl_error_string().'". Contact your hosting support to check the OpenSSL configuration.', false);
515
-
516
- } else {
517
- mmb_response('Command not successful. Please try again.', false);
518
- }
519
- }
520
- }
521
-
522
- if (!get_option('_worker_nossl_key')) {
523
- srand();
524
-
525
- $random_key = md5(base64_encode($public_key).rand(0, getrandmax()));
526
-
527
- $mmb_core->set_random_signature($random_key);
528
- //$mmb_core->set_worker_message_id($id);
529
- $mmb_core->set_master_public_key($public_key);
530
-
531
-
532
- $mmb_core->get_stats_instance();
533
- if (is_array($notifications) && !empty($notifications)) {
534
- $mmb_core->stats_instance->set_notifications($notifications);
535
- }
536
-
537
- if (is_array($brand) && !empty($brand)) {
538
- update_option('mwp_worker_brand', $brand);
539
- }
540
-
541
- mmb_response($mmb_core->stats_instance->get_initial_stats(), true);
542
- } else {
543
- mmb_response('Sorry, we were unable to communicate with your website. Please deactivate, then activate ManageWP Worker plugin on your website and try again or contact our support.', false);
544
- }
545
-
546
- } else {
547
- mmb_response('Sorry, we were unable to communicate with your website. Please deactivate, then activate ManageWP Worker plugin on your website and try again or contact our support.', false);
548
- }
549
- } else {
550
- mmb_response('Invalid parameters received. Please try again.', false);
551
- }
552
- }
553
- }
554
-
555
- if (!function_exists('mmb_remove_site')) {
556
- function mmb_remove_site($params)
557
- {
558
- extract($params);
559
- global $mmb_core;
560
- $mmb_core->uninstall($deactivate);
561
-
562
- include_once(ABSPATH.'wp-admin/includes/plugin.php');
563
- $plugin_slug = basename(dirname(__FILE__)).'/'.basename(__FILE__);
564
-
565
- if ($deactivate) {
566
- deactivate_plugins($plugin_slug, true);
567
- } else {
568
- // Prolong the worker deactivation upon site removal.
569
- update_option('mmb_worker_activation_time', time());
570
- }
571
-
572
- if (!is_plugin_active($plugin_slug)) {
573
- mmb_response(
574
- array(
575
- 'deactivated' => 'Site removed successfully. <br /><br />ManageWP Worker plugin successfully deactivated.'
576
- ),
577
- true
578
- );
579
- } else {
580
- mmb_response(
581
- array(
582
- 'removed_data' => 'Site removed successfully. <br /><br /><b>ManageWP Worker plugin was not deactivated.</b>'
583
- ),
584
- true
585
- );
586
- }
587
-
588
- }
589
- }
590
- if (!function_exists('mmb_stats_get')) {
591
- function mmb_stats_get($params)
592
- {
593
- global $mmb_core;
594
- $mmb_core->get_stats_instance();
595
- mmb_response($mmb_core->stats_instance->get($params), true);
596
- }
597
- }
598
-
599
- if (!function_exists('mmb_worker_header')) {
600
- function mmb_worker_header()
601
- {
602
- global $mmb_core, $current_user;
603
-
604
- if (!headers_sent()) {
605
- if (isset($current_user->ID)) {
606
- $expiration = time() + apply_filters('auth_cookie_expiration', 10800, $current_user->ID, false);
607
- } else {
608
- $expiration = time() + 10800;
609
- }
610
-
611
- setcookie(MMB_XFRAME_COOKIE, md5(MMB_XFRAME_COOKIE), $expiration, COOKIEPATH, COOKIE_DOMAIN, false, true);
612
- $_COOKIE[MMB_XFRAME_COOKIE] = md5(MMB_XFRAME_COOKIE);
613
- }
614
- }
615
- }
616
-
617
- if (!function_exists('mmb_pre_init_stats')) {
618
- function mmb_pre_init_stats($params)
619
- {
620
- global $mmb_core;
621
- $mmb_core->get_stats_instance();
622
-
623
- return $mmb_core->stats_instance->pre_init_stats($params);
624
- }
625
- }
626
-
627
- if (!function_exists('mwp_datasend')) {
628
- function mwp_datasend($params = array())
629
- {
630
- global $mmb_core, $_mmb_item_filter, $_mmb_options;
631
-
632
-
633
- $_mmb_remoteurl = get_option('home');
634
- $_mmb_remoteown = isset($_mmb_options['dataown']) && !empty($_mmb_options['dataown']) ? $_mmb_options['dataown'] : false;
635
-
636
- if (empty($_mmb_remoteown)) {
637
- return;
638
- }
639
-
640
- $_mmb_item_filter['pre_init_stats'] = array('core_update', 'hit_counter', 'comments', 'backups', 'posts', 'drafts', 'scheduled');
641
- $_mmb_item_filter['get'] = array('updates', 'errors');
642
- $mmb_core->get_stats_instance();
643
-
644
- $filter = array(
645
- 'refresh' => 'transient',
646
- 'item_filter' => array(
647
- 'get_stats' => array(
648
- array('updates', array('plugins' => true, 'themes' => true, 'premium' => true)),
649
- array('core_update', array('core' => true)),
650
- array('posts', array('numberposts' => 5)),
651
- array('drafts', array('numberposts' => 5)),
652
- array('scheduled', array('numberposts' => 5)),
653
- array('hit_counter'),
654
- array('comments', array('numberposts' => 5)),
655
- array('backups'),
656
- 'plugins' => array(
657
- 'cleanup' => array(
658
- 'overhead' => array(),
659
- 'revisions' => array('num_to_keep' => 'r_5'),
660
- 'spam' => array(),
661
- )
662
- ),
663
- ),
664
- )
665
- );
666
-
667
- $pre_init_data = $mmb_core->stats_instance->pre_init_stats($filter);
668
- $init_data = $mmb_core->stats_instance->get($filter);
669
-
670
- $data = array_merge($init_data, $pre_init_data);
671
- $data['server_ip'] = $_SERVER['SERVER_ADDR'];
672
- $data['uhost'] = php_uname('n');
673
- $hash = $mmb_core->get_secure_hash();
674
-
675
- if (mwp_datasend_trigger($data)) { // adds trigger to check if really need to send something
676
- $configurationService = new MWP_Configuration_Service();
677
- $configuration = $configurationService->getConfiguration();
678
-
679
- set_transient("mwp_cache_notifications", $data);
680
- set_transient("mwp_cache_notifications_time", time());
681
-
682
- $datasend['datasend'] = $mmb_core->encrypt_data($data);
683
- $datasend['sitehome'] = base64_encode($_mmb_remoteown.'[]'.$_mmb_remoteurl);
684
- $datasend['sitehash'] = md5($hash.$_mmb_remoteown.$_mmb_remoteurl);
685
- $datasend['setting_checksum_order'] = implode(",", array_keys($configuration->getVariables()));
686
- $datasend['setting_checksum'] = md5(json_encode($configuration->toArray()));
687
- if (!class_exists('WP_Http')) {
688
- include_once(ABSPATH.WPINC.'/class-http.php');
689
- }
690
-
691
- $remote = array();
692
- $remote['body'] = $datasend;
693
- $remote['timeout'] = 20;
694
-
695
- $result = wp_remote_post($configuration->getMasterCronUrl(), $remote);
696
- if (!is_wp_error($result)) {
697
- if (isset($result['body']) && !empty($result['body'])) {
698
- $settings = @unserialize($result['body']);
699
- /* rebrand worker or set default */
700
- $brand = '';
701
- if ($settings['worker_brand']) {
702
- $brand = $settings['worker_brand'];
703
- }
704
- update_option("mwp_worker_brand", $brand);
705
- /* change worker version */
706
- $w_version = @$settings['worker_updates']['version'];
707
- $w_url = @$settings['worker_updates']['url'];
708
- if (version_compare($GLOBALS['MMB_WORKER_VERSION'], $w_version, '<')) {
709
- //automatic update
710
- $mmb_core->update_worker_plugin(array("download_url" => $w_url));
711
- }
712
-
713
- if (!empty($settings['mwp_worker_configuration'])) {
714
- require_once dirname(__FILE__).'/src/PHPSecLib/Crypt/RSA.php';
715
- $rsa = new Crypt_RSA();
716
- $keyName = $configuration->getKeyName();
717
- $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
718
- $rsa->loadKey(file_get_contents(dirname(__FILE__)."/publickeys/$keyName.pub")); // public key
719
- $signature = base64_decode($settings['mwp_worker_configuration_signature']);
720
- if ($rsa->verify(json_encode($settings['mwp_worker_configuration']), $signature)) {
721
- $configuration = new MWP_Configuration_Conf($settings['mwp_worker_configuration']);
722
- $configurationService->saveConfiguration($configuration);
723
- }
724
- }
725
- }
726
- } else {
727
- //$mmb_core->_log($result);
728
- }
729
-
730
- }
731
-
732
- }
733
-
734
- }
735
-
736
- if (!function_exists("mwp_datasend_trigger")) {
737
- // trigger function, returns true if notifications should be sent
738
- function mwp_datasend_trigger($stats)
739
- {
740
-
741
- $configurationService = new MWP_Configuration_Service();
742
- $configuration = $configurationService->getConfiguration();
743
-
744
- $cachedData = get_transient("mwp_cache_notifications");
745
- $cacheTime = (int) get_transient("mwp_cache_notifications_time");
746
-
747
- $returnValue = false;
748
- if (false == $cachedData || empty($configuration)) {
749
- $returnValue = true;
750
- }
751
- /**
752
- * Cache lifetime check
753
- */
754
- if (!$returnValue) {
755
- $now = time();
756
- if ($now - $configuration->getNotiCacheLifeTime() >= $cacheTime) {
757
- $returnValue = true;
758
- }
759
- }
760
-
761
- /**
762
- * Themes difference check section
763
- * First check if array differ in size. If same size,then check values difference
764
- */
765
- if (!$returnValue && empty($stats['upgradable_themes']) != empty($cachedData['upgradable_themes'])) {
766
- $returnValue = true;
767
- }
768
- if (!$returnValue && !empty($stats['upgradable_themes'])) {
769
- $themesArr = mwp_std_to_array($stats['upgradable_themes']);
770
- $cachedThemesArr = mwp_std_to_array($cachedData['upgradable_themes']);
771
- if ($themesArr != $cachedThemesArr) {
772
- $returnValue = true;
773
- }
774
- }
775
-
776
- /**
777
- * Plugins difference check section
778
- * First check if array differ in size. If same size,then check values difference
779
- */
780
- if (!$returnValue && empty($stats['upgradable_plugins']) != empty($cachedData['upgradable_plugins'])) {
781
- $returnValue = true;
782
- }
783
-
784
- if (!$returnValue && !empty($stats['upgradable_plugins'])) { //we have hear stdclass
785
- $pluginsArr = mwp_std_to_array($stats['upgradable_plugins']);
786
- $cachedPluginsArr = mwp_std_to_array($cachedData['upgradable_plugins']);
787
- if ($pluginsArr != $cachedPluginsArr) {
788
- $returnValue = true;
789
- }
790
- }
791
-
792
- /**
793
- * Premium difference check section
794
- * First check if array differ in size. If same size,then check values difference
795
- */
796
- if (!$returnValue && empty($stats['premium_updates']) != empty($cachedData['premium_updates'])) {
797
- $returnValue = true;
798
- }
799
- if (!$returnValue && !empty($stats['premium_updates'])) {
800
- $premiumArr = mwp_std_to_array($stats['premium_updates']);
801
- $cachedPremiumArr = mwp_std_to_array($cachedData['premium_updates']);
802
- if ($premiumArr != $cachedPremiumArr) {
803
- $returnValue = true;
804
- }
805
- }
806
- /**
807
- * Comments
808
- * Check if we have configs first, then check trasholds
809
- */
810
- if (!$returnValue && (int) $stats['num_spam_comments'] >= $configuration->getNotiTresholdSpamComments() && $stats['num_spam_comments'] != (int) $cachedData['num_spam_comments']) {
811
- $returnValue = true;
812
- }
813
- if (!$returnValue && (int) $stats['num_spam_comments'] < (int) $cachedData['num_spam_comments']) {
814
- $returnValue = true;
815
- }
816
-
817
- if (!$returnValue && !empty($stats['comments'])) {
818
- if (!empty($stats['comments']['pending']) && count($stats['comments']['pending']) >= $configuration->getNotiTresholdPendingComments()) {
819
- $pendingArr = mwp_std_to_array($stats['comments']['pending']);
820
- $cachedPendingArr = mwp_std_to_array($cachedData['comments']['pending']);
821
- if ($pendingArr != $cachedPendingArr) {
822
- $returnValue = true;
823
- }
824
- }
825
-
826
- if (!empty($stats['comments']['approved']) && count($stats['comments']['approved']) >= $configuration->getNotiTresholdApprovedComments()) {
827
- $approvedArr = mwp_std_to_array($stats['comments']['approved']);
828
- $cachedApprovedArr = mwp_std_to_array($cachedData['comments']['approved']);
829
- if ($approvedArr != $cachedApprovedArr) {
830
- $returnValue = true;
831
- }
832
- }
833
- }
834
-
835
- /**
836
- * Drafts, posts
837
- */
838
-
839
- if (!$returnValue && !empty($stats['drafts']) && count($stats['drafts']) >= $configuration->getNotiTresholdDrafts()) {
840
- if (count($stats['drafts']) > $configuration->getNotiTresholdDrafts() && empty($cachedData['drafts'])) {
841
- $returnValue = true;
842
- } else {
843
- $draftsArr = mwp_std_to_array($stats['drafts']);
844
- $cachedDraftsArr = mwp_std_to_array($cachedData['drafts']);
845
- if ($draftsArr != $cachedDraftsArr) {
846
- $returnValue = true;
847
- }
848
- }
849
-
850
- }
851
-
852
- if (!$returnValue && !empty($stats['posts']) && count($stats['posts']) >= $configuration->getNotiTresholdPosts()) {
853
- if (count($stats['posts']) > $configuration->getNotiTresholdPosts() && empty($cachedData['posts'])) {
854
- $returnValue = true;
855
- } else {
856
- $postsArr = mwp_std_to_array($stats['posts']);
857
- $cachedPostsArr = mwp_std_to_array($cachedData['posts']);
858
- if ($postsArr != $cachedPostsArr) {
859
- $returnValue = true;
860
- }
861
- }
862
- }
863
-
864
- /**
865
- * Core updates & backups
866
- */
867
- if (!$returnValue && empty($stats['core_updates']) != empty($cachedData['core_updates'])) {
868
- $returnValue = true;
869
- }
870
- if (!$returnValue && !empty($stats['core_updates'])) {
871
- $coreArr = mwp_std_to_array($stats['core_updates']);
872
- $cachedCoreArr = mwp_std_to_array($cachedData['core_updates']);
873
- if ($coreArr != $cachedCoreArr) {
874
- $returnValue = true;
875
- }
876
- }
877
-
878
- if (!$returnValue && empty($stats['mwp_backups']) != empty($cachedData['mwp_backups'])) {
879
- $returnValue = true;
880
- }
881
- if (!$returnValue && !empty($stats['mwp_backups'])) {
882
- $backupArr = mwp_std_to_array($stats['mwp_backups']);
883
- $cachedBackupArr = mwp_std_to_array($cachedData['mwp_backups']);
884
- if ($backupArr != $cachedBackupArr) {
885
- $returnValue = true;
886
- }
887
- }
888
-
889
- return $returnValue;
890
- }
891
- }
892
-
893
- if (!function_exists("mwp_std_to_array")) {
894
- function mwp_std_to_array($obj)
895
- {
896
- if (is_object($obj)) {
897
- $objArr = clone $obj;
898
- } else {
899
- $objArr = $obj;
900
- }
901
- if (!empty($objArr)) {
902
- foreach ($objArr as &$element) {
903
- if ($element instanceof stdClass || is_array($element)) {
904
- $element = mwp_std_to_array($element);
905
- }
906
- }
907
- $objArr = (array) $objArr;
908
- }
909
-
910
- return $objArr;
911
- }
912
- }
913
-
914
-
915
- //post
916
- if (!function_exists('mmb_post_create')) {
917
- function mmb_post_create($params)
918
- {
919
- global $mmb_core;
920
- $mmb_core->get_post_instance();
921
- $return = $mmb_core->post_instance->create($params);
922
- if (is_int($return)) {
923
- mmb_response($return, true);
924
- } else {
925
- if (isset($return['error'])) {
926
- mmb_response($return['error'], false);
927
- } else {
928
- mmb_response($return, false);
929
- }
930
- }
931
- }
932
- }
933
-
934
- if (!function_exists('mmb_change_post_status')) {
935
- function mmb_change_post_status($params)
936
- {
937
- global $mmb_core;
938
- $mmb_core->get_post_instance();
939
- $return = $mmb_core->post_instance->change_status($params);
940
- if (is_wp_error($return)) {
941
- mmb_response($return->get_error_message(), false);
942
- } elseif (empty($return)) {
943
- mmb_response("Post status can not be changed", false);
944
- } else {
945
- mmb_response($return, true);
946
- }
947
- }
948
- }
949
-
950
- //comments
951
- if (!function_exists('mmb_change_comment_status')) {
952
- function mmb_change_comment_status($params)
953
- {
954
- global $mmb_core;
955
- $mmb_core->get_comment_instance();
956
- $return = $mmb_core->comment_instance->change_status($params);
957
- //mmb_response($return, true);
958
- if ($return) {
959
- $mmb_core->get_stats_instance();
960
- mmb_response($mmb_core->stats_instance->get_comments_stats($params), true);
961
- } else {
962
- mmb_response('Comment not updated', false);
963
- }
964
- }
965
-
966
- }
967
- if (!function_exists('mmb_comment_stats_get')) {
968
- function mmb_comment_stats_get($params)
969
- {
970
- global $mmb_core;
971
- $mmb_core->get_stats_instance();
972
- mmb_response($mmb_core->stats_instance->get_comments_stats($params), true);
973
- }
974
- }
975
-
976
- if (!function_exists('mmb_backup_now')) {
977
- //backup
978
- function mmb_backup_now($params)
979
- {
980
- global $mmb_core;
981
-
982
- $mmb_core->get_backup_instance();
983
- $return = $mmb_core->backup_instance->backup($params);
984
-
985
- if (is_array($return) && array_key_exists('error', $return)) {
986
- mmb_response($return['error'], false);
987
- } else {
988
- mmb_response($return, true);
989
- }
990
- }
991
- }
992
-
993
- if (!function_exists('mwp_ping_backup')) {
994
- //ping backup
995
- function mwp_ping_backup($params)
996
- {
997
- global $mmb_core;
998
-
999
- $mmb_core->get_backup_instance();
1000
- $return = $mmb_core->backup_instance->ping_backup($params);
1001
-
1002
- if (is_array($return) && array_key_exists('error', $return)) {
1003
- mmb_response($return['error'], false);
1004
- } else {
1005
- mmb_response($return, true);
1006
- }
1007
- }
1008
- }
1009
-
1010
- if (!function_exists('mmb_run_task_now')) {
1011
- function mmb_run_task_now($params)
1012
- {
1013
- global $mmb_core;
1014
- $mmb_core->get_backup_instance();
1015
-
1016
- $task_name = isset($params['task_name']) ? $params['task_name'] : false;
1017
- $google_drive_token = isset($params['google_drive_token']) ? $params['google_drive_token'] : false;
1018
-
1019
- if ($task_name) {
1020
- $return = $mmb_core->backup_instance->task_now($task_name, $google_drive_token);
1021
- if (is_array($return) && array_key_exists('error', $return)) {
1022
- mmb_response($return['error'], false);
1023
- } else {
1024
- mmb_response($return, true);
1025
- }
1026
- } else {
1027
- mmb_response("Task name is not provided.", false);
1028
- }
1029
-
1030
- }
1031
- }
1032
-
1033
- if (!function_exists('mmb_email_backup')) {
1034
- function mmb_email_backup($params)
1035
- {
1036
- global $mmb_core;
1037
- $mmb_core->get_backup_instance();
1038
- $return = $mmb_core->backup_instance->email_backup($params);
1039
-
1040
- if (is_array($return) && array_key_exists('error', $return)) {
1041
- mmb_response($return['error'], false);
1042
- } else {
1043
- mmb_response($return, true);
1044
- }
1045
- }
1046
- }
1047
-
1048
- if (!function_exists('mmb_check_backup_compat')) {
1049
- function mmb_check_backup_compat($params)
1050
- {
1051
- global $mmb_core;
1052
- $mmb_core->get_backup_instance();
1053
- $return = $mmb_core->backup_instance->check_backup_compat($params);
1054
-
1055
- if (is_array($return) && array_key_exists('error', $return)) {
1056
- mmb_response($return['error'], false);
1057
- } else {
1058
- mmb_response($return, true);
1059
- }
1060
- }
1061
- }
1062
-
1063
- if (!function_exists('mmb_get_backup_req')) {
1064
- function mmb_get_backup_req($params)
1065
- {
1066
- global $mmb_core;
1067
- $mmb_core->get_stats_instance();
1068
- $return = $mmb_core->stats_instance->get_backup_req($params);
1069
-
1070
- mmb_response($return, true);
1071
- }
1072
- }
1073
-
1074
- // Fires when Backup Now, or some backup task is saved.
1075
- if (!function_exists('mmb_scheduled_backup')) {
1076
- function mmb_scheduled_backup($params)
1077
- {
1078
- global $mmb_core;
1079
- $mmb_core->get_backup_instance();
1080
- $return = $mmb_core->backup_instance->set_backup_task($params);
1081
- mmb_response($return, $return);
1082
- }
1083
- }
1084
-
1085
- if (!function_exists('mmm_delete_backup')) {
1086
- function mmm_delete_backup($params)
1087
- {
1088
- global $mmb_core;
1089
- $mmb_core->get_backup_instance();
1090
- $return = $mmb_core->backup_instance->delete_backup($params);
1091
- mmb_response($return, $return);
1092
- }
1093
- }
1094
-
1095
- if (!function_exists('mmb_optimize_tables')) {
1096
- function mmb_optimize_tables($params)
1097
- {
1098
- global $mmb_core;
1099
- $mmb_core->get_backup_instance();
1100
- $return = $mmb_core->backup_instance->optimize_tables();
1101
- if ($return) {
1102
- mmb_response($return, true);
1103
- } else {
1104
- mmb_response(false, false);
1105
- }
1106
- }
1107
- }
1108
- if (!function_exists('mmb_restore_now')) {
1109
- function mmb_restore_now($params)
1110
- {
1111
- global $mmb_core;
1112
- $mmb_core->get_backup_instance();
1113
- $return = $mmb_core->backup_instance->restore($params);
1114
- if (is_array($return) && array_key_exists('error', $return)) {
1115
- mmb_response($return['error'], false);
1116
- } else {
1117
- mmb_response($return, true);
1118
- }
1119
-
1120
- }
1121
- }
1122
-
1123
- if (!function_exists('mmb_remote_backup_now')) {
1124
- function mmb_remote_backup_now($params)
1125
- {
1126
- global $mmb_core;
1127
- $backup_instance = $mmb_core->get_backup_instance();
1128
- $return = $mmb_core->backup_instance->remote_backup_now($params);
1129
- if (is_array($return) && array_key_exists('error', $return)) {
1130
- mmb_response($return['error'], false);
1131
- } else {
1132
- mmb_response($return, true);
1133
- }
1134
- }
1135
- }
1136
-
1137
-
1138
- if (!function_exists('mmb_clean_orphan_backups')) {
1139
- function mmb_clean_orphan_backups()
1140
- {
1141
- global $mmb_core;
1142
- $backup_instance = $mmb_core->get_backup_instance();
1143
- $return = $mmb_core->backup_instance->cleanup();
1144
- if (is_array($return)) {
1145
- mmb_response($return, true);
1146
- } else {
1147
- mmb_response($return, false);
1148
- }
1149
- }
1150
- }
1151
-
1152
- function mmb_run_forked_action()
1153
- {
1154
- if (!isset($_POST['mmb_fork_nonce'])) {
1155
- return false;
1156
- }
1157
-
1158
- $originalUser = wp_get_current_user();
1159
- $usernameUsed = array_key_exists('username', $_POST) ? $_POST : null;
1160
-
1161
- if ($usernameUsed && !is_user_logged_in()) {
1162
- $user = function_exists('get_user_by') ? get_user_by('login', $_POST['username']) : get_user_by('login', $_POST['username']);
1163
- }
1164
-
1165
- if (isset($user) && isset($user->ID)) {
1166
- wp_set_current_user($user->ID);
1167
- // Compatibility with All In One Security
1168
- update_user_meta($user->ID, 'last_login_time', current_time('mysql'));
1169
- }
1170
-
1171
- if (!wp_verify_nonce($_POST['mmb_fork_nonce'], 'mmb-fork-nonce')) {
1172
- wp_set_current_user($originalUser->ID);
1173
-
1174
- return false;
1175
- }
1176
-
1177
- $public_key = get_option('_worker_public_key');
1178
- if (!isset($_POST['public_key']) || $public_key !== $_POST['public_key']) {
1179
- wp_set_current_user($originalUser->ID);
1180
-
1181
- return false;
1182
- }
1183
- $args = @json_decode(stripslashes($_POST['args']), true);
1184
- $args['forked'] = true;
1185
-
1186
- if (!isset($args)) {
1187
- wp_set_current_user($originalUser->ID);
1188
-
1189
- return false;
1190
- }
1191
- $cron_action = isset($_POST['mwp_forked_action']) ? $_POST['mwp_forked_action'] : false;
1192
- if ($cron_action) {
1193
- do_action($cron_action, $args);
1194
- }
1195
- //unset($_POST['public_key']);
1196
- unset($_POST['mmb_fork_nonce']);
1197
- unset($_POST['args']);
1198
- unset($_POST['mwp_forked_action']);
1199
-
1200
- wp_set_current_user($originalUser->ID);
1201
-
1202
- return true;
1203
- }
1204
-
1205
- add_filter('mwp_website_add', 'mmb_readd_backup_task');
1206
-
1207
- if (!function_exists('mmb_readd_backup_task')) {
1208
- function mmb_readd_backup_task($params = array())
1209
- {
1210
- global $mmb_core;
1211
- $backup_instance = $mmb_core->get_backup_instance();
1212
- $settings = $backup_instance->readd_tasks($params);
1213
-
1214
- return $settings;
1215
- }
1216
- }
1217
-
1218
- if (!function_exists('mmb_update_worker_plugin')) {
1219
- function mmb_update_worker_plugin($params)
1220
- {
1221
- global $mmb_core;
1222
- mmb_response($mmb_core->update_worker_plugin($params), true);
1223
- }
1224
- }
1225
-
1226
- if (!function_exists('mmb_wp_checkversion')) {
1227
- function mmb_wp_checkversion($params)
1228
- {
1229
- include_once(ABSPATH.'wp-includes/version.php');
1230
- global $mmb_wp_version, $mmb_core;
1231
- mmb_response($mmb_wp_version, true);
1232
- }
1233
- }
1234
- if (!function_exists('mmb_search_posts_by_term')) {
1235
- function mmb_search_posts_by_term($params)
1236
- {
1237
- global $mmb_core;
1238
- $mmb_core->get_search_instance();
1239
-
1240
- $search_type = trim($params['search_type']);
1241
- $search_term = strtolower(trim($params['search_term']));
1242
-
1243
- switch ($search_type) {
1244
- case 'page_post':
1245
- $return = $mmb_core->search_instance->search_posts_by_term($params);
1246
- if ($return) {
1247
- $return = serialize($return);
1248
- mmb_response($return, true);
1249
- } else {
1250
- mmb_response('No posts found', false);
1251
- }
1252
- break;
1253
-
1254
- case 'plugin':
1255
- $plugins = get_option('active_plugins');
1256
-
1257
- $have_plugin = false;
1258
- foreach ($plugins as $plugin) {
1259
- if (strpos($plugin, $search_term) > -1) {
1260
- $have_plugin = true;
1261
- }
1262
- }
1263
- if ($have_plugin) {
1264
- mmb_response(serialize($plugin), true);
1265
- } else {
1266
- mmb_response(false, false);
1267
- }
1268
- break;
1269
- case 'theme':
1270
- $theme = strtolower(get_option('template'));
1271
- if (strpos($theme, $search_term) > -1) {
1272
- mmb_response($theme, true);
1273
- } else {
1274
- mmb_response(false, false);
1275
- }
1276
- break;
1277
- default:
1278
- mmb_response(false, false);
1279
- }
1280
- $return = $mmb_core->search_instance->search_posts_by_term($params);
1281
-
1282
-
1283
- if ($return_if_true) {
1284
- mmb_response($return_value, true);
1285
- } else {
1286
- mmb_response($return_if_false, false);
1287
- }
1288
- }
1289
- }
1290
-
1291
- if (!function_exists('mmb_install_addon')) {
1292
- function mmb_install_addon($params)
1293
- {
1294
- global $mmb_core;
1295
- $mmb_core->get_installer_instance();
1296
- $return = $mmb_core->installer_instance->install_remote_file($params);
1297
- mmb_response($return, true);
1298
-
1299
- }
1300
- }
1301
-
1302
- if (!function_exists('mmb_install_addons')) {
1303
- function mmb_install_addons($params)
1304
- {
1305
- global $mmb_core;
1306
- $mmb_core->get_installer_instance();
1307
- $return = $mmb_core->installer_instance->install_remote_files($params);
1308
- mmb_response($return, true);
1309
-
1310
- }
1311
- }
1312
-
1313
- if (!function_exists('mmb_do_upgrade')) {
1314
- function mmb_do_upgrade($params)
1315
- {
1316
- global $mmb_core, $mmb_upgrading;
1317
- $mmb_core->get_installer_instance();
1318
- $return = $mmb_core->installer_instance->do_upgrade($params);
1319
- mmb_response($return, true);
1320
-
1321
- }
1322
- }
1323
-
1324
- if (!function_exists('mmb_get_links')) {
1325
- function mmb_get_links($params)
1326
- {
1327
- global $mmb_core;
1328
- $mmb_core->get_link_instance();
1329
- $return = $mmb_core->link_instance->get_links($params);
1330
- if (is_array($return) && array_key_exists('error', $return)) {
1331
- mmb_response($return['error'], false);
1332
- } else {
1333
- mmb_response($return, true);
1334
- }
1335
- }
1336
- }
1337
-
1338
- if (!function_exists('mmb_add_link')) {
1339
- function mmb_add_link($params)
1340
- {
1341
- global $mmb_core;
1342
- $mmb_core->get_link_instance();
1343
- $return = $mmb_core->link_instance->add_link($params);
1344
- if (is_array($return) && array_key_exists('error', $return)) {
1345
- mmb_response($return['error'], false);
1346
- } else {
1347
- mmb_response($return, true);
1348
- }
1349
-
1350
- }
1351
- }
1352
-
1353
- if (!function_exists('mmb_delete_link')) {
1354
- function mmb_delete_link($params)
1355
- {
1356
- global $mmb_core;
1357
- $mmb_core->get_link_instance();
1358
-
1359
- $return = $mmb_core->link_instance->delete_link($params);
1360
- if (is_array($return) && array_key_exists('error', $return)) {
1361
- mmb_response($return['error'], false);
1362
- } else {
1363
- mmb_response($return, true);
1364
- }
1365
- }
1366
- }
1367
-
1368
- if (!function_exists('mmb_delete_links')) {
1369
- function mmb_delete_links($params)
1370
- {
1371
- global $mmb_core;
1372
- $mmb_core->get_link_instance();
1373
-
1374
- $return = $mmb_core->link_instance->delete_links($params);
1375
- if (is_array($return) && array_key_exists('error', $return)) {
1376
- mmb_response($return['error'], false);
1377
- } else {
1378
- mmb_response($return, true);
1379
- }
1380
- }
1381
- }
1382
-
1383
- if (!function_exists('mmb_get_comments')) {
1384
- function mmb_get_comments($params)
1385
- {
1386
- global $mmb_core;
1387
- $mmb_core->get_comment_instance();
1388
- $return = $mmb_core->comment_instance->get_comments($params);
1389
- if (is_array($return) && array_key_exists('error', $return)) {
1390
- mmb_response($return['error'], false);
1391
- } else {
1392
- mmb_response($return, true);
1393
- }
1394
- }
1395
- }
1396
-
1397
- if (!function_exists('mmb_action_comment')) {
1398
- function mmb_action_comment($params)
1399
- {
1400
- global $mmb_core;
1401
- $mmb_core->get_comment_instance();
1402
-
1403
- $return = $mmb_core->comment_instance->action_comment($params);
1404
- if (is_array($return) && array_key_exists('error', $return)) {
1405
- mmb_response($return['error'], false);
1406
- } else {
1407
- mmb_response($return, true);
1408
- }
1409
- }
1410
- }
1411
-
1412
- if (!function_exists('mmb_bulk_action_comments')) {
1413
- function mmb_bulk_action_comments($params)
1414
- {
1415
- global $mmb_core;
1416
- $mmb_core->get_comment_instance();
1417
-
1418
- $return = $mmb_core->comment_instance->bulk_action_comments($params);
1419
- if (is_array($return) && array_key_exists('error', $return)) {
1420
- mmb_response($return['error'], false);
1421
- } else {
1422
- mmb_response($return, true);
1423
- }
1424
- }
1425
- }
1426
-
1427
- if (!function_exists('mmb_reply_comment')) {
1428
- function mmb_reply_comment($params)
1429
- {
1430
- global $mmb_core;
1431
- $mmb_core->get_comment_instance();
1432
-
1433
- $return = $mmb_core->comment_instance->reply_comment($params);
1434
- if (is_array($return) && array_key_exists('error', $return)) {
1435
- mmb_response($return['error'], false);
1436
- } else {
1437
- mmb_response($return, true);
1438
- }
1439
- }
1440
- }
1441
-
1442
- if (!function_exists('mmb_add_user')) {
1443
- function mmb_add_user($params)
1444
- {
1445
- global $mmb_core;
1446
- $mmb_core->get_user_instance();
1447
- $return = $mmb_core->user_instance->add_user($params);
1448
- if (is_array($return) && array_key_exists('error', $return)) {
1449
- mmb_response($return['error'], false);
1450
- } else {
1451
- mmb_response($return, true);
1452
- }
1453
-
1454
- }
1455
- }
1456
-
1457
- if (!function_exists('mbb_security_check')) {
1458
- function mbb_security_check($params)
1459
- {
1460
- global $mmb_core;
1461
- $mmb_core->get_security_instance();
1462
- $return = $mmb_core->security_instance->security_check($params);
1463
- if (is_array($return) && array_key_exists('error', $return)) {
1464
- mmb_response($return['error'], false);
1465
- } else {
1466
- mmb_response($return, true);
1467
- }
1468
-
1469
- }
1470
- }
1471
-
1472
- if (!function_exists('mbb_security_fix_folder_listing')) {
1473
- function mbb_security_fix_folder_listing($params)
1474
- {
1475
- global $mmb_core;
1476
- $mmb_core->get_security_instance();
1477
- $return = $mmb_core->security_instance->security_fix_dir_listing($params);
1478
- if (is_array($return) && array_key_exists('error', $return)) {
1479
- mmb_response($return['error'], false);
1480
- } else {
1481
- mmb_response($return, true);
1482
- }
1483
-
1484
- }
1485
- }
1486
-
1487
- if (!function_exists('mbb_security_fix_php_reporting')) {
1488
- function mbb_security_fix_php_reporting($params)
1489
- {
1490
- global $mmb_core;
1491
- $mmb_core->get_security_instance();
1492
- $return = $mmb_core->security_instance->security_fix_php_reporting($params);
1493
- if (is_array($return) && array_key_exists('error', $return)) {
1494
- mmb_response($return['error'], false);
1495
- } else {
1496
- mmb_response($return, true);
1497
- }
1498
-
1499
- }
1500
- }
1501
-
1502
- if (!function_exists('mbb_security_fix_database_reporting')) {
1503
- function mbb_security_fix_database_reporting($params)
1504
- {
1505
- global $mmb_core;
1506
- $mmb_core->get_security_instance();
1507
- $return = $mmb_core->security_instance->security_fix_database_reporting($params);
1508
- if (is_array($return) && array_key_exists('error', $return)) {
1509
- mmb_response($return['error'], false);
1510
- } else {
1511
- mmb_response($return, true);
1512
- }
1513
-
1514
- }
1515
- }
1516
-
1517
- //security_fix_wp_version
1518
-
1519
- if (!function_exists('mbb_security_fix_wp_version')) {
1520
- function mbb_security_fix_wp_version($params)
1521
- {
1522
- global $mmb_core;
1523
- $mmb_core->get_security_instance();
1524
- $return = $mmb_core->security_instance->security_fix_wp_version($params);
1525
- if (is_array($return) && array_key_exists('error', $return)) {
1526
- mmb_response($return['error'], false);
1527
- } else {
1528
- mmb_response($return, true);
1529
- }
1530
-
1531
- }
1532
- }
1533
-
1534
- //mbb_security_fix_admin_username
1535
-
1536
- if (!function_exists('mbb_security_fix_admin_username')) {
1537
- function mbb_security_fix_admin_username($params)
1538
- {
1539
- global $mmb_core;
1540
- $mmb_core->get_security_instance();
1541
- $return = $mmb_core->security_instance->security_fix_admin_username($params);
1542
- if (is_array($return) && array_key_exists('error', $return)) {
1543
- mmb_response($return['error'], false);
1544
- } else {
1545
- mmb_response($return, true);
1546
- }
1547
-
1548
- }
1549
- }
1550
-
1551
- if (!function_exists('mbb_security_fix_scripts_styles')) {
1552
- function mbb_security_fix_scripts_styles($params)
1553
- {
1554
- global $mmb_core;
1555
- $mmb_core->get_security_instance();
1556
- $return = $mmb_core->security_instance->security_fix_scripts_styles($params);
1557
- if (is_array($return) && array_key_exists('error', $return)) {
1558
- mmb_response($return['error'], false);
1559
- } else {
1560
- mmb_response($return, true);
1561
- }
1562
-
1563
- }
1564
- }
1565
-
1566
- //mbb_security_fix_file_permission
1567
- if (!function_exists('mbb_security_fix_file_permission')) {
1568
- function mbb_security_fix_file_permission($params)
1569
- {
1570
- global $mmb_core;
1571
- $mmb_core->get_security_instance();
1572
- $return = $mmb_core->security_instance->security_fix_permissions($params);
1573
- if (is_array($return) && array_key_exists('error', $return)) {
1574
- mmb_response($return['error'], false);
1575
- } else {
1576
- mmb_response($return, true);
1577
- }
1578
-
1579
- }
1580
- }
1581
-
1582
- //mbb_security_fix_all
1583
- if (!function_exists('mbb_security_fix_all')) {
1584
- function mbb_security_fix_all($params)
1585
- {
1586
- global $mmb_core;
1587
- $mmb_core->get_security_instance();
1588
- $return = $mmb_core->security_instance->security_fix_all($params);
1589
- if (is_array($return) && array_key_exists('error', $return)) {
1590
- mmb_response($return['error'], false);
1591
- } else {
1592
- mmb_response($return, true);
1593
- }
1594
- }
1595
- }
1596
-
1597
- //mbb_security_fix_htaccess_permission
1598
-
1599
- if (!function_exists('mbb_security_fix_htaccess_permission')) {
1600
- function mbb_security_fix_htaccess_permission($params)
1601
- {
1602
- global $mmb_core;
1603
- $mmb_core->get_security_instance();
1604
- $return = $mmb_core->security_instance->security_fix_htaccess_permission($params);
1605
- if (is_array($return) && array_key_exists('error', $return)) {
1606
- mmb_response($return['error'], false);
1607
- } else {
1608
- mmb_response($return, true);
1609
- }
1610
-
1611
- }
1612
- }
1613
-
1614
- if (!function_exists('mmb_get_users')) {
1615
- function mmb_get_users($params)
1616
- {
1617
- global $mmb_core;
1618
- $mmb_core->get_user_instance();
1619
- $return = $mmb_core->user_instance->get_users($params);
1620
- if (is_array($return) && array_key_exists('error', $return)) {
1621
- mmb_response($return['error'], false);
1622
- } else {
1623
- mmb_response($return, true);
1624
- }
1625
- }
1626
- }
1627
-
1628
- if (!function_exists('mmb_edit_users')) {
1629
- function mmb_edit_users($params)
1630
- {
1631
- global $mmb_core;
1632
- $mmb_core->get_user_instance();
1633
- $users = $mmb_core->user_instance->edit_users($params);
1634
- $response = 'User updated.';
1635
- $check_error = false;
1636
- foreach ($users as $username => $user) {
1637
- $check_error = array_key_exists('error', $user);
1638
- if ($check_error) {
1639
- $response = $username.': '.$user['error'];
1640
- }
1641
- }
1642
- mmb_response($response, !$check_error);
1643
- }
1644
- }
1645
-
1646
- if (!function_exists('mmb_get_posts')) {
1647
- function mmb_get_posts($params)
1648
- {
1649
- global $mmb_core;
1650
- $mmb_core->get_post_instance();
1651
-
1652
- $return = $mmb_core->post_instance->get_posts($params);
1653
- if (is_array($return) && array_key_exists('error', $return)) {
1654
- mmb_response($return['error'], false);
1655
- } else {
1656
- mmb_response($return, true);
1657
- }
1658
- }
1659
- }
1660
-
1661
- if (!function_exists('mmb_delete_post')) {
1662
- function mmb_delete_post($params)
1663
- {
1664
- global $mmb_core;
1665
- $mmb_core->get_post_instance();
1666
-
1667
- $return = $mmb_core->post_instance->delete_post($params);
1668
- if (is_array($return) && array_key_exists('error', $return)) {
1669
- mmb_response($return['error'], false);
1670
- } else {
1671
- mmb_response($return, true);
1672
- }
1673
- }
1674
- }
1675
-
1676
- if (!function_exists('mmb_delete_posts')) {
1677
- function mmb_delete_posts($params)
1678
- {
1679
- global $mmb_core;
1680
- $mmb_core->get_post_instance();
1681
-
1682
- $return = $mmb_core->post_instance->delete_posts($params);
1683
- if (is_array($return) && array_key_exists('error', $return)) {
1684
- mmb_response($return['error'], false);
1685
- } else {
1686
- mmb_response($return, true);
1687
- }
1688
- }
1689
- }
1690
-
1691
-
1692
- if (!function_exists('mmb_edit_posts')) {
1693
- function mmb_edit_posts($params)
1694
- {
1695
- global $mmb_core;
1696
- $mmb_core->get_posts_instance();
1697
- $return = $mmb_core->posts_instance->edit_posts($params);
1698
- mmb_response($return, true);
1699
- }
1700
- }
1701
-
1702
- if (!function_exists('mmb_get_pages')) {
1703
- function mmb_get_pages($params)
1704
- {
1705
- global $mmb_core;
1706
- $mmb_core->get_post_instance();
1707
-
1708
- $return = $mmb_core->post_instance->get_pages($params);
1709
- if (is_array($return) && array_key_exists('error', $return)) {
1710
- mmb_response($return['error'], false);
1711
- } else {
1712
- mmb_response($return, true);
1713
- }
1714
- }
1715
- }
1716
-
1717
- if (!function_exists('mmb_delete_page')) {
1718
- function mmb_delete_page($params)
1719
- {
1720
- global $mmb_core;
1721
- $mmb_core->get_post_instance();
1722
-
1723
- $return = $mmb_core->post_instance->delete_page($params);
1724
- if (is_array($return) && array_key_exists('error', $return)) {
1725
- mmb_response($return['error'], false);
1726
- } else {
1727
- mmb_response($return, true);
1728
- }
1729
- }
1730
- }
1731
-
1732
- if (!function_exists('mmb_iframe_plugins_fix')) {
1733
- function mmb_iframe_plugins_fix($update_actions)
1734
- {
1735
- foreach ($update_actions as $key => $action) {
1736
- $update_actions[$key] = str_replace('target="_parent"', '', $action);
1737
- }
1738
-
1739
- return $update_actions;
1740
-
1741
- }
1742
- }
1743
- if (!function_exists('mmb_execute_php_code')) {
1744
- function mmb_execute_php_code($params)
1745
- {
1746
- ob_start();
1747
- eval($params['code']);
1748
- $return = ob_get_flush();
1749
- mmb_response(print_r($return, true), true);
1750
- }
1751
- }
1752
-
1753
- if (!function_exists('mmb_set_notifications')) {
1754
- function mmb_set_notifications($params)
1755
- {
1756
- global $mmb_core;
1757
- $mmb_core->get_stats_instance();
1758
- $return = $mmb_core->stats_instance->set_notifications($params);
1759
- if (is_array($return) && array_key_exists('error', $return)) {
1760
- mmb_response($return['error'], false);
1761
- } else {
1762
- mmb_response($return, true);
1763
- }
1764
-
1765
- }
1766
- }
1767
-
1768
- if (!function_exists('mmb_get_dbname')) {
1769
- function mmb_get_dbname($params)
1770
- {
1771
- global $mmb_core;
1772
- $mmb_core->get_stats_instance();
1773
-
1774
- $return = $mmb_core->stats_instance->get_active_db();
1775
- if (is_array($return) && array_key_exists('error', $return)) {
1776
- mmb_response($return['error'], false);
1777
- } else {
1778
- mmb_response($return, true);
1779
- }
1780
- }
1781
- }
1782
-
1783
- if (!function_exists('mmb_more_reccurences')) {
1784
- //Backup Tasks
1785
- add_filter('cron_schedules', 'mmb_more_reccurences');
1786
- function mmb_more_reccurences($schedules)
1787
- {
1788
- $schedules['halfminute'] = array('interval' => 30, 'display' => 'Once in a half minute');
1789
- $schedules['minutely'] = array('interval' => 60, 'display' => 'Once in a minute');
1790
- $schedules['fiveminutes'] = array('interval' => 300, 'display' => 'Once every five minutes');
1791
- $schedules['tenminutes'] = array('interval' => 600, 'display' => 'Once every ten minutes');
1792
- $schedules['sixhours'] = array('interval' => 21600, 'display' => 'Every six hours');
1793
- $schedules['fourhours'] = array('interval' => 14400, 'display' => 'Every four hours');
1794
- $schedules['threehours'] = array('interval' => 10800, 'display' => 'Every three hours');
1795
-
1796
- return $schedules;
1797
- }
1798
- }
1799
-
1800
- add_action('mwp_backup_tasks', 'mwp_check_backup_tasks');
1801
-
1802
- if (!function_exists('mwp_check_backup_tasks')) {
1803
- function mwp_check_backup_tasks()
1804
- {
1805
- global $mmb_core, $_wp_using_ext_object_cache;
1806
- $_wp_using_ext_object_cache = false;
1807
- $mmb_core->get_backup_instance();
1808
- $mmb_core->backup_instance->check_backup_tasks();
1809
- }
1810
- }
1811
-
1812
- // Remote upload in the second request.
1813
- // add_action('mmb_scheduled_remote_upload', 'mmb_call_scheduled_remote_upload');
1814
- add_action('mmb_remote_upload', 'mmb_call_scheduled_remote_upload');
1815
-
1816
- if (!function_exists('mmb_call_scheduled_remote_upload')) {
1817
- function mmb_call_scheduled_remote_upload($args)
1818
- {
1819
- global $mmb_core, $_wp_using_ext_object_cache;
1820
- $_wp_using_ext_object_cache = false;
1821
-
1822
- $mmb_core->get_backup_instance();
1823
- if (isset($args['task_name'])) {
1824
- $mmb_core->backup_instance->remote_backup_now($args);
1825
- }
1826
- }
1827
- }
1828
-
1829
- // if (!wp_next_scheduled('mwp_notifications')) {
1830
- // wp_schedule_event( time(), 'twicedaily', 'mwp_notifications' );
1831
- // }
1832
- // add_action('mwp_notifications', 'mwp_check_notifications');
1833
-
1834
- if (!wp_next_scheduled('mwp_datasend')) {
1835
- wp_schedule_event(time(), 'threehours', 'mwp_datasend');
1836
- }
1837
-
1838
- add_action('mwp_datasend', 'mwp_datasend');
1839
-
1840
- if (!function_exists('mwp_check_notifications')) {
1841
- function mwp_check_notifications()
1842
- {
1843
- global $mmb_core, $_wp_using_ext_object_cache;
1844
- $_wp_using_ext_object_cache = false;
1845
-
1846
- $mmb_core->get_stats_instance();
1847
- $mmb_core->stats_instance->check_notifications();
1848
- }
1849
- }
1850
-
1851
-
1852
- if (!function_exists('mmb_get_plugins_themes')) {
1853
- function mmb_get_plugins_themes($params)
1854
- {
1855
- global $mmb_core;
1856
- $mmb_core->get_installer_instance();
1857
- $return = $mmb_core->installer_instance->get($params);
1858
- mmb_response($return, true);
1859
- }
1860
- }
1861
-
1862
-
1863
- if (!function_exists('mmb_get_autoupdate_plugins_themes')) {
1864
- function mmb_get_autoupdate_plugins_themes($params)
1865
- {
1866
- $return = MMB_Updater::getSettings($params);
1867
- mmb_response($return, true);
1868
- }
1869
- }
1870
-
1871
- if (!function_exists('mmb_edit_plugins_themes')) {
1872
- function mmb_edit_plugins_themes($params)
1873
- {
1874
- global $mmb_core;
1875
- $mmb_core->get_installer_instance();
1876
- $return = $mmb_core->installer_instance->edit($params);
1877
- mmb_response($return, true);
1878
- }
1879
- }
1880
-
1881
- if (!function_exists('mmb_edit_autoupdate_plugins_themes')) {
1882
- function mmb_edit_autoupdate_plugins_themes($params)
1883
- {
1884
- $return = MMB_Updater::setSettings($params);
1885
- mmb_response($return, true);
1886
- }
1887
- }
1888
-
1889
- if (!function_exists('mmb_worker_brand')) {
1890
- function mmb_worker_brand($params)
1891
- {
1892
- update_option("mwp_worker_brand", $params['brand']);
1893
- mmb_response(true, true);
1894
- }
1895
- }
1896
-
1897
- if (!function_exists('mmb_maintenance_mode')) {
1898
- function mmb_maintenance_mode($params)
1899
- {
1900
- global $wp_object_cache;
1901
-
1902
- $default = get_option('mwp_maintenace_mode');
1903
- $params = empty($default) ? $params : array_merge($default, $params);
1904
- update_option("mwp_maintenace_mode", $params);
1905
-
1906
- if (!empty($wp_object_cache)) {
1907
- @$wp_object_cache->flush();
1908
- }
1909
- mmb_response(true, true);
1910
- }
1911
- }
1912
-
1913
- if (!function_exists('mmb_plugin_actions')) {
1914
- function mmb_plugin_actions()
1915
- {
1916
- global $mmb_actions, $mmb_core;
1917
-
1918
- if (!empty($mmb_actions)) {
1919
- global $_mmb_plugin_actions;
1920
- if (!empty($_mmb_plugin_actions)) {
1921
- $failed = array();
1922
- foreach ($_mmb_plugin_actions as $action => $params) {
1923
- if (isset($mmb_actions[$action])) {
1924
- call_user_func($mmb_actions[$action], $params);
1925
- } else {
1926
- $failed[] = $action;
1927
- }
1928
- }
1929
- if (!empty($failed)) {
1930
- $f = implode(', ', $failed);
1931
- $s = count($f) > 1 ? 'Actions "'.$f.'" do' : 'Action "'.$f.'" does';
1932
- mmb_response($s.' not exist. Please update your Worker plugin.', false);
1933
- }
1934
-
1935
- }
1936
- }
1937
-
1938
- global $pagenow, $current_user, $mmode;
1939
- if (!is_admin() && !in_array($pagenow, array('wp-login.php'))) {
1940
- $mmode = get_option('mwp_maintenace_mode');
1941
- if (!empty($mmode)) {
1942
- if (isset($mmode['active']) && $mmode['active'] == true) {
1943
- if (isset($current_user->data) && !empty($current_user->data) && isset($mmode['hidecaps']) && !empty($mmode['hidecaps'])) {
1944
- $usercaps = array();
1945
- if (isset($current_user->caps) && !empty($current_user->caps)) {
1946
- $usercaps = $current_user->caps;
1947
- }
1948
- foreach ($mmode['hidecaps'] as $cap => $hide) {
1949
- if (!$hide) {
1950
- continue;
1951
- }
1952
-
1953
- foreach ($usercaps as $ucap => $val) {
1954
- if ($ucap == $cap) {
1955
- ob_end_clean();
1956
- ob_end_flush();
1957
- die($mmode['template']);
1958
- }
1959
- }
1960
- }
1961
- } else {
1962
- die($mmode['template']);
1963
- }
1964
- }
1965
- }
1966
- }
1967
-
1968
- if (file_exists(dirname(__FILE__).'/log')) {
1969
- unlink(dirname(__FILE__).'/log');
1970
- }
1971
- }
1972
- }
1973
-
1974
- $mmb_core = $mmb_core_backup = new MMB_Core();
1975
-
1976
- if (isset($_GET['auto_login'])) {
1977
- $mmb_core->automatic_login();
1978
- }
1979
-
1980
- MMB_Updater::register();
1981
-
1982
-
1983
- if (!function_exists('mwp_return_core_reference')) {
1984
- function mwp_return_core_reference()
1985
- {
1986
- global $mmb_core, $mmb_core_backup;
1987
- if (!$mmb_core instanceof MMB_Core) {
1988
- $mmb_core = $mmb_core_backup;
1989
- }
1990
- }
1991
- }
1992
-
1993
- if (function_exists('register_activation_hook')) {
1994
- register_activation_hook(__FILE__, array($mmb_core, 'install'));
1995
- }
1996
-
1997
- if (function_exists('register_deactivation_hook')) {
1998
- register_deactivation_hook(__FILE__, array($mmb_core, 'uninstall'));
1999
- }
2000
-
2001
- if (function_exists('add_action')) {
2002
- add_action('init', 'mmb_plugin_actions', 99999);
2003
- }
2004
-
2005
- if (function_exists('add_filter')) {
2006
- add_filter('install_plugin_complete_actions', 'mmb_iframe_plugins_fix');
2007
- }
2008
-
2009
- if (!function_exists('mwb_edit_redirect_override')) {
2010
- function mwb_edit_redirect_override($location = false, $comment_id = false)
2011
- {
2012
- if (isset($_COOKIE[MMB_XFRAME_COOKIE])) {
2013
- $location = get_site_url().'/wp-admin/edit-comments.php';
2014
- }
2015
-
2016
- return $location;
2017
- }
2018
- }
2019
- if (function_exists('add_filter')) {
2020
- add_filter('comment_edit_redirect', 'mwb_edit_redirect_override');
2021
- }
2022
-
2023
- if (isset($_COOKIE[MMB_XFRAME_COOKIE])) {
2024
- remove_action('admin_init', 'send_frame_options_header');
2025
- remove_action('login_init', 'send_frame_options_header');
2026
- }
2027
-
2028
- if (get_option('mwp_remove_php_reporting') == 'T') {
2029
- @error_reporting(0);
2030
- @ini_set('display_errors', 'off');
2031
- @ini_set('display_startup_errors', "off");
2032
- }
2033
-
2034
- if (get_option('mwp_remove_wp_version') == 'T') {
2035
- remove_action('wp_head', 'wp_generator');
2036
- remove_filter('wp_head', 'wp_generator');
2037
- }
2038
- if (get_option('managewp_remove_styles_version') == 'T') {
2039
- global $wp_styles;
2040
- if (!is_a($wp_styles, 'WP_Styles')) {
2041
- return;
2042
- }
2043
-
2044
- foreach ($wp_styles->registered as $handle => $style) {
2045
- $wp_styles->registered[$handle]->ver = null;
2046
- }
2047
- }
2048
- if (get_option('managewp_remove_scripts_version') == 'T') {
2049
- global $wp_scripts;
2050
- if (!is_a($wp_scripts, 'WP_Scripts')) {
2051
- return;
2052
- }
2053
-
2054
- foreach ($wp_scripts->registered as $handle => $script) {
2055
- $wp_scripts->registered[$handle]->ver = null;
2056
- }
2057
- }
2058
-
2059
- if (wp_next_scheduled('mwp_backup_tasks')) {
2060
- wp_clear_scheduled_hook('mwp_backup_tasks');
2061
- }
2062
-
2063
- $activePlugins = get_option('active_plugins');
2064
- if (reset($activePlugins) !== 'worker/init.php') {
2065
- $workerKey = array_search('worker/init.php', $activePlugins);
2066
- if ($workerKey !== false) {
2067
- unset($activePlugins[$workerKey]);
2068
- array_unshift($activePlugins, 'worker/init.php');
2069
- update_option('active_plugins', $activePlugins);
2070
- }
2071
- }
1
+ <?php
2
+ /*
3
+ Plugin Name: ManageWP - Worker
4
+ Plugin URI: https://managewp.com
5
+ Description: ManageWP Worker plugin allows you to manage your WordPress sites from one dashboard. Visit <a href="https://managewp.com">ManageWP.com</a> for more information.
6
+ Version: 4.0.1
7
+ Author: ManageWP
8
+ Author URI: https://managewp.com
9
+ License: GPL2
10
+ */
11
+
12
+ /*************************************************************
13
+ * init.php
14
+ * Initialize the communication with master
15
+ * Copyright (c) 2011 Prelovac Media
16
+ * www.prelovac.com
17
+ **************************************************************/
18
+ if (!defined('ABSPATH')) {
19
+ exit;
20
+ }
21
+
22
+ /**
23
+ * Handler for incomplete plugin installations.
24
+ */
25
+ if (!function_exists('mwp_fail_safe')):
26
+ /**
27
+ * Reserved memory for fatal error handling execution context.
28
+ */
29
+ $GLOBALS['mwp_reserved_memory'] = str_repeat(' ', 1024 * 20);
30
+ /**
31
+ * If we ever get only partially upgraded due to a server error or misconfiguration,
32
+ * attempt to disable the plugin.
33
+ */
34
+ function mwp_fail_safe()
35
+ {
36
+ $GLOBALS['mwp_reserved_memory'] = null;
37
+
38
+ $lastError = error_get_last();
39
+
40
+ if (!$lastError || $lastError['type'] !== E_ERROR) {
41
+ return;
42
+ }
43
+
44
+ $activePlugins = get_option('active_plugins');
45
+ $workerIndex = array_search(plugin_basename(__FILE__), $activePlugins);
46
+ if ($workerIndex === false) {
47
+ // Plugin is not yet enabled, possibly in activation context.
48
+ return;
49
+ }
50
+
51
+ $errorSource = realpath($lastError['file']);
52
+ // We might be in eval() context.
53
+ if (!$errorSource) {
54
+ return;
55
+ }
56
+
57
+ // The only fatal error that we would get would be a 'Class 'X' not found in ...', so look out only for those messages.
58
+ if (!preg_match('/^Class \'[^\']+\' not found$/', $lastError['message'])) {
59
+ return;
60
+ }
61
+
62
+ // Only look for files that belong to this plugin.
63
+ $pluginBase = realpath(dirname(__FILE__));
64
+ if (stripos($errorSource, $pluginBase) !== 0) {
65
+ return;
66
+ }
67
+
68
+ unset($activePlugins[$workerIndex]);
69
+ // Reset indexes.
70
+ $activePlugins = array_values($activePlugins);
71
+ update_option('active_plugins', $activePlugins);
72
+
73
+ // We probably won't have access to the wp_mail function.
74
+ $mailFn = function_exists('wp_mail') ? 'wp_mail' : 'mail';
75
+ $siteUrl = get_option('siteurl');
76
+ $title = sprintf("ManageWP Worker deactivated on %s", $siteUrl);
77
+ $to = get_option('admin_email');
78
+ $brand = get_option('mwp_worker_brand');
79
+ if (!empty($brand['admin_email'])) {
80
+ $to = $brand['admin_email'];
81
+ }
82
+
83
+ $fullError = print_r($lastError, 1);
84
+ $workerSettings = get_option('wrksettings');
85
+ $userID = 0;
86
+ if (!empty($workerSettings['dataown'])) {
87
+ $userID = (int) $workerSettings['dataown'];
88
+ }
89
+ $body = sprintf('Worker deactivation due to an error. The site that was deactivated - %s. User email - %s (UserID: %s). The error that caused this: %s', $siteUrl, $to, $userID, $fullError);
90
+ $mailFn('support@managewp.com', $title, $body);
91
+
92
+ // If we're inside a cron scope, don't attempt to hide this error.
93
+ if (defined('DOING_CRON') && DOING_CRON) {
94
+ return;
95
+ }
96
+
97
+ // If we're inside a normal request scope retry the request so user doesn't have to see an ugly error page.
98
+ if (!empty($_SERVER['REQUEST_URI'])) {
99
+ $siteUrl .= $_SERVER['REQUEST_URI'];
100
+ }
101
+ if (headers_sent()) {
102
+ // The headers are probably sent if the PHP configuration has the 'display_errors' directive enabled. In that case try a meta redirect.
103
+ printf('<meta http-equiv="refresh" content="0; url=%s">', htmlspecialchars($siteUrl, ENT_QUOTES));
104
+ } else {
105
+ header('Location: '.htmlspecialchars($siteUrl, ENT_QUOTES));
106
+ }
107
+ exit;
108
+ }
109
+
110
+ register_shutdown_function('mwp_fail_safe');
111
+ endif;
112
+
113
+ if (!class_exists('MwpWorkerResponder', false)):
114
+ /**
115
+ * We're not allowed to use lambda functions because this is PHP 5.2, so use a responder
116
+ * class that's able to access the service container.
117
+ */
118
+ class MwpWorkerResponder
119
+ {
120
+
121
+ private $container;
122
+
123
+ function __construct(MWP_ServiceContainer_Interface $container)
124
+ {
125
+ $this->container = $container;
126
+ }
127
+
128
+ function callback(Exception $e = null, MWP_Http_ResponseInterface $response = null)
129
+ {
130
+ if ($response !== null) {
131
+ $responseEvent = new MWP_Event_MasterResponse($response);
132
+ $this->container->getEventDispatcher()->dispatch(MWP_Event_Events::MASTER_RESPONSE, $responseEvent);
133
+ $lastResponse = $responseEvent->getResponse();
134
+
135
+ if ($lastResponse !== null) {
136
+ $lastResponse->send();
137
+ exit;
138
+ }
139
+ } elseif ($e !== null) {
140
+ // Exception is thrown and the response is empty. This should never happen, so don't try to hide it.
141
+ throw $e;
142
+ }
143
+ }
144
+
145
+ /**
146
+ * @return callable
147
+ */
148
+ public function getCallback()
149
+ {
150
+ return array($this, 'callback');
151
+ }
152
+ }
153
+ endif;
154
+
155
+ if (!function_exists('mwp_container')):
156
+ /**
157
+ * @return MWP_ServiceContainer_Interface
158
+ */
159
+ function mwp_container()
160
+ {
161
+ static $container;
162
+
163
+ if ($container === null) {
164
+ $parameters = (array) get_option('mwp_container_parameters', array());
165
+ $container = new MWP_ServiceContainer_Production(array(
166
+ 'worker_realpath' => __FILE__,
167
+ 'worker_basename' => 'worker/init.php',
168
+ 'worker_version' => $GLOBALS['MMB_WORKER_VERSION'],
169
+ 'worker_revision' => $GLOBALS['MMB_WORKER_REVISION'],
170
+ ) + $parameters);
171
+ }
172
+
173
+ return $container;
174
+ }
175
+ endif;
176
+
177
+ if (!function_exists('mwp_init')):
178
+ function mwp_init()
179
+ {
180
+ // Ensure PHP version compatibility.
181
+ if (version_compare(PHP_VERSION, '5.2', '<')) {
182
+ trigger_error("ManageWP Worker plugin requires PHP 5.2 or higher.", E_USER_ERROR);
183
+ exit;
184
+ }
185
+
186
+ // Register the autoloader that loads everything except the Google namespace.
187
+ if (version_compare(PHP_VERSION, '5.3', '<')) {
188
+ spl_autoload_register('mwp_autoload');
189
+ } else {
190
+ // The prepend parameter was added in PHP 5.3.0
191
+ spl_autoload_register('mwp_autoload', true, true);
192
+ }
193
+
194
+ $GLOBALS['MMB_WORKER_VERSION'] = '4.0.1';
195
+ $GLOBALS['MMB_WORKER_REVISION'] = '2015-01-18 00:00:00';
196
+ $GLOBALS['mmb_plugin_dir'] = WP_PLUGIN_DIR.'/'.basename(dirname(__FILE__));
197
+ $GLOBALS['_mmb_item_filter'] = array();
198
+ $GLOBALS['mmb_core'] = $core = $mmb_core_backup = new MMB_Core();
199
+
200
+ $siteUrl = function_exists('get_site_option') ? get_site_option('siteurl') : get_option('siteurl');
201
+ define('MMB_XFRAME_COOKIE', 'wordpress_'.md5($siteUrl).'_xframe');
202
+
203
+ define('MWP_BACKUP_DIR', WP_CONTENT_DIR.'/managewp/backups');
204
+ define('MWP_DB_DIR', MWP_BACKUP_DIR.'/mwp_db');
205
+
206
+ add_filter('mmb_stats_filter', 'mmb_get_extended_info');
207
+ add_action('plugins_loaded', 'mwp_return_core_reference', 1);
208
+ add_filter('cron_schedules', 'mmb_more_reccurences');
209
+ add_action('mmb_remote_upload', 'mmb_call_scheduled_remote_upload');
210
+ add_action('mwp_datasend', 'mwp_datasend');
211
+ add_action('init', 'mmb_plugin_actions', 99999);
212
+ add_filter('install_plugin_complete_actions', 'mmb_iframe_plugins_fix');
213
+ add_filter('comment_edit_redirect', 'mwb_edit_redirect_override');
214
+
215
+ // Datasend cron.
216
+ if (!wp_next_scheduled('mwp_datasend')) {
217
+ wp_schedule_event(time(), 'threehours', 'mwp_datasend');
218
+ }
219
+
220
+ // Register updater hooks.
221
+ MMB_Updater::register();
222
+
223
+ // Plugin management hooks.
224
+ register_activation_hook(__FILE__, array($core, 'install'));
225
+ register_deactivation_hook(__FILE__, array($core, 'deactivate'));
226
+ register_uninstall_hook(__FILE__, array($core, 'uninstall'));
227
+
228
+ // Don't send the "X-Frame-Options: SAMEORIGIN" header if we're logging in inside an iframe.
229
+ if (isset($_COOKIE[MMB_XFRAME_COOKIE])) {
230
+ remove_action('admin_init', 'send_frame_options_header');
231
+ remove_action('login_init', 'send_frame_options_header');
232
+ }
233
+
234
+ // Remove legacy scheduler.
235
+ if (wp_next_scheduled('mwp_backup_tasks')) {
236
+ wp_clear_scheduled_hook('mwp_backup_tasks');
237
+ }
238
+
239
+ mwp_set_plugin_priority();
240
+
241
+ $request = MWP_Worker_Request::createFromGlobals();
242
+ $container = mwp_container();
243
+ $responder = new MwpWorkerResponder($container);
244
+
245
+ $kernel = new MWP_Worker_Kernel($container);
246
+ $kernel->handleRequest($request, $responder->getCallback(), true);
247
+ }
248
+
249
+ require_once dirname(__FILE__).'/functions.php';
250
+
251
+ mwp_init();
252
+ endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
publickeys/managewp.pub CHANGED
@@ -1,9 +1,9 @@
1
- -----BEGIN PUBLIC KEY-----
2
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAppMNCsrtW7elGrFIK/LS
3
- TqoPlm8JmkJHdY3oKarH5bvKG82j8KZmpn5ww+32S3T9NawTMdoYjXSqQLtxgPgn
4
- OAVHiDq0NzjHdD7I+tsqCZIxUnmTzT8m/KIsftl0pNVVi0vUJLHwWkLv5FkMjG9X
5
- bE0zviVGpxpRlIMQhlrUXL+Xy0k78mERaX4djaLBXYRsbqO/4hY7FHcSXKwzSQK9
6
- huN44CGBpy/ePGmXO9AbQA3vfOa1Yh00AEUFaeDCCNrjflgKFE9xnIBzxlOHeDqz
7
- l64zvO9Ui2tHvltK3G6P8m1I23+CgbPjmwyVJ+Qo7PXPq+5VLrcCm8QjZOb9Ctkm
8
- iwIDAQAB
9
- -----END PUBLIC KEY-----
1
+ -----BEGIN PUBLIC KEY-----
2
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAppMNCsrtW7elGrFIK/LS
3
+ TqoPlm8JmkJHdY3oKarH5bvKG82j8KZmpn5ww+32S3T9NawTMdoYjXSqQLtxgPgn
4
+ OAVHiDq0NzjHdD7I+tsqCZIxUnmTzT8m/KIsftl0pNVVi0vUJLHwWkLv5FkMjG9X
5
+ bE0zviVGpxpRlIMQhlrUXL+Xy0k78mERaX4djaLBXYRsbqO/4hY7FHcSXKwzSQK9
6
+ huN44CGBpy/ePGmXO9AbQA3vfOa1Yh00AEUFaeDCCNrjflgKFE9xnIBzxlOHeDqz
7
+ l64zvO9Ui2tHvltK3G6P8m1I23+CgbPjmwyVJ+Qo7PXPq+5VLrcCm8QjZOb9Ctkm
8
+ iwIDAQAB
9
+ -----END PUBLIC KEY-----
publickeys/managewp_d.pub CHANGED
@@ -1,9 +1,9 @@
1
- -----BEGIN PUBLIC KEY-----
2
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtEvKFDXjXcqDwGZbrCCx
3
- o8kDmx4ft5SfJs8qaVxlprPQ1k9SR3Y3npGToUjlgmpeXy1zFazdcdFQsI4MdpbL
4
- 37ZckHujDIRjsG8PNRTIr0cF+gH+adrBMMLNL9x5ePom10ZRmVFwyP6RnqezX6io
5
- UVoi+B6qRecaTw432TT66zIcpgyZKeihwBPL2+ubpAVUzSBBD0Jx7VC8MzFZK/Oj
6
- DMkkWedQPn58FciQCDxnzjXI7Yi5EtXdQUL2C5FPQTgjxJcPi8x4iXl/Z6XC/sG1
7
- dExFmb1Km/+EaeaV7bYpeUnBhNkUp47TY2qQdXrtoe6YhOBFfqggRrEXDVu1nM2X
8
- iQIDAQAB
9
- -----END PUBLIC KEY-----
1
+ -----BEGIN PUBLIC KEY-----
2
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtEvKFDXjXcqDwGZbrCCx
3
+ o8kDmx4ft5SfJs8qaVxlprPQ1k9SR3Y3npGToUjlgmpeXy1zFazdcdFQsI4MdpbL
4
+ 37ZckHujDIRjsG8PNRTIr0cF+gH+adrBMMLNL9x5ePom10ZRmVFwyP6RnqezX6io
5
+ UVoi+B6qRecaTw432TT66zIcpgyZKeihwBPL2+ubpAVUzSBBD0Jx7VC8MzFZK/Oj
6
+ DMkkWedQPn58FciQCDxnzjXI7Yi5EtXdQUL2C5FPQTgjxJcPi8x4iXl/Z6XC/sG1
7
+ dExFmb1Km/+EaeaV7bYpeUnBhNkUp47TY2qQdXrtoe6YhOBFfqggRrEXDVu1nM2X
8
+ iQIDAQAB
9
+ -----END PUBLIC KEY-----
publickeys/{ManageWP_mt.pub → managewp_mt.pub} RENAMED
@@ -1,9 +1,9 @@
1
- -----BEGIN PUBLIC KEY-----
2
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1Osn7/ZLiz3+Of/puyJn
3
- zk0bKLEhLUvKoSn+qLOM+Q1XfOzuAAn9Kwj0JopyqoCPxI5Df3eWEdjQDhG+B7+4
4
- 36o12yq99krg7t79Ez/gy2xJoZM6oIT3eqnh8UO3OFQ8rkvpS7OR+ZWWc1W3/iiH
5
- uVmOpeR2JDM0h7w749+V9Dp3toYLvj84NSmvI2OrtPHS/BIfGBnyk1sEsdT6Gbrz
6
- PBDhO4yTXTetIoLsJsoAIhvXg6OQFYN+QXosftLUcS2PrTJcuX2LN4U8OSSdgtTA
7
- NazcUSeJ7jlmrL1DYuhDUbAvxhT4cWTnATTmAcZPY5n/4h2Ya6XvMvO2AAcpshVK
8
- 2QIDAQAB
9
- -----END PUBLIC KEY-----
1
+ -----BEGIN PUBLIC KEY-----
2
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1Osn7/ZLiz3+Of/puyJn
3
+ zk0bKLEhLUvKoSn+qLOM+Q1XfOzuAAn9Kwj0JopyqoCPxI5Df3eWEdjQDhG+B7+4
4
+ 36o12yq99krg7t79Ez/gy2xJoZM6oIT3eqnh8UO3OFQ8rkvpS7OR+ZWWc1W3/iiH
5
+ uVmOpeR2JDM0h7w749+V9Dp3toYLvj84NSmvI2OrtPHS/BIfGBnyk1sEsdT6Gbrz
6
+ PBDhO4yTXTetIoLsJsoAIhvXg6OQFYN+QXosftLUcS2PrTJcuX2LN4U8OSSdgtTA
7
+ NazcUSeJ7jlmrL1DYuhDUbAvxhT4cWTnATTmAcZPY5n/4h2Ya6XvMvO2AAcpshVK
8
+ 2QIDAQAB
9
+ -----END PUBLIC KEY-----
publickeys/managewp_t.pub CHANGED
@@ -1,9 +1,9 @@
1
- -----BEGIN PUBLIC KEY-----
2
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyKuVlOg8/WJ/cfk5POp3
3
- Vg+tBqdOViijE/zBNisp4VrT2n4QfCMB0TD2etYPuhmY8MO7b617SVMtkgmOg9kx
4
- ZY3eWDO6ChAoMBkmLCZksrkaHksaZeFNzjbo2GaIfP7Wz4xvShI5IAhU4w2hG6WY
5
- HJ0oD2WTF/qFYnA2/T2q8Cby6pKEy3PzMCRjGdgKB5Y3kbCyApl66So+5IqiyEcX
6
- pYSYtM90cqBWGq8bv1mK6DL62NRd+MtrBnXxO/0PF3lclnSpi8QEToMQSuNK6Yuz
7
- EEqAWlvtuUl+IKccOUBeNGOqt2QFj1nkbQawVzIiPzDpzZrqCVdHoQgAFzXbav6U
8
- NwIDAQAB
9
- -----END PUBLIC KEY-----
1
+ -----BEGIN PUBLIC KEY-----
2
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyKuVlOg8/WJ/cfk5POp3
3
+ Vg+tBqdOViijE/zBNisp4VrT2n4QfCMB0TD2etYPuhmY8MO7b617SVMtkgmOg9kx
4
+ ZY3eWDO6ChAoMBkmLCZksrkaHksaZeFNzjbo2GaIfP7Wz4xvShI5IAhU4w2hG6WY
5
+ HJ0oD2WTF/qFYnA2/T2q8Cby6pKEy3PzMCRjGdgKB5Y3kbCyApl66So+5IqiyEcX
6
+ pYSYtM90cqBWGq8bv1mK6DL62NRd+MtrBnXxO/0PF3lclnSpi8QEToMQSuNK6Yuz
7
+ EEqAWlvtuUl+IKccOUBeNGOqt2QFj1nkbQawVzIiPzDpzZrqCVdHoQgAFzXbav6U
8
+ NwIDAQAB
9
+ -----END PUBLIC KEY-----
publickeys/partner1.pub CHANGED
@@ -1,9 +1,9 @@
1
- -----BEGIN PUBLIC KEY-----
2
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA57wtC1CiWjqRtEjd2ryQ
3
- wskHNNkr6+FArJUrPcxq7xxcW/KjUSTTFbDM84vEVTzn6wsgxXOjgGSDMptk+f7L
4
- 8Ja/32XX+7jWZdTC8fyKNh4K6CD/A040WxbtMXsqOSGUiC0dzU27j0BhTwQxnhQW
5
- j6ViaPgfEzb3q34w8jNBHwraWc1bW8/KizzGXUYSBuJBWJ6rD+aEJ3fr/tlwnGDs
6
- JJc2NQnkV8RP78uFy6c1cLzSQClX9WB1E4yxFDDXS1jBTAT4v9PJoMZaROU/MYbZ
7
- nEOx4FQt8ckJyE5syyWE7jWJolXjF0lSjbf4r0i2RZ7bDh5i2czgat8OoXwvWM+4
8
- XQIDAQAB
9
- -----END PUBLIC KEY-----
1
+ -----BEGIN PUBLIC KEY-----
2
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA57wtC1CiWjqRtEjd2ryQ
3
+ wskHNNkr6+FArJUrPcxq7xxcW/KjUSTTFbDM84vEVTzn6wsgxXOjgGSDMptk+f7L
4
+ 8Ja/32XX+7jWZdTC8fyKNh4K6CD/A040WxbtMXsqOSGUiC0dzU27j0BhTwQxnhQW
5
+ j6ViaPgfEzb3q34w8jNBHwraWc1bW8/KizzGXUYSBuJBWJ6rD+aEJ3fr/tlwnGDs
6
+ JJc2NQnkV8RP78uFy6c1cLzSQClX9WB1E4yxFDDXS1jBTAT4v9PJoMZaROU/MYbZ
7
+ nEOx4FQt8ckJyE5syyWE7jWJolXjF0lSjbf4r0i2RZ7bDh5i2czgat8OoXwvWM+4
8
+ XQIDAQAB
9
+ -----END PUBLIC KEY-----
publickeys/partner10.pub CHANGED
@@ -1,9 +1,9 @@
1
- -----BEGIN PUBLIC KEY-----
2
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApTPS/ietBUIm+g6byuFV
3
- /fbW2HmGomL8PQ1JJ3ZEjbsMQhEJ066xrdOlpI/Up09Y6+aO4LUydUg4j1nQzaZF
4
- K3Nk2kUqgNYcws2Qrrs3mnkuJ4w0heAaACtaCjYpM3/Rlk2z7HKqJbCCvJVVVW7J
5
- yohUHunGZZPP5qIutEaGssETbmnmqxUqgY6TfgzhU4rCRBDabHxop/jRZ3qdWSXp
6
- 5rQUag+v6KhhbhGNrFLa3NRdHCRU/6US8njnzbDoSJ626tNJHploeSq81/Efjw0k
7
- 5eEx4EsB1Tp0JIIuKtzxfde1EkFJnU7cJa2EBWdjxfz77QGwkDRmzHUnyyNlP6BE
8
- NQIDAQAB
9
- -----END PUBLIC KEY-----
1
+ -----BEGIN PUBLIC KEY-----
2
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApTPS/ietBUIm+g6byuFV
3
+ /fbW2HmGomL8PQ1JJ3ZEjbsMQhEJ066xrdOlpI/Up09Y6+aO4LUydUg4j1nQzaZF
4
+ K3Nk2kUqgNYcws2Qrrs3mnkuJ4w0heAaACtaCjYpM3/Rlk2z7HKqJbCCvJVVVW7J
5
+ yohUHunGZZPP5qIutEaGssETbmnmqxUqgY6TfgzhU4rCRBDabHxop/jRZ3qdWSXp
6
+ 5rQUag+v6KhhbhGNrFLa3NRdHCRU/6US8njnzbDoSJ626tNJHploeSq81/Efjw0k
7
+ 5eEx4EsB1Tp0JIIuKtzxfde1EkFJnU7cJa2EBWdjxfz77QGwkDRmzHUnyyNlP6BE
8
+ NQIDAQAB
9
+ -----END PUBLIC KEY-----
publickeys/partner11.pub CHANGED
@@ -1,9 +1,9 @@
1
- -----BEGIN PUBLIC KEY-----
2
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkyoHKQOqOF01tdC2JLSe
3
- jnhnNdljEBjKcAz6hfYwR8xsWXg17cFxY56/I788XLKME4WkKVmvsYGY4mfUOxcI
4
- gGJFxySelpK9jqMZgglCQU9mFzStuanrcxfpeuzEO4XTQk5fqwLc5bvmxEsjPcUV
5
- pkHR6TkgHP1yoyMMLb+OKrgsy2iATvONlh8iI+luynx72ZkyypVdhSoRwy9viRXW
6
- LxL2kpLgWrAQG+SJX0/T8Djtm2lqpw3V/vzFBZ6Npfv3TwPm3jjDcW2XiYG/LBvF
7
- o6VWnVdsTvAkh1+Zhqq7WQLThWtE2xW4kJqXqDzLHq9l+fEzDdqjQr9WEtKy2RKb
8
- 5QIDAQAB
9
- -----END PUBLIC KEY-----
1
+ -----BEGIN PUBLIC KEY-----
2
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkyoHKQOqOF01tdC2JLSe
3
+ jnhnNdljEBjKcAz6hfYwR8xsWXg17cFxY56/I788XLKME4WkKVmvsYGY4mfUOxcI
4
+ gGJFxySelpK9jqMZgglCQU9mFzStuanrcxfpeuzEO4XTQk5fqwLc5bvmxEsjPcUV
5
+ pkHR6TkgHP1yoyMMLb+OKrgsy2iATvONlh8iI+luynx72ZkyypVdhSoRwy9viRXW
6
+ LxL2kpLgWrAQG+SJX0/T8Djtm2lqpw3V/vzFBZ6Npfv3TwPm3jjDcW2XiYG/LBvF
7
+ o6VWnVdsTvAkh1+Zhqq7WQLThWtE2xW4kJqXqDzLHq9l+fEzDdqjQr9WEtKy2RKb
8
+ 5QIDAQAB
9
+ -----END PUBLIC KEY-----
publickeys/partner12.pub CHANGED
@@ -1,9 +1,9 @@
1
- -----BEGIN PUBLIC KEY-----
2
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxzbLmjytu3VTo8vHvgUJ
3
- zPqDSkHcSwYPzJVPcnjThgRADG8xK9pw8NHiw3OYm+2pYosYDiGHQAisDczxcuUW
4
- ELKBb9YtSlgdQUcUrvmuf8Hsb8ryvy2b62T+qA2bHxL6Nfku9T58TD5YuFvjSMa/
5
- Zue6zd9lhkHb7oEyd0oT+Izdw2+2Cc4lPBANeAP5JlcLzGNXc1Z6fKcMYqUe/gJa
6
- MdfkZEEmsbPjW97bsPhXZ2wElImgnILyMx7zozA0vkkmwPdBZbZeIZkfrOAFgMMN
7
- PdhHPRNUJPaFN3W4VsMWsRtblj1YOwvlNiNdtDmCBZGNnCMKq0zXHCLJjpaQGQP7
8
- qwIDAQAB
9
- -----END PUBLIC KEY-----
1
+ -----BEGIN PUBLIC KEY-----
2
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxzbLmjytu3VTo8vHvgUJ
3
+ zPqDSkHcSwYPzJVPcnjThgRADG8xK9pw8NHiw3OYm+2pYosYDiGHQAisDczxcuUW
4
+ ELKBb9YtSlgdQUcUrvmuf8Hsb8ryvy2b62T+qA2bHxL6Nfku9T58TD5YuFvjSMa/
5
+ Zue6zd9lhkHb7oEyd0oT+Izdw2+2Cc4lPBANeAP5JlcLzGNXc1Z6fKcMYqUe/gJa
6
+ MdfkZEEmsbPjW97bsPhXZ2wElImgnILyMx7zozA0vkkmwPdBZbZeIZkfrOAFgMMN
7
+ PdhHPRNUJPaFN3W4VsMWsRtblj1YOwvlNiNdtDmCBZGNnCMKq0zXHCLJjpaQGQP7
8
+ qwIDAQAB
9
+ -----END PUBLIC KEY-----
publickeys/partner13.pub CHANGED
@@ -1,9 +1,9 @@
1
- -----BEGIN PUBLIC KEY-----
2
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0B9sRvkgoao+YaSTk5Wy
3
- hQFLjw/PaEfGgqpk2/MqaVZSBFHsJxUYjwoTUOWeJEhXE18jQKHKJYjcs/77y1Mc
4
- dB9UWOoRk7XDZNVMVhW9lO4Vi3Gr43WnIPiePkvJILN3kN8S+UjM9loKcKIwtr3k
5
- /5Kcu7HZu+vqh5dZQwhTspDN4nW9JMqKEWDL4gj4ggFu6PaTGqo5JyRoLzay1In5
6
- oxUs7QALi8W9CzICiuhtdvjvHXcnmg7YeW+kWYuahkn1E7C4P/rWGN6M7NGyuWtj
7
- Q5w7eTpwAg6uxlXMtmVwX5cXLszuFZOaf/OJDBuLIxVBtklwn0BBAAVLpaYFUGnQ
8
- DQIDAQAB
9
- -----END PUBLIC KEY-----
1
+ -----BEGIN PUBLIC KEY-----
2
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0B9sRvkgoao+YaSTk5Wy
3
+ hQFLjw/PaEfGgqpk2/MqaVZSBFHsJxUYjwoTUOWeJEhXE18jQKHKJYjcs/77y1Mc
4
+ dB9UWOoRk7XDZNVMVhW9lO4Vi3Gr43WnIPiePkvJILN3kN8S+UjM9loKcKIwtr3k
5
+ /5Kcu7HZu+vqh5dZQwhTspDN4nW9JMqKEWDL4gj4ggFu6PaTGqo5JyRoLzay1In5
6
+ oxUs7QALi8W9CzICiuhtdvjvHXcnmg7YeW+kWYuahkn1E7C4P/rWGN6M7NGyuWtj
7
+ Q5w7eTpwAg6uxlXMtmVwX5cXLszuFZOaf/OJDBuLIxVBtklwn0BBAAVLpaYFUGnQ
8
+ DQIDAQAB
9
+ -----END PUBLIC KEY-----
publickeys/partner14.pub CHANGED
@@ -1,9 +1,9 @@
1
- -----BEGIN PUBLIC KEY-----
2
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxWvTKrJSWeIGGiDlWyRl
3
- 6pIpXLurQtsB2FltPhapMrGE5oBbWb//xw1GNqKh/hu6J2RVZNGZXovQ5s3u+TSq
4
- VwypAEpz45khycD5cgQFxaHKVOWTcl2+7bjQ2BeG9EON4luiNU5PbqasIyXP0fNj
5
- 5v1KHhST4GXxMeLeWYpMbMqn0i0CFn4dsvWW7yLqcBcxxeTMma0tF6qpXHfIEC3m
6
- 1IpYKkQmGNJUz0Kaql9Dm5R2QjG/ZNDQeJXe0bKnX4NoC8zmGZ7Edw9b4KLDrTAX
7
- G49jUuGzWnro5gwLfWrqnugfso/unoD26Br7FD1ItD/MnzsTGnEu5yFOrEw3EzJv
8
- aQIDAQAB
9
- -----END PUBLIC KEY-----
1
+ -----BEGIN PUBLIC KEY-----
2
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxWvTKrJSWeIGGiDlWyRl
3
+ 6pIpXLurQtsB2FltPhapMrGE5oBbWb//xw1GNqKh/hu6J2RVZNGZXovQ5s3u+TSq
4
+ VwypAEpz45khycD5cgQFxaHKVOWTcl2+7bjQ2BeG9EON4luiNU5PbqasIyXP0fNj
5
+ 5v1KHhST4GXxMeLeWYpMbMqn0i0CFn4dsvWW7yLqcBcxxeTMma0tF6qpXHfIEC3m
6
+ 1IpYKkQmGNJUz0Kaql9Dm5R2QjG/ZNDQeJXe0bKnX4NoC8zmGZ7Edw9b4KLDrTAX
7
+ G49jUuGzWnro5gwLfWrqnugfso/unoD26Br7FD1ItD/MnzsTGnEu5yFOrEw3EzJv
8
+ aQIDAQAB
9
+ -----END PUBLIC KEY-----
publickeys/partner15.pub CHANGED
@@ -1,9 +1,9 @@
1
- -----BEGIN PUBLIC KEY-----
2
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3btn2odEVqxsqvd0lgD0
3
- PbqxVrPnvM1/gV14vgujb69XPdIc3nfdUtQJdYhLpTi5lEnutelFu293v6FW1L9p
4
- ZdMnzgGZonUdn6ZEwOqcSiVIuBUDKgSvjskU/RU6jnb4/2Mu5gY384y2VzD/wXCu
5
- yme+pKi+ta4CnqDn3udW3giL8fQT7oq2WhQEWmZOGTJtbaFeMgbtDLHzgdZaMkpR
6
- ecbjuvdvN5TMG7PuzcunyD0BOeEX1l6sf1/OyUFKHqubxzwoVext70HBRSJLy/TS
7
- lcNiCtBnsKb0AxVI0ZSAFmVO4H14fsVhk6whGiyqDr2sHxjZXlwOE1t3+HRK74Sn
8
- OQIDAQAB
9
- -----END PUBLIC KEY-----
1
+ -----BEGIN PUBLIC KEY-----
2
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3btn2odEVqxsqvd0lgD0
3
+ PbqxVrPnvM1/gV14vgujb69XPdIc3nfdUtQJdYhLpTi5lEnutelFu293v6FW1L9p
4
+ ZdMnzgGZonUdn6ZEwOqcSiVIuBUDKgSvjskU/RU6jnb4/2Mu5gY384y2VzD/wXCu
5
+ yme+pKi+ta4CnqDn3udW3giL8fQT7oq2WhQEWmZOGTJtbaFeMgbtDLHzgdZaMkpR
6
+ ecbjuvdvN5TMG7PuzcunyD0BOeEX1l6sf1/OyUFKHqubxzwoVext70HBRSJLy/TS
7
+ lcNiCtBnsKb0AxVI0ZSAFmVO4H14fsVhk6whGiyqDr2sHxjZXlwOE1t3+HRK74Sn
8
+ OQIDAQAB
9
+ -----END PUBLIC KEY-----
publickeys/partner16.pub CHANGED
@@ -1,9 +1,9 @@
1
- -----BEGIN PUBLIC KEY-----
2
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo5RculesjuT4aZH8jp/r
3
- 9LAcH40H1zu5hul1WADZQEymlHB2kqP25GQPAeSfb8omO9LubyM9pgddsLflV15G
4
- jZ3KWPwa34VUtLQtk9ibU0LTnepqn3bWCVRe9AoEAYdPTVCgdvPYY9J0JD8NvB5G
5
- ndTRPNOiBuq8Fj5+oY3dvWWH2efW1OtcUq30l3i82PtpxxI6AzOCTRBEGAegx6FF
6
- +tuQR+33Apjyj4FuSDHwuRweyu+exBnMBNo5FtoYeTfIy6xHujGZ3av2YTijjAQ/
7
- 4c6+7FXXXdPGK7KhG5WaLL4Wi1eXsEL7J8EtxQLYaCXWQkYbs7ZZOCDiEMbJKbMz
8
- 2wIDAQAB
9
- -----END PUBLIC KEY-----
1
+ -----BEGIN PUBLIC KEY-----
2
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo5RculesjuT4aZH8jp/r
3
+ 9LAcH40H1zu5hul1WADZQEymlHB2kqP25GQPAeSfb8omO9LubyM9pgddsLflV15G
4
+ jZ3KWPwa34VUtLQtk9ibU0LTnepqn3bWCVRe9AoEAYdPTVCgdvPYY9J0JD8NvB5G
5
+ ndTRPNOiBuq8Fj5+oY3dvWWH2efW1OtcUq30l3i82PtpxxI6AzOCTRBEGAegx6FF
6
+ +tuQR+33Apjyj4FuSDHwuRweyu+exBnMBNo5FtoYeTfIy6xHujGZ3av2YTijjAQ/
7
+ 4c6+7FXXXdPGK7KhG5WaLL4Wi1eXsEL7J8EtxQLYaCXWQkYbs7ZZOCDiEMbJKbMz
8
+ 2wIDAQAB
9
+ -----END PUBLIC KEY-----
publickeys/partner17.pub CHANGED
@@ -1,9 +1,9 @@
1
- -----BEGIN PUBLIC KEY-----
2
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmumb22xILsQPdKj0CFDw
3
- V4z1F2ZRsm91gItyeoUxaqZJAxPXdPk+rkLN2nuuRGNvWr0Xjz0gNvObehFqzdmz
4
- KVK/uXaD2SEpaka9Z68KiucUVdUJrHgrhJ19PBsXoFY8ZG1Nq82WTDVbguCvm626
5
- tAo6jKJ4/oimWioSaRxKoIFVIYGZPRNP53Ggawwlnruf+SG2f5AiZhVAS6wagM/F
6
- LLwNatUuw7dXdkrzY/+w2bKtLP7DsZy6fMkiZPvKgHvnYoMQfMtuNw0V3bTEZHQv
7
- C9ZAvRngePj66iHfjOWXBbHBMb16TK+2zHSwvE7i/jOQQUM3mmREAiHeholVtqaC
8
- nwIDAQAB
9
- -----END PUBLIC KEY-----
1
+ -----BEGIN PUBLIC KEY-----
2
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmumb22xILsQPdKj0CFDw
3
+ V4z1F2ZRsm91gItyeoUxaqZJAxPXdPk+rkLN2nuuRGNvWr0Xjz0gNvObehFqzdmz
4
+ KVK/uXaD2SEpaka9Z68KiucUVdUJrHgrhJ19PBsXoFY8ZG1Nq82WTDVbguCvm626
5
+ tAo6jKJ4/oimWioSaRxKoIFVIYGZPRNP53Ggawwlnruf+SG2f5AiZhVAS6wagM/F
6
+ LLwNatUuw7dXdkrzY/+w2bKtLP7DsZy6fMkiZPvKgHvnYoMQfMtuNw0V3bTEZHQv
7
+ C9ZAvRngePj66iHfjOWXBbHBMb16TK+2zHSwvE7i/jOQQUM3mmREAiHeholVtqaC
8
+ nwIDAQAB
9
+ -----END PUBLIC KEY-----
publickeys/partner2.pub CHANGED
@@ -1,9 +1,9 @@
1
- -----BEGIN PUBLIC KEY-----
2
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2doy5JneOGkPchV/zd8s
3
- K3xm6jr1T6YX1ORGZA4+0QEmLbr70VAcrO/ptdEzze9afJUAT0Mey3sa/9oOXeqO
4
- 3NI8xdFs9nXOIUKBUDBQsxWVdrOohZnQa/r8V+zeqmMl/FeZob+K1wIyFbKKVKBn
5
- NoSEQDzYUa5PbTNSJpaOhe1EalxHyucZALdeXcM00tMYOuXvOOLxM+QOG2OBXIIV
6
- FiGkLFiCi3bvJlhw/68gY2zH0xZfcyOsGj6260Y9fQ+D2yA15jlsksFT2hcj2T5D
7
- RuF0UCZqPKtQgOjpd3b4N4ZVZ7KlxAknZIHC9bf0sA7nKVr2oQY9BJrCUNOKhYjC
8
- WQIDAQAB
9
- -----END PUBLIC KEY-----
1
+ -----BEGIN PUBLIC KEY-----
2
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2doy5JneOGkPchV/zd8s
3
+ K3xm6jr1T6YX1ORGZA4+0QEmLbr70VAcrO/ptdEzze9afJUAT0Mey3sa/9oOXeqO
4
+ 3NI8xdFs9nXOIUKBUDBQsxWVdrOohZnQa/r8V+zeqmMl/FeZob+K1wIyFbKKVKBn
5
+ NoSEQDzYUa5PbTNSJpaOhe1EalxHyucZALdeXcM00tMYOuXvOOLxM+QOG2OBXIIV
6
+ FiGkLFiCi3bvJlhw/68gY2zH0xZfcyOsGj6260Y9fQ+D2yA15jlsksFT2hcj2T5D
7
+ RuF0UCZqPKtQgOjpd3b4N4ZVZ7KlxAknZIHC9bf0sA7nKVr2oQY9BJrCUNOKhYjC
8
+ WQIDAQAB
9
+ -----END PUBLIC KEY-----
publickeys/partner3.pub CHANGED
@@ -1,9 +1,9 @@
1
- -----BEGIN PUBLIC KEY-----
2
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3Rrmegqtq6ULsQe2duIf
3
- 5L/mBZ4aGOSxWjTh+nX7198E26Tt3BpmeNM0f6nZoaHORaWQBcbtwGTiwLh+ceZS
4
- 9OGe3mh0BcMqCoaqJLEJXTPccAFcSRkti6ib2/IGRFmR4U76oy9IS0ncp79WVde1
5
- X2RP8w2PC/IHjztzL40vT+8G+CbxtugdSe+d0Qg13beZngJ64SzCl3OEoe0L/3Da
6
- KZoHfUJAhGAZH210XWq8qD1FQTab7OIbgIV4zwTB++5oYfhZ2TTE+FfBKmzBrrE9
7
- w+EtutF2oFapbvJB6I3HQNprogdiedBBiQDddVPyWX3KqlFUOi13SjyRivJfbyYi
8
- owIDAQAB
9
- -----END PUBLIC KEY-----
1
+ -----BEGIN PUBLIC KEY-----
2
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3Rrmegqtq6ULsQe2duIf
3
+ 5L/mBZ4aGOSxWjTh+nX7198E26Tt3BpmeNM0f6nZoaHORaWQBcbtwGTiwLh+ceZS
4
+ 9OGe3mh0BcMqCoaqJLEJXTPccAFcSRkti6ib2/IGRFmR4U76oy9IS0ncp79WVde1
5
+ X2RP8w2PC/IHjztzL40vT+8G+CbxtugdSe+d0Qg13beZngJ64SzCl3OEoe0L/3Da
6
+ KZoHfUJAhGAZH210XWq8qD1FQTab7OIbgIV4zwTB++5oYfhZ2TTE+FfBKmzBrrE9
7
+ w+EtutF2oFapbvJB6I3HQNprogdiedBBiQDddVPyWX3KqlFUOi13SjyRivJfbyYi
8
+ owIDAQAB
9
+ -----END PUBLIC KEY-----
publickeys/partner4.pub CHANGED
@@ -1,9 +1,9 @@
1
- -----BEGIN PUBLIC KEY-----
2
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAutt+iSy6VG70mFzbkUTj
3
- 4CUZoL2wgXRfJ3sNPMg92bvQarIZRdbaydRttUHPYovFrFPBFUzHfxuISyxZbDYb
4
- wKbviq+T4YCcYo+oy79CMsUfB22Lzm8hlt0c1i3DWrQ1T0NDV2bhT+tTJs6cS1Jv
5
- Vu1Ze5ZUWiv+e61kNDvSctInX7nYPxBGuzpCci2tiWAAvvlmKVuRJDMhiSrEAFe2
6
- +5EU5kaUZiQrdXdOViBWhdm1V/QidPD7MubATwVgucsZG0S0DDw7nHyh1t6CcAhd
7
- IgIs13hZJy8FpDt6CLnHU/aM0Oufua42h4uBzkqADQ0Zw6jmTtZI7Dnmj9cnAdic
8
- dwIDAQAB
9
  -----END PUBLIC KEY-----
1
+ -----BEGIN PUBLIC KEY-----
2
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAutt+iSy6VG70mFzbkUTj
3
+ 4CUZoL2wgXRfJ3sNPMg92bvQarIZRdbaydRttUHPYovFrFPBFUzHfxuISyxZbDYb
4
+ wKbviq+T4YCcYo+oy79CMsUfB22Lzm8hlt0c1i3DWrQ1T0NDV2bhT+tTJs6cS1Jv
5
+ Vu1Ze5ZUWiv+e61kNDvSctInX7nYPxBGuzpCci2tiWAAvvlmKVuRJDMhiSrEAFe2
6
+ +5EU5kaUZiQrdXdOViBWhdm1V/QidPD7MubATwVgucsZG0S0DDw7nHyh1t6CcAhd
7
+ IgIs13hZJy8FpDt6CLnHU/aM0Oufua42h4uBzkqADQ0Zw6jmTtZI7Dnmj9cnAdic
8
+ dwIDAQAB
9
  -----END PUBLIC KEY-----
publickeys/partner5.pub CHANGED
@@ -1,9 +1,9 @@
1
- -----BEGIN PUBLIC KEY-----
2
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArcJ794ai0mbaaY17yhlb
3
- umJ1OiBEHOthp0M7DT3o+42gLB19jZtaWZPtPZFRudgN5Z6N+X0ufd7yD92uL1vg
4
- /WMuvB4LM1FKiVTrpa8/runZGek4hVNktE67gR6ut5Zwbuc5O8zTwyNj/KuEiI6t
5
- NSMMceiWElGTb0xOFdkeGq7tGJlwFXJ41zFpp5Ej61vAv4vW1WJL5ztx1l2ALOKX
6
- swbdvT3+Ht8it/wXMykPCYhDnr4oHnl9tz6dGe61xPDvSs9zb6IX5N+J0sPVN3Th
7
- VIVUS2GD1eyzPkAgo0TyScefYr1sVFHn1YxFzFZpeYsAKnhsthkNBxIQaYEc+A9w
8
- 9QIDAQAB
9
- -----END PUBLIC KEY-----
1
+ -----BEGIN PUBLIC KEY-----
2
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArcJ794ai0mbaaY17yhlb
3
+ umJ1OiBEHOthp0M7DT3o+42gLB19jZtaWZPtPZFRudgN5Z6N+X0ufd7yD92uL1vg
4
+ /WMuvB4LM1FKiVTrpa8/runZGek4hVNktE67gR6ut5Zwbuc5O8zTwyNj/KuEiI6t
5
+ NSMMceiWElGTb0xOFdkeGq7tGJlwFXJ41zFpp5Ej61vAv4vW1WJL5ztx1l2ALOKX
6
+ swbdvT3+Ht8it/wXMykPCYhDnr4oHnl9tz6dGe61xPDvSs9zb6IX5N+J0sPVN3Th
7
+ VIVUS2GD1eyzPkAgo0TyScefYr1sVFHn1YxFzFZpeYsAKnhsthkNBxIQaYEc+A9w
8
+ 9QIDAQAB
9
+ -----END PUBLIC KEY-----
publickeys/partner6.pub CHANGED
@@ -1,9 +1,9 @@
1
- -----BEGIN PUBLIC KEY-----
2
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0eZeh+/7qFWecpGLTpwJ
3
- ShKZ6ZtfS8IeRwAsKmEZavcZH/uCTioq9L+rDhXrVE07jv5QQZfzQzosycU3Nnfa
4
- yBpuPynECzBfHbKKnoVb5PMllH2/Dj7skC5kTfOpugiymLpNhIcWfJS6empwfG0i
5
- 67xYJYS7Eik+5+ALhF54KaKZ5C5HAYhcPi3NDFrHecg/t+fio8Tvd4U5ZrxloTDR
6
- 8t4p3cfPEVMJ6udCMfP6xQbVNvTV3VHUemmRaxVSTUjAJfeIRqtnLDVusrIYyxdR
7
- xjct4hDbajE0f82BefDq6g79qyc47LrxYxUypdryT+06WHsJ5wz/0BbrTGxK22mt
8
- eQIDAQAB
9
- -----END PUBLIC KEY-----
1
+ -----BEGIN PUBLIC KEY-----
2
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0eZeh+/7qFWecpGLTpwJ
3
+ ShKZ6ZtfS8IeRwAsKmEZavcZH/uCTioq9L+rDhXrVE07jv5QQZfzQzosycU3Nnfa
4
+ yBpuPynECzBfHbKKnoVb5PMllH2/Dj7skC5kTfOpugiymLpNhIcWfJS6empwfG0i
5
+ 67xYJYS7Eik+5+ALhF54KaKZ5C5HAYhcPi3NDFrHecg/t+fio8Tvd4U5ZrxloTDR
6
+ 8t4p3cfPEVMJ6udCMfP6xQbVNvTV3VHUemmRaxVSTUjAJfeIRqtnLDVusrIYyxdR
7
+ xjct4hDbajE0f82BefDq6g79qyc47LrxYxUypdryT+06WHsJ5wz/0BbrTGxK22mt
8
+ eQIDAQAB
9
+ -----END PUBLIC KEY-----
publickeys/partner7.pub CHANGED
@@ -1,9 +1,9 @@
1
- -----BEGIN PUBLIC KEY-----
2
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu6Em6gaB1pI0CJ1wUGkR
3
- vKBBTm75WAgfpZCbSBoSrruxCsOl4ofADJU8kLPOSmoXtuQikfDIYkZiKW9R4+5J
4
- Xq81hEzkhEWP67ggbAXlVsTxhuNLPFb7C0QLLaHAAcQwY7amaOKj584DiePvhZNe
5
- aIllbON8jbajEIacXBRvgCpkJISciEpwHfwSYdYkBMHbTzaYumUPUQ1K47zw6b9s
6
- Rs60Hoz9ojRvEhxNUXSWa2ztnb0Us6xeIR/waUHMVdTOinpPDUPMSLSjBrSYRs8D
7
- GL3wfIJu+DKpV+LBjDv+kgf5hs05gstrZ96N6pZW4L85gWQvS4tPXC3rr70OKdy5
8
- mQIDAQAB
9
- -----END PUBLIC KEY-----
1
+ -----BEGIN PUBLIC KEY-----
2
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu6Em6gaB1pI0CJ1wUGkR
3
+ vKBBTm75WAgfpZCbSBoSrruxCsOl4ofADJU8kLPOSmoXtuQikfDIYkZiKW9R4+5J
4
+ Xq81hEzkhEWP67ggbAXlVsTxhuNLPFb7C0QLLaHAAcQwY7amaOKj584DiePvhZNe
5
+ aIllbON8jbajEIacXBRvgCpkJISciEpwHfwSYdYkBMHbTzaYumUPUQ1K47zw6b9s
6
+ Rs60Hoz9ojRvEhxNUXSWa2ztnb0Us6xeIR/waUHMVdTOinpPDUPMSLSjBrSYRs8D
7
+ GL3wfIJu+DKpV+LBjDv+kgf5hs05gstrZ96N6pZW4L85gWQvS4tPXC3rr70OKdy5
8
+ mQIDAQAB
9
+ -----END PUBLIC KEY-----
publickeys/partner8.pub CHANGED
@@ -1,9 +1,9 @@
1
- -----BEGIN PUBLIC KEY-----
2
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0XrrzSYYtUJ8oKQcR6D0
3
- 4M/8sX6yJDpqNElrOj0YMwXuDyDiE4r9BqO+G5P2paZWIZFrC1reyaIiNIdNgcyr
4
- 7RcK1eVJZ+VW1mw7srCGgJiVyNXMawu02YlJenzgDUb4dqDqzPaa2XlEzP5YNZOY
5
- /DALizkX6uPvHlsH4UQxEZ7UK2a7hYWEwLYklj24WFGLaqXfm3scIckgdg3S5s+v
6
- KX/jqNZpCFzwdqPx09CYTlDL2Dl/kBuw5DwUrNJl+rWFtQsP2JjxSbyuxe+9XeCl
7
- Gb88lUxNPbO7C6OogTqFt+K3BnCficN0KQ6HNpmpwB4Cp5ckd85zmQemFnCXhMPu
8
- ZwIDAQAB
9
- -----END PUBLIC KEY-----
1
+ -----BEGIN PUBLIC KEY-----
2
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0XrrzSYYtUJ8oKQcR6D0
3
+ 4M/8sX6yJDpqNElrOj0YMwXuDyDiE4r9BqO+G5P2paZWIZFrC1reyaIiNIdNgcyr
4
+ 7RcK1eVJZ+VW1mw7srCGgJiVyNXMawu02YlJenzgDUb4dqDqzPaa2XlEzP5YNZOY
5
+ /DALizkX6uPvHlsH4UQxEZ7UK2a7hYWEwLYklj24WFGLaqXfm3scIckgdg3S5s+v
6
+ KX/jqNZpCFzwdqPx09CYTlDL2Dl/kBuw5DwUrNJl+rWFtQsP2JjxSbyuxe+9XeCl
7
+ Gb88lUxNPbO7C6OogTqFt+K3BnCficN0KQ6HNpmpwB4Cp5ckd85zmQemFnCXhMPu
8
+ ZwIDAQAB
9
+ -----END PUBLIC KEY-----
publickeys/partner9.pub CHANGED
@@ -1,9 +1,9 @@
1
- -----BEGIN PUBLIC KEY-----
2
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyGLveJUzI1fC7rufjTSU
3
- 1Es6Xly3Jdf5/qs+RwXp8qmKpaoZTVJO9Uk1ixi8alvC2Hq6v0qMHU/xgFAMU9y1
4
- TsVDgSJc4djLl8VrX7glyB8O12UqByk+ND+c4p6v4oUfothxr9wEr+jdlBH68eDJ
5
- XZ5jO7bU9Sh398KRj8jTzkgrSLTe0GkSrErzIq46B+wGx2RZlyKpMW7F7nLRcCpt
6
- ZH5vPatWt8gnw+8M0D66WETdUZrQaG0GYcMmE+LuVOTgx+mHMLH+ntd/B7K7NGHh
7
- fPnUm2nIG+oOgAj1RZzRi5qUF4+XFBmBWJV2vEM7HinYJlAsgCFMF6IaVAf3/ula
8
- HQIDAQAB
9
- -----END PUBLIC KEY-----
1
+ -----BEGIN PUBLIC KEY-----
2
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyGLveJUzI1fC7rufjTSU
3
+ 1Es6Xly3Jdf5/qs+RwXp8qmKpaoZTVJO9Uk1ixi8alvC2Hq6v0qMHU/xgFAMU9y1
4
+ TsVDgSJc4djLl8VrX7glyB8O12UqByk+ND+c4p6v4oUfothxr9wEr+jdlBH68eDJ
5
+ XZ5jO7bU9Sh398KRj8jTzkgrSLTe0GkSrErzIq46B+wGx2RZlyKpMW7F7nLRcCpt
6
+ ZH5vPatWt8gnw+8M0D66WETdUZrQaG0GYcMmE+LuVOTgx+mHMLH+ntd/B7K7NGHh
7
+ fPnUm2nIG+oOgAj1RZzRi5qUF4+XFBmBWJV2vEM7HinYJlAsgCFMF6IaVAf3/ula
8
+ HQIDAQAB
9
+ -----END PUBLIC KEY-----
readme.txt CHANGED
@@ -1,380 +1,385 @@
1
- === ManageWP Worker ===
2
- Contributors: freediver
3
- Donate link: https://www.networkforgood.org/donation/MakeDonation.aspx?ORGID2=520781390
4
- Tags: administration, admin,amazon, analytics, api, automate, automatic, backup, comments, clone, dashboard, database, debug, dropbox, duplicate, events, google analytics, google drive, google, integration, login, manage, managewp, migrate, multiple, multisite, mysql, page, performance, plugin, post, remote, s3, security, seo, spam, speed, stats
5
- Requires at least: 3.0
6
- Tested up to: 4.1
7
- Stable tag: trunk
8
- License: GPLv3 or later
9
- License URI: http://www.gnu.org/licenses/quick-guide-gplv3.html
10
-
11
- ManageWP is the ultimate WordPress productivity tool, allowing you to efficiently manage your websites.
12
-
13
- == Description ==
14
-
15
- [ManageWP](https://managewp.com/ "Manage WordPress Websites") is a revolutionary service that automates the management of multiple WordPress websites. ManageWP Worker Plugin allows your site to communicate with the service, and is needed in order to enjoy all these features:
16
-
17
- Main features:
18
-
19
- * Manage multiple WordPress sites securely and fast
20
- * Manage WordPress themes, plugins, users, pages and posts for all your websites from one dashboard
21
- * One click upgrades for WordPress, plugin and themes across all your sites
22
- * Schedule automatic backups of your websites (Amazon S3, Google Drive, FTP/SFTP and Dropbox supported)
23
- * Install WordPress, clone or migrate WordPress website to another domain
24
- * One click to access WP admin of any site
25
- * Bulk install themes and plugins to multiple sites at once
26
- * Bulk publish posts and pages to multiple sites at once
27
- * Add sub-users (writers, staff..) to your account
28
- * SEO Statistics, track your keyword rankings
29
- * Uptime monitoring - receive an SMS notification if your site goes down
30
-
31
-
32
- Check out the [ManageWP Tour video](http://www.youtube.com/watch?v=Cg_W9MQBWt4).
33
-
34
- http://www.youtube.com/watch?v=Cg_W9MQBWt4
35
-
36
- ManageWP is also the creator of [ManageWP.org](https://managewp.org/ "WordPress news site"), community project capturing the pulse of the WordPress community.
37
-
38
- == Changelog ==
39
-
40
- = 3.9.30 =
41
-
42
- - New: Fully compatible with WordPress 4.0
43
- - New: Adding websites to your ManageWP Dashboard is now easier than ever
44
- - Fix: Backup tool improvements (especially for websites located on Rackspace)
45
- - Fix: Various Clone/Migration tool improvements and fixes
46
- - Fix: SEO PDF report visual enhancement
47
- - Fix: Various interface improvements and fixes
48
-
49
- = 3.9.29 =
50
-
51
- - New: Worker plugin is now 36% faster and uses 83% less memory
52
- - New: Backup no longer relies on WordPress cron
53
- - New: New Server-Client communication fixing some of the previous issues
54
- - New: Notes and Recent backups widgets
55
- - New: Refreshed app interface :)
56
-
57
- = 3.9.28 =
58
- - New: Control WordPress Automatic Background Updates for plugins and themes!
59
- - Fix: Tweaks to SFTP support for backups and clone
60
- - Fix: Enhancements to Backup and Branding features
61
-
62
-
63
- = 3.9.27 =
64
- - New: SFTP support for backups and clone!
65
- - Fix: Database dump for backup tasks with defined socket path or port number in wp-config.php
66
- - Fix: Optimize WordPress tables before backup
67
- - Fix: Compatibility with Better WP Security
68
- - Fix: Not adding jQuery on front page while using branding option
69
-
70
- = 3.9.26 =
71
- - New: Improved branding feature
72
- - New: Disable Plugin and Theme changes for your clients
73
- - New: Support Page for non-Admin Users
74
- - New: Manage biographical info of user
75
- - Fix: Restore backup action keeps all backup tasks and backups
76
- - Fix: Add/delete post action uses WordPress hook
77
- - Fix: Delete user action was not functioning properly
78
-
79
- = 3.9.25 =
80
- - New: Improved Worker branding feature
81
- - Fix: Traffic alerts feature was not functioning properly
82
- - Fix: Backup information was sometimes incorrectly displayed
83
- - Fix: DB Table overhead was not shown on the dashboard
84
-
85
- = 3.9.24 =
86
- - New: Better support for large database dumps
87
- - Fix: PHP notice for WordPress 3.5
88
- - Fix: Support for automatic backup reports
89
- - Fix: Incorrect backup result message for S3 large files
90
-
91
- = 3.9.23 =
92
- - New: SEO reports can be branded and viewed by sharing an URL
93
- - New: Set custom database prefix for new clone destination
94
- - New: Automatic change all URL paths for new clone destination
95
- - New: Success and fail email notifications for scheduled backup tasks
96
- - Fix: Improved scheduled backups for limited server resources
97
- - Fix: Improved backup to Dropbox (now supporting larger backup files)
98
- - Fix: Handling of external images with bulk posting
99
- - Fix: Display plugin versions on manage plugins
100
- - Fix: Deprecated get_themes function
101
- - Fix: Special characters support for notes
102
-
103
- = 3.9.22 =
104
- - New: Backup support for Google Drive
105
- - New: Keyword tracking limit increased from 5 to 20 times the website limit (ie. with 25 website account you can now track the ranking for 500 keywords!)
106
- - New: Support for Google Analytics API 3.0
107
- - New: Website preview screenshot
108
- - New: Ability to assign a newly added website to existing Backup tasks (under "advanced" in add website dialogue)
109
- - Fix: Clone tool now supports special characters and localized WP installs
110
- - Fix: Backup history preserved on website re-add
111
-
112
- = 3.9.21 =
113
- * New: Continuous updates! Read more at http://managewp.com/continuous-updates
114
-
115
- = 3.9.20 =
116
- * New: ManageWP iOS app compatibility
117
- * New: Perform security and performance test as you add websites
118
- * New: New comment handling screen
119
-
120
- = 3.9.19 =
121
- * New: Improved mechanism for refreshing website stats. You should have fresh information every 4 hours without refreshing now
122
- * Fix: Categories now showing properly in Manage posts
123
- * Fix: Website stats now ignore uptime monitoring pings
124
-
125
- = 3.9.18 =
126
- * New: Pagelines themes added to the list of partners
127
- * New: Comprehensive website performance scan tool
128
- * New: You can now bulk edit posts/pages (updating that contact info will become piece of cake)
129
- * New: Upload and save your premium plugins/themes in your personal repository for quick installation
130
- * New: Run code snippets now get a repository. Save your snippets and share them with other users
131
- * New: SEO reports can now be sorted. Export as CSV and PDF reports.
132
- * New: Manage Blogroll links
133
- * New: Clean post revisions now has an option to save last x revisions when cleaning
134
- * New: Bulk delete na posts/pages/links
135
- * Fix: Amazon S3 backups failing
136
-
137
- = 3.9.17 =
138
- * New: Add your favorite sites to the Favorites bar (just drag&drop them to the small heart on the top)
139
- * New: Entirely new website menu loaded with features and tools
140
- * New: Manage Posts and Pages across all sites in a more efficient way
141
- * New: Support for all WPMU.org premium plugin updates
142
- * New: Complete Dropbox integration through Oauth which allows us to restore/delete Dropbox backups directly
143
- * New: We have the user guide as PDF now. [Download] (http://managewp.com/files/ManageWP_User_Guide.zip)
144
-
145
-
146
- = 3.9.16 =
147
- * New: Option to "Run now" backup tasks
148
- * New: Traffic alerts functionality
149
- * New: Support for Genesis premium theme updates
150
- * Fix: In some circutmsances .htaccess was not correctly zipped in the backup archive
151
-
152
- = 3.9.15 =
153
- * New: Full range of SEO Statistics now trackable for your websites (Google Page Rank and Page Speed, Backlinks and 20+ more)
154
- * New: Google keyword rank tracking with history
155
- * New: Uptime monitoring (5 min interval with email/SMS notification)
156
- * New: Insights into server PHP error logs right in your dashboard
157
- * New: Remote maintenance mode for your websites
158
- * Fix: A bug when a completed backup was reported as failed
159
-
160
- = 3.9.14 =
161
- * Two factor authentication
162
- * Run code tool
163
- * Quick access to security check and broken link tools
164
- * More accurate pageview statistics
165
- * You can now opt to completely hide the Worker plugin from the list of plugins (part of Worker branding features)
166
- * We improved the backups for folks running Windows servers
167
- * Amazon S3 directory name now "ManageWP" by default
168
- * Read more on ManageWP.com http://managewp.com/update-two-factor-authentication-run-code-tool-sucuri-security-check-more-accurate-pageview-statistics
169
-
170
- = 3.9.13 =
171
- * Added bucket location for Amazon S3 backups
172
- * Better backup feature for larger sites
173
- * Added Disable compression to further help with larger sites
174
- * Backing up wp-admin, wp-includes and wp-content by default now, other folders can be included manually
175
-
176
- = 3.9.12 =
177
- * Minor bug fixes
178
- * Backup, clone, favorites functionality improved
179
-
180
- = 3.9.10 =
181
- * Supporting updates for more premium plugins/themes
182
- * Backup notifications (users can now get notices when the backup succeeds or fails)
183
- * Support for WordPress 3.3
184
- * Worker Branding (useful for web agencies, add your own Name/Description)
185
- * Manage Groups screen
186
- * Specify wp-admin path if your site uses a custom one
187
- * Amazon S3 backups support for mixed case bucket names
188
- * Bulk Add Links has additional options
189
- * Better Multisite support
190
- * Option to set the number of items for Google Analytics
191
- * ManageWP backup folder changed to wp-content/managewp/backups
192
-
193
- = 3.9.9 =
194
- * New widget on the dashboard - Backup status
195
- * New screen for managing plugins and themes (activate, deactivate, delete, add to favorites, install) across all sites
196
- * New screen for managing users (change role or password, delete user) across all sites
197
- * Option to overwrite old plugins and themes during bulk installation
198
- * Your website admin now loads faster in ManageWP
199
- * Added API for premium theme and plugin updates
200
-
201
- = 3.9.8 =
202
- * Conversion goals integration
203
- * Update notifications
204
- * Enhanced security for your account
205
- * Better backups
206
- * Better update interface
207
- * [Full changelog](http://managewp.com/update-goals-and-adsense-analytics-integration-update-notifications-login-by-ip-better-backups "Full changelog")
208
-
209
- = 3.9.7 =
210
- * Fixed problem with cron schedules
211
-
212
- = 3.9.6 =
213
- * Improved dashboard performance
214
- * Fixed bug with W3TC, we hope it is fully comptabile now
215
- * Improved backup feature
216
- * Various other fixes and improvements
217
-
218
- = 3.9.5 =
219
- * Now supporting scheduled backups to Amazon S3 and Dropbox
220
- * Revamped cloning procedure
221
- * You can now have sites in different colors
222
- * W3 Total Cache comptability improved
223
-
224
- = 3.9.3 =
225
- * Included support for WordPress 3.2 partial updates
226
-
227
- = 3.9.2 =
228
- * Fixed problem with full backups
229
- * Fixed problem with wordpress dev version upgrades
230
-
231
- = 3.9.1 =
232
- * Support for sub-users (limited access users)
233
- * Bulk add user
234
- * 'Select all' feature for bulk posting
235
- * Featured image support for bulk posting
236
- * Reload button on the dashboard (on the top of the Right now widget) will now refresh information about available updates
237
- * Fixed a problem with the import tool
238
- * Fixed a problem when remote dashboard would not work for some servers
239
-
240
- = 3.9.0 =
241
- * New feature: Up to 50% faster dashboard loading
242
- * New feature: You can now ignore WordPress/plugin/theme updates
243
- * New feature: Setting 'Show favicon' for websites in the dashboad
244
- * New feature: Full backups now include WordPress and other folders in the root of the site
245
- * Fixed: Bug with W3 TotalCache object cache causing weird behaviour in the dashboard
246
- * Fixed: All groups now show when adding a site
247
-
248
- = 3.8.8 =
249
- * New feature: Bulk add links to blogroll
250
- * New feature: Manual backups to email address
251
- * New feature: Backup requirements check (under Manage Backups)
252
- * New feature: Popup menu for groups allowing to show dashboard for that group only
253
- * New feature: Favorite list for plugins and themes for later quick installation to multiple blogs
254
- * New feature: Invite friends
255
- * Fixed: problem with backups and write permissions when upload dir was wrongly set
256
- * Fixed: problem adding sites where WordPress is installed in a folder
257
- * Fixed: 408 error message problem when adding site
258
- * Fixed: site time out problems when adding site
259
- * Fixed: problems with some WP plugins (WP Sentinel)
260
- * Fixed: problems with upgrade notifications
261
-
262
- = 3.8.7 =
263
- * Fixed 408 error when adding sites
264
- * Added support for IDN domains
265
- * Fixed bug with WordPress updates
266
- * Added comment moderation to the dashboard
267
- * Added quick links for sites (menu appears on hover)
268
-
269
-
270
- = 3.8.6 =
271
- * Added seach websites feature
272
- * Enhanced dashboard actions (spam comments, post revisions, table overhead)
273
- * Added developer [API] (http://managewp.com/api "ManageWP API")
274
- * Improved Migrate/Clone site feature
275
-
276
- = 3.8.4 =
277
- * Fixed remote dashboard problems for sites with redirects
278
- * Fixed IE7 issues in the dashboard
279
-
280
- = 3.8.3 =
281
- * Fixed problem with capabilities
282
-
283
- = 3.8.2 =
284
- * New interface
285
- * SSL security protocol
286
- * No passwords required
287
- * Improved clone/backup
288
-
289
- = 3.6.3 =
290
- * Initial public release
291
-
292
- == Installation ==
293
-
294
- 1. Upload the plugin folder to your `/wp-content/plugins/` folder
295
- 2. Go to the Plugins page in your website's WP-admin area and activate ManageWP Worker
296
- 3. Visit [ManageWP.com](https://managewp.com/ "ManageWP")
297
- 4. Sign up and add your website
298
-
299
- Alternatively
300
-
301
- 1. Visit [ManageWP.com](https://managewp.com/ "Manage Multiple WordPress Sites") and sign up
302
- 2. ManageWP will notify you the Worker plugin is not installed and offer a link for quick installation
303
-
304
- For detailed instructions, you can read our [User Guide](http://managewp.com/user-guide/how-to-use-managewp/getting-started/adding-your-website-to-managewp/ "Add your website to ManageWP")
305
-
306
- == Screenshots ==
307
-
308
- 1. ManageWP dashboard with available upgrades, site statistics and management functions
309
-
310
-
311
- == Upgrade Notice ==
312
-
313
- = 3.9.30 =
314
- Worker plugin is now fully compatible with WordPress 4.0, adding websites is now easier and we have made fixes and improvements in Backup and Clone tools
315
-
316
-
317
- = 3.9.29 =
318
- Worker plugin is 36% faster and uses 83% less memory. Backup tool no longer relies on WordPress cron
319
-
320
-
321
- = 3.9.28 =
322
- It is now possible to control WordPress automatic background updates for plugins and themes!
323
-
324
-
325
- = 3.9.27 =
326
- We have added compatibility with Better WP Security. Also, it is now possible to backup and clone to SFTP
327
-
328
-
329
- == License ==
330
-
331
- This file is part of ManageWP Worker.
332
-
333
- ManageWP Worker is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
334
-
335
- ManageWP Worker is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
336
-
337
- You should have received a copy of the GNU General Public License along with ManageWP Worker. If not, see <http://www.gnu.org/licenses/>.
338
-
339
-
340
- == Frequently Asked Questions ==
341
-
342
- = Is ManageWP secure? =
343
-
344
- Yes. We invest heavilly in our security and in four years and serving over quarter a million websites we did not have a single security incident. Also we invest in a [white hat security program](https://managewp.com/white-hat-reward) with the purpose of preventing security issues.
345
-
346
- = Will ManageWP work with sites spread on different hosting accounts? =
347
-
348
- Yes.
349
-
350
- = Does ManageWP work with WordPress.com sites? =
351
-
352
- No. ManageWP works only with self-hosted WordPress sites.
353
-
354
- = Can I try all features for free? =
355
-
356
- Absolutely. The first month is on us.
357
-
358
- = I have problems adding my site =
359
-
360
- Make sure you use the latest version of the Worker plugin on the site you are trying to add. If you still have problems, check our dedicated [FAQ page](http://managewp.com/user-guide/faq/my-sites-fail-to-addload-to-managewp "Add site FAQ") or [contact us](http://managewp.com/contact "ManageWP Contact").
361
-
362
- = How does ManageWP compare to backup plugins like BackupBuddy, Backwpup, UpdraftPlus, WP-DB-Backup ? =
363
-
364
- There is a limit to what a PHP based backup can do (as are all these plugins) but we believe that our backup system is one of if not the most robust solution on the market.
365
-
366
- = How does ManageWP compare with clone plugins like Duplicator, WP Migrate DB, All-in-One WP Migration, XCloner ? =
367
-
368
- We are confident that our clone system is the most reliable one on the market featuring highly sophisticated technology allowing for the easiest and most efficient site clone/migration on the market.
369
-
370
- = Does ManageWP work with caching plugins like W3 Total Cache or WP Super Cache =
371
-
372
- Yes.
373
-
374
- = Does ManageWP work with all popular plugins like WordPress SEO by Yoast, WPTouch, Google XML Sitemaps, NextGEN Gallery, Contact Form 7, WooCommerce, iThemes Security, WordPres importer, Wordfence Security and others? =
375
-
376
- Yes. In most cases where there are conflicts we document them on our [known issues](https://managewp.com/user-guide/known-issues) page.
377
-
378
- = How does ManageWP compare to services like InfiniteWP, MainWP, CMS Commander, IControlWP ? =
379
-
380
- We believe that our product is technologically more advanced and more mature. In some cases ManageWP has been the inspiration for these services, and we continue to innovate. For more information please refer to [this comment](http://wpchat.com/t/security-and-centralized-wordpress-management-ie-managewp-jetpack-etc/505/6?u=vprelovac)
 
 
 
 
 
1
+ === ManageWP Worker ===
2
+ Contributors: freediver
3
+ Donate link: https://www.networkforgood.org/donation/MakeDonation.aspx?ORGID2=520781390
4
+ Tags: administration, admin,amazon, analytics, api, automate, automatic, backup, comments, clone, dashboard, database, debug, dropbox, duplicate, events, google analytics, google drive, google, integration, login, manage, managewp, migrate, multiple, multisite, mysql, page, performance, plugin, post, remote, s3, security, seo, spam, speed, stats
5
+ Requires at least: 3.0
6
+ Tested up to: 4.1
7
+ Stable tag: trunk
8
+ License: GPLv3 or later
9
+ License URI: http://www.gnu.org/licenses/quick-guide-gplv3.html
10
+
11
+ ManageWP is the ultimate WordPress productivity tool, allowing you to efficiently manage your websites.
12
+
13
+ == Description ==
14
+
15
+ [ManageWP](https://managewp.com/ "Manage WordPress Websites") is a revolutionary service that automates the management of multiple WordPress websites. ManageWP Worker Plugin allows your site to communicate with the service, and is needed in order to enjoy all these features:
16
+
17
+ Main features:
18
+
19
+ * Manage multiple WordPress sites securely and fast
20
+ * Manage WordPress themes, plugins, users, pages and posts for all your websites from one dashboard
21
+ * One click upgrades for WordPress, plugin and themes across all your sites
22
+ * Schedule automatic backups of your websites (Amazon S3, Google Drive, FTP/SFTP and Dropbox supported)
23
+ * Install WordPress, clone or migrate WordPress website to another domain
24
+ * One click to access WP admin of any site
25
+ * Bulk install themes and plugins to multiple sites at once
26
+ * Bulk publish posts and pages to multiple sites at once
27
+ * Add sub-users (writers, staff..) to your account
28
+ * SEO Statistics, track your keyword rankings
29
+ * Uptime monitoring - receive an SMS notification if your site goes down
30
+
31
+
32
+ Check out the [ManageWP Tour video](http://www.youtube.com/watch?v=Cg_W9MQBWt4).
33
+
34
+ http://www.youtube.com/watch?v=Cg_W9MQBWt4
35
+
36
+ ManageWP is also the creator of [ManageWP.org](https://managewp.org/ "WordPress news site"), community project capturing the pulse of the WordPress community.
37
+
38
+ == Changelog ==
39
+
40
+ = 4.0.0 =
41
+
42
+ - New features for the [ManageWP Orion release](http://managewp.com/managewp-orion-official-announcement "ManageWP Orion Official Announcement")
43
+ - Misc bug fixes and performance improvements
44
+
45
+ = 3.9.30 =
46
+
47
+ - New: Fully compatible with WordPress 4.0
48
+ - New: Adding websites to your ManageWP Dashboard is now easier than ever
49
+ - Fix: Backup tool improvements (especially for websites located on Rackspace)
50
+ - Fix: Various Clone/Migration tool improvements and fixes
51
+ - Fix: SEO PDF report visual enhancement
52
+ - Fix: Various interface improvements and fixes
53
+
54
+ = 3.9.29 =
55
+
56
+ - New: Worker plugin is now 36% faster and uses 83% less memory
57
+ - New: Backup no longer relies on WordPress cron
58
+ - New: New Server-Client communication fixing some of the previous issues
59
+ - New: Notes and Recent backups widgets
60
+ - New: Refreshed app interface :)
61
+
62
+ = 3.9.28 =
63
+ - New: Control WordPress Automatic Background Updates for plugins and themes!
64
+ - Fix: Tweaks to SFTP support for backups and clone
65
+ - Fix: Enhancements to Backup and Branding features
66
+
67
+
68
+ = 3.9.27 =
69
+ - New: SFTP support for backups and clone!
70
+ - Fix: Database dump for backup tasks with defined socket path or port number in wp-config.php
71
+ - Fix: Optimize WordPress tables before backup
72
+ - Fix: Compatibility with Better WP Security
73
+ - Fix: Not adding jQuery on front page while using branding option
74
+
75
+ = 3.9.26 =
76
+ - New: Improved branding feature
77
+ - New: Disable Plugin and Theme changes for your clients
78
+ - New: Support Page for non-Admin Users
79
+ - New: Manage biographical info of user
80
+ - Fix: Restore backup action keeps all backup tasks and backups
81
+ - Fix: Add/delete post action uses WordPress hook
82
+ - Fix: Delete user action was not functioning properly
83
+
84
+ = 3.9.25 =
85
+ - New: Improved Worker branding feature
86
+ - Fix: Traffic alerts feature was not functioning properly
87
+ - Fix: Backup information was sometimes incorrectly displayed
88
+ - Fix: DB Table overhead was not shown on the dashboard
89
+
90
+ = 3.9.24 =
91
+ - New: Better support for large database dumps
92
+ - Fix: PHP notice for WordPress 3.5
93
+ - Fix: Support for automatic backup reports
94
+ - Fix: Incorrect backup result message for S3 large files
95
+
96
+ = 3.9.23 =
97
+ - New: SEO reports can be branded and viewed by sharing an URL
98
+ - New: Set custom database prefix for new clone destination
99
+ - New: Automatic change all URL paths for new clone destination
100
+ - New: Success and fail email notifications for scheduled backup tasks
101
+ - Fix: Improved scheduled backups for limited server resources
102
+ - Fix: Improved backup to Dropbox (now supporting larger backup files)
103
+ - Fix: Handling of external images with bulk posting
104
+ - Fix: Display plugin versions on manage plugins
105
+ - Fix: Deprecated get_themes function
106
+ - Fix: Special characters support for notes
107
+
108
+ = 3.9.22 =
109
+ - New: Backup support for Google Drive
110
+ - New: Keyword tracking limit increased from 5 to 20 times the website limit (ie. with 25 website account you can now track the ranking for 500 keywords!)
111
+ - New: Support for Google Analytics API 3.0
112
+ - New: Website preview screenshot
113
+ - New: Ability to assign a newly added website to existing Backup tasks (under "advanced" in add website dialogue)
114
+ - Fix: Clone tool now supports special characters and localized WP installs
115
+ - Fix: Backup history preserved on website re-add
116
+
117
+ = 3.9.21 =
118
+ * New: Continuous updates! Read more at http://managewp.com/continuous-updates
119
+
120
+ = 3.9.20 =
121
+ * New: ManageWP iOS app compatibility
122
+ * New: Perform security and performance test as you add websites
123
+ * New: New comment handling screen
124
+
125
+ = 3.9.19 =
126
+ * New: Improved mechanism for refreshing website stats. You should have fresh information every 4 hours without refreshing now
127
+ * Fix: Categories now showing properly in Manage posts
128
+ * Fix: Website stats now ignore uptime monitoring pings
129
+
130
+ = 3.9.18 =
131
+ * New: Pagelines themes added to the list of partners
132
+ * New: Comprehensive website performance scan tool
133
+ * New: You can now bulk edit posts/pages (updating that contact info will become piece of cake)
134
+ * New: Upload and save your premium plugins/themes in your personal repository for quick installation
135
+ * New: Run code snippets now get a repository. Save your snippets and share them with other users
136
+ * New: SEO reports can now be sorted. Export as CSV and PDF reports.
137
+ * New: Manage Blogroll links
138
+ * New: Clean post revisions now has an option to save last x revisions when cleaning
139
+ * New: Bulk delete na posts/pages/links
140
+ * Fix: Amazon S3 backups failing
141
+
142
+ = 3.9.17 =
143
+ * New: Add your favorite sites to the Favorites bar (just drag&drop them to the small heart on the top)
144
+ * New: Entirely new website menu loaded with features and tools
145
+ * New: Manage Posts and Pages across all sites in a more efficient way
146
+ * New: Support for all WPMU.org premium plugin updates
147
+ * New: Complete Dropbox integration through Oauth which allows us to restore/delete Dropbox backups directly
148
+ * New: We have the user guide as PDF now. [Download] (http://managewp.com/files/ManageWP_User_Guide.zip)
149
+
150
+
151
+ = 3.9.16 =
152
+ * New: Option to "Run now" backup tasks
153
+ * New: Traffic alerts functionality
154
+ * New: Support for Genesis premium theme updates
155
+ * Fix: In some circutmsances .htaccess was not correctly zipped in the backup archive
156
+
157
+ = 3.9.15 =
158
+ * New: Full range of SEO Statistics now trackable for your websites (Google Page Rank and Page Speed, Backlinks and 20+ more)
159
+ * New: Google keyword rank tracking with history
160
+ * New: Uptime monitoring (5 min interval with email/SMS notification)
161
+ * New: Insights into server PHP error logs right in your dashboard
162
+ * New: Remote maintenance mode for your websites
163
+ * Fix: A bug when a completed backup was reported as failed
164
+
165
+ = 3.9.14 =
166
+ * Two factor authentication
167
+ * Run code tool
168
+ * Quick access to security check and broken link tools
169
+ * More accurate pageview statistics
170
+ * You can now opt to completely hide the Worker plugin from the list of plugins (part of Worker branding features)
171
+ * We improved the backups for folks running Windows servers
172
+ * Amazon S3 directory name now "ManageWP" by default
173
+ * Read more on ManageWP.com http://managewp.com/update-two-factor-authentication-run-code-tool-sucuri-security-check-more-accurate-pageview-statistics
174
+
175
+ = 3.9.13 =
176
+ * Added bucket location for Amazon S3 backups
177
+ * Better backup feature for larger sites
178
+ * Added Disable compression to further help with larger sites
179
+ * Backing up wp-admin, wp-includes and wp-content by default now, other folders can be included manually
180
+
181
+ = 3.9.12 =
182
+ * Minor bug fixes
183
+ * Backup, clone, favorites functionality improved
184
+
185
+ = 3.9.10 =
186
+ * Supporting updates for more premium plugins/themes
187
+ * Backup notifications (users can now get notices when the backup succeeds or fails)
188
+ * Support for WordPress 3.3
189
+ * Worker Branding (useful for web agencies, add your own Name/Description)
190
+ * Manage Groups screen
191
+ * Specify wp-admin path if your site uses a custom one
192
+ * Amazon S3 backups support for mixed case bucket names
193
+ * Bulk Add Links has additional options
194
+ * Better Multisite support
195
+ * Option to set the number of items for Google Analytics
196
+ * ManageWP backup folder changed to wp-content/managewp/backups
197
+
198
+ = 3.9.9 =
199
+ * New widget on the dashboard - Backup status
200
+ * New screen for managing plugins and themes (activate, deactivate, delete, add to favorites, install) across all sites
201
+ * New screen for managing users (change role or password, delete user) across all sites
202
+ * Option to overwrite old plugins and themes during bulk installation
203
+ * Your website admin now loads faster in ManageWP
204
+ * Added API for premium theme and plugin updates
205
+
206
+ = 3.9.8 =
207
+ * Conversion goals integration
208
+ * Update notifications
209
+ * Enhanced security for your account
210
+ * Better backups
211
+ * Better update interface
212
+ * [Full changelog](http://managewp.com/update-goals-and-adsense-analytics-integration-update-notifications-login-by-ip-better-backups "Full changelog")
213
+
214
+ = 3.9.7 =
215
+ * Fixed problem with cron schedules
216
+
217
+ = 3.9.6 =
218
+ * Improved dashboard performance
219
+ * Fixed bug with W3TC, we hope it is fully comptabile now
220
+ * Improved backup feature
221
+ * Various other fixes and improvements
222
+
223
+ = 3.9.5 =
224
+ * Now supporting scheduled backups to Amazon S3 and Dropbox
225
+ * Revamped cloning procedure
226
+ * You can now have sites in different colors
227
+ * W3 Total Cache comptability improved
228
+
229
+ = 3.9.3 =
230
+ * Included support for WordPress 3.2 partial updates
231
+
232
+ = 3.9.2 =
233
+ * Fixed problem with full backups
234
+ * Fixed problem with wordpress dev version upgrades
235
+
236
+ = 3.9.1 =
237
+ * Support for sub-users (limited access users)
238
+ * Bulk add user
239
+ * 'Select all' feature for bulk posting
240
+ * Featured image support for bulk posting
241
+ * Reload button on the dashboard (on the top of the Right now widget) will now refresh information about available updates
242
+ * Fixed a problem with the import tool
243
+ * Fixed a problem when remote dashboard would not work for some servers
244
+
245
+ = 3.9.0 =
246
+ * New feature: Up to 50% faster dashboard loading
247
+ * New feature: You can now ignore WordPress/plugin/theme updates
248
+ * New feature: Setting 'Show favicon' for websites in the dashboad
249
+ * New feature: Full backups now include WordPress and other folders in the root of the site
250
+ * Fixed: Bug with W3 TotalCache object cache causing weird behaviour in the dashboard
251
+ * Fixed: All groups now show when adding a site
252
+
253
+ = 3.8.8 =
254
+ * New feature: Bulk add links to blogroll
255
+ * New feature: Manual backups to email address
256
+ * New feature: Backup requirements check (under Manage Backups)
257
+ * New feature: Popup menu for groups allowing to show dashboard for that group only
258
+ * New feature: Favorite list for plugins and themes for later quick installation to multiple blogs
259
+ * New feature: Invite friends
260
+ * Fixed: problem with backups and write permissions when upload dir was wrongly set
261
+ * Fixed: problem adding sites where WordPress is installed in a folder
262
+ * Fixed: 408 error message problem when adding site
263
+ * Fixed: site time out problems when adding site
264
+ * Fixed: problems with some WP plugins (WP Sentinel)
265
+ * Fixed: problems with upgrade notifications
266
+
267
+ = 3.8.7 =
268
+ * Fixed 408 error when adding sites
269
+ * Added support for IDN domains
270
+ * Fixed bug with WordPress updates
271
+ * Added comment moderation to the dashboard
272
+ * Added quick links for sites (menu appears on hover)
273
+
274
+
275
+ = 3.8.6 =
276
+ * Added seach websites feature
277
+ * Enhanced dashboard actions (spam comments, post revisions, table overhead)
278
+ * Added developer [API] (http://managewp.com/api "ManageWP API")
279
+ * Improved Migrate/Clone site feature
280
+
281
+ = 3.8.4 =
282
+ * Fixed remote dashboard problems for sites with redirects
283
+ * Fixed IE7 issues in the dashboard
284
+
285
+ = 3.8.3 =
286
+ * Fixed problem with capabilities
287
+
288
+ = 3.8.2 =
289
+ * New interface
290
+ * SSL security protocol
291
+ * No passwords required
292
+ * Improved clone/backup
293
+
294
+ = 3.6.3 =
295
+ * Initial public release
296
+
297
+ == Installation ==
298
+
299
+ 1. Upload the plugin folder to your `/wp-content/plugins/` folder
300
+ 2. Go to the Plugins page in your website's WP-admin area and activate ManageWP Worker
301
+ 3. Visit [ManageWP.com](https://managewp.com/ "ManageWP")
302
+ 4. Sign up and add your website
303
+
304
+ Alternatively
305
+
306
+ 1. Visit [ManageWP.com](https://managewp.com/ "Manage Multiple WordPress Sites") and sign up
307
+ 2. ManageWP will notify you the Worker plugin is not installed and offer a link for quick installation
308
+
309
+ For detailed instructions, you can read our [User Guide](http://managewp.com/user-guide/how-to-use-managewp/getting-started/adding-your-website-to-managewp/ "Add your website to ManageWP")
310
+
311
+ == Screenshots ==
312
+
313
+ 1. ManageWP dashboard with available upgrades, site statistics and management functions
314
+
315
+
316
+ == Upgrade Notice ==
317
+
318
+ = 3.9.30 =
319
+ Worker plugin is now fully compatible with WordPress 4.0, adding websites is now easier and we have made fixes and improvements in Backup and Clone tools
320
+
321
+
322
+ = 3.9.29 =
323
+ Worker plugin is 36% faster and uses 83% less memory. Backup tool no longer relies on WordPress cron
324
+
325
+
326
+ = 3.9.28 =
327
+ It is now possible to control WordPress automatic background updates for plugins and themes!
328
+
329
+
330
+ = 3.9.27 =
331
+ We have added compatibility with Better WP Security. Also, it is now possible to backup and clone to SFTP
332
+
333
+
334
+ == License ==
335
+
336
+ This file is part of ManageWP Worker.
337
+
338
+ ManageWP Worker is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
339
+
340
+ ManageWP Worker is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
341
+
342
+ You should have received a copy of the GNU General Public License along with ManageWP Worker. If not, see <http://www.gnu.org/licenses/>.
343
+
344
+
345
+ == Frequently Asked Questions ==
346
+
347
+ = Is ManageWP secure? =
348
+
349
+ Yes. We invest heavilly in our security and in four years and serving over quarter a million websites we did not have a single security incident. Also we invest in a [white hat security program](https://managewp.com/white-hat-reward) with the purpose of preventing security issues.
350
+
351
+ = Will ManageWP work with sites spread on different hosting accounts? =
352
+
353
+ Yes.
354
+
355
+ = Does ManageWP work with WordPress.com sites? =
356
+
357
+ No. ManageWP works only with self-hosted WordPress sites.
358
+
359
+ = Can I try all features for free? =
360
+
361
+ Absolutely. The first month is on us.
362
+
363
+ = I have problems adding my site =
364
+
365
+ Make sure you use the latest version of the Worker plugin on the site you are trying to add. If you still have problems, check our dedicated [FAQ page](http://managewp.com/user-guide/faq/my-sites-fail-to-addload-to-managewp "Add site FAQ") or [contact us](http://managewp.com/contact "ManageWP Contact").
366
+
367
+ = How does ManageWP compare to backup plugins like BackupBuddy, Backwpup, UpdraftPlus, WP-DB-Backup ? =
368
+
369
+ There is a limit to what a PHP based backup can do (as are all these plugins) but we believe that our backup system is one of if not the most robust solution on the market.
370
+
371
+ = How does ManageWP compare with clone plugins like Duplicator, WP Migrate DB, All-in-One WP Migration, XCloner ? =
372
+
373
+ We are confident that our clone system is the most reliable one on the market featuring highly sophisticated technology allowing for the easiest and most efficient site clone/migration on the market.
374
+
375
+ = Does ManageWP work with caching plugins like W3 Total Cache or WP Super Cache =
376
+
377
+ Yes.
378
+
379
+ = Does ManageWP work with all popular plugins like WordPress SEO by Yoast, WPTouch, Google XML Sitemaps, NextGEN Gallery, Contact Form 7, WooCommerce, iThemes Security, WordPres importer, Wordfence Security and others? =
380
+
381
+ Yes. In most cases where there are conflicts we document them on our [known issues](https://managewp.com/user-guide/known-issues) page.
382
+
383
+ = How does ManageWP compare to services like InfiniteWP, MainWP, CMS Commander, IControlWP ? =
384
+
385
+ We believe that our product is technologically more advanced and more mature. In some cases ManageWP has been the inspiration for these services, and we continue to innovate. For more information please refer to [this comment](http://wpchat.com/t/security-and-centralized-wordpress-management-ie-managewp-jetpack-etc/505/6?u=vprelovac)
src/Dropbox/certs/trusted-certs.crt CHANGED
@@ -1,1396 +1,1396 @@
1
- # DigiCert Assured ID Root CA.pem
2
- # Certificate:
3
- # Data:
4
- # Version: 3 (0x2)
5
- # Serial Number:
6
- # 0c:e7:e0:e5:17:d8:46:fe:8f:e5:60:fc:1b:f0:30:39
7
- # Signature Algorithm: sha1WithRSAEncryption
8
- # Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Assured ID Root CA
9
- # Validity
10
- # Not Before: Nov 10 00:00:00 2006 GMT
11
- # Not After : Nov 10 00:00:00 2031 GMT
12
- # Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Assured ID Root CA
13
- # Subject Public Key Info:
14
- # Public Key Algorithm: rsaEncryption
15
- # Public-Key: (2048 bit)
16
- # Modulus:
17
- # 00:ad:0e:15:ce:e4:43:80:5c:b1:87:f3:b7:60:f9:
18
- # 71:12:a5:ae:dc:26:94:88:aa:f4:ce:f5:20:39:28:
19
- # 58:60:0c:f8:80:da:a9:15:95:32:61:3c:b5:b1:28:
20
- # 84:8a:8a:dc:9f:0a:0c:83:17:7a:8f:90:ac:8a:e7:
21
- # 79:53:5c:31:84:2a:f6:0f:98:32:36:76:cc:de:dd:
22
- # 3c:a8:a2:ef:6a:fb:21:f2:52:61:df:9f:20:d7:1f:
23
- # e2:b1:d9:fe:18:64:d2:12:5b:5f:f9:58:18:35:bc:
24
- # 47:cd:a1:36:f9:6b:7f:d4:b0:38:3e:c1:1b:c3:8c:
25
- # 33:d9:d8:2f:18:fe:28:0f:b3:a7:83:d6:c3:6e:44:
26
- # c0:61:35:96:16:fe:59:9c:8b:76:6d:d7:f1:a2:4b:
27
- # 0d:2b:ff:0b:72:da:9e:60:d0:8e:90:35:c6:78:55:
28
- # 87:20:a1:cf:e5:6d:0a:c8:49:7c:31:98:33:6c:22:
29
- # e9:87:d0:32:5a:a2:ba:13:82:11:ed:39:17:9d:99:
30
- # 3a:72:a1:e6:fa:a4:d9:d5:17:31:75:ae:85:7d:22:
31
- # ae:3f:01:46:86:f6:28:79:c8:b1:da:e4:57:17:c4:
32
- # 7e:1c:0e:b0:b4:92:a6:56:b3:bd:b2:97:ed:aa:a7:
33
- # f0:b7:c5:a8:3f:95:16:d0:ff:a1:96:eb:08:5f:18:
34
- # 77:4f
35
- # Exponent: 65537 (0x10001)
36
- # X509v3 extensions:
37
- # X509v3 Key Usage: critical
38
- # Digital Signature, Certificate Sign, CRL Sign
39
- # X509v3 Basic Constraints: critical
40
- # CA:TRUE
41
- # X509v3 Subject Key Identifier:
42
- # 45:EB:A2:AF:F4:92:CB:82:31:2D:51:8B:A7:A7:21:9D:F3:6D:C8:0F
43
- # X509v3 Authority Key Identifier:
44
- # keyid:45:EB:A2:AF:F4:92:CB:82:31:2D:51:8B:A7:A7:21:9D:F3:6D:C8:0F
45
- #
46
- # Signature Algorithm: sha1WithRSAEncryption
47
- # a2:0e:bc:df:e2:ed:f0:e3:72:73:7a:64:94:bf:f7:72:66:d8:
48
- # 32:e4:42:75:62:ae:87:eb:f2:d5:d9:de:56:b3:9f:cc:ce:14:
49
- # 28:b9:0d:97:60:5c:12:4c:58:e4:d3:3d:83:49:45:58:97:35:
50
- # 69:1a:a8:47:ea:56:c6:79:ab:12:d8:67:81:84:df:7f:09:3c:
51
- # 94:e6:b8:26:2c:20:bd:3d:b3:28:89:f7:5f:ff:22:e2:97:84:
52
- # 1f:e9:65:ef:87:e0:df:c1:67:49:b3:5d:eb:b2:09:2a:eb:26:
53
- # ed:78:be:7d:3f:2b:f3:b7:26:35:6d:5f:89:01:b6:49:5b:9f:
54
- # 01:05:9b:ab:3d:25:c1:cc:b6:7f:c2:f1:6f:86:c6:fa:64:68:
55
- # eb:81:2d:94:eb:42:b7:fa:8c:1e:dd:62:f1:be:50:67:b7:6c:
56
- # bd:f3:f1:1f:6b:0c:36:07:16:7f:37:7c:a9:5b:6d:7a:f1:12:
57
- # 46:60:83:d7:27:04:be:4b:ce:97:be:c3:67:2a:68:11:df:80:
58
- # e7:0c:33:66:bf:13:0d:14:6e:f3:7f:1f:63:10:1e:fa:8d:1b:
59
- # 25:6d:6c:8f:a5:b7:61:01:b1:d2:a3:26:a1:10:71:9d:ad:e2:
60
- # c3:f9:c3:99:51:b7:2b:07:08:ce:2e:e6:50:b2:a7:fa:0a:45:
61
- # 2f:a2:f0:f2
62
- -----BEGIN CERTIFICATE-----
63
- MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
64
- MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
65
- d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
66
- b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG
67
- EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
68
- cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi
69
- MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c
70
- JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP
71
- mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+
72
- wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4
73
- VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/
74
- AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB
75
- AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
76
- BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
77
- pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
78
- dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf
79
- fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm
80
- NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx
81
- H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
82
- +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
83
- -----END CERTIFICATE-----
84
- # DigiCert Global Root CA.pem
85
- # Certificate:
86
- # Data:
87
- # Version: 3 (0x2)
88
- # Serial Number:
89
- # 08:3b:e0:56:90:42:46:b1:a1:75:6a:c9:59:91:c7:4a
90
- # Signature Algorithm: sha1WithRSAEncryption
91
- # Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root CA
92
- # Validity
93
- # Not Before: Nov 10 00:00:00 2006 GMT
94
- # Not After : Nov 10 00:00:00 2031 GMT
95
- # Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root CA
96
- # Subject Public Key Info:
97
- # Public Key Algorithm: rsaEncryption
98
- # Public-Key: (2048 bit)
99
- # Modulus:
100
- # 00:e2:3b:e1:11:72:de:a8:a4:d3:a3:57:aa:50:a2:
101
- # 8f:0b:77:90:c9:a2:a5:ee:12:ce:96:5b:01:09:20:
102
- # cc:01:93:a7:4e:30:b7:53:f7:43:c4:69:00:57:9d:
103
- # e2:8d:22:dd:87:06:40:00:81:09:ce:ce:1b:83:bf:
104
- # df:cd:3b:71:46:e2:d6:66:c7:05:b3:76:27:16:8f:
105
- # 7b:9e:1e:95:7d:ee:b7:48:a3:08:da:d6:af:7a:0c:
106
- # 39:06:65:7f:4a:5d:1f:bc:17:f8:ab:be:ee:28:d7:
107
- # 74:7f:7a:78:99:59:85:68:6e:5c:23:32:4b:bf:4e:
108
- # c0:e8:5a:6d:e3:70:bf:77:10:bf:fc:01:f6:85:d9:
109
- # a8:44:10:58:32:a9:75:18:d5:d1:a2:be:47:e2:27:
110
- # 6a:f4:9a:33:f8:49:08:60:8b:d4:5f:b4:3a:84:bf:
111
- # a1:aa:4a:4c:7d:3e:cf:4f:5f:6c:76:5e:a0:4b:37:
112
- # 91:9e:dc:22:e6:6d:ce:14:1a:8e:6a:cb:fe:cd:b3:
113
- # 14:64:17:c7:5b:29:9e:32:bf:f2:ee:fa:d3:0b:42:
114
- # d4:ab:b7:41:32:da:0c:d4:ef:f8:81:d5:bb:8d:58:
115
- # 3f:b5:1b:e8:49:28:a2:70:da:31:04:dd:f7:b2:16:
116
- # f2:4c:0a:4e:07:a8:ed:4a:3d:5e:b5:7f:a3:90:c3:
117
- # af:27
118
- # Exponent: 65537 (0x10001)
119
- # X509v3 extensions:
120
- # X509v3 Key Usage: critical
121
- # Digital Signature, Certificate Sign, CRL Sign
122
- # X509v3 Basic Constraints: critical
123
- # CA:TRUE
124
- # X509v3 Subject Key Identifier:
125
- # 03:DE:50:35:56:D1:4C:BB:66:F0:A3:E2:1B:1B:C3:97:B2:3D:D1:55
126
- # X509v3 Authority Key Identifier:
127
- # keyid:03:DE:50:35:56:D1:4C:BB:66:F0:A3:E2:1B:1B:C3:97:B2:3D:D1:55
128
- #
129
- # Signature Algorithm: sha1WithRSAEncryption
130
- # cb:9c:37:aa:48:13:12:0a:fa:dd:44:9c:4f:52:b0:f4:df:ae:
131
- # 04:f5:79:79:08:a3:24:18:fc:4b:2b:84:c0:2d:b9:d5:c7:fe:
132
- # f4:c1:1f:58:cb:b8:6d:9c:7a:74:e7:98:29:ab:11:b5:e3:70:
133
- # a0:a1:cd:4c:88:99:93:8c:91:70:e2:ab:0f:1c:be:93:a9:ff:
134
- # 63:d5:e4:07:60:d3:a3:bf:9d:5b:09:f1:d5:8e:e3:53:f4:8e:
135
- # 63:fa:3f:a7:db:b4:66:df:62:66:d6:d1:6e:41:8d:f2:2d:b5:
136
- # ea:77:4a:9f:9d:58:e2:2b:59:c0:40:23:ed:2d:28:82:45:3e:
137
- # 79:54:92:26:98:e0:80:48:a8:37:ef:f0:d6:79:60:16:de:ac:
138
- # e8:0e:cd:6e:ac:44:17:38:2f:49:da:e1:45:3e:2a:b9:36:53:
139
- # cf:3a:50:06:f7:2e:e8:c4:57:49:6c:61:21:18:d5:04:ad:78:
140
- # 3c:2c:3a:80:6b:a7:eb:af:15:14:e9:d8:89:c1:b9:38:6c:e2:
141
- # 91:6c:8a:ff:64:b9:77:25:57:30:c0:1b:24:a3:e1:dc:e9:df:
142
- # 47:7c:b5:b4:24:08:05:30:ec:2d:bd:0b:bf:45:bf:50:b9:a9:
143
- # f3:eb:98:01:12:ad:c8:88:c6:98:34:5f:8d:0a:3c:c6:e9:d5:
144
- # 95:95:6d:de
145
- -----BEGIN CERTIFICATE-----
146
- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
147
- MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
148
- d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
149
- QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
150
- MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
151
- b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
152
- 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
153
- CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
154
- nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
155
- 43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
156
- T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
157
- gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
158
- BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
159
- TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
160
- DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
161
- hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
162
- 06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
163
- PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
164
- YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
165
- CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
166
- -----END CERTIFICATE-----
167
- # DigiCert High Assurance EV Root CA.pem
168
- # Certificate:
169
- # Data:
170
- # Version: 3 (0x2)
171
- # Serial Number:
172
- # 02:ac:5c:26:6a:0b:40:9b:8f:0b:79:f2:ae:46:25:77
173
- # Signature Algorithm: sha1WithRSAEncryption
174
- # Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA
175
- # Validity
176
- # Not Before: Nov 10 00:00:00 2006 GMT
177
- # Not After : Nov 10 00:00:00 2031 GMT
178
- # Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA
179
- # Subject Public Key Info:
180
- # Public Key Algorithm: rsaEncryption
181
- # Public-Key: (2048 bit)
182
- # Modulus:
183
- # 00:c6:cc:e5:73:e6:fb:d4:bb:e5:2d:2d:32:a6:df:
184
- # e5:81:3f:c9:cd:25:49:b6:71:2a:c3:d5:94:34:67:
185
- # a2:0a:1c:b0:5f:69:a6:40:b1:c4:b7:b2:8f:d0:98:
186
- # a4:a9:41:59:3a:d3:dc:94:d6:3c:db:74:38:a4:4a:
187
- # cc:4d:25:82:f7:4a:a5:53:12:38:ee:f3:49:6d:71:
188
- # 91:7e:63:b6:ab:a6:5f:c3:a4:84:f8:4f:62:51:be:
189
- # f8:c5:ec:db:38:92:e3:06:e5:08:91:0c:c4:28:41:
190
- # 55:fb:cb:5a:89:15:7e:71:e8:35:bf:4d:72:09:3d:
191
- # be:3a:38:50:5b:77:31:1b:8d:b3:c7:24:45:9a:a7:
192
- # ac:6d:00:14:5a:04:b7:ba:13:eb:51:0a:98:41:41:
193
- # 22:4e:65:61:87:81:41:50:a6:79:5c:89:de:19:4a:
194
- # 57:d5:2e:e6:5d:1c:53:2c:7e:98:cd:1a:06:16:a4:
195
- # 68:73:d0:34:04:13:5c:a1:71:d3:5a:7c:55:db:5e:
196
- # 64:e1:37:87:30:56:04:e5:11:b4:29:80:12:f1:79:
197
- # 39:88:a2:02:11:7c:27:66:b7:88:b7:78:f2:ca:0a:
198
- # a8:38:ab:0a:64:c2:bf:66:5d:95:84:c1:a1:25:1e:
199
- # 87:5d:1a:50:0b:20:12:cc:41:bb:6e:0b:51:38:b8:
200
- # 4b:cb
201
- # Exponent: 65537 (0x10001)
202
- # X509v3 extensions:
203
- # X509v3 Key Usage: critical
204
- # Digital Signature, Certificate Sign, CRL Sign
205
- # X509v3 Basic Constraints: critical
206
- # CA:TRUE
207
- # X509v3 Subject Key Identifier:
208
- # B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3
209
- # X509v3 Authority Key Identifier:
210
- # keyid:B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3
211
- #
212
- # Signature Algorithm: sha1WithRSAEncryption
213
- # 1c:1a:06:97:dc:d7:9c:9f:3c:88:66:06:08:57:21:db:21:47:
214
- # f8:2a:67:aa:bf:18:32:76:40:10:57:c1:8a:f3:7a:d9:11:65:
215
- # 8e:35:fa:9e:fc:45:b5:9e:d9:4c:31:4b:b8:91:e8:43:2c:8e:
216
- # b3:78:ce:db:e3:53:79:71:d6:e5:21:94:01:da:55:87:9a:24:
217
- # 64:f6:8a:66:cc:de:9c:37:cd:a8:34:b1:69:9b:23:c8:9e:78:
218
- # 22:2b:70:43:e3:55:47:31:61:19:ef:58:c5:85:2f:4e:30:f6:
219
- # a0:31:16:23:c8:e7:e2:65:16:33:cb:bf:1a:1b:a0:3d:f8:ca:
220
- # 5e:8b:31:8b:60:08:89:2d:0c:06:5c:52:b7:c4:f9:0a:98:d1:
221
- # 15:5f:9f:12:be:7c:36:63:38:bd:44:a4:7f:e4:26:2b:0a:c4:
222
- # 97:69:0d:e9:8c:e2:c0:10:57:b8:c8:76:12:91:55:f2:48:69:
223
- # d8:bc:2a:02:5b:0f:44:d4:20:31:db:f4:ba:70:26:5d:90:60:
224
- # 9e:bc:4b:17:09:2f:b4:cb:1e:43:68:c9:07:27:c1:d2:5c:f7:
225
- # ea:21:b9:68:12:9c:3c:9c:bf:9e:fc:80:5c:9b:63:cd:ec:47:
226
- # aa:25:27:67:a0:37:f3:00:82:7d:54:d7:a9:f8:e9:2e:13:a3:
227
- # 77:e8:1f:4a
228
- -----BEGIN CERTIFICATE-----
229
- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
230
- MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
231
- d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
232
- ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
233
- MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
234
- LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
235
- RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
236
- +9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
237
- PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
238
- xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
239
- Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
240
- hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
241
- EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
242
- MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
243
- FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
244
- nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
245
- eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
246
- hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
247
- Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
248
- vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
249
- +OkuE6N36B9K
250
- -----END CERTIFICATE-----
251
- # Entrust Root Certification Authority - EC1.pem
252
- # Certificate:
253
- # Data:
254
- # Version: 3 (0x2)
255
- # Serial Number:
256
- # a6:8b:79:29:00:00:00:00:50:d0:91:f9
257
- # Signature Algorithm: ecdsa-with-SHA384
258
- # Issuer: C=US, O=Entrust, Inc., OU=See www.entrust.net/legal-terms, OU=(c) 2012 Entrust, Inc. - for authorized use only, CN=Entrust Root Certification Authority - EC1
259
- # Validity
260
- # Not Before: Dec 18 15:25:36 2012 GMT
261
- # Not After : Dec 18 15:55:36 2037 GMT
262
- # Subject: C=US, O=Entrust, Inc., OU=See www.entrust.net/legal-terms, OU=(c) 2012 Entrust, Inc. - for authorized use only, CN=Entrust Root Certification Authority - EC1
263
- # Subject Public Key Info:
264
- # Public Key Algorithm: id-ecPublicKey
265
- # Public-Key: (384 bit)
266
- # pub:
267
- # 04:84:13:c9:d0:ba:6d:41:7b:e2:6c:d0:eb:55:5f:
268
- # 66:02:1a:24:f4:5b:89:69:47:e3:b8:c2:7d:f1:f2:
269
- # 02:c5:9f:a0:f6:5b:d5:8b:06:19:86:4f:53:10:6d:
270
- # 07:24:27:a1:a0:f8:d5:47:19:61:4c:7d:ca:93:27:
271
- # ea:74:0c:ef:6f:96:09:fe:63:ec:70:5d:36:ad:67:
272
- # 77:ae:c9:9d:7c:55:44:3a:a2:63:51:1f:f5:e3:62:
273
- # d4:a9:47:07:3e:cc:20
274
- # ASN1 OID: secp384r1
275
- # X509v3 extensions:
276
- # X509v3 Key Usage: critical
277
- # Certificate Sign, CRL Sign
278
- # X509v3 Basic Constraints: critical
279
- # CA:TRUE
280
- # X509v3 Subject Key Identifier:
281
- # B7:63:E7:1A:DD:8D:E9:08:A6:55:83:A4:E0:6A:50:41:65:11:42:49
282
- # Signature Algorithm: ecdsa-with-SHA384
283
- # 30:64:02:30:61:79:d8:e5:42:47:df:1c:ae:53:99:17:b6:6f:
284
- # 1c:7d:e1:bf:11:94:d1:03:88:75:e4:8d:89:a4:8a:77:46:de:
285
- # 6d:61:ef:02:f5:fb:b5:df:cc:fe:4e:ff:fe:a9:e6:a7:02:30:
286
- # 5b:99:d7:85:37:06:b5:7b:08:fd:eb:27:8b:4a:94:f9:e1:fa:
287
- # a7:8e:26:08:e8:7c:92:68:6d:73:d8:6f:26:ac:21:02:b8:99:
288
- # b7:26:41:5b:25:60:ae:d0:48:1a:ee:06
289
- -----BEGIN CERTIFICATE-----
290
- MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG
291
- A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3
292
- d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu
293
- dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq
294
- RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy
295
- MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD
296
- VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0
297
- L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g
298
- Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD
299
- ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi
300
- A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt
301
- ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH
302
- Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
303
- BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC
304
- R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX
305
- hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
306
- -----END CERTIFICATE-----
307
- # Entrust Root Certification Authority - G2.pem
308
- # Certificate:
309
- # Data:
310
- # Version: 3 (0x2)
311
- # Serial Number: 1246989352 (0x4a538c28)
312
- # Signature Algorithm: sha256WithRSAEncryption
313
- # Issuer: C=US, O=Entrust, Inc., OU=See www.entrust.net/legal-terms, OU=(c) 2009 Entrust, Inc. - for authorized use only, CN=Entrust Root Certification Authority - G2
314
- # Validity
315
- # Not Before: Jul 7 17:25:54 2009 GMT
316
- # Not After : Dec 7 17:55:54 2030 GMT
317
- # Subject: C=US, O=Entrust, Inc., OU=See www.entrust.net/legal-terms, OU=(c) 2009 Entrust, Inc. - for authorized use only, CN=Entrust Root Certification Authority - G2
318
- # Subject Public Key Info:
319
- # Public Key Algorithm: rsaEncryption
320
- # Public-Key: (2048 bit)
321
- # Modulus:
322
- # 00:ba:84:b6:72:db:9e:0c:6b:e2:99:e9:30:01:a7:
323
- # 76:ea:32:b8:95:41:1a:c9:da:61:4e:58:72:cf:fe:
324
- # f6:82:79:bf:73:61:06:0a:a5:27:d8:b3:5f:d3:45:
325
- # 4e:1c:72:d6:4e:32:f2:72:8a:0f:f7:83:19:d0:6a:
326
- # 80:80:00:45:1e:b0:c7:e7:9a:bf:12:57:27:1c:a3:
327
- # 68:2f:0a:87:bd:6a:6b:0e:5e:65:f3:1c:77:d5:d4:
328
- # 85:8d:70:21:b4:b3:32:e7:8b:a2:d5:86:39:02:b1:
329
- # b8:d2:47:ce:e4:c9:49:c4:3b:a7:de:fb:54:7d:57:
330
- # be:f0:e8:6e:c2:79:b2:3a:0b:55:e2:50:98:16:32:
331
- # 13:5c:2f:78:56:c1:c2:94:b3:f2:5a:e4:27:9a:9f:
332
- # 24:d7:c6:ec:d0:9b:25:82:e3:cc:c2:c4:45:c5:8c:
333
- # 97:7a:06:6b:2a:11:9f:a9:0a:6e:48:3b:6f:db:d4:
334
- # 11:19:42:f7:8f:07:bf:f5:53:5f:9c:3e:f4:17:2c:
335
- # e6:69:ac:4e:32:4c:62:77:ea:b7:e8:e5:bb:34:bc:
336
- # 19:8b:ae:9c:51:e7:b7:7e:b5:53:b1:33:22:e5:6d:
337
- # cf:70:3c:1a:fa:e2:9b:67:b6:83:f4:8d:a5:af:62:
338
- # 4c:4d:e0:58:ac:64:34:12:03:f8:b6:8d:94:63:24:
339
- # a4:71
340
- # Exponent: 65537 (0x10001)
341
- # X509v3 extensions:
342
- # X509v3 Key Usage: critical
343
- # Certificate Sign, CRL Sign
344
- # X509v3 Basic Constraints: critical
345
- # CA:TRUE
346
- # X509v3 Subject Key Identifier:
347
- # 6A:72:26:7A:D0:1E:EF:7D:E7:3B:69:51:D4:6C:8D:9F:90:12:66:AB
348
- # Signature Algorithm: sha256WithRSAEncryption
349
- # 79:9f:1d:96:c6:b6:79:3f:22:8d:87:d3:87:03:04:60:6a:6b:
350
- # 9a:2e:59:89:73:11:ac:43:d1:f5:13:ff:8d:39:2b:c0:f2:bd:
351
- # 4f:70:8c:a9:2f:ea:17:c4:0b:54:9e:d4:1b:96:98:33:3c:a8:
352
- # ad:62:a2:00:76:ab:59:69:6e:06:1d:7e:c4:b9:44:8d:98:af:
353
- # 12:d4:61:db:0a:19:46:47:f3:eb:f7:63:c1:40:05:40:a5:d2:
354
- # b7:f4:b5:9a:36:bf:a9:88:76:88:04:55:04:2b:9c:87:7f:1a:
355
- # 37:3c:7e:2d:a5:1a:d8:d4:89:5e:ca:bd:ac:3d:6c:d8:6d:af:
356
- # d5:f3:76:0f:cd:3b:88:38:22:9d:6c:93:9a:c4:3d:bf:82:1b:
357
- # 65:3f:a6:0f:5d:aa:fc:e5:b2:15:ca:b5:ad:c6:bc:3d:d0:84:
358
- # e8:ea:06:72:b0:4d:39:32:78:bf:3e:11:9c:0b:a4:9d:9a:21:
359
- # f3:f0:9b:0b:30:78:db:c1:dc:87:43:fe:bc:63:9a:ca:c5:c2:
360
- # 1c:c9:c7:8d:ff:3b:12:58:08:e6:b6:3d:ec:7a:2c:4e:fb:83:
361
- # 96:ce:0c:3c:69:87:54:73:a4:73:c2:93:ff:51:10:ac:15:54:
362
- # 01:d8:fc:05:b1:89:a1:7f:74:83:9a:49:d7:dc:4e:7b:8a:48:
363
- # 6f:8b:45:f6
364
- -----BEGIN CERTIFICATE-----
365
- MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC
366
- VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50
367
- cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs
368
- IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz
369
- dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy
370
- NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu
371
- dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt
372
- dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0
373
- aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj
374
- YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
375
- AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T
376
- RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN
377
- cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW
378
- wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1
379
- U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0
380
- jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP
381
- BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN
382
- BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/
383
- jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
384
- Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v
385
- 1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R
386
- nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH
387
- VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g==
388
- -----END CERTIFICATE-----
389
- # Entrust Root Certification Authority.pem
390
- # Certificate:
391
- # Data:
392
- # Version: 3 (0x2)
393
- # Serial Number: 1164660820 (0x456b5054)
394
- # Signature Algorithm: sha1WithRSAEncryption
395
- # Issuer: C=US, O=Entrust, Inc., OU=www.entrust.net/CPS is incorporated by reference, OU=(c) 2006 Entrust, Inc., CN=Entrust Root Certification Authority
396
- # Validity
397
- # Not Before: Nov 27 20:23:42 2006 GMT
398
- # Not After : Nov 27 20:53:42 2026 GMT
399
- # Subject: C=US, O=Entrust, Inc., OU=www.entrust.net/CPS is incorporated by reference, OU=(c) 2006 Entrust, Inc., CN=Entrust Root Certification Authority
400
- # Subject Public Key Info:
401
- # Public Key Algorithm: rsaEncryption
402
- # Public-Key: (2048 bit)
403
- # Modulus:
404
- # 00:b6:95:b6:43:42:fa:c6:6d:2a:6f:48:df:94:4c:
405
- # 39:57:05:ee:c3:79:11:41:68:36:ed:ec:fe:9a:01:
406
- # 8f:a1:38:28:fc:f7:10:46:66:2e:4d:1e:1a:b1:1a:
407
- # 4e:c6:d1:c0:95:88:b0:c9:ff:31:8b:33:03:db:b7:
408
- # 83:7b:3e:20:84:5e:ed:b2:56:28:a7:f8:e0:b9:40:
409
- # 71:37:c5:cb:47:0e:97:2a:68:c0:22:95:62:15:db:
410
- # 47:d9:f5:d0:2b:ff:82:4b:c9:ad:3e:de:4c:db:90:
411
- # 80:50:3f:09:8a:84:00:ec:30:0a:3d:18:cd:fb:fd:
412
- # 2a:59:9a:23:95:17:2c:45:9e:1f:6e:43:79:6d:0c:
413
- # 5c:98:fe:48:a7:c5:23:47:5c:5e:fd:6e:e7:1e:b4:
414
- # f6:68:45:d1:86:83:5b:a2:8a:8d:b1:e3:29:80:fe:
415
- # 25:71:88:ad:be:bc:8f:ac:52:96:4b:aa:51:8d:e4:
416
- # 13:31:19:e8:4e:4d:9f:db:ac:b3:6a:d5:bc:39:54:
417
- # 71:ca:7a:7a:7f:90:dd:7d:1d:80:d9:81:bb:59:26:
418
- # c2:11:fe:e6:93:e2:f7:80:e4:65:fb:34:37:0e:29:
419
- # 80:70:4d:af:38:86:2e:9e:7f:57:af:9e:17:ae:eb:
420
- # 1c:cb:28:21:5f:b6:1c:d8:e7:a2:04:22:f9:d3:da:
421
- # d8:cb
422
- # Exponent: 65537 (0x10001)
423
- # X509v3 extensions:
424
- # X509v3 Key Usage: critical
425
- # Certificate Sign, CRL Sign
426
- # X509v3 Basic Constraints: critical
427
- # CA:TRUE
428
- # X509v3 Private Key Usage Period:
429
- # Not Before: Nov 27 20:23:42 2006 GMT, Not After: Nov 27 20:53:42 2026 GMT
430
- # X509v3 Authority Key Identifier:
431
- # keyid:68:90:E4:67:A4:A6:53:80:C7:86:66:A4:F1:F7:4B:43:FB:84:BD:6D
432
- #
433
- # X509v3 Subject Key Identifier:
434
- # 68:90:E4:67:A4:A6:53:80:C7:86:66:A4:F1:F7:4B:43:FB:84:BD:6D
435
- # 1.2.840.113533.7.65.0:
436
- # 0...V7.1:4.0....
437
- # Signature Algorithm: sha1WithRSAEncryption
438
- # 93:d4:30:b0:d7:03:20:2a:d0:f9:63:e8:91:0c:05:20:a9:5f:
439
- # 19:ca:7b:72:4e:d4:b1:db:d0:96:fb:54:5a:19:2c:0c:08:f7:
440
- # b2:bc:85:a8:9d:7f:6d:3b:52:b3:2a:db:e7:d4:84:8c:63:f6:
441
- # 0f:cb:26:01:91:50:6c:f4:5f:14:e2:93:74:c0:13:9e:30:3a:
442
- # 50:e3:b4:60:c5:1c:f0:22:44:8d:71:47:ac:c8:1a:c9:e9:9b:
443
- # 9a:00:60:13:ff:70:7e:5f:11:4d:49:1b:b3:15:52:7b:c9:54:
444
- # da:bf:9d:95:af:6b:9a:d8:9e:e9:f1:e4:43:8d:e2:11:44:3a:
445
- # bf:af:bd:83:42:73:52:8b:aa:bb:a7:29:cf:f5:64:1c:0a:4d:
446
- # d1:bc:aa:ac:9f:2a:d0:ff:7f:7f:da:7d:ea:b1:ed:30:25:c1:
447
- # 84:da:34:d2:5b:78:83:56:ec:9c:36:c3:26:e2:11:f6:67:49:
448
- # 1d:92:ab:8c:fb:eb:ff:7a:ee:85:4a:a7:50:80:f0:a7:5c:4a:
449
- # 94:2e:5f:05:99:3c:52:41:e0:cd:b4:63:cf:01:43:ba:9c:83:
450
- # dc:8f:60:3b:f3:5a:b4:b4:7b:ae:da:0b:90:38:75:ef:81:1d:
451
- # 66:d2:f7:57:70:36:b3:bf:fc:28:af:71:25:85:5b:13:fe:1e:
452
- # 7f:5a:b4:3c
453
- -----BEGIN CERTIFICATE-----
454
- MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
455
- VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
456
- Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
457
- KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
458
- cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
459
- NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
460
- NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
461
- ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
462
- BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
463
- KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
464
- Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
465
- 4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
466
- KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
467
- rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
468
- 94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
469
- sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
470
- gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
471
- kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
472
- vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
473
- A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
474
- O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
475
- AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
476
- 9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
477
- eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
478
- 0vdXcDazv/wor3ElhVsT/h5/WrQ8
479
- -----END CERTIFICATE-----
480
- # Entrust.net Certification Authority (2048).pem
481
- # Certificate:
482
- # Data:
483
- # Version: 3 (0x2)
484
- # Serial Number: 946069240 (0x3863def8)
485
- # Signature Algorithm: sha1WithRSAEncryption
486
- # Issuer: O=Entrust.net, OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Certification Authority (2048)
487
- # Validity
488
- # Not Before: Dec 24 17:50:51 1999 GMT
489
- # Not After : Jul 24 14:15:12 2029 GMT
490
- # Subject: O=Entrust.net, OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Certification Authority (2048)
491
- # Subject Public Key Info:
492
- # Public Key Algorithm: rsaEncryption
493
- # Public-Key: (2048 bit)
494
- # Modulus:
495
- # 00:ad:4d:4b:a9:12:86:b2:ea:a3:20:07:15:16:64:
496
- # 2a:2b:4b:d1:bf:0b:4a:4d:8e:ed:80:76:a5:67:b7:
497
- # 78:40:c0:73:42:c8:68:c0:db:53:2b:dd:5e:b8:76:
498
- # 98:35:93:8b:1a:9d:7c:13:3a:0e:1f:5b:b7:1e:cf:
499
- # e5:24:14:1e:b1:81:a9:8d:7d:b8:cc:6b:4b:03:f1:
500
- # 02:0c:dc:ab:a5:40:24:00:7f:74:94:a1:9d:08:29:
501
- # b3:88:0b:f5:87:77:9d:55:cd:e4:c3:7e:d7:6a:64:
502
- # ab:85:14:86:95:5b:97:32:50:6f:3d:c8:ba:66:0c:
503
- # e3:fc:bd:b8:49:c1:76:89:49:19:fd:c0:a8:bd:89:
504
- # a3:67:2f:c6:9f:bc:71:19:60:b8:2d:e9:2c:c9:90:
505
- # 76:66:7b:94:e2:af:78:d6:65:53:5d:3c:d6:9c:b2:
506
- # cf:29:03:f9:2f:a4:50:b2:d4:48:ce:05:32:55:8a:
507
- # fd:b2:64:4c:0e:e4:98:07:75:db:7f:df:b9:08:55:
508
- # 60:85:30:29:f9:7b:48:a4:69:86:e3:35:3f:1e:86:
509
- # 5d:7a:7a:15:bd:ef:00:8e:15:22:54:17:00:90:26:
510
- # 93:bc:0e:49:68:91:bf:f8:47:d3:9d:95:42:c1:0e:
511
- # 4d:df:6f:26:cf:c3:18:21:62:66:43:70:d6:d5:c0:
512
- # 07:e1
513
- # Exponent: 65537 (0x10001)
514
- # X509v3 extensions:
515
- # X509v3 Key Usage: critical
516
- # Certificate Sign, CRL Sign
517
- # X509v3 Basic Constraints: critical
518
- # CA:TRUE
519
- # X509v3 Subject Key Identifier:
520
- # 55:E4:81:D1:11:80:BE:D8:89:B9:08:A3:31:F9:A1:24:09:16:B9:70
521
- # Signature Algorithm: sha1WithRSAEncryption
522
- # 3b:9b:8f:56:9b:30:e7:53:99:7c:7a:79:a7:4d:97:d7:19:95:
523
- # 90:fb:06:1f:ca:33:7c:46:63:8f:96:66:24:fa:40:1b:21:27:
524
- # ca:e6:72:73:f2:4f:fe:31:99:fd:c8:0c:4c:68:53:c6:80:82:
525
- # 13:98:fa:b6:ad:da:5d:3d:f1:ce:6e:f6:15:11:94:82:0c:ee:
526
- # 3f:95:af:11:ab:0f:d7:2f:de:1f:03:8f:57:2c:1e:c9:bb:9a:
527
- # 1a:44:95:eb:18:4f:a6:1f:cd:7d:57:10:2f:9b:04:09:5a:84:
528
- # b5:6e:d8:1d:3a:e1:d6:9e:d1:6c:79:5e:79:1c:14:c5:e3:d0:
529
- # 4c:93:3b:65:3c:ed:df:3d:be:a6:e5:95:1a:c3:b5:19:c3:bd:
530
- # 5e:5b:bb:ff:23:ef:68:19:cb:12:93:27:5c:03:2d:6f:30:d0:
531
- # 1e:b6:1a:ac:de:5a:f7:d1:aa:a8:27:a6:fe:79:81:c4:79:99:
532
- # 33:57:ba:12:b0:a9:e0:42:6c:93:ca:56:de:fe:6d:84:0b:08:
533
- # 8b:7e:8d:ea:d7:98:21:c6:f3:e7:3c:79:2f:5e:9c:d1:4c:15:
534
- # 8d:e1:ec:22:37:cc:9a:43:0b:97:dc:80:90:8d:b3:67:9b:6f:
535
- # 48:08:15:56:cf:bf:f1:2b:7c:5e:9a:76:e9:59:90:c5:7c:83:
536
- # 35:11:65:51
537
- -----BEGIN CERTIFICATE-----
538
- MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
539
- RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
540
- bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
541
- IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
542
- ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3
543
- MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
544
- LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
545
- YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
546
- A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
547
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
548
- K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
549
- sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
550
- MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
551
- XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
552
- HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
553
- 4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
554
- HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub
555
- j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo
556
- U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
557
- zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b
558
- u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+
559
- bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er
560
- fF6adulZkMV8gzURZVE=
561
- -----END CERTIFICATE-----
562
- # GeoTrust Global CA.pem
563
- # Certificate:
564
- # Data:
565
- # Version: 3 (0x2)
566
- # Serial Number: 144470 (0x23456)
567
- # Signature Algorithm: sha1WithRSAEncryption
568
- # Issuer: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA
569
- # Validity
570
- # Not Before: May 21 04:00:00 2002 GMT
571
- # Not After : May 21 04:00:00 2022 GMT
572
- # Subject: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA
573
- # Subject Public Key Info:
574
- # Public Key Algorithm: rsaEncryption
575
- # Public-Key: (2048 bit)
576
- # Modulus:
577
- # 00:da:cc:18:63:30:fd:f4:17:23:1a:56:7e:5b:df:
578
- # 3c:6c:38:e4:71:b7:78:91:d4:bc:a1:d8:4c:f8:a8:
579
- # 43:b6:03:e9:4d:21:07:08:88:da:58:2f:66:39:29:
580
- # bd:05:78:8b:9d:38:e8:05:b7:6a:7e:71:a4:e6:c4:
581
- # 60:a6:b0:ef:80:e4:89:28:0f:9e:25:d6:ed:83:f3:
582
- # ad:a6:91:c7:98:c9:42:18:35:14:9d:ad:98:46:92:
583
- # 2e:4f:ca:f1:87:43:c1:16:95:57:2d:50:ef:89:2d:
584
- # 80:7a:57:ad:f2:ee:5f:6b:d2:00:8d:b9:14:f8:14:
585
- # 15:35:d9:c0:46:a3:7b:72:c8:91:bf:c9:55:2b:cd:
586
- # d0:97:3e:9c:26:64:cc:df:ce:83:19:71:ca:4e:e6:
587
- # d4:d5:7b:a9:19:cd:55:de:c8:ec:d2:5e:38:53:e5:
588
- # 5c:4f:8c:2d:fe:50:23:36:fc:66:e6:cb:8e:a4:39:
589
- # 19:00:b7:95:02:39:91:0b:0e:fe:38:2e:d1:1d:05:
590
- # 9a:f6:4d:3e:6f:0f:07:1d:af:2c:1e:8f:60:39:e2:
591
- # fa:36:53:13:39:d4:5e:26:2b:db:3d:a8:14:bd:32:
592
- # eb:18:03:28:52:04:71:e5:ab:33:3d:e1:38:bb:07:
593
- # 36:84:62:9c:79:ea:16:30:f4:5f:c0:2b:e8:71:6b:
594
- # e4:f9
595
- # Exponent: 65537 (0x10001)
596
- # X509v3 extensions:
597
- # X509v3 Basic Constraints: critical
598
- # CA:TRUE
599
- # X509v3 Subject Key Identifier:
600
- # C0:7A:98:68:8D:89:FB:AB:05:64:0C:11:7D:AA:7D:65:B8:CA:CC:4E
601
- # X509v3 Authority Key Identifier:
602
- # keyid:C0:7A:98:68:8D:89:FB:AB:05:64:0C:11:7D:AA:7D:65:B8:CA:CC:4E
603
- #
604
- # Signature Algorithm: sha1WithRSAEncryption
605
- # 35:e3:29:6a:e5:2f:5d:54:8e:29:50:94:9f:99:1a:14:e4:8f:
606
- # 78:2a:62:94:a2:27:67:9e:d0:cf:1a:5e:47:e9:c1:b2:a4:cf:
607
- # dd:41:1a:05:4e:9b:4b:ee:4a:6f:55:52:b3:24:a1:37:0a:eb:
608
- # 64:76:2a:2e:2c:f3:fd:3b:75:90:bf:fa:71:d8:c7:3d:37:d2:
609
- # b5:05:95:62:b9:a6:de:89:3d:36:7b:38:77:48:97:ac:a6:20:
610
- # 8f:2e:a6:c9:0c:c2:b2:99:45:00:c7:ce:11:51:22:22:e0:a5:
611
- # ea:b6:15:48:09:64:ea:5e:4f:74:f7:05:3e:c7:8a:52:0c:db:
612
- # 15:b4:bd:6d:9b:e5:c6:b1:54:68:a9:e3:69:90:b6:9a:a5:0f:
613
- # b8:b9:3f:20:7d:ae:4a:b5:b8:9c:e4:1d:b6:ab:e6:94:a5:c1:
614
- # c7:83:ad:db:f5:27:87:0e:04:6c:d5:ff:dd:a0:5d:ed:87:52:
615
- # b7:2b:15:02:ae:39:a6:6a:74:e9:da:c4:e7:bc:4d:34:1e:a9:
616
- # 5c:4d:33:5f:92:09:2f:88:66:5d:77:97:c7:1d:76:13:a9:d5:
617
- # e5:f1:16:09:11:35:d5:ac:db:24:71:70:2c:98:56:0b:d9:17:
618
- # b4:d1:e3:51:2b:5e:75:e8:d5:d0:dc:4f:34:ed:c2:05:66:80:
619
- # a1:cb:e6:33
620
- -----BEGIN CERTIFICATE-----
621
- MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
622
- MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
623
- YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
624
- EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
625
- R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
626
- 9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
627
- fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
628
- iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
629
- 1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
630
- bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
631
- MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
632
- ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
633
- uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
634
- Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
635
- tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
636
- PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
637
- hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
638
- 5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
639
- -----END CERTIFICATE-----
640
- # GeoTrust Primary Certification Authority - G2.pem
641
- # Certificate:
642
- # Data:
643
- # Version: 3 (0x2)
644
- # Serial Number:
645
- # 3c:b2:f4:48:0a:00:e2:fe:eb:24:3b:5e:60:3e:c3:6b
646
- # Signature Algorithm: ecdsa-with-SHA384
647
- # Issuer: C=US, O=GeoTrust Inc., OU=(c) 2007 GeoTrust Inc. - For authorized use only, CN=GeoTrust Primary Certification Authority - G2
648
- # Validity
649
- # Not Before: Nov 5 00:00:00 2007 GMT
650
- # Not After : Jan 18 23:59:59 2038 GMT
651
- # Subject: C=US, O=GeoTrust Inc., OU=(c) 2007 GeoTrust Inc. - For authorized use only, CN=GeoTrust Primary Certification Authority - G2
652
- # Subject Public Key Info:
653
- # Public Key Algorithm: id-ecPublicKey
654
- # Public-Key: (384 bit)
655
- # pub:
656
- # 04:15:b1:e8:fd:03:15:43:e5:ac:eb:87:37:11:62:
657
- # ef:d2:83:36:52:7d:45:57:0b:4a:8d:7b:54:3b:3a:
658
- # 6e:5f:15:02:c0:50:a6:cf:25:2f:7d:ca:48:b8:c7:
659
- # 50:63:1c:2a:21:08:7c:9a:36:d8:0b:fe:d1:26:c5:
660
- # 58:31:30:28:25:f3:5d:5d:a3:b8:b6:a5:b4:92:ed:
661
- # 6c:2c:9f:eb:dd:43:89:a2:3c:4b:48:91:1d:50:ec:
662
- # 26:df:d6:60:2e:bd:21
663
- # ASN1 OID: secp384r1
664
- # X509v3 extensions:
665
- # X509v3 Basic Constraints: critical
666
- # CA:TRUE
667
- # X509v3 Key Usage: critical
668
- # Certificate Sign, CRL Sign
669
- # X509v3 Subject Key Identifier:
670
- # 15:5F:35:57:51:55:FB:25:B2:AD:03:69:FC:01:A3:FA:BE:11:55:D5
671
- # Signature Algorithm: ecdsa-with-SHA384
672
- # 30:64:02:30:64:96:59:a6:e8:09:de:8b:ba:fa:5a:88:88:f0:
673
- # 1f:91:d3:46:a8:f2:4a:4c:02:63:fb:6c:5f:38:db:2e:41:93:
674
- # a9:0e:e6:9d:dc:31:1c:b2:a0:a7:18:1c:79:e1:c7:36:02:30:
675
- # 3a:56:af:9a:74:6c:f6:fb:83:e0:33:d3:08:5f:a1:9c:c2:5b:
676
- # 9f:46:d6:b6:cb:91:06:63:a2:06:e7:33:ac:3e:a8:81:12:d0:
677
- # cb:ba:d0:92:0b:b6:9e:96:aa:04:0f:8a
678
- -----BEGIN CERTIFICATE-----
679
- MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL
680
- MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj
681
- KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2
682
- MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
683
- eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV
684
- BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw
685
- NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV
686
- BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
687
- MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL
688
- So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal
689
- tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
690
- BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG
691
- CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT
692
- qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz
693
- rD6ogRLQy7rQkgu2npaqBA+K
694
- -----END CERTIFICATE-----
695
- # GeoTrust Primary Certification Authority - G3.pem
696
- # Certificate:
697
- # Data:
698
- # Version: 3 (0x2)
699
- # Serial Number:
700
- # 15:ac:6e:94:19:b2:79:4b:41:f6:27:a9:c3:18:0f:1f
701
- # Signature Algorithm: sha256WithRSAEncryption
702
- # Issuer: C=US, O=GeoTrust Inc., OU=(c) 2008 GeoTrust Inc. - For authorized use only, CN=GeoTrust Primary Certification Authority - G3
703
- # Validity
704
- # Not Before: Apr 2 00:00:00 2008 GMT
705
- # Not After : Dec 1 23:59:59 2037 GMT
706
- # Subject: C=US, O=GeoTrust Inc., OU=(c) 2008 GeoTrust Inc. - For authorized use only, CN=GeoTrust Primary Certification Authority - G3
707
- # Subject Public Key Info:
708
- # Public Key Algorithm: rsaEncryption
709
- # Public-Key: (2048 bit)
710
- # Modulus:
711
- # 00:dc:e2:5e:62:58:1d:33:57:39:32:33:fa:eb:cb:
712
- # 87:8c:a7:d4:4a:dd:06:88:ea:64:8e:31:98:a5:38:
713
- # 90:1e:98:cf:2e:63:2b:f0:46:bc:44:b2:89:a1:c0:
714
- # 28:0c:49:70:21:95:9f:64:c0:a6:93:12:02:65:26:
715
- # 86:c6:a5:89:f0:fa:d7:84:a0:70:af:4f:1a:97:3f:
716
- # 06:44:d5:c9:eb:72:10:7d:e4:31:28:fb:1c:61:e6:
717
- # 28:07:44:73:92:22:69:a7:03:88:6c:9d:63:c8:52:
718
- # da:98:27:e7:08:4c:70:3e:b4:c9:12:c1:c5:67:83:
719
- # 5d:33:f3:03:11:ec:6a:d0:53:e2:d1:ba:36:60:94:
720
- # 80:bb:61:63:6c:5b:17:7e:df:40:94:1e:ab:0d:c2:
721
- # 21:28:70:88:ff:d6:26:6c:6c:60:04:25:4e:55:7e:
722
- # 7d:ef:bf:94:48:de:b7:1d:dd:70:8d:05:5f:88:a5:
723
- # 9b:f2:c2:ee:ea:d1:40:41:6d:62:38:1d:56:06:c5:
724
- # 03:47:51:20:19:fc:7b:10:0b:0e:62:ae:76:55:bf:
725
- # 5f:77:be:3e:49:01:53:3d:98:25:03:76:24:5a:1d:
726
- # b4:db:89:ea:79:e5:b6:b3:3b:3f:ba:4c:28:41:7f:
727
- # 06:ac:6a:8e:c1:d0:f6:05:1d:7d:e6:42:86:e3:a5:
728
- # d5:47
729
- # Exponent: 65537 (0x10001)
730
- # X509v3 extensions:
731
- # X509v3 Basic Constraints: critical
732
- # CA:TRUE
733
- # X509v3 Key Usage: critical
734
- # Certificate Sign, CRL Sign
735
- # X509v3 Subject Key Identifier:
736
- # C4:79:CA:8E:A1:4E:03:1D:1C:DC:6B:DB:31:5B:94:3E:3F:30:7F:2D
737
- # Signature Algorithm: sha256WithRSAEncryption
738
- # 2d:c5:13:cf:56:80:7b:7a:78:bd:9f:ae:2c:99:e7:ef:da:df:
739
- # 94:5e:09:69:a7:e7:6e:68:8c:bd:72:be:47:a9:0e:97:12:b8:
740
- # 4a:f1:64:d3:39:df:25:34:d4:c1:cd:4e:81:f0:0f:04:c4:24:
741
- # b3:34:96:c6:a6:aa:30:df:68:61:73:d7:f9:8e:85:89:ef:0e:
742
- # 5e:95:28:4a:2a:27:8f:10:8e:2e:7c:86:c4:02:9e:da:0c:77:
743
- # 65:0e:44:0d:92:fd:fd:b3:16:36:fa:11:0d:1d:8c:0e:07:89:
744
- # 6a:29:56:f7:72:f4:dd:15:9c:77:35:66:57:ab:13:53:d8:8e:
745
- # c1:40:c5:d7:13:16:5a:72:c7:b7:69:01:c4:7a:b1:83:01:68:
746
- # 7d:8d:41:a1:94:18:c1:25:5c:fc:f0:fe:83:02:87:7c:0d:0d:
747
- # cf:2e:08:5c:4a:40:0d:3e:ec:81:61:e6:24:db:ca:e0:0e:2d:
748
- # 07:b2:3e:56:dc:8d:f5:41:85:07:48:9b:0c:0b:cb:49:3f:7d:
749
- # ec:b7:fd:cb:8d:67:89:1a:ab:ed:bb:1e:a3:00:08:08:17:2a:
750
- # 82:5c:31:5d:46:8a:2d:0f:86:9b:74:d9:45:fb:d4:40:b1:7a:
751
- # aa:68:2d:86:b2:99:22:e1:c1:2b:c7:9c:f8:f3:5f:a8:82:12:
752
- # eb:19:11:2d
753
- -----BEGIN CERTIFICATE-----
754
- MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB
755
- mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT
756
- MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
757
- eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
758
- cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ
759
- BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
760
- MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0
761
- BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
762
- LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz
763
- +uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm
764
- hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn
765
- 5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W
766
- JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL
767
- DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC
768
- huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
769
- HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB
770
- AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB
771
- zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN
772
- kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
773
- AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH
774
- SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G
775
- spki4cErx5z481+oghLrGREt
776
- -----END CERTIFICATE-----
777
- # GeoTrust Primary Certification Authority.pem
778
- # Certificate:
779
- # Data:
780
- # Version: 3 (0x2)
781
- # Serial Number:
782
- # 18:ac:b5:6a:fd:69:b6:15:3a:63:6c:af:da:fa:c4:a1
783
- # Signature Algorithm: sha1WithRSAEncryption
784
- # Issuer: C=US, O=GeoTrust Inc., CN=GeoTrust Primary Certification Authority
785
- # Validity
786
- # Not Before: Nov 27 00:00:00 2006 GMT
787
- # Not After : Jul 16 23:59:59 2036 GMT
788
- # Subject: C=US, O=GeoTrust Inc., CN=GeoTrust Primary Certification Authority
789
- # Subject Public Key Info:
790
- # Public Key Algorithm: rsaEncryption
791
- # Public-Key: (2048 bit)
792
- # Modulus:
793
- # 00:be:b8:15:7b:ff:d4:7c:7d:67:ad:83:64:7b:c8:
794
- # 42:53:2d:df:f6:84:08:20:61:d6:01:59:6a:9c:44:
795
- # 11:af:ef:76:fd:95:7e:ce:61:30:bb:7a:83:5f:02:
796
- # bd:01:66:ca:ee:15:8d:6f:a1:30:9c:bd:a1:85:9e:
797
- # 94:3a:f3:56:88:00:31:cf:d8:ee:6a:96:02:d9:ed:
798
- # 03:8c:fb:75:6d:e7:ea:b8:55:16:05:16:9a:f4:e0:
799
- # 5e:b1:88:c0:64:85:5c:15:4d:88:c7:b7:ba:e0:75:
800
- # e9:ad:05:3d:9d:c7:89:48:e0:bb:28:c8:03:e1:30:
801
- # 93:64:5e:52:c0:59:70:22:35:57:88:8a:f1:95:0a:
802
- # 83:d7:bc:31:73:01:34:ed:ef:46:71:e0:6b:02:a8:
803
- # 35:72:6b:97:9b:66:e0:cb:1c:79:5f:d8:1a:04:68:
804
- # 1e:47:02:e6:9d:60:e2:36:97:01:df:ce:35:92:df:
805
- # be:67:c7:6d:77:59:3b:8f:9d:d6:90:15:94:bc:42:
806
- # 34:10:c1:39:f9:b1:27:3e:7e:d6:8a:75:c5:b2:af:
807
- # 96:d3:a2:de:9b:e4:98:be:7d:e1:e9:81:ad:b6:6f:
808
- # fc:d7:0e:da:e0:34:b0:0d:1a:77:e7:e3:08:98:ef:
809
- # 58:fa:9c:84:b7:36:af:c2:df:ac:d2:f4:10:06:70:
810
- # 71:35
811
- # Exponent: 65537 (0x10001)
812
- # X509v3 extensions:
813
- # X509v3 Basic Constraints: critical
814
- # CA:TRUE
815
- # X509v3 Key Usage: critical
816
- # Certificate Sign, CRL Sign
817
- # X509v3 Subject Key Identifier:
818
- # 2C:D5:50:41:97:15:8B:F0:8F:36:61:5B:4A:FB:6B:D9:99:C9:33:92
819
- # Signature Algorithm: sha1WithRSAEncryption
820
- # 5a:70:7f:2c:dd:b7:34:4f:f5:86:51:a9:26:be:4b:b8:aa:f1:
821
- # 71:0d:dc:61:c7:a0:ea:34:1e:7a:77:0f:04:35:e8:27:8f:6c:
822
- # 90:bf:91:16:24:46:3e:4a:4e:ce:2b:16:d5:0b:52:1d:fc:1f:
823
- # 67:a2:02:45:31:4f:ce:f3:fa:03:a7:79:9d:53:6a:d9:da:63:
824
- # 3a:f8:80:d7:d3:99:e1:a5:e1:be:d4:55:71:98:35:3a:be:93:
825
- # ea:ae:ad:42:b2:90:6f:e0:fc:21:4d:35:63:33:89:49:d6:9b:
826
- # 4e:ca:c7:e7:4e:09:00:f7:da:c7:ef:99:62:99:77:b6:95:22:
827
- # 5e:8a:a0:ab:f4:b8:78:98:ca:38:19:99:c9:72:9e:78:cd:4b:
828
- # ac:af:19:a0:73:12:2d:fc:c2:41:ba:81:91:da:16:5a:31:b7:
829
- # f9:b4:71:80:12:48:99:72:73:5a:59:53:c1:63:52:33:ed:a7:
830
- # c9:d2:39:02:70:fa:e0:b1:42:66:29:aa:9b:51:ed:30:54:22:
831
- # 14:5f:d9:ab:1d:c1:e4:94:f0:f8:f5:2b:f7:ea:ca:78:46:d6:
832
- # b8:91:fd:a6:0d:2b:1a:14:01:3e:80:f0:42:a0:95:07:5e:6d:
833
- # cd:cc:4b:a4:45:8d:ab:12:e8:b3:de:5a:e5:a0:7c:e8:0f:22:
834
- # 1d:5a:e9:59
835
- -----BEGIN CERTIFICATE-----
836
- MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY
837
- MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo
838
- R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx
839
- MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
840
- Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp
841
- ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
842
- AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9
843
- AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA
844
- ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0
845
- 7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W
846
- kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI
847
- mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
848
- A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ
849
- KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1
850
- 6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl
851
- 4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K
852
- oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj
853
- UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU
854
- AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
855
- -----END CERTIFICATE-----
856
- # Go Daddy Class 2 Certification Authority.pem
857
- # Certificate:
858
- # Data:
859
- # Version: 3 (0x2)
860
- # Serial Number: 0 (0x0)
861
- # Signature Algorithm: sha1WithRSAEncryption
862
- # Issuer: C=US, O=The Go Daddy Group, Inc., OU=Go Daddy Class 2 Certification Authority
863
- # Validity
864
- # Not Before: Jun 29 17:06:20 2004 GMT
865
- # Not After : Jun 29 17:06:20 2034 GMT
866
- # Subject: C=US, O=The Go Daddy Group, Inc., OU=Go Daddy Class 2 Certification Authority
867
- # Subject Public Key Info:
868
- # Public Key Algorithm: rsaEncryption
869
- # Public-Key: (2048 bit)
870
- # Modulus:
871
- # 00:de:9d:d7:ea:57:18:49:a1:5b:eb:d7:5f:48:86:
872
- # ea:be:dd:ff:e4:ef:67:1c:f4:65:68:b3:57:71:a0:
873
- # 5e:77:bb:ed:9b:49:e9:70:80:3d:56:18:63:08:6f:
874
- # da:f2:cc:d0:3f:7f:02:54:22:54:10:d8:b2:81:d4:
875
- # c0:75:3d:4b:7f:c7:77:c3:3e:78:ab:1a:03:b5:20:
876
- # 6b:2f:6a:2b:b1:c5:88:7e:c4:bb:1e:b0:c1:d8:45:
877
- # 27:6f:aa:37:58:f7:87:26:d7:d8:2d:f6:a9:17:b7:
878
- # 1f:72:36:4e:a6:17:3f:65:98:92:db:2a:6e:5d:a2:
879
- # fe:88:e0:0b:de:7f:e5:8d:15:e1:eb:cb:3a:d5:e2:
880
- # 12:a2:13:2d:d8:8e:af:5f:12:3d:a0:08:05:08:b6:
881
- # 5c:a5:65:38:04:45:99:1e:a3:60:60:74:c5:41:a5:
882
- # 72:62:1b:62:c5:1f:6f:5f:1a:42:be:02:51:65:a8:
883
- # ae:23:18:6a:fc:78:03:a9:4d:7f:80:c3:fa:ab:5a:
884
- # fc:a1:40:a4:ca:19:16:fe:b2:c8:ef:5e:73:0d:ee:
885
- # 77:bd:9a:f6:79:98:bc:b1:07:67:a2:15:0d:dd:a0:
886
- # 58:c6:44:7b:0a:3e:62:28:5f:ba:41:07:53:58:cf:
887
- # 11:7e:38:74:c5:f8:ff:b5:69:90:8f:84:74:ea:97:
888
- # 1b:af
889
- # Exponent: 3 (0x3)
890
- # X509v3 extensions:
891
- # X509v3 Subject Key Identifier:
892
- # D2:C4:B0:D2:91:D4:4C:11:71:B3:61:CB:3D:A1:FE:DD:A8:6A:D4:E3
893
- # X509v3 Authority Key Identifier:
894
- # keyid:D2:C4:B0:D2:91:D4:4C:11:71:B3:61:CB:3D:A1:FE:DD:A8:6A:D4:E3
895
- # DirName:/C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority
896
- # serial:00
897
- #
898
- # X509v3 Basic Constraints:
899
- # CA:TRUE
900
- # Signature Algorithm: sha1WithRSAEncryption
901
- # 32:4b:f3:b2:ca:3e:91:fc:12:c6:a1:07:8c:8e:77:a0:33:06:
902
- # 14:5c:90:1e:18:f7:08:a6:3d:0a:19:f9:87:80:11:6e:69:e4:
903
- # 96:17:30:ff:34:91:63:72:38:ee:cc:1c:01:a3:1d:94:28:a4:
904
- # 31:f6:7a:c4:54:d7:f6:e5:31:58:03:a2:cc:ce:62:db:94:45:
905
- # 73:b5:bf:45:c9:24:b5:d5:82:02:ad:23:79:69:8d:b8:b6:4d:
906
- # ce:cf:4c:ca:33:23:e8:1c:88:aa:9d:8b:41:6e:16:c9:20:e5:
907
- # 89:9e:cd:3b:da:70:f7:7e:99:26:20:14:54:25:ab:6e:73:85:
908
- # e6:9b:21:9d:0a:6c:82:0e:a8:f8:c2:0c:fa:10:1e:6c:96:ef:
909
- # 87:0d:c4:0f:61:8b:ad:ee:83:2b:95:f8:8e:92:84:72:39:eb:
910
- # 20:ea:83:ed:83:cd:97:6e:08:bc:eb:4e:26:b6:73:2b:e4:d3:
911
- # f6:4c:fe:26:71:e2:61:11:74:4a:ff:57:1a:87:0f:75:48:2e:
912
- # cf:51:69:17:a0:02:12:61:95:d5:d1:40:b2:10:4c:ee:c4:ac:
913
- # 10:43:a6:a5:9e:0a:d5:95:62:9a:0d:cf:88:82:c5:32:0c:e4:
914
- # 2b:9f:45:e6:0d:9f:28:9c:b1:b9:2a:5a:57:ad:37:0f:af:1d:
915
- # 7f:db:bd:9f
916
- -----BEGIN CERTIFICATE-----
917
- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh
918
- MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE
919
- YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3
920
- MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo
921
- ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg
922
- MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN
923
- ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA
924
- PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w
925
- wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi
926
- EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY
927
- avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+
928
- YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE
929
- sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h
930
- /t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5
931
- IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
932
- YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
933
- ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy
934
- OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P
935
- TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
936
- HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER
937
- dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf
938
- ReYNnyicsbkqWletNw+vHX/bvZ8=
939
- -----END CERTIFICATE-----
940
- # Go Daddy Root Certificate Authority - G2.pem
941
- # Certificate:
942
- # Data:
943
- # Version: 3 (0x2)
944
- # Serial Number: 0 (0x0)
945
- # Signature Algorithm: sha256WithRSAEncryption
946
- # Issuer: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., CN=Go Daddy Root Certificate Authority - G2
947
- # Validity
948
- # Not Before: Sep 1 00:00:00 2009 GMT
949
- # Not After : Dec 31 23:59:59 2037 GMT
950
- # Subject: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., CN=Go Daddy Root Certificate Authority - G2
951
- # Subject Public Key Info:
952
- # Public Key Algorithm: rsaEncryption
953
- # Public-Key: (2048 bit)
954
- # Modulus:
955
- # 00:bf:71:62:08:f1:fa:59:34:f7:1b:c9:18:a3:f7:
956
- # 80:49:58:e9:22:83:13:a6:c5:20:43:01:3b:84:f1:
957
- # e6:85:49:9f:27:ea:f6:84:1b:4e:a0:b4:db:70:98:
958
- # c7:32:01:b1:05:3e:07:4e:ee:f4:fa:4f:2f:59:30:
959
- # 22:e7:ab:19:56:6b:e2:80:07:fc:f3:16:75:80:39:
960
- # 51:7b:e5:f9:35:b6:74:4e:a9:8d:82:13:e4:b6:3f:
961
- # a9:03:83:fa:a2:be:8a:15:6a:7f:de:0b:c3:b6:19:
962
- # 14:05:ca:ea:c3:a8:04:94:3b:46:7c:32:0d:f3:00:
963
- # 66:22:c8:8d:69:6d:36:8c:11:18:b7:d3:b2:1c:60:
964
- # b4:38:fa:02:8c:ce:d3:dd:46:07:de:0a:3e:eb:5d:
965
- # 7c:c8:7c:fb:b0:2b:53:a4:92:62:69:51:25:05:61:
966
- # 1a:44:81:8c:2c:a9:43:96:23:df:ac:3a:81:9a:0e:
967
- # 29:c5:1c:a9:e9:5d:1e:b6:9e:9e:30:0a:39:ce:f1:
968
- # 88:80:fb:4b:5d:cc:32:ec:85:62:43:25:34:02:56:
969
- # 27:01:91:b4:3b:70:2a:3f:6e:b1:e8:9c:88:01:7d:
970
- # 9f:d4:f9:db:53:6d:60:9d:bf:2c:e7:58:ab:b8:5f:
971
- # 46:fc:ce:c4:1b:03:3c:09:eb:49:31:5c:69:46:b3:
972
- # e0:47
973
- # Exponent: 65537 (0x10001)
974
- # X509v3 extensions:
975
- # X509v3 Basic Constraints: critical
976
- # CA:TRUE
977
- # X509v3 Key Usage: critical
978
- # Certificate Sign, CRL Sign
979
- # X509v3 Subject Key Identifier:
980
- # 3A:9A:85:07:10:67:28:B6:EF:F6:BD:05:41:6E:20:C1:94:DA:0F:DE
981
- # Signature Algorithm: sha256WithRSAEncryption
982
- # 99:db:5d:79:d5:f9:97:59:67:03:61:f1:7e:3b:06:31:75:2d:
983
- # a1:20:8e:4f:65:87:b4:f7:a6:9c:bc:d8:e9:2f:d0:db:5a:ee:
984
- # cf:74:8c:73:b4:38:42:da:05:7b:f8:02:75:b8:fd:a5:b1:d7:
985
- # ae:f6:d7:de:13:cb:53:10:7e:8a:46:d1:97:fa:b7:2e:2b:11:
986
- # ab:90:b0:27:80:f9:e8:9f:5a:e9:37:9f:ab:e4:df:6c:b3:85:
987
- # 17:9d:3d:d9:24:4f:79:91:35:d6:5f:04:eb:80:83:ab:9a:02:
988
- # 2d:b5:10:f4:d8:90:c7:04:73:40:ed:72:25:a0:a9:9f:ec:9e:
989
- # ab:68:12:99:57:c6:8f:12:3a:09:a4:bd:44:fd:06:15:37:c1:
990
- # 9b:e4:32:a3:ed:38:e8:d8:64:f3:2c:7e:14:fc:02:ea:9f:cd:
991
- # ff:07:68:17:db:22:90:38:2d:7a:8d:d1:54:f1:69:e3:5f:33:
992
- # ca:7a:3d:7b:0a:e3:ca:7f:5f:39:e5:e2:75:ba:c5:76:18:33:
993
- # ce:2c:f0:2f:4c:ad:f7:b1:e7:ce:4f:a8:c4:9b:4a:54:06:c5:
994
- # 7f:7d:d5:08:0f:e2:1c:fe:7e:17:b8:ac:5e:f6:d4:16:b2:43:
995
- # 09:0c:4d:f6:a7:6b:b4:99:84:65:ca:7a:88:e2:e2:44:be:5c:
996
- # f7:ea:1c:f5
997
- -----BEGIN CERTIFICATE-----
998
- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx
999
- EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT
1000
- EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp
1001
- ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz
1002
- NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH
1003
- EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE
1004
- AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw
1005
- DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD
1006
- E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH
1007
- /PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy
1008
- DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh
1009
- GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR
1010
- tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA
1011
- AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
1012
- FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX
1013
- WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu
1014
- 9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr
1015
- gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo
1016
- 2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
1017
- LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI
1018
- 4uJEvlz36hz1
1019
- -----END CERTIFICATE-----
1020
- # Go Daddy Secure Certification Authority serialNumber=07969287.pem
1021
- # Certificate:
1022
- # Data:
1023
- # Version: 3 (0x2)
1024
- # Serial Number: 769 (0x301)
1025
- # Signature Algorithm: sha1WithRSAEncryption
1026
- # Issuer: C=US, O=The Go Daddy Group, Inc., OU=Go Daddy Class 2 Certification Authority
1027
- # Validity
1028
- # Not Before: Nov 16 01:54:37 2006 GMT
1029
- # Not After : Nov 16 01:54:37 2026 GMT
1030
- # Subject: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., OU=http://certificates.godaddy.com/repository, CN=Go Daddy Secure Certification Authority/serialNumber=07969287
1031
- # Subject Public Key Info:
1032
- # Public Key Algorithm: rsaEncryption
1033
- # Public-Key: (2048 bit)
1034
- # Modulus:
1035
- # 00:c4:2d:d5:15:8c:9c:26:4c:ec:32:35:eb:5f:b8:
1036
- # 59:01:5a:a6:61:81:59:3b:70:63:ab:e3:dc:3d:c7:
1037
- # 2a:b8:c9:33:d3:79:e4:3a:ed:3c:30:23:84:8e:b3:
1038
- # 30:14:b6:b2:87:c3:3d:95:54:04:9e:df:99:dd:0b:
1039
- # 25:1e:21:de:65:29:7e:35:a8:a9:54:eb:f6:f7:32:
1040
- # 39:d4:26:55:95:ad:ef:fb:fe:58:86:d7:9e:f4:00:
1041
- # 8d:8c:2a:0c:bd:42:04:ce:a7:3f:04:f6:ee:80:f2:
1042
- # aa:ef:52:a1:69:66:da:be:1a:ad:5d:da:2c:66:ea:
1043
- # 1a:6b:bb:e5:1a:51:4a:00:2f:48:c7:98:75:d8:b9:
1044
- # 29:c8:ee:f8:66:6d:0a:9c:b3:f3:fc:78:7c:a2:f8:
1045
- # a3:f2:b5:c3:f3:b9:7a:91:c1:a7:e6:25:2e:9c:a8:
1046
- # ed:12:65:6e:6a:f6:12:44:53:70:30:95:c3:9c:2b:
1047
- # 58:2b:3d:08:74:4a:f2:be:51:b0:bf:87:d0:4c:27:
1048
- # 58:6b:b5:35:c5:9d:af:17:31:f8:0b:8f:ee:ad:81:
1049
- # 36:05:89:08:98:cf:3a:af:25:87:c0:49:ea:a7:fd:
1050
- # 67:f7:45:8e:97:cc:14:39:e2:36:85:b5:7e:1a:37:
1051
- # fd:16:f6:71:11:9a:74:30:16:fe:13:94:a3:3f:84:
1052
- # 0d:4f
1053
- # Exponent: 65537 (0x10001)
1054
- # X509v3 extensions:
1055
- # X509v3 Subject Key Identifier:
1056
- # FD:AC:61:32:93:6C:45:D6:E2:EE:85:5F:9A:BA:E7:76:99:68:CC:E7
1057
- # X509v3 Authority Key Identifier:
1058
- # keyid:D2:C4:B0:D2:91:D4:4C:11:71:B3:61:CB:3D:A1:FE:DD:A8:6A:D4:E3
1059
- #
1060
- # X509v3 Basic Constraints: critical
1061
- # CA:TRUE, pathlen:0
1062
- # Authority Information Access:
1063
- # OCSP - URI:http://ocsp.godaddy.com
1064
- #
1065
- # X509v3 CRL Distribution Points:
1066
- #
1067
- # Full Name:
1068
- # URI:http://certificates.godaddy.com/repository/gdroot.crl
1069
- #
1070
- # X509v3 Certificate Policies:
1071
- # Policy: X509v3 Any Policy
1072
- # CPS: http://certificates.godaddy.com/repository
1073
- #
1074
- # X509v3 Key Usage: critical
1075
- # Certificate Sign, CRL Sign
1076
- # Signature Algorithm: sha1WithRSAEncryption
1077
- # d2:86:c0:ec:bd:f9:a1:b6:67:ee:66:0b:a2:06:3a:04:50:8e:
1078
- # 15:72:ac:4a:74:95:53:cb:37:cb:44:49:ef:07:90:6b:33:d9:
1079
- # 96:f0:94:56:a5:13:30:05:3c:85:32:21:7b:c9:c7:0a:a8:24:
1080
- # a4:90:de:46:d3:25:23:14:03:67:c2:10:d6:6f:0f:5d:7b:7a:
1081
- # cc:9f:c5:58:2a:c1:c4:9e:21:a8:5a:f3:ac:a4:46:f3:9e:e4:
1082
- # 63:cb:2f:90:a4:29:29:01:d9:72:2c:29:df:37:01:27:bc:4f:
1083
- # ee:68:d3:21:8f:c0:b3:e4:f5:09:ed:d2:10:aa:53:b4:be:f0:
1084
- # cc:59:0b:d6:3b:96:1c:95:24:49:df:ce:ec:fd:a7:48:91:14:
1085
- # 45:0e:3a:36:6f:da:45:b3:45:a2:41:c9:d4:d7:44:4e:3e:b9:
1086
- # 74:76:d5:a2:13:55:2c:c6:87:a3:b5:99:ac:06:84:87:7f:75:
1087
- # 06:fc:bf:14:4c:0e:cc:6e:c4:df:3d:b7:12:71:f4:e8:f1:51:
1088
- # 40:22:28:49:e0:1d:4b:87:a8:34:cc:06:a2:dd:12:5a:d1:86:
1089
- # 36:64:03:35:6f:6f:77:6e:eb:f2:85:50:98:5e:ab:03:53:ad:
1090
- # 91:23:63:1f:16:9c:cd:b9:b2:05:63:3a:e1:f4:68:1b:17:05:
1091
- # 35:95:53:ee
1092
- -----BEGIN CERTIFICATE-----
1093
- MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx
1094
- ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
1095
- RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMTYw
1096
- MTU0MzdaFw0yNjExMTYwMTU0MzdaMIHKMQswCQYDVQQGEwJVUzEQMA4GA1UECBMH
1097
- QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5j
1098
- b20sIEluYy4xMzAxBgNVBAsTKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j
1099
- b20vcmVwb3NpdG9yeTEwMC4GA1UEAxMnR28gRGFkZHkgU2VjdXJlIENlcnRpZmlj
1100
- YXRpb24gQXV0aG9yaXR5MREwDwYDVQQFEwgwNzk2OTI4NzCCASIwDQYJKoZIhvcN
1101
- AQEBBQADggEPADCCAQoCggEBAMQt1RWMnCZM7DI161+4WQFapmGBWTtwY6vj3D3H
1102
- KrjJM9N55DrtPDAjhI6zMBS2sofDPZVUBJ7fmd0LJR4h3mUpfjWoqVTr9vcyOdQm
1103
- VZWt7/v+WIbXnvQAjYwqDL1CBM6nPwT27oDyqu9SoWlm2r4arV3aLGbqGmu75RpR
1104
- SgAvSMeYddi5Kcju+GZtCpyz8/x4fKL4o/K1w/O5epHBp+YlLpyo7RJlbmr2EkRT
1105
- cDCVw5wrWCs9CHRK8r5RsL+H0EwnWGu1NcWdrxcx+AuP7q2BNgWJCJjPOq8lh8BJ
1106
- 6qf9Z/dFjpfMFDniNoW1fho3/Rb2cRGadDAW/hOUoz+EDU8CAwEAAaOCATIwggEu
1107
- MB0GA1UdDgQWBBT9rGEyk2xF1uLuhV+auud2mWjM5zAfBgNVHSMEGDAWgBTSxLDS
1108
- kdRMEXGzYcs9of7dqGrU4zASBgNVHRMBAf8ECDAGAQH/AgEAMDMGCCsGAQUFBwEB
1109
- BCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZ29kYWRkeS5jb20wRgYDVR0f
1110
- BD8wPTA7oDmgN4Y1aHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBv
1111
- c2l0b3J5L2dkcm9vdC5jcmwwSwYDVR0gBEQwQjBABgRVHSAAMDgwNgYIKwYBBQUH
1112
- AgEWKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeTAO
1113
- BgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBANKGwOy9+aG2Z+5mC6IG
1114
- OgRQjhVyrEp0lVPLN8tESe8HkGsz2ZbwlFalEzAFPIUyIXvJxwqoJKSQ3kbTJSMU
1115
- A2fCENZvD117esyfxVgqwcSeIaha86ykRvOe5GPLL5CkKSkB2XIsKd83ASe8T+5o
1116
- 0yGPwLPk9Qnt0hCqU7S+8MxZC9Y7lhyVJEnfzuz9p0iRFEUOOjZv2kWzRaJBydTX
1117
- RE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsxuxN89txJx9OjxUUAiKEngHUuH
1118
- qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV
1119
- U+4=
1120
- -----END CERTIFICATE-----
1121
- # Thawte Premium Server CA.pem
1122
- # Certificate:
1123
- # Data:
1124
- # Version: 3 (0x2)
1125
- # Serial Number: 1 (0x1)
1126
- # Signature Algorithm: md5WithRSAEncryption
1127
- # Issuer: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting cc, OU=Certification Services Division, CN=Thawte Premium Server CA/emailAddress=premium-server@thawte.com
1128
- # Validity
1129
- # Not Before: Aug 1 00:00:00 1996 GMT
1130
- # Not After : Dec 31 23:59:59 2020 GMT
1131
- # Subject: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting cc, OU=Certification Services Division, CN=Thawte Premium Server CA/emailAddress=premium-server@thawte.com
1132
- # Subject Public Key Info:
1133
- # Public Key Algorithm: rsaEncryption
1134
- # Public-Key: (1024 bit)
1135
- # Modulus:
1136
- # 00:d2:36:36:6a:8b:d7:c2:5b:9e:da:81:41:62:8f:
1137
- # 38:ee:49:04:55:d6:d0:ef:1c:1b:95:16:47:ef:18:
1138
- # 48:35:3a:52:f4:2b:6a:06:8f:3b:2f:ea:56:e3:af:
1139
- # 86:8d:9e:17:f7:9e:b4:65:75:02:4d:ef:cb:09:a2:
1140
- # 21:51:d8:9b:d0:67:d0:ba:0d:92:06:14:73:d4:93:
1141
- # cb:97:2a:00:9c:5c:4e:0c:bc:fa:15:52:fc:f2:44:
1142
- # 6e:da:11:4a:6e:08:9f:2f:2d:e3:f9:aa:3a:86:73:
1143
- # b6:46:53:58:c8:89:05:bd:83:11:b8:73:3f:aa:07:
1144
- # 8d:f4:42:4d:e7:40:9d:1c:37
1145
- # Exponent: 65537 (0x10001)
1146
- # X509v3 extensions:
1147
- # X509v3 Basic Constraints: critical
1148
- # CA:TRUE
1149
- # Signature Algorithm: md5WithRSAEncryption
1150
- # 26:48:2c:16:c2:58:fa:e8:16:74:0c:aa:aa:5f:54:3f:f2:d7:
1151
- # c9:78:60:5e:5e:6e:37:63:22:77:36:7e:b2:17:c4:34:b9:f5:
1152
- # 08:85:fc:c9:01:38:ff:4d:be:f2:16:42:43:e7:bb:5a:46:fb:
1153
- # c1:c6:11:1f:f1:4a:b0:28:46:c9:c3:c4:42:7d:bc:fa:ab:59:
1154
- # 6e:d5:b7:51:88:11:e3:a4:85:19:6b:82:4c:a4:0c:12:ad:e9:
1155
- # a4:ae:3f:f1:c3:49:65:9a:8c:c5:c8:3e:25:b7:94:99:bb:92:
1156
- # 32:71:07:f0:86:5e:ed:50:27:a6:0d:a6:23:f9:bb:cb:a6:07:
1157
- # 14:42
1158
- -----BEGIN CERTIFICATE-----
1159
- MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx
1160
- FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
1161
- VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
1162
- biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy
1163
- dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t
1164
- MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB
1165
- MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG
1166
- A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp
1167
- b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl
1168
- cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv
1169
- bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE
1170
- VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ
1171
- ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR
1172
- uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
1173
- 9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
1174
- hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM
1175
- pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==
1176
- -----END CERTIFICATE-----
1177
- # Thawte Primary Root CA - G2.pem
1178
- # Certificate:
1179
- # Data:
1180
- # Version: 3 (0x2)
1181
- # Serial Number:
1182
- # 35:fc:26:5c:d9:84:4f:c9:3d:26:3d:57:9b:ae:d7:56
1183
- # Signature Algorithm: ecdsa-with-SHA384
1184
- # Issuer: C=US, O=thawte, Inc., OU=(c) 2007 thawte, Inc. - For authorized use only, CN=thawte Primary Root CA - G2
1185
- # Validity
1186
- # Not Before: Nov 5 00:00:00 2007 GMT
1187
- # Not After : Jan 18 23:59:59 2038 GMT
1188
- # Subject: C=US, O=thawte, Inc., OU=(c) 2007 thawte, Inc. - For authorized use only, CN=thawte Primary Root CA - G2
1189
- # Subject Public Key Info:
1190
- # Public Key Algorithm: id-ecPublicKey
1191
- # Public-Key: (384 bit)
1192
- # pub:
1193
- # 04:a2:d5:9c:82:7b:95:9d:f1:52:78:87:fe:8a:16:
1194
- # bf:05:e6:df:a3:02:4f:0d:07:c6:00:51:ba:0c:02:
1195
- # 52:2d:22:a4:42:39:c4:fe:8f:ea:c9:c1:be:d4:4d:
1196
- # ff:9f:7a:9e:e2:b1:7c:9a:ad:a7:86:09:73:87:d1:
1197
- # e7:9a:e3:7a:a5:aa:6e:fb:ba:b3:70:c0:67:88:a2:
1198
- # 35:d4:a3:9a:b1:fd:ad:c2:ef:31:fa:a8:b9:f3:fb:
1199
- # 08:c6:91:d1:fb:29:95
1200
- # ASN1 OID: secp384r1
1201
- # X509v3 extensions:
1202
- # X509v3 Basic Constraints: critical
1203
- # CA:TRUE
1204
- # X509v3 Key Usage: critical
1205
- # Certificate Sign, CRL Sign
1206
- # X509v3 Subject Key Identifier:
1207
- # 9A:D8:00:30:00:E7:6B:7F:85:18:EE:8B:B6:CE:8A:0C:F8:11:E1:BB
1208
- # Signature Algorithm: ecdsa-with-SHA384
1209
- # 30:66:02:31:00:dd:f8:e0:57:47:5b:a7:e6:0a:c3:bd:f5:80:
1210
- # 8a:97:35:0d:1b:89:3c:54:86:77:28:ca:a1:f4:79:de:b5:e6:
1211
- # 38:b0:f0:65:70:8c:7f:02:54:c2:bf:ff:d8:a1:3e:d9:cf:02:
1212
- # 31:00:c4:8d:94:fc:dc:53:d2:dc:9d:78:16:1f:15:33:23:53:
1213
- # 52:e3:5a:31:5d:9d:ca:ae:bd:13:29:44:0d:27:5b:a8:e7:68:
1214
- # 9c:12:f7:58:3f:2e:72:02:57:a3:8f:a1:14:2e
1215
- -----BEGIN CERTIFICATE-----
1216
- MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL
1217
- MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp
1218
- IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi
1219
- BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw
1220
- MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
1221
- d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig
1222
- YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v
1223
- dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/
1224
- BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6
1225
- papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E
1226
- BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K
1227
- DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3
1228
- KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox
1229
- XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
1230
- -----END CERTIFICATE-----
1231
- # Thawte Primary Root CA - G3.pem
1232
- # Certificate:
1233
- # Data:
1234
- # Version: 3 (0x2)
1235
- # Serial Number:
1236
- # 60:01:97:b7:46:a7:ea:b4:b4:9a:d6:4b:2f:f7:90:fb
1237
- # Signature Algorithm: sha256WithRSAEncryption
1238
- # Issuer: C=US, O=thawte, Inc., OU=Certification Services Division, OU=(c) 2008 thawte, Inc. - For authorized use only, CN=thawte Primary Root CA - G3
1239
- # Validity
1240
- # Not Before: Apr 2 00:00:00 2008 GMT
1241
- # Not After : Dec 1 23:59:59 2037 GMT
1242
- # Subject: C=US, O=thawte, Inc., OU=Certification Services Division, OU=(c) 2008 thawte, Inc. - For authorized use only, CN=thawte Primary Root CA - G3
1243
- # Subject Public Key Info:
1244
- # Public Key Algorithm: rsaEncryption
1245
- # Public-Key: (2048 bit)
1246
- # Modulus:
1247
- # 00:b2:bf:27:2c:fb:db:d8:5b:dd:78:7b:1b:9e:77:
1248
- # 66:81:cb:3e:bc:7c:ae:f3:a6:27:9a:34:a3:68:31:
1249
- # 71:38:33:62:e4:f3:71:66:79:b1:a9:65:a3:a5:8b:
1250
- # d5:8f:60:2d:3f:42:cc:aa:6b:32:c0:23:cb:2c:41:
1251
- # dd:e4:df:fc:61:9c:e2:73:b2:22:95:11:43:18:5f:
1252
- # c4:b6:1f:57:6c:0a:05:58:22:c8:36:4c:3a:7c:a5:
1253
- # d1:cf:86:af:88:a7:44:02:13:74:71:73:0a:42:59:
1254
- # 02:f8:1b:14:6b:42:df:6f:5f:ba:6b:82:a2:9d:5b:
1255
- # e7:4a:bd:1e:01:72:db:4b:74:e8:3b:7f:7f:7d:1f:
1256
- # 04:b4:26:9b:e0:b4:5a:ac:47:3d:55:b8:d7:b0:26:
1257
- # 52:28:01:31:40:66:d8:d9:24:bd:f6:2a:d8:ec:21:
1258
- # 49:5c:9b:f6:7a:e9:7f:55:35:7e:96:6b:8d:93:93:
1259
- # 27:cb:92:bb:ea:ac:40:c0:9f:c2:f8:80:cf:5d:f4:
1260
- # 5a:dc:ce:74:86:a6:3e:6c:0b:53:ca:bd:92:ce:19:
1261
- # 06:72:e6:0c:5c:38:69:c7:04:d6:bc:6c:ce:5b:f6:
1262
- # f7:68:9c:dc:25:15:48:88:a1:e9:a9:f8:98:9c:e0:
1263
- # f3:d5:31:28:61:11:6c:67:96:8d:39:99:cb:c2:45:
1264
- # 24:39
1265
- # Exponent: 65537 (0x10001)
1266
- # X509v3 extensions:
1267
- # X509v3 Basic Constraints: critical
1268
- # CA:TRUE
1269
- # X509v3 Key Usage: critical
1270
- # Certificate Sign, CRL Sign
1271
- # X509v3 Subject Key Identifier:
1272
- # AD:6C:AA:94:60:9C:ED:E4:FF:FA:3E:0A:74:2B:63:03:F7:B6:59:BF
1273
- # Signature Algorithm: sha256WithRSAEncryption
1274
- # 1a:40:d8:95:65:ac:09:92:89:c6:39:f4:10:e5:a9:0e:66:53:
1275
- # 5d:78:de:fa:24:91:bb:e7:44:51:df:c6:16:34:0a:ef:6a:44:
1276
- # 51:ea:2b:07:8a:03:7a:c3:eb:3f:0a:2c:52:16:a0:2b:43:b9:
1277
- # 25:90:3f:70:a9:33:25:6d:45:1a:28:3b:27:cf:aa:c3:29:42:
1278
- # 1b:df:3b:4c:c0:33:34:5b:41:88:bf:6b:2b:65:af:28:ef:b2:
1279
- # f5:c3:aa:66:ce:7b:56:ee:b7:c8:cb:67:c1:c9:9c:1a:18:b8:
1280
- # c4:c3:49:03:f1:60:0e:50:cd:46:c5:f3:77:79:f7:b6:15:e0:
1281
- # 38:db:c7:2f:28:a0:0c:3f:77:26:74:d9:25:12:da:31:da:1a:
1282
- # 1e:dc:29:41:91:22:3c:69:a7:bb:02:f2:b6:5c:27:03:89:f4:
1283
- # 06:ea:9b:e4:72:82:e3:a1:09:c1:e9:00:19:d3:3e:d4:70:6b:
1284
- # ba:71:a6:aa:58:ae:f4:bb:e9:6c:b6:ef:87:cc:9b:bb:ff:39:
1285
- # e6:56:61:d3:0a:a7:c4:5c:4c:60:7b:05:77:26:7a:bf:d8:07:
1286
- # 52:2c:62:f7:70:63:d9:39:bc:6f:1c:c2:79:dc:76:29:af:ce:
1287
- # c5:2c:64:04:5e:88:36:6e:31:d4:40:1a:62:34:36:3f:35:01:
1288
- # ae:ac:63:a0
1289
- -----BEGIN CERTIFICATE-----
1290
- MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB
1291
- rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
1292
- Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
1293
- MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV
1294
- BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa
1295
- Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl
1296
- LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u
1297
- MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl
1298
- ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz
1299
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm
1300
- gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8
1301
- YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf
1302
- b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9
1303
- 9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S
1304
- zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk
1305
- OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV
1306
- HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA
1307
- 2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW
1308
- oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
1309
- t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c
1310
- KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM
1311
- m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu
1312
- MdRAGmI0Nj81Aa6sY6A=
1313
- -----END CERTIFICATE-----
1314
- # Thawte Primary Root CA.pem
1315
- # Certificate:
1316
- # Data:
1317
- # Version: 3 (0x2)
1318
- # Serial Number:
1319
- # 34:4e:d5:57:20:d5:ed:ec:49:f4:2f:ce:37:db:2b:6d
1320
- # Signature Algorithm: sha1WithRSAEncryption
1321
- # Issuer: C=US, O=thawte, Inc., OU=Certification Services Division, OU=(c) 2006 thawte, Inc. - For authorized use only, CN=thawte Primary Root CA
1322
- # Validity
1323
- # Not Before: Nov 17 00:00:00 2006 GMT
1324
- # Not After : Jul 16 23:59:59 2036 GMT
1325
- # Subject: C=US, O=thawte, Inc., OU=Certification Services Division, OU=(c) 2006 thawte, Inc. - For authorized use only, CN=thawte Primary Root CA
1326
- # Subject Public Key Info:
1327
- # Public Key Algorithm: rsaEncryption
1328
- # Public-Key: (2048 bit)
1329
- # Modulus:
1330
- # 00:ac:a0:f0:fb:80:59:d4:9c:c7:a4:cf:9d:a1:59:
1331
- # 73:09:10:45:0c:0d:2c:6e:68:f1:6c:5b:48:68:49:
1332
- # 59:37:fc:0b:33:19:c2:77:7f:cc:10:2d:95:34:1c:
1333
- # e6:eb:4d:09:a7:1c:d2:b8:c9:97:36:02:b7:89:d4:
1334
- # 24:5f:06:c0:cc:44:94:94:8d:02:62:6f:eb:5a:dd:
1335
- # 11:8d:28:9a:5c:84:90:10:7a:0d:bd:74:66:2f:6a:
1336
- # 38:a0:e2:d5:54:44:eb:1d:07:9f:07:ba:6f:ee:e9:
1337
- # fd:4e:0b:29:f5:3e:84:a0:01:f1:9c:ab:f8:1c:7e:
1338
- # 89:a4:e8:a1:d8:71:65:0d:a3:51:7b:ee:bc:d2:22:
1339
- # 60:0d:b9:5b:9d:df:ba:fc:51:5b:0b:af:98:b2:e9:
1340
- # 2e:e9:04:e8:62:87:de:2b:c8:d7:4e:c1:4c:64:1e:
1341
- # dd:cf:87:58:ba:4a:4f:ca:68:07:1d:1c:9d:4a:c6:
1342
- # d5:2f:91:cc:7c:71:72:1c:c5:c0:67:eb:32:fd:c9:
1343
- # 92:5c:94:da:85:c0:9b:bf:53:7d:2b:09:f4:8c:9d:
1344
- # 91:1f:97:6a:52:cb:de:09:36:a4:77:d8:7b:87:50:
1345
- # 44:d5:3e:6e:29:69:fb:39:49:26:1e:09:a5:80:7b:
1346
- # 40:2d:eb:e8:27:85:c9:fe:61:fd:7e:e6:7c:97:1d:
1347
- # d5:9d
1348
- # Exponent: 65537 (0x10001)
1349
- # X509v3 extensions:
1350
- # X509v3 Basic Constraints: critical
1351
- # CA:TRUE
1352
- # X509v3 Key Usage: critical
1353
- # Certificate Sign, CRL Sign
1354
- # X509v3 Subject Key Identifier:
1355
- # 7B:5B:45:CF:AF:CE:CB:7A:FD:31:92:1A:6A:B6:F3:46:EB:57:48:50
1356
- # Signature Algorithm: sha1WithRSAEncryption
1357
- # 79:11:c0:4b:b3:91:b6:fc:f0:e9:67:d4:0d:6e:45:be:55:e8:
1358
- # 93:d2:ce:03:3f:ed:da:25:b0:1d:57:cb:1e:3a:76:a0:4c:ec:
1359
- # 50:76:e8:64:72:0c:a4:a9:f1:b8:8b:d6:d6:87:84:bb:32:e5:
1360
- # 41:11:c0:77:d9:b3:60:9d:eb:1b:d5:d1:6e:44:44:a9:a6:01:
1361
- # ec:55:62:1d:77:b8:5c:8e:48:49:7c:9c:3b:57:11:ac:ad:73:
1362
- # 37:8e:2f:78:5c:90:68:47:d9:60:60:e6:fc:07:3d:22:20:17:
1363
- # c4:f7:16:e9:c4:d8:72:f9:c8:73:7c:df:16:2f:15:a9:3e:fd:
1364
- # 6a:27:b6:a1:eb:5a:ba:98:1f:d5:e3:4d:64:0a:9d:13:c8:61:
1365
- # ba:f5:39:1c:87:ba:b8:bd:7b:22:7f:f6:fe:ac:40:79:e5:ac:
1366
- # 10:6f:3d:8f:1b:79:76:8b:c4:37:b3:21:18:84:e5:36:00:eb:
1367
- # 63:20:99:b9:e9:fe:33:04:bb:41:c8:c1:02:f9:44:63:20:9e:
1368
- # 81:ce:42:d3:d6:3f:2c:76:d3:63:9c:59:dd:8f:a6:e1:0e:a0:
1369
- # 2e:41:f7:2e:95:47:cf:bc:fd:33:f3:f6:0b:61:7e:7e:91:2b:
1370
- # 81:47:c2:27:30:ee:a7:10:5d:37:8f:5c:39:2b:e4:04:f0:7b:
1371
- # 8d:56:8c:68
1372
- -----BEGIN CERTIFICATE-----
1373
- MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
1374
- qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
1375
- Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
1376
- MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
1377
- BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
1378
- NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
1379
- LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
1380
- A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
1381
- IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
1382
- SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
1383
- W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
1384
- 3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
1385
- 6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
1386
- Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
1387
- NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
1388
- MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
1389
- r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
1390
- DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
1391
- YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
1392
- xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
1393
- /qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
1394
- LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
1395
- jVaMaA==
1396
  -----END CERTIFICATE-----
1
+ # DigiCert Assured ID Root CA.pem
2
+ # Certificate:
3
+ # Data:
4
+ # Version: 3 (0x2)
5
+ # Serial Number:
6
+ # 0c:e7:e0:e5:17:d8:46:fe:8f:e5:60:fc:1b:f0:30:39
7
+ # Signature Algorithm: sha1WithRSAEncryption
8
+ # Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Assured ID Root CA
9
+ # Validity
10
+ # Not Before: Nov 10 00:00:00 2006 GMT
11
+ # Not After : Nov 10 00:00:00 2031 GMT
12
+ # Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Assured ID Root CA
13
+ # Subject Public Key Info:
14
+ # Public Key Algorithm: rsaEncryption
15
+ # Public-Key: (2048 bit)
16
+ # Modulus:
17
+ # 00:ad:0e:15:ce:e4:43:80:5c:b1:87:f3:b7:60:f9:
18
+ # 71:12:a5:ae:dc:26:94:88:aa:f4:ce:f5:20:39:28:
19
+ # 58:60:0c:f8:80:da:a9:15:95:32:61:3c:b5:b1:28:
20
+ # 84:8a:8a:dc:9f:0a:0c:83:17:7a:8f:90:ac:8a:e7:
21
+ # 79:53:5c:31:84:2a:f6:0f:98:32:36:76:cc:de:dd:
22
+ # 3c:a8:a2:ef:6a:fb:21:f2:52:61:df:9f:20:d7:1f:
23
+ # e2:b1:d9:fe:18:64:d2:12:5b:5f:f9:58:18:35:bc:
24
+ # 47:cd:a1:36:f9:6b:7f:d4:b0:38:3e:c1:1b:c3:8c:
25
+ # 33:d9:d8:2f:18:fe:28:0f:b3:a7:83:d6:c3:6e:44:
26
+ # c0:61:35:96:16:fe:59:9c:8b:76:6d:d7:f1:a2:4b:
27
+ # 0d:2b:ff:0b:72:da:9e:60:d0:8e:90:35:c6:78:55:
28
+ # 87:20:a1:cf:e5:6d:0a:c8:49:7c:31:98:33:6c:22:
29
+ # e9:87:d0:32:5a:a2:ba:13:82:11:ed:39:17:9d:99:
30
+ # 3a:72:a1:e6:fa:a4:d9:d5:17:31:75:ae:85:7d:22:
31
+ # ae:3f:01:46:86:f6:28:79:c8:b1:da:e4:57:17:c4:
32
+ # 7e:1c:0e:b0:b4:92:a6:56:b3:bd:b2:97:ed:aa:a7:
33
+ # f0:b7:c5:a8:3f:95:16:d0:ff:a1:96:eb:08:5f:18:
34
+ # 77:4f
35
+ # Exponent: 65537 (0x10001)
36
+ # X509v3 extensions:
37
+ # X509v3 Key Usage: critical
38
+ # Digital Signature, Certificate Sign, CRL Sign
39
+ # X509v3 Basic Constraints: critical
40
+ # CA:TRUE
41
+ # X509v3 Subject Key Identifier:
42
+ # 45:EB:A2:AF:F4:92:CB:82:31:2D:51:8B:A7:A7:21:9D:F3:6D:C8:0F
43
+ # X509v3 Authority Key Identifier:
44
+ # keyid:45:EB:A2:AF:F4:92:CB:82:31:2D:51:8B:A7:A7:21:9D:F3:6D:C8:0F
45
+ #
46
+ # Signature Algorithm: sha1WithRSAEncryption
47
+ # a2:0e:bc:df:e2:ed:f0:e3:72:73:7a:64:94:bf:f7:72:66:d8:
48
+ # 32:e4:42:75:62:ae:87:eb:f2:d5:d9:de:56:b3:9f:cc:ce:14:
49
+ # 28:b9:0d:97:60:5c:12:4c:58:e4:d3:3d:83:49:45:58:97:35:
50
+ # 69:1a:a8:47:ea:56:c6:79:ab:12:d8:67:81:84:df:7f:09:3c:
51
+ # 94:e6:b8:26:2c:20:bd:3d:b3:28:89:f7:5f:ff:22:e2:97:84:
52
+ # 1f:e9:65:ef:87:e0:df:c1:67:49:b3:5d:eb:b2:09:2a:eb:26:
53
+ # ed:78:be:7d:3f:2b:f3:b7:26:35:6d:5f:89:01:b6:49:5b:9f:
54
+ # 01:05:9b:ab:3d:25:c1:cc:b6:7f:c2:f1:6f:86:c6:fa:64:68:
55
+ # eb:81:2d:94:eb:42:b7:fa:8c:1e:dd:62:f1:be:50:67:b7:6c:
56
+ # bd:f3:f1:1f:6b:0c:36:07:16:7f:37:7c:a9:5b:6d:7a:f1:12:
57
+ # 46:60:83:d7:27:04:be:4b:ce:97:be:c3:67:2a:68:11:df:80:
58
+ # e7:0c:33:66:bf:13:0d:14:6e:f3:7f:1f:63:10:1e:fa:8d:1b:
59
+ # 25:6d:6c:8f:a5:b7:61:01:b1:d2:a3:26:a1:10:71:9d:ad:e2:
60
+ # c3:f9:c3:99:51:b7:2b:07:08:ce:2e:e6:50:b2:a7:fa:0a:45:
61
+ # 2f:a2:f0:f2
62
+ -----BEGIN CERTIFICATE-----
63
+ MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
64
+ MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
65
+ d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
66
+ b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG
67
+ EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
68
+ cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi
69
+ MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c
70
+ JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP
71
+ mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+
72
+ wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4
73
+ VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/
74
+ AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB
75
+ AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
76
+ BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
77
+ pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
78
+ dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf
79
+ fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm
80
+ NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx
81
+ H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
82
+ +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
83
+ -----END CERTIFICATE-----
84
+ # DigiCert Global Root CA.pem
85
+ # Certificate:
86
+ # Data:
87
+ # Version: 3 (0x2)
88
+ # Serial Number:
89
+ # 08:3b:e0:56:90:42:46:b1:a1:75:6a:c9:59:91:c7:4a
90
+ # Signature Algorithm: sha1WithRSAEncryption
91
+ # Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root CA
92
+ # Validity
93
+ # Not Before: Nov 10 00:00:00 2006 GMT
94
+ # Not After : Nov 10 00:00:00 2031 GMT
95
+ # Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root CA
96
+ # Subject Public Key Info:
97
+ # Public Key Algorithm: rsaEncryption
98
+ # Public-Key: (2048 bit)
99
+ # Modulus:
100
+ # 00:e2:3b:e1:11:72:de:a8:a4:d3:a3:57:aa:50:a2:
101
+ # 8f:0b:77:90:c9:a2:a5:ee:12:ce:96:5b:01:09:20:
102
+ # cc:01:93:a7:4e:30:b7:53:f7:43:c4:69:00:57:9d:
103
+ # e2:8d:22:dd:87:06:40:00:81:09:ce:ce:1b:83:bf:
104
+ # df:cd:3b:71:46:e2:d6:66:c7:05:b3:76:27:16:8f:
105
+ # 7b:9e:1e:95:7d:ee:b7:48:a3:08:da:d6:af:7a:0c:
106
+ # 39:06:65:7f:4a:5d:1f:bc:17:f8:ab:be:ee:28:d7:
107
+ # 74:7f:7a:78:99:59:85:68:6e:5c:23:32:4b:bf:4e:
108
+ # c0:e8:5a:6d:e3:70:bf:77:10:bf:fc:01:f6:85:d9:
109
+ # a8:44:10:58:32:a9:75:18:d5:d1:a2:be:47:e2:27:
110
+ # 6a:f4:9a:33:f8:49:08:60:8b:d4:5f:b4:3a:84:bf:
111
+ # a1:aa:4a:4c:7d:3e:cf:4f:5f:6c:76:5e:a0:4b:37:
112
+ # 91:9e:dc:22:e6:6d:ce:14:1a:8e:6a:cb:fe:cd:b3:
113
+ # 14:64:17:c7:5b:29:9e:32:bf:f2:ee:fa:d3:0b:42:
114
+ # d4:ab:b7:41:32:da:0c:d4:ef:f8:81:d5:bb:8d:58:
115
+ # 3f:b5:1b:e8:49:28:a2:70:da:31:04:dd:f7:b2:16:
116
+ # f2:4c:0a:4e:07:a8:ed:4a:3d:5e:b5:7f:a3:90:c3:
117
+ # af:27
118
+ # Exponent: 65537 (0x10001)
119
+ # X509v3 extensions:
120
+ # X509v3 Key Usage: critical
121
+ # Digital Signature, Certificate Sign, CRL Sign
122
+ # X509v3 Basic Constraints: critical
123
+ # CA:TRUE
124
+ # X509v3 Subject Key Identifier:
125
+ # 03:DE:50:35:56:D1:4C:BB:66:F0:A3:E2:1B:1B:C3:97:B2:3D:D1:55
126
+ # X509v3 Authority Key Identifier:
127
+ # keyid:03:DE:50:35:56:D1:4C:BB:66:F0:A3:E2:1B:1B:C3:97:B2:3D:D1:55
128
+ #
129
+ # Signature Algorithm: sha1WithRSAEncryption
130
+ # cb:9c:37:aa:48:13:12:0a:fa:dd:44:9c:4f:52:b0:f4:df:ae:
131
+ # 04:f5:79:79:08:a3:24:18:fc:4b:2b:84:c0:2d:b9:d5:c7:fe:
132
+ # f4:c1:1f:58:cb:b8:6d:9c:7a:74:e7:98:29:ab:11:b5:e3:70:
133
+ # a0:a1:cd:4c:88:99:93:8c:91:70:e2:ab:0f:1c:be:93:a9:ff:
134
+ # 63:d5:e4:07:60:d3:a3:bf:9d:5b:09:f1:d5:8e:e3:53:f4:8e:
135
+ # 63:fa:3f:a7:db:b4:66:df:62:66:d6:d1:6e:41:8d:f2:2d:b5:
136
+ # ea:77:4a:9f:9d:58:e2:2b:59:c0:40:23:ed:2d:28:82:45:3e:
137
+ # 79:54:92:26:98:e0:80:48:a8:37:ef:f0:d6:79:60:16:de:ac:
138
+ # e8:0e:cd:6e:ac:44:17:38:2f:49:da:e1:45:3e:2a:b9:36:53:
139
+ # cf:3a:50:06:f7:2e:e8:c4:57:49:6c:61:21:18:d5:04:ad:78:
140
+ # 3c:2c:3a:80:6b:a7:eb:af:15:14:e9:d8:89:c1:b9:38:6c:e2:
141
+ # 91:6c:8a:ff:64:b9:77:25:57:30:c0:1b:24:a3:e1:dc:e9:df:
142
+ # 47:7c:b5:b4:24:08:05:30:ec:2d:bd:0b:bf:45:bf:50:b9:a9:
143
+ # f3:eb:98:01:12:ad:c8:88:c6:98:34:5f:8d:0a:3c:c6:e9:d5:
144
+ # 95:95:6d:de
145
+ -----BEGIN CERTIFICATE-----
146
+ MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
147
+ MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
148
+ d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
149
+ QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
150
+ MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
151
+ b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
152
+ 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
153
+ CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
154
+ nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
155
+ 43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
156
+ T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
157
+ gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
158
+ BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
159
+ TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
160
+ DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
161
+ hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
162
+ 06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
163
+ PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
164
+ YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
165
+ CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
166
+ -----END CERTIFICATE-----
167
+ # DigiCert High Assurance EV Root CA.pem
168
+ # Certificate:
169
+ # Data:
170
+ # Version: 3 (0x2)
171
+ # Serial Number:
172
+ # 02:ac:5c:26:6a:0b:40:9b:8f:0b:79:f2:ae:46:25:77
173
+ # Signature Algorithm: sha1WithRSAEncryption
174
+ # Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA
175
+ # Validity
176
+ # Not Before: Nov 10 00:00:00 2006 GMT
177
+ # Not After : Nov 10 00:00:00 2031 GMT
178
+ # Subject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA
179
+ # Subject Public Key Info:
180
+ # Public Key Algorithm: rsaEncryption
181
+ # Public-Key: (2048 bit)
182
+ # Modulus:
183
+ # 00:c6:cc:e5:73:e6:fb:d4:bb:e5:2d:2d:32:a6:df:
184
+ # e5:81:3f:c9:cd:25:49:b6:71:2a:c3:d5:94:34:67:
185
+ # a2:0a:1c:b0:5f:69:a6:40:b1:c4:b7:b2:8f:d0:98:
186
+ # a4:a9:41:59:3a:d3:dc:94:d6:3c:db:74:38:a4:4a:
187
+ # cc:4d:25:82:f7:4a:a5:53:12:38:ee:f3:49:6d:71:
188
+ # 91:7e:63:b6:ab:a6:5f:c3:a4:84:f8:4f:62:51:be:
189
+ # f8:c5:ec:db:38:92:e3:06:e5:08:91:0c:c4:28:41:
190
+ # 55:fb:cb:5a:89:15:7e:71:e8:35:bf:4d:72:09:3d:
191
+ # be:3a:38:50:5b:77:31:1b:8d:b3:c7:24:45:9a:a7:
192
+ # ac:6d:00:14:5a:04:b7:ba:13:eb:51:0a:98:41:41:
193
+ # 22:4e:65:61:87:81:41:50:a6:79:5c:89:de:19:4a:
194
+ # 57:d5:2e:e6:5d:1c:53:2c:7e:98:cd:1a:06:16:a4:
195
+ # 68:73:d0:34:04:13:5c:a1:71:d3:5a:7c:55:db:5e:
196
+ # 64:e1:37:87:30:56:04:e5:11:b4:29:80:12:f1:79:
197
+ # 39:88:a2:02:11:7c:27:66:b7:88:b7:78:f2:ca:0a:
198
+ # a8:38:ab:0a:64:c2:bf:66:5d:95:84:c1:a1:25:1e:
199
+ # 87:5d:1a:50:0b:20:12:cc:41:bb:6e:0b:51:38:b8:
200
+ # 4b:cb
201
+ # Exponent: 65537 (0x10001)
202
+ # X509v3 extensions:
203
+ # X509v3 Key Usage: critical
204
+ # Digital Signature, Certificate Sign, CRL Sign
205
+ # X509v3 Basic Constraints: critical
206
+ # CA:TRUE
207
+ # X509v3 Subject Key Identifier:
208
+ # B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3
209
+ # X509v3 Authority Key Identifier:
210
+ # keyid:B1:3E:C3:69:03:F8:BF:47:01:D4:98:26:1A:08:02:EF:63:64:2B:C3
211
+ #
212
+ # Signature Algorithm: sha1WithRSAEncryption
213
+ # 1c:1a:06:97:dc:d7:9c:9f:3c:88:66:06:08:57:21:db:21:47:
214
+ # f8:2a:67:aa:bf:18:32:76:40:10:57:c1:8a:f3:7a:d9:11:65:
215
+ # 8e:35:fa:9e:fc:45:b5:9e:d9:4c:31:4b:b8:91:e8:43:2c:8e:
216
+ # b3:78:ce:db:e3:53:79:71:d6:e5:21:94:01:da:55:87:9a:24:
217
+ # 64:f6:8a:66:cc:de:9c:37:cd:a8:34:b1:69:9b:23:c8:9e:78:
218
+ # 22:2b:70:43:e3:55:47:31:61:19:ef:58:c5:85:2f:4e:30:f6:
219
+ # a0:31:16:23:c8:e7:e2:65:16:33:cb:bf:1a:1b:a0:3d:f8:ca:
220
+ # 5e:8b:31:8b:60:08:89:2d:0c:06:5c:52:b7:c4:f9:0a:98:d1:
221
+ # 15:5f:9f:12:be:7c:36:63:38:bd:44:a4:7f:e4:26:2b:0a:c4:
222
+ # 97:69:0d:e9:8c:e2:c0:10:57:b8:c8:76:12:91:55:f2:48:69:
223
+ # d8:bc:2a:02:5b:0f:44:d4:20:31:db:f4:ba:70:26:5d:90:60:
224
+ # 9e:bc:4b:17:09:2f:b4:cb:1e:43:68:c9:07:27:c1:d2:5c:f7:
225
+ # ea:21:b9:68:12:9c:3c:9c:bf:9e:fc:80:5c:9b:63:cd:ec:47:
226
+ # aa:25:27:67:a0:37:f3:00:82:7d:54:d7:a9:f8:e9:2e:13:a3:
227
+ # 77:e8:1f:4a
228
+ -----BEGIN CERTIFICATE-----
229
+ MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
230
+ MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
231
+ d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
232
+ ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
233
+ MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
234
+ LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
235
+ RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
236
+ +9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
237
+ PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
238
+ xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
239
+ Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
240
+ hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
241
+ EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
242
+ MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
243
+ FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
244
+ nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
245
+ eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
246
+ hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
247
+ Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
248
+ vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
249
+ +OkuE6N36B9K
250
+ -----END CERTIFICATE-----
251
+ # Entrust Root Certification Authority - EC1.pem
252
+ # Certificate:
253
+ # Data:
254
+ # Version: 3 (0x2)
255
+ # Serial Number:
256
+ # a6:8b:79:29:00:00:00:00:50:d0:91:f9
257
+ # Signature Algorithm: ecdsa-with-SHA384
258
+ # Issuer: C=US, O=Entrust, Inc., OU=See www.entrust.net/legal-terms, OU=(c) 2012 Entrust, Inc. - for authorized use only, CN=Entrust Root Certification Authority - EC1
259
+ # Validity
260
+ # Not Before: Dec 18 15:25:36 2012 GMT
261
+ # Not After : Dec 18 15:55:36 2037 GMT
262
+ # Subject: C=US, O=Entrust, Inc., OU=See www.entrust.net/legal-terms, OU=(c) 2012 Entrust, Inc. - for authorized use only, CN=Entrust Root Certification Authority - EC1
263
+ # Subject Public Key Info:
264
+ # Public Key Algorithm: id-ecPublicKey
265
+ # Public-Key: (384 bit)
266
+ # pub:
267
+ # 04:84:13:c9:d0:ba:6d:41:7b:e2:6c:d0:eb:55:5f:
268
+ # 66:02:1a:24:f4:5b:89:69:47:e3:b8:c2:7d:f1:f2:
269
+ # 02:c5:9f:a0:f6:5b:d5:8b:06:19:86:4f:53:10:6d:
270
+ # 07:24:27:a1:a0:f8:d5:47:19:61:4c:7d:ca:93:27:
271
+ # ea:74:0c:ef:6f:96:09:fe:63:ec:70:5d:36:ad:67:
272
+ # 77:ae:c9:9d:7c:55:44:3a:a2:63:51:1f:f5:e3:62:
273
+ # d4:a9:47:07:3e:cc:20
274
+ # ASN1 OID: secp384r1
275
+ # X509v3 extensions:
276
+ # X509v3 Key Usage: critical
277
+ # Certificate Sign, CRL Sign
278
+ # X509v3 Basic Constraints: critical
279
+ # CA:TRUE
280
+ # X509v3 Subject Key Identifier:
281
+ # B7:63:E7:1A:DD:8D:E9:08:A6:55:83:A4:E0:6A:50:41:65:11:42:49
282
+ # Signature Algorithm: ecdsa-with-SHA384
283
+ # 30:64:02:30:61:79:d8:e5:42:47:df:1c:ae:53:99:17:b6:6f:
284
+ # 1c:7d:e1:bf:11:94:d1:03:88:75:e4:8d:89:a4:8a:77:46:de:
285
+ # 6d:61:ef:02:f5:fb:b5:df:cc:fe:4e:ff:fe:a9:e6:a7:02:30:
286
+ # 5b:99:d7:85:37:06:b5:7b:08:fd:eb:27:8b:4a:94:f9:e1:fa:
287
+ # a7:8e:26:08:e8:7c:92:68:6d:73:d8:6f:26:ac:21:02:b8:99:
288
+ # b7:26:41:5b:25:60:ae:d0:48:1a:ee:06
289
+ -----BEGIN CERTIFICATE-----
290
+ MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG
291
+ A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3
292
+ d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu
293
+ dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq
294
+ RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy
295
+ MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD
296
+ VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0
297
+ L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g
298
+ Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD
299
+ ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi
300
+ A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt
301
+ ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH
302
+ Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
303
+ BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC
304
+ R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX
305
+ hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
306
+ -----END CERTIFICATE-----
307
+ # Entrust Root Certification Authority - G2.pem
308
+ # Certificate:
309
+ # Data:
310
+ # Version: 3 (0x2)
311
+ # Serial Number: 1246989352 (0x4a538c28)
312
+ # Signature Algorithm: sha256WithRSAEncryption
313
+ # Issuer: C=US, O=Entrust, Inc., OU=See www.entrust.net/legal-terms, OU=(c) 2009 Entrust, Inc. - for authorized use only, CN=Entrust Root Certification Authority - G2
314
+ # Validity
315
+ # Not Before: Jul 7 17:25:54 2009 GMT
316
+ # Not After : Dec 7 17:55:54 2030 GMT
317
+ # Subject: C=US, O=Entrust, Inc., OU=See www.entrust.net/legal-terms, OU=(c) 2009 Entrust, Inc. - for authorized use only, CN=Entrust Root Certification Authority - G2
318
+ # Subject Public Key Info:
319
+ # Public Key Algorithm: rsaEncryption
320
+ # Public-Key: (2048 bit)
321
+ # Modulus:
322
+ # 00:ba:84:b6:72:db:9e:0c:6b:e2:99:e9:30:01:a7:
323
+ # 76:ea:32:b8:95:41:1a:c9:da:61:4e:58:72:cf:fe:
324
+ # f6:82:79:bf:73:61:06:0a:a5:27:d8:b3:5f:d3:45:
325
+ # 4e:1c:72:d6:4e:32:f2:72:8a:0f:f7:83:19:d0:6a:
326
+ # 80:80:00:45:1e:b0:c7:e7:9a:bf:12:57:27:1c:a3:
327
+ # 68:2f:0a:87:bd:6a:6b:0e:5e:65:f3:1c:77:d5:d4:
328
+ # 85:8d:70:21:b4:b3:32:e7:8b:a2:d5:86:39:02:b1:
329
+ # b8:d2:47:ce:e4:c9:49:c4:3b:a7:de:fb:54:7d:57:
330
+ # be:f0:e8:6e:c2:79:b2:3a:0b:55:e2:50:98:16:32:
331
+ # 13:5c:2f:78:56:c1:c2:94:b3:f2:5a:e4:27:9a:9f:
332
+ # 24:d7:c6:ec:d0:9b:25:82:e3:cc:c2:c4:45:c5:8c:
333
+ # 97:7a:06:6b:2a:11:9f:a9:0a:6e:48:3b:6f:db:d4:
334
+ # 11:19:42:f7:8f:07:bf:f5:53:5f:9c:3e:f4:17:2c:
335
+ # e6:69:ac:4e:32:4c:62:77:ea:b7:e8:e5:bb:34:bc:
336
+ # 19:8b:ae:9c:51:e7:b7:7e:b5:53:b1:33:22:e5:6d:
337
+ # cf:70:3c:1a:fa:e2:9b:67:b6:83:f4:8d:a5:af:62:
338
+ # 4c:4d:e0:58:ac:64:34:12:03:f8:b6:8d:94:63:24:
339
+ # a4:71
340
+ # Exponent: 65537 (0x10001)
341
+ # X509v3 extensions:
342
+ # X509v3 Key Usage: critical
343
+ # Certificate Sign, CRL Sign
344
+ # X509v3 Basic Constraints: critical
345
+ # CA:TRUE
346
+ # X509v3 Subject Key Identifier:
347
+ # 6A:72:26:7A:D0:1E:EF:7D:E7:3B:69:51:D4:6C:8D:9F:90:12:66:AB
348
+ # Signature Algorithm: sha256WithRSAEncryption
349
+ # 79:9f:1d:96:c6:b6:79:3f:22:8d:87:d3:87:03:04:60:6a:6b:
350
+ # 9a:2e:59:89:73:11:ac:43:d1:f5:13:ff:8d:39:2b:c0:f2:bd:
351
+ # 4f:70:8c:a9:2f:ea:17:c4:0b:54:9e:d4:1b:96:98:33:3c:a8:
352
+ # ad:62:a2:00:76:ab:59:69:6e:06:1d:7e:c4:b9:44:8d:98:af:
353
+ # 12:d4:61:db:0a:19:46:47:f3:eb:f7:63:c1:40:05:40:a5:d2:
354
+ # b7:f4:b5:9a:36:bf:a9:88:76:88:04:55:04:2b:9c:87:7f:1a:
355
+ # 37:3c:7e:2d:a5:1a:d8:d4:89:5e:ca:bd:ac:3d:6c:d8:6d:af:
356
+ # d5:f3:76:0f:cd:3b:88:38:22:9d:6c:93:9a:c4:3d:bf:82:1b:
357
+ # 65:3f:a6:0f:5d:aa:fc:e5:b2:15:ca:b5:ad:c6:bc:3d:d0:84:
358
+ # e8:ea:06:72:b0:4d:39:32:78:bf:3e:11:9c:0b:a4:9d:9a:21:
359
+ # f3:f0:9b:0b:30:78:db:c1:dc:87:43:fe:bc:63:9a:ca:c5:c2:
360
+ # 1c:c9:c7:8d:ff:3b:12:58:08:e6:b6:3d:ec:7a:2c:4e:fb:83:
361
+ # 96:ce:0c:3c:69:87:54:73:a4:73:c2:93:ff:51:10:ac:15:54:
362
+ # 01:d8:fc:05:b1:89:a1:7f:74:83:9a:49:d7:dc:4e:7b:8a:48:
363
+ # 6f:8b:45:f6
364
+ -----BEGIN CERTIFICATE-----
365
+ MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC
366
+ VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50
367
+ cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs
368
+ IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz
369
+ dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy
370
+ NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu
371
+ dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt
372
+ dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0
373
+ aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj
374
+ YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
375
+ AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T
376
+ RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN
377
+ cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW
378
+ wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1
379
+ U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0
380
+ jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP
381
+ BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN
382
+ BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/
383
+ jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
384
+ Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v
385
+ 1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R
386
+ nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH
387
+ VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g==
388
+ -----END CERTIFICATE-----
389
+ # Entrust Root Certification Authority.pem
390
+ # Certificate:
391
+ # Data:
392
+ # Version: 3 (0x2)
393
+ # Serial Number: 1164660820 (0x456b5054)
394
+ # Signature Algorithm: sha1WithRSAEncryption
395
+ # Issuer: C=US, O=Entrust, Inc., OU=www.entrust.net/CPS is incorporated by reference, OU=(c) 2006 Entrust, Inc., CN=Entrust Root Certification Authority
396
+ # Validity
397
+ # Not Before: Nov 27 20:23:42 2006 GMT
398
+ # Not After : Nov 27 20:53:42 2026 GMT
399
+ # Subject: C=US, O=Entrust, Inc., OU=www.entrust.net/CPS is incorporated by reference, OU=(c) 2006 Entrust, Inc., CN=Entrust Root Certification Authority
400
+ # Subject Public Key Info:
401
+ # Public Key Algorithm: rsaEncryption
402
+ # Public-Key: (2048 bit)
403
+ # Modulus:
404
+ # 00:b6:95:b6:43:42:fa:c6:6d:2a:6f:48:df:94:4c:
405
+ # 39:57:05:ee:c3:79:11:41:68:36:ed:ec:fe:9a:01:
406
+ # 8f:a1:38:28:fc:f7:10:46:66:2e:4d:1e:1a:b1:1a:
407
+ # 4e:c6:d1:c0:95:88:b0:c9:ff:31:8b:33:03:db:b7:
408
+ # 83:7b:3e:20:84:5e:ed:b2:56:28:a7:f8:e0:b9:40:
409
+ # 71:37:c5:cb:47:0e:97:2a:68:c0:22:95:62:15:db:
410
+ # 47:d9:f5:d0:2b:ff:82:4b:c9:ad:3e:de:4c:db:90:
411
+ # 80:50:3f:09:8a:84:00:ec:30:0a:3d:18:cd:fb:fd:
412
+ # 2a:59:9a:23:95:17:2c:45:9e:1f:6e:43:79:6d:0c:
413
+ # 5c:98:fe:48:a7:c5:23:47:5c:5e:fd:6e:e7:1e:b4:
414
+ # f6:68:45:d1:86:83:5b:a2:8a:8d:b1:e3:29:80:fe:
415
+ # 25:71:88:ad:be:bc:8f:ac:52:96:4b:aa:51:8d:e4:
416
+ # 13:31:19:e8:4e:4d:9f:db:ac:b3:6a:d5:bc:39:54:
417
+ # 71:ca:7a:7a:7f:90:dd:7d:1d:80:d9:81:bb:59:26:
418
+ # c2:11:fe:e6:93:e2:f7:80:e4:65:fb:34:37:0e:29:
419
+ # 80:70:4d:af:38:86:2e:9e:7f:57:af:9e:17:ae:eb:
420
+ # 1c:cb:28:21:5f:b6:1c:d8:e7:a2:04:22:f9:d3:da:
421
+ # d8:cb
422
+ # Exponent: 65537 (0x10001)
423
+ # X509v3 extensions:
424
+ # X509v3 Key Usage: critical
425
+ # Certificate Sign, CRL Sign
426
+ # X509v3 Basic Constraints: critical
427
+ # CA:TRUE
428
+ # X509v3 Private Key Usage Period:
429
+ # Not Before: Nov 27 20:23:42 2006 GMT, Not After: Nov 27 20:53:42 2026 GMT
430
+ # X509v3 Authority Key Identifier:
431
+ # keyid:68:90:E4:67:A4:A6:53:80:C7:86:66:A4:F1:F7:4B:43:FB:84:BD:6D
432
+ #
433
+ # X509v3 Subject Key Identifier:
434
+ # 68:90:E4:67:A4:A6:53:80:C7:86:66:A4:F1:F7:4B:43:FB:84:BD:6D
435
+ # 1.2.840.113533.7.65.0:
436
+ # 0...V7.1:4.0....
437
+ # Signature Algorithm: sha1WithRSAEncryption
438
+ # 93:d4:30:b0:d7:03:20:2a:d0:f9:63:e8:91:0c:05:20:a9:5f:
439
+ # 19:ca:7b:72:4e:d4:b1:db:d0:96:fb:54:5a:19:2c:0c:08:f7:
440
+ # b2:bc:85:a8:9d:7f:6d:3b:52:b3:2a:db:e7:d4:84:8c:63:f6:
441
+ # 0f:cb:26:01:91:50:6c:f4:5f:14:e2:93:74:c0:13:9e:30:3a:
442
+ # 50:e3:b4:60:c5:1c:f0:22:44:8d:71:47:ac:c8:1a:c9:e9:9b:
443
+ # 9a:00:60:13:ff:70:7e:5f:11:4d:49:1b:b3:15:52:7b:c9:54:
444
+ # da:bf:9d:95:af:6b:9a:d8:9e:e9:f1:e4:43:8d:e2:11:44:3a:
445
+ # bf:af:bd:83:42:73:52:8b:aa:bb:a7:29:cf:f5:64:1c:0a:4d:
446
+ # d1:bc:aa:ac:9f:2a:d0:ff:7f:7f:da:7d:ea:b1:ed:30:25:c1:
447
+ # 84:da:34:d2:5b:78:83:56:ec:9c:36:c3:26:e2:11:f6:67:49:
448
+ # 1d:92:ab:8c:fb:eb:ff:7a:ee:85:4a:a7:50:80:f0:a7:5c:4a:
449
+ # 94:2e:5f:05:99:3c:52:41:e0:cd:b4:63:cf:01:43:ba:9c:83:
450
+ # dc:8f:60:3b:f3:5a:b4:b4:7b:ae:da:0b:90:38:75:ef:81:1d:
451
+ # 66:d2:f7:57:70:36:b3:bf:fc:28:af:71:25:85:5b:13:fe:1e:
452
+ # 7f:5a:b4:3c
453
+ -----BEGIN CERTIFICATE-----
454
+ MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
455
+ VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
456
+ Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
457
+ KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
458
+ cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
459
+ NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
460
+ NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
461
+ ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
462
+ BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
463
+ KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
464
+ Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
465
+ 4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
466
+ KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
467
+ rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
468
+ 94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
469
+ sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
470
+ gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
471
+ kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
472
+ vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
473
+ A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
474
+ O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
475
+ AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
476
+ 9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
477
+ eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
478
+ 0vdXcDazv/wor3ElhVsT/h5/WrQ8
479
+ -----END CERTIFICATE-----
480
+ # Entrust.net Certification Authority (2048).pem
481
+ # Certificate:
482
+ # Data:
483
+ # Version: 3 (0x2)
484
+ # Serial Number: 946069240 (0x3863def8)
485
+ # Signature Algorithm: sha1WithRSAEncryption
486
+ # Issuer: O=Entrust.net, OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Certification Authority (2048)
487
+ # Validity
488
+ # Not Before: Dec 24 17:50:51 1999 GMT
489
+ # Not After : Jul 24 14:15:12 2029 GMT
490
+ # Subject: O=Entrust.net, OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.), OU=(c) 1999 Entrust.net Limited, CN=Entrust.net Certification Authority (2048)
491
+ # Subject Public Key Info:
492
+ # Public Key Algorithm: rsaEncryption
493
+ # Public-Key: (2048 bit)
494
+ # Modulus:
495
+ # 00:ad:4d:4b:a9:12:86:b2:ea:a3:20:07:15:16:64:
496
+ # 2a:2b:4b:d1:bf:0b:4a:4d:8e:ed:80:76:a5:67:b7:
497
+ # 78:40:c0:73:42:c8:68:c0:db:53:2b:dd:5e:b8:76:
498
+ # 98:35:93:8b:1a:9d:7c:13:3a:0e:1f:5b:b7:1e:cf:
499
+ # e5:24:14:1e:b1:81:a9:8d:7d:b8:cc:6b:4b:03:f1:
500
+ # 02:0c:dc:ab:a5:40:24:00:7f:74:94:a1:9d:08:29:
501
+ # b3:88:0b:f5:87:77:9d:55:cd:e4:c3:7e:d7:6a:64:
502
+ # ab:85:14:86:95:5b:97:32:50:6f:3d:c8:ba:66:0c:
503
+ # e3:fc:bd:b8:49:c1:76:89:49:19:fd:c0:a8:bd:89:
504
+ # a3:67:2f:c6:9f:bc:71:19:60:b8:2d:e9:2c:c9:90:
505
+ # 76:66:7b:94:e2:af:78:d6:65:53:5d:3c:d6:9c:b2:
506
+ # cf:29:03:f9:2f:a4:50:b2:d4:48:ce:05:32:55:8a:
507
+ # fd:b2:64:4c:0e:e4:98:07:75:db:7f:df:b9:08:55:
508
+ # 60:85:30:29:f9:7b:48:a4:69:86:e3:35:3f:1e:86:
509
+ # 5d:7a:7a:15:bd:ef:00:8e:15:22:54:17:00:90:26:
510
+ # 93:bc:0e:49:68:91:bf:f8:47:d3:9d:95:42:c1:0e:
511
+ # 4d:df:6f:26:cf:c3:18:21:62:66:43:70:d6:d5:c0:
512
+ # 07:e1
513
+ # Exponent: 65537 (0x10001)
514
+ # X509v3 extensions:
515
+ # X509v3 Key Usage: critical
516
+ # Certificate Sign, CRL Sign
517
+ # X509v3 Basic Constraints: critical
518
+ # CA:TRUE
519
+ # X509v3 Subject Key Identifier:
520
+ # 55:E4:81:D1:11:80:BE:D8:89:B9:08:A3:31:F9:A1:24:09:16:B9:70
521
+ # Signature Algorithm: sha1WithRSAEncryption
522
+ # 3b:9b:8f:56:9b:30:e7:53:99:7c:7a:79:a7:4d:97:d7:19:95:
523
+ # 90:fb:06:1f:ca:33:7c:46:63:8f:96:66:24:fa:40:1b:21:27:
524
+ # ca:e6:72:73:f2:4f:fe:31:99:fd:c8:0c:4c:68:53:c6:80:82:
525
+ # 13:98:fa:b6:ad:da:5d:3d:f1:ce:6e:f6:15:11:94:82:0c:ee:
526
+ # 3f:95:af:11:ab:0f:d7:2f:de:1f:03:8f:57:2c:1e:c9:bb:9a:
527
+ # 1a:44:95:eb:18:4f:a6:1f:cd:7d:57:10:2f:9b:04:09:5a:84:
528
+ # b5:6e:d8:1d:3a:e1:d6:9e:d1:6c:79:5e:79:1c:14:c5:e3:d0:
529
+ # 4c:93:3b:65:3c:ed:df:3d:be:a6:e5:95:1a:c3:b5:19:c3:bd:
530
+ # 5e:5b:bb:ff:23:ef:68:19:cb:12:93:27:5c:03:2d:6f:30:d0:
531
+ # 1e:b6:1a:ac:de:5a:f7:d1:aa:a8:27:a6:fe:79:81:c4:79:99:
532
+ # 33:57:ba:12:b0:a9:e0:42:6c:93:ca:56:de:fe:6d:84:0b:08:
533
+ # 8b:7e:8d:ea:d7:98:21:c6:f3:e7:3c:79:2f:5e:9c:d1:4c:15:
534
+ # 8d:e1:ec:22:37:cc:9a:43:0b:97:dc:80:90:8d:b3:67:9b:6f:
535
+ # 48:08:15:56:cf:bf:f1:2b:7c:5e:9a:76:e9:59:90:c5:7c:83:
536
+ # 35:11:65:51
537
+ -----BEGIN CERTIFICATE-----
538
+ MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
539
+ RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
540
+ bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
541
+ IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
542
+ ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3
543
+ MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
544
+ LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
545
+ YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
546
+ A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
547
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
548
+ K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
549
+ sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
550
+ MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
551
+ XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
552
+ HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
553
+ 4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
554
+ HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub
555
+ j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo
556
+ U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
557
+ zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b
558
+ u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+
559
+ bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er
560
+ fF6adulZkMV8gzURZVE=
561
+ -----END CERTIFICATE-----
562
+ # GeoTrust Global CA.pem
563
+ # Certificate:
564
+ # Data:
565
+ # Version: 3 (0x2)
566
+ # Serial Number: 144470 (0x23456)
567
+ # Signature Algorithm: sha1WithRSAEncryption
568
+ # Issuer: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA
569
+ # Validity
570
+ # Not Before: May 21 04:00:00 2002 GMT
571
+ # Not After : May 21 04:00:00 2022 GMT
572
+ # Subject: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA
573
+ # Subject Public Key Info:
574
+ # Public Key Algorithm: rsaEncryption
575
+ # Public-Key: (2048 bit)
576
+ # Modulus:
577
+ # 00:da:cc:18:63:30:fd:f4:17:23:1a:56:7e:5b:df:
578
+ # 3c:6c:38:e4:71:b7:78:91:d4:bc:a1:d8:4c:f8:a8:
579
+ # 43:b6:03:e9:4d:21:07:08:88:da:58:2f:66:39:29:
580
+ # bd:05:78:8b:9d:38:e8:05:b7:6a:7e:71:a4:e6:c4:
581
+ # 60:a6:b0:ef:80:e4:89:28:0f:9e:25:d6:ed:83:f3:
582
+ # ad:a6:91:c7:98:c9:42:18:35:14:9d:ad:98:46:92:
583
+ # 2e:4f:ca:f1:87:43:c1:16:95:57:2d:50:ef:89:2d:
584
+ # 80:7a:57:ad:f2:ee:5f:6b:d2:00:8d:b9:14:f8:14:
585
+ # 15:35:d9:c0:46:a3:7b:72:c8:91:bf:c9:55:2b:cd:
586
+ # d0:97:3e:9c:26:64:cc:df:ce:83:19:71:ca:4e:e6:
587
+ # d4:d5:7b:a9:19:cd:55:de:c8:ec:d2:5e:38:53:e5:
588
+ # 5c:4f:8c:2d:fe:50:23:36:fc:66:e6:cb:8e:a4:39:
589
+ # 19:00:b7:95:02:39:91:0b:0e:fe:38:2e:d1:1d:05:
590
+ # 9a:f6:4d:3e:6f:0f:07:1d:af:2c:1e:8f:60:39:e2:
591
+ # fa:36:53:13:39:d4:5e:26:2b:db:3d:a8:14:bd:32:
592
+ # eb:18:03:28:52:04:71:e5:ab:33:3d:e1:38:bb:07:
593
+ # 36:84:62:9c:79:ea:16:30:f4:5f:c0:2b:e8:71:6b:
594
+ # e4:f9
595
+ # Exponent: 65537 (0x10001)
596
+ # X509v3 extensions:
597
+ # X509v3 Basic Constraints: critical
598
+ # CA:TRUE
599
+ # X509v3 Subject Key Identifier:
600
+ # C0:7A:98:68:8D:89:FB:AB:05:64:0C:11:7D:AA:7D:65:B8:CA:CC:4E
601
+ # X509v3 Authority Key Identifier:
602
+ # keyid:C0:7A:98:68:8D:89:FB:AB:05:64:0C:11:7D:AA:7D:65:B8:CA:CC:4E
603
+ #
604
+ # Signature Algorithm: sha1WithRSAEncryption
605
+ # 35:e3:29:6a:e5:2f:5d:54:8e:29:50:94:9f:99:1a:14:e4:8f:
606
+ # 78:2a:62:94:a2:27:67:9e:d0:cf:1a:5e:47:e9:c1:b2:a4:cf:
607
+ # dd:41:1a:05:4e:9b:4b:ee:4a:6f:55:52:b3:24:a1:37:0a:eb:
608
+ # 64:76:2a:2e:2c:f3:fd:3b:75:90:bf:fa:71:d8:c7:3d:37:d2:
609
+ # b5:05:95:62:b9:a6:de:89:3d:36:7b:38:77:48:97:ac:a6:20:
610
+ # 8f:2e:a6:c9:0c:c2:b2:99:45:00:c7:ce:11:51:22:22:e0:a5:
611
+ # ea:b6:15:48:09:64:ea:5e:4f:74:f7:05:3e:c7:8a:52:0c:db:
612
+ # 15:b4:bd:6d:9b:e5:c6:b1:54:68:a9:e3:69:90:b6:9a:a5:0f:
613
+ # b8:b9:3f:20:7d:ae:4a:b5:b8:9c:e4:1d:b6:ab:e6:94:a5:c1:
614
+ # c7:83:ad:db:f5:27:87:0e:04:6c:d5:ff:dd:a0:5d:ed:87:52:
615
+ # b7:2b:15:02:ae:39:a6:6a:74:e9:da:c4:e7:bc:4d:34:1e:a9:
616
+ # 5c:4d:33:5f:92:09:2f:88:66:5d:77:97:c7:1d:76:13:a9:d5:
617
+ # e5:f1:16:09:11:35:d5:ac:db:24:71:70:2c:98:56:0b:d9:17:
618
+ # b4:d1:e3:51:2b:5e:75:e8:d5:d0:dc:4f:34:ed:c2:05:66:80:
619
+ # a1:cb:e6:33
620
+ -----BEGIN CERTIFICATE-----
621
+ MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
622
+ MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
623
+ YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
624
+ EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
625
+ R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
626
+ 9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
627
+ fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
628
+ iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
629
+ 1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
630
+ bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
631
+ MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
632
+ ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
633
+ uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
634
+ Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
635
+ tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
636
+ PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
637
+ hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
638
+ 5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
639
+ -----END CERTIFICATE-----
640
+ # GeoTrust Primary Certification Authority - G2.pem
641
+ # Certificate:
642
+ # Data:
643
+ # Version: 3 (0x2)
644
+ # Serial Number:
645
+ # 3c:b2:f4:48:0a:00:e2:fe:eb:24:3b:5e:60:3e:c3:6b
646
+ # Signature Algorithm: ecdsa-with-SHA384
647
+ # Issuer: C=US, O=GeoTrust Inc., OU=(c) 2007 GeoTrust Inc. - For authorized use only, CN=GeoTrust Primary Certification Authority - G2
648
+ # Validity
649
+ # Not Before: Nov 5 00:00:00 2007 GMT
650
+ # Not After : Jan 18 23:59:59 2038 GMT
651
+ # Subject: C=US, O=GeoTrust Inc., OU=(c) 2007 GeoTrust Inc. - For authorized use only, CN=GeoTrust Primary Certification Authority - G2
652
+ # Subject Public Key Info:
653
+ # Public Key Algorithm: id-ecPublicKey
654
+ # Public-Key: (384 bit)
655
+ # pub:
656
+ # 04:15:b1:e8:fd:03:15:43:e5:ac:eb:87:37:11:62:
657
+ # ef:d2:83:36:52:7d:45:57:0b:4a:8d:7b:54:3b:3a:
658
+ # 6e:5f:15:02:c0:50:a6:cf:25:2f:7d:ca:48:b8:c7:
659
+ # 50:63:1c:2a:21:08:7c:9a:36:d8:0b:fe:d1:26:c5:
660
+ # 58:31:30:28:25:f3:5d:5d:a3:b8:b6:a5:b4:92:ed:
661
+ # 6c:2c:9f:eb:dd:43:89:a2:3c:4b:48:91:1d:50:ec:
662
+ # 26:df:d6:60:2e:bd:21
663
+ # ASN1 OID: secp384r1
664
+ # X509v3 extensions:
665
+ # X509v3 Basic Constraints: critical
666
+ # CA:TRUE
667
+ # X509v3 Key Usage: critical
668
+ # Certificate Sign, CRL Sign
669
+ # X509v3 Subject Key Identifier:
670
+ # 15:5F:35:57:51:55:FB:25:B2:AD:03:69:FC:01:A3:FA:BE:11:55:D5
671
+ # Signature Algorithm: ecdsa-with-SHA384
672
+ # 30:64:02:30:64:96:59:a6:e8:09:de:8b:ba:fa:5a:88:88:f0:
673
+ # 1f:91:d3:46:a8:f2:4a:4c:02:63:fb:6c:5f:38:db:2e:41:93:
674
+ # a9:0e:e6:9d:dc:31:1c:b2:a0:a7:18:1c:79:e1:c7:36:02:30:
675
+ # 3a:56:af:9a:74:6c:f6:fb:83:e0:33:d3:08:5f:a1:9c:c2:5b:
676
+ # 9f:46:d6:b6:cb:91:06:63:a2:06:e7:33:ac:3e:a8:81:12:d0:
677
+ # cb:ba:d0:92:0b:b6:9e:96:aa:04:0f:8a
678
+ -----BEGIN CERTIFICATE-----
679
+ MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL
680
+ MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj
681
+ KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2
682
+ MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
683
+ eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV
684
+ BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw
685
+ NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV
686
+ BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
687
+ MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL
688
+ So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal
689
+ tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
690
+ BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG
691
+ CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT
692
+ qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz
693
+ rD6ogRLQy7rQkgu2npaqBA+K
694
+ -----END CERTIFICATE-----
695
+ # GeoTrust Primary Certification Authority - G3.pem
696
+ # Certificate:
697
+ # Data:
698
+ # Version: 3 (0x2)
699
+ # Serial Number:
700
+ # 15:ac:6e:94:19:b2:79:4b:41:f6:27:a9:c3:18:0f:1f
701
+ # Signature Algorithm: sha256WithRSAEncryption
702
+ # Issuer: C=US, O=GeoTrust Inc., OU=(c) 2008 GeoTrust Inc. - For authorized use only, CN=GeoTrust Primary Certification Authority - G3
703
+ # Validity
704
+ # Not Before: Apr 2 00:00:00 2008 GMT
705
+ # Not After : Dec 1 23:59:59 2037 GMT
706
+ # Subject: C=US, O=GeoTrust Inc., OU=(c) 2008 GeoTrust Inc. - For authorized use only, CN=GeoTrust Primary Certification Authority - G3
707
+ # Subject Public Key Info:
708
+ # Public Key Algorithm: rsaEncryption
709
+ # Public-Key: (2048 bit)
710
+ # Modulus:
711
+ # 00:dc:e2:5e:62:58:1d:33:57:39:32:33:fa:eb:cb:
712
+ # 87:8c:a7:d4:4a:dd:06:88:ea:64:8e:31:98:a5:38:
713
+ # 90:1e:98:cf:2e:63:2b:f0:46:bc:44:b2:89:a1:c0:
714
+ # 28:0c:49:70:21:95:9f:64:c0:a6:93:12:02:65:26:
715
+ # 86:c6:a5:89:f0:fa:d7:84:a0:70:af:4f:1a:97:3f:
716
+ # 06:44:d5:c9:eb:72:10:7d:e4:31:28:fb:1c:61:e6:
717
+ # 28:07:44:73:92:22:69:a7:03:88:6c:9d:63:c8:52:
718
+ # da:98:27:e7:08:4c:70:3e:b4:c9:12:c1:c5:67:83:
719
+ # 5d:33:f3:03:11:ec:6a:d0:53:e2:d1:ba:36:60:94:
720
+ # 80:bb:61:63:6c:5b:17:7e:df:40:94:1e:ab:0d:c2:
721
+ # 21:28:70:88:ff:d6:26:6c:6c:60:04:25:4e:55:7e:
722
+ # 7d:ef:bf:94:48:de:b7:1d:dd:70:8d:05:5f:88:a5:
723
+ # 9b:f2:c2:ee:ea:d1:40:41:6d:62:38:1d:56:06:c5:
724
+ # 03:47:51:20:19:fc:7b:10:0b:0e:62:ae:76:55:bf:
725
+ # 5f:77:be:3e:49:01:53:3d:98:25:03:76:24:5a:1d:
726
+ # b4:db:89:ea:79:e5:b6:b3:3b:3f:ba:4c:28:41:7f:
727
+ # 06:ac:6a:8e:c1:d0:f6:05:1d:7d:e6:42:86:e3:a5:
728
+ # d5:47
729
+ # Exponent: 65537 (0x10001)
730
+ # X509v3 extensions:
731
+ # X509v3 Basic Constraints: critical
732
+ # CA:TRUE
733
+ # X509v3 Key Usage: critical
734
+ # Certificate Sign, CRL Sign
735
+ # X509v3 Subject Key Identifier:
736
+ # C4:79:CA:8E:A1:4E:03:1D:1C:DC:6B:DB:31:5B:94:3E:3F:30:7F:2D
737
+ # Signature Algorithm: sha256WithRSAEncryption
738
+ # 2d:c5:13:cf:56:80:7b:7a:78:bd:9f:ae:2c:99:e7:ef:da:df:
739
+ # 94:5e:09:69:a7:e7:6e:68:8c:bd:72:be:47:a9:0e:97:12:b8:
740
+ # 4a:f1:64:d3:39:df:25:34:d4:c1:cd:4e:81:f0:0f:04:c4:24:
741
+ # b3:34:96:c6:a6:aa:30:df:68:61:73:d7:f9:8e:85:89:ef:0e:
742
+ # 5e:95:28:4a:2a:27:8f:10:8e:2e:7c:86:c4:02:9e:da:0c:77:
743
+ # 65:0e:44:0d:92:fd:fd:b3:16:36:fa:11:0d:1d:8c:0e:07:89:
744
+ # 6a:29:56:f7:72:f4:dd:15:9c:77:35:66:57:ab:13:53:d8:8e:
745
+ # c1:40:c5:d7:13:16:5a:72:c7:b7:69:01:c4:7a:b1:83:01:68:
746
+ # 7d:8d:41:a1:94:18:c1:25:5c:fc:f0:fe:83:02:87:7c:0d:0d:
747
+ # cf:2e:08:5c:4a:40:0d:3e:ec:81:61:e6:24:db:ca:e0:0e:2d:
748
+ # 07:b2:3e:56:dc:8d:f5:41:85:07:48:9b:0c:0b:cb:49:3f:7d:
749
+ # ec:b7:fd:cb:8d:67:89:1a:ab:ed:bb:1e:a3:00:08:08:17:2a:
750
+ # 82:5c:31:5d:46:8a:2d:0f:86:9b:74:d9:45:fb:d4:40:b1:7a:
751
+ # aa:68:2d:86:b2:99:22:e1:c1:2b:c7:9c:f8:f3:5f:a8:82:12:
752
+ # eb:19:11:2d
753
+ -----BEGIN CERTIFICATE-----
754
+ MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB
755
+ mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT
756
+ MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
757
+ eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
758
+ cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ
759
+ BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
760
+ MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0
761
+ BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
762
+ LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz
763
+ +uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm
764
+ hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn
765
+ 5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W
766
+ JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL
767
+ DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC
768
+ huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
769
+ HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB
770
+ AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB
771
+ zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN
772
+ kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
773
+ AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH
774
+ SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G
775
+ spki4cErx5z481+oghLrGREt
776
+ -----END CERTIFICATE-----
777
+ # GeoTrust Primary Certification Authority.pem
778
+ # Certificate:
779
+ # Data:
780
+ # Version: 3 (0x2)
781
+ # Serial Number:
782
+ # 18:ac:b5:6a:fd:69:b6:15:3a:63:6c:af:da:fa:c4:a1
783
+ # Signature Algorithm: sha1WithRSAEncryption
784
+ # Issuer: C=US, O=GeoTrust Inc., CN=GeoTrust Primary Certification Authority
785
+ # Validity
786
+ # Not Before: Nov 27 00:00:00 2006 GMT
787
+ # Not After : Jul 16 23:59:59 2036 GMT
788
+ # Subject: C=US, O=GeoTrust Inc., CN=GeoTrust Primary Certification Authority
789
+ # Subject Public Key Info:
790
+ # Public Key Algorithm: rsaEncryption
791
+ # Public-Key: (2048 bit)
792
+ # Modulus:
793
+ # 00:be:b8:15:7b:ff:d4:7c:7d:67:ad:83:64:7b:c8:
794
+ # 42:53:2d:df:f6:84:08:20:61:d6:01:59:6a:9c:44:
795
+ # 11:af:ef:76:fd:95:7e:ce:61:30:bb:7a:83:5f:02:
796
+ # bd:01:66:ca:ee:15:8d:6f:a1:30:9c:bd:a1:85:9e:
797
+ # 94:3a:f3:56:88:00:31:cf:d8:ee:6a:96:02:d9:ed:
798
+ # 03:8c:fb:75:6d:e7:ea:b8:55:16:05:16:9a:f4:e0:
799
+ # 5e:b1:88:c0:64:85:5c:15:4d:88:c7:b7:ba:e0:75:
800
+ # e9:ad:05:3d:9d:c7:89:48:e0:bb:28:c8:03:e1:30:
801
+ # 93:64:5e:52:c0:59:70:22:35:57:88:8a:f1:95:0a:
802
+ # 83:d7:bc:31:73:01:34:ed:ef:46:71:e0:6b:02:a8:
803
+ # 35:72:6b:97:9b:66:e0:cb:1c:79:5f:d8:1a:04:68:
804
+ # 1e:47:02:e6:9d:60:e2:36:97:01:df:ce:35:92:df:
805
+ # be:67:c7:6d:77:59:3b:8f:9d:d6:90:15:94:bc:42:
806
+ # 34:10:c1:39:f9:b1:27:3e:7e:d6:8a:75:c5:b2:af:
807
+ # 96:d3:a2:de:9b:e4:98:be:7d:e1:e9:81:ad:b6:6f:
808
+ # fc:d7:0e:da:e0:34:b0:0d:1a:77:e7:e3:08:98:ef:
809
+ # 58:fa:9c:84:b7:36:af:c2:df:ac:d2:f4:10:06:70:
810
+ # 71:35
811
+ # Exponent: 65537 (0x10001)
812
+ # X509v3 extensions:
813
+ # X509v3 Basic Constraints: critical
814
+ # CA:TRUE
815
+ # X509v3 Key Usage: critical
816
+ # Certificate Sign, CRL Sign
817
+ # X509v3 Subject Key Identifier:
818
+ # 2C:D5:50:41:97:15:8B:F0:8F:36:61:5B:4A:FB:6B:D9:99:C9:33:92
819
+ # Signature Algorithm: sha1WithRSAEncryption
820
+ # 5a:70:7f:2c:dd:b7:34:4f:f5:86:51:a9:26:be:4b:b8:aa:f1:
821
+ # 71:0d:dc:61:c7:a0:ea:34:1e:7a:77:0f:04:35:e8:27:8f:6c:
822
+ # 90:bf:91:16:24:46:3e:4a:4e:ce:2b:16:d5:0b:52:1d:fc:1f:
823
+ # 67:a2:02:45:31:4f:ce:f3:fa:03:a7:79:9d:53:6a:d9:da:63:
824
+ # 3a:f8:80:d7:d3:99:e1:a5:e1:be:d4:55:71:98:35:3a:be:93:
825
+ # ea:ae:ad:42:b2:90:6f:e0:fc:21:4d:35:63:33:89:49:d6:9b:
826
+ # 4e:ca:c7:e7:4e:09:00:f7:da:c7:ef:99:62:99:77:b6:95:22:
827
+ # 5e:8a:a0:ab:f4:b8:78:98:ca:38:19:99:c9:72:9e:78:cd:4b:
828
+ # ac:af:19:a0:73:12:2d:fc:c2:41:ba:81:91:da:16:5a:31:b7:
829
+ # f9:b4:71:80:12:48:99:72:73:5a:59:53:c1:63:52:33:ed:a7:
830
+ # c9:d2:39:02:70:fa:e0:b1:42:66:29:aa:9b:51:ed:30:54:22:
831
+ # 14:5f:d9:ab:1d:c1:e4:94:f0:f8:f5:2b:f7:ea:ca:78:46:d6:
832
+ # b8:91:fd:a6:0d:2b:1a:14:01:3e:80:f0:42:a0:95:07:5e:6d:
833
+ # cd:cc:4b:a4:45:8d:ab:12:e8:b3:de:5a:e5:a0:7c:e8:0f:22:
834
+ # 1d:5a:e9:59
835
+ -----BEGIN CERTIFICATE-----
836
+ MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY
837
+ MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo
838
+ R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx
839
+ MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
840
+ Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp
841
+ ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
842
+ AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9
843
+ AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA
844
+ ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0
845
+ 7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W
846
+ kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI
847
+ mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
848
+ A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ
849
+ KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1
850
+ 6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl
851
+ 4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K
852
+ oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj
853
+ UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU
854
+ AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
855
+ -----END CERTIFICATE-----
856
+ # Go Daddy Class 2 Certification Authority.pem
857
+ # Certificate:
858
+ # Data:
859
+ # Version: 3 (0x2)
860
+ # Serial Number: 0 (0x0)
861
+ # Signature Algorithm: sha1WithRSAEncryption
862
+ # Issuer: C=US, O=The Go Daddy Group, Inc., OU=Go Daddy Class 2 Certification Authority
863
+ # Validity
864
+ # Not Before: Jun 29 17:06:20 2004 GMT
865
+ # Not After : Jun 29 17:06:20 2034 GMT
866
+ # Subject: C=US, O=The Go Daddy Group, Inc., OU=Go Daddy Class 2 Certification Authority
867
+ # Subject Public Key Info:
868
+ # Public Key Algorithm: rsaEncryption
869
+ # Public-Key: (2048 bit)
870
+ # Modulus:
871
+ # 00:de:9d:d7:ea:57:18:49:a1:5b:eb:d7:5f:48:86:
872
+ # ea:be:dd:ff:e4:ef:67:1c:f4:65:68:b3:57:71:a0:
873
+ # 5e:77:bb:ed:9b:49:e9:70:80:3d:56:18:63:08:6f:
874
+ # da:f2:cc:d0:3f:7f:02:54:22:54:10:d8:b2:81:d4:
875
+ # c0:75:3d:4b:7f:c7:77:c3:3e:78:ab:1a:03:b5:20:
876
+ # 6b:2f:6a:2b:b1:c5:88:7e:c4:bb:1e:b0:c1:d8:45:
877
+ # 27:6f:aa:37:58:f7:87:26:d7:d8:2d:f6:a9:17:b7:
878
+ # 1f:72:36:4e:a6:17:3f:65:98:92:db:2a:6e:5d:a2:
879
+ # fe:88:e0:0b:de:7f:e5:8d:15:e1:eb:cb:3a:d5:e2:
880
+ # 12:a2:13:2d:d8:8e:af:5f:12:3d:a0:08:05:08:b6:
881
+ # 5c:a5:65:38:04:45:99:1e:a3:60:60:74:c5:41:a5:
882
+ # 72:62:1b:62:c5:1f:6f:5f:1a:42:be:02:51:65:a8:
883
+ # ae:23:18:6a:fc:78:03:a9:4d:7f:80:c3:fa:ab:5a:
884
+ # fc:a1:40:a4:ca:19:16:fe:b2:c8:ef:5e:73:0d:ee:
885
+ # 77:bd:9a:f6:79:98:bc:b1:07:67:a2:15:0d:dd:a0:
886
+ # 58:c6:44:7b:0a:3e:62:28:5f:ba:41:07:53:58:cf:
887
+ # 11:7e:38:74:c5:f8:ff:b5:69:90:8f:84:74:ea:97:
888
+ # 1b:af
889
+ # Exponent: 3 (0x3)
890
+ # X509v3 extensions:
891
+ # X509v3 Subject Key Identifier:
892
+ # D2:C4:B0:D2:91:D4:4C:11:71:B3:61:CB:3D:A1:FE:DD:A8:6A:D4:E3
893
+ # X509v3 Authority Key Identifier:
894
+ # keyid:D2:C4:B0:D2:91:D4:4C:11:71:B3:61:CB:3D:A1:FE:DD:A8:6A:D4:E3
895
+ # DirName:/C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority
896
+ # serial:00
897
+ #
898
+ # X509v3 Basic Constraints:
899
+ # CA:TRUE
900
+ # Signature Algorithm: sha1WithRSAEncryption
901
+ # 32:4b:f3:b2:ca:3e:91:fc:12:c6:a1:07:8c:8e:77:a0:33:06:
902
+ # 14:5c:90:1e:18:f7:08:a6:3d:0a:19:f9:87:80:11:6e:69:e4:
903
+ # 96:17:30:ff:34:91:63:72:38:ee:cc:1c:01:a3:1d:94:28:a4:
904
+ # 31:f6:7a:c4:54:d7:f6:e5:31:58:03:a2:cc:ce:62:db:94:45:
905
+ # 73:b5:bf:45:c9:24:b5:d5:82:02:ad:23:79:69:8d:b8:b6:4d:
906
+ # ce:cf:4c:ca:33:23:e8:1c:88:aa:9d:8b:41:6e:16:c9:20:e5:
907
+ # 89:9e:cd:3b:da:70:f7:7e:99:26:20:14:54:25:ab:6e:73:85:
908
+ # e6:9b:21:9d:0a:6c:82:0e:a8:f8:c2:0c:fa:10:1e:6c:96:ef:
909
+ # 87:0d:c4:0f:61:8b:ad:ee:83:2b:95:f8:8e:92:84:72:39:eb:
910
+ # 20:ea:83:ed:83:cd:97:6e:08:bc:eb:4e:26:b6:73:2b:e4:d3:
911
+ # f6:4c:fe:26:71:e2:61:11:74:4a:ff:57:1a:87:0f:75:48:2e:
912
+ # cf:51:69:17:a0:02:12:61:95:d5:d1:40:b2:10:4c:ee:c4:ac:
913
+ # 10:43:a6:a5:9e:0a:d5:95:62:9a:0d:cf:88:82:c5:32:0c:e4:
914
+ # 2b:9f:45:e6:0d:9f:28:9c:b1:b9:2a:5a:57:ad:37:0f:af:1d:
915
+ # 7f:db:bd:9f
916
+ -----BEGIN CERTIFICATE-----
917
+ MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh
918
+ MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE
919
+ YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3
920
+ MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo
921
+ ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg
922
+ MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN
923
+ ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA
924
+ PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w
925
+ wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi
926
+ EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY
927
+ avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+
928
+ YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE
929
+ sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h
930
+ /t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5
931
+ IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
932
+ YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
933
+ ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy
934
+ OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P
935
+ TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
936
+ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER
937
+ dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf
938
+ ReYNnyicsbkqWletNw+vHX/bvZ8=
939
+ -----END CERTIFICATE-----
940
+ # Go Daddy Root Certificate Authority - G2.pem
941
+ # Certificate:
942
+ # Data:
943
+ # Version: 3 (0x2)
944
+ # Serial Number: 0 (0x0)
945
+ # Signature Algorithm: sha256WithRSAEncryption
946
+ # Issuer: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., CN=Go Daddy Root Certificate Authority - G2
947
+ # Validity
948
+ # Not Before: Sep 1 00:00:00 2009 GMT
949
+ # Not After : Dec 31 23:59:59 2037 GMT
950
+ # Subject: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., CN=Go Daddy Root Certificate Authority - G2
951
+ # Subject Public Key Info:
952
+ # Public Key Algorithm: rsaEncryption
953
+ # Public-Key: (2048 bit)
954
+ # Modulus:
955
+ # 00:bf:71:62:08:f1:fa:59:34:f7:1b:c9:18:a3:f7:
956
+ # 80:49:58:e9:22:83:13:a6:c5:20:43:01:3b:84:f1:
957
+ # e6:85:49:9f:27:ea:f6:84:1b:4e:a0:b4:db:70:98:
958
+ # c7:32:01:b1:05:3e:07:4e:ee:f4:fa:4f:2f:59:30:
959
+ # 22:e7:ab:19:56:6b:e2:80:07:fc:f3:16:75:80:39:
960
+ # 51:7b:e5:f9:35:b6:74:4e:a9:8d:82:13:e4:b6:3f:
961
+ # a9:03:83:fa:a2:be:8a:15:6a:7f:de:0b:c3:b6:19:
962
+ # 14:05:ca:ea:c3:a8:04:94:3b:46:7c:32:0d:f3:00:
963
+ # 66:22:c8:8d:69:6d:36:8c:11:18:b7:d3:b2:1c:60:
964
+ # b4:38:fa:02:8c:ce:d3:dd:46:07:de:0a:3e:eb:5d:
965
+ # 7c:c8:7c:fb:b0:2b:53:a4:92:62:69:51:25:05:61:
966
+ # 1a:44:81:8c:2c:a9:43:96:23:df:ac:3a:81:9a:0e:
967
+ # 29:c5:1c:a9:e9:5d:1e:b6:9e:9e:30:0a:39:ce:f1:
968
+ # 88:80:fb:4b:5d:cc:32:ec:85:62:43:25:34:02:56:
969
+ # 27:01:91:b4:3b:70:2a:3f:6e:b1:e8:9c:88:01:7d:
970
+ # 9f:d4:f9:db:53:6d:60:9d:bf:2c:e7:58:ab:b8:5f:
971
+ # 46:fc:ce:c4:1b:03:3c:09:eb:49:31:5c:69:46:b3:
972
+ # e0:47
973
+ # Exponent: 65537 (0x10001)
974
+ # X509v3 extensions:
975
+ # X509v3 Basic Constraints: critical
976
+ # CA:TRUE
977
+ # X509v3 Key Usage: critical
978
+ # Certificate Sign, CRL Sign
979
+ # X509v3 Subject Key Identifier:
980
+ # 3A:9A:85:07:10:67:28:B6:EF:F6:BD:05:41:6E:20:C1:94:DA:0F:DE
981
+ # Signature Algorithm: sha256WithRSAEncryption
982
+ # 99:db:5d:79:d5:f9:97:59:67:03:61:f1:7e:3b:06:31:75:2d:
983
+ # a1:20:8e:4f:65:87:b4:f7:a6:9c:bc:d8:e9:2f:d0:db:5a:ee:
984
+ # cf:74:8c:73:b4:38:42:da:05:7b:f8:02:75:b8:fd:a5:b1:d7:
985
+ # ae:f6:d7:de:13:cb:53:10:7e:8a:46:d1:97:fa:b7:2e:2b:11:
986
+ # ab:90:b0:27:80:f9:e8:9f:5a:e9:37:9f:ab:e4:df:6c:b3:85:
987
+ # 17:9d:3d:d9:24:4f:79:91:35:d6:5f:04:eb:80:83:ab:9a:02:
988
+ # 2d:b5:10:f4:d8:90:c7:04:73:40:ed:72:25:a0:a9:9f:ec:9e:
989
+ # ab:68:12:99:57:c6:8f:12:3a:09:a4:bd:44:fd:06:15:37:c1:
990
+ # 9b:e4:32:a3:ed:38:e8:d8:64:f3:2c:7e:14:fc:02:ea:9f:cd:
991
+ # ff:07:68:17:db:22:90:38:2d:7a:8d:d1:54:f1:69:e3:5f:33:
992
+ # ca:7a:3d:7b:0a:e3:ca:7f:5f:39:e5:e2:75:ba:c5:76:18:33:
993
+ # ce:2c:f0:2f:4c:ad:f7:b1:e7:ce:4f:a8:c4:9b:4a:54:06:c5:
994
+ # 7f:7d:d5:08:0f:e2:1c:fe:7e:17:b8:ac:5e:f6:d4:16:b2:43:
995
+ # 09:0c:4d:f6:a7:6b:b4:99:84:65:ca:7a:88:e2:e2:44:be:5c:
996
+ # f7:ea:1c:f5
997
+ -----BEGIN CERTIFICATE-----
998
+ MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx
999
+ EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT
1000
+ EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp
1001
+ ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz
1002
+ NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH
1003
+ EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE
1004
+ AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw
1005
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD
1006
+ E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH
1007
+ /PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy
1008
+ DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh
1009
+ GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR
1010
+ tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA
1011
+ AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
1012
+ FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX
1013
+ WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu
1014
+ 9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr
1015
+ gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo
1016
+ 2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
1017
+ LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI
1018
+ 4uJEvlz36hz1
1019
+ -----END CERTIFICATE-----
1020
+ # Go Daddy Secure Certification Authority serialNumber=07969287.pem
1021
+ # Certificate:
1022
+ # Data:
1023
+ # Version: 3 (0x2)
1024
+ # Serial Number: 769 (0x301)
1025
+ # Signature Algorithm: sha1WithRSAEncryption
1026
+ # Issuer: C=US, O=The Go Daddy Group, Inc., OU=Go Daddy Class 2 Certification Authority
1027
+ # Validity
1028
+ # Not Before: Nov 16 01:54:37 2006 GMT
1029
+ # Not After : Nov 16 01:54:37 2026 GMT
1030
+ # Subject: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., OU=http://certificates.godaddy.com/repository, CN=Go Daddy Secure Certification Authority/serialNumber=07969287
1031
+ # Subject Public Key Info:
1032
+ # Public Key Algorithm: rsaEncryption
1033
+ # Public-Key: (2048 bit)
1034
+ # Modulus:
1035
+ # 00:c4:2d:d5:15:8c:9c:26:4c:ec:32:35:eb:5f:b8:
1036
+ # 59:01:5a:a6:61:81:59:3b:70:63:ab:e3:dc:3d:c7:
1037
+ # 2a:b8:c9:33:d3:79:e4:3a:ed:3c:30:23:84:8e:b3:
1038
+ # 30:14:b6:b2:87:c3:3d:95:54:04:9e:df:99:dd:0b:
1039
+ # 25:1e:21:de:65:29:7e:35:a8:a9:54:eb:f6:f7:32:
1040
+ # 39:d4:26:55:95:ad:ef:fb:fe:58:86:d7:9e:f4:00:
1041
+ # 8d:8c:2a:0c:bd:42:04:ce:a7:3f:04:f6:ee:80:f2:
1042
+ # aa:ef:52:a1:69:66:da:be:1a:ad:5d:da:2c:66:ea:
1043
+ # 1a:6b:bb:e5:1a:51:4a:00:2f:48:c7:98:75:d8:b9:
1044
+ # 29:c8:ee:f8:66:6d:0a:9c:b3:f3:fc:78:7c:a2:f8:
1045
+ # a3:f2:b5:c3:f3:b9:7a:91:c1:a7:e6:25:2e:9c:a8:
1046
+ # ed:12:65:6e:6a:f6:12:44:53:70:30:95:c3:9c:2b:
1047
+ # 58:2b:3d:08:74:4a:f2:be:51:b0:bf:87:d0:4c:27:
1048
+ # 58:6b:b5:35:c5:9d:af:17:31:f8:0b:8f:ee:ad:81:
1049
+ # 36:05:89:08:98:cf:3a:af:25:87:c0:49:ea:a7:fd:
1050
+ # 67:f7:45:8e:97:cc:14:39:e2:36:85:b5:7e:1a:37:
1051
+ # fd:16:f6:71:11:9a:74:30:16:fe:13:94:a3:3f:84:
1052
+ # 0d:4f
1053
+ # Exponent: 65537 (0x10001)
1054
+ # X509v3 extensions:
1055
+ # X509v3 Subject Key Identifier:
1056
+ # FD:AC:61:32:93:6C:45:D6:E2:EE:85:5F:9A:BA:E7:76:99:68:CC:E7
1057
+ # X509v3 Authority Key Identifier:
1058
+ # keyid:D2:C4:B0:D2:91:D4:4C:11:71:B3:61:CB:3D:A1:FE:DD:A8:6A:D4:E3
1059
+ #
1060
+ # X509v3 Basic Constraints: critical
1061
+ # CA:TRUE, pathlen:0
1062
+ # Authority Information Access:
1063
+ # OCSP - URI:http://ocsp.godaddy.com
1064
+ #
1065
+ # X509v3 CRL Distribution Points:
1066
+ #
1067
+ # Full Name:
1068
+ # URI:http://certificates.godaddy.com/repository/gdroot.crl
1069
+ #
1070
+ # X509v3 Certificate Policies:
1071
+ # Policy: X509v3 Any Policy
1072
+ # CPS: http://certificates.godaddy.com/repository
1073
+ #
1074
+ # X509v3 Key Usage: critical
1075
+ # Certificate Sign, CRL Sign
1076
+ # Signature Algorithm: sha1WithRSAEncryption
1077
+ # d2:86:c0:ec:bd:f9:a1:b6:67:ee:66:0b:a2:06:3a:04:50:8e:
1078
+ # 15:72:ac:4a:74:95:53:cb:37:cb:44:49:ef:07:90:6b:33:d9:
1079
+ # 96:f0:94:56:a5:13:30:05:3c:85:32:21:7b:c9:c7:0a:a8:24:
1080
+ # a4:90:de:46:d3:25:23:14:03:67:c2:10:d6:6f:0f:5d:7b:7a:
1081
+ # cc:9f:c5:58:2a:c1:c4:9e:21:a8:5a:f3:ac:a4:46:f3:9e:e4:
1082
+ # 63:cb:2f:90:a4:29:29:01:d9:72:2c:29:df:37:01:27:bc:4f:
1083
+ # ee:68:d3:21:8f:c0:b3:e4:f5:09:ed:d2:10:aa:53:b4:be:f0:
1084
+ # cc:59:0b:d6:3b:96:1c:95:24:49:df:ce:ec:fd:a7:48:91:14:
1085
+ # 45:0e:3a:36:6f:da:45:b3:45:a2:41:c9:d4:d7:44:4e:3e:b9:
1086
+ # 74:76:d5:a2:13:55:2c:c6:87:a3:b5:99:ac:06:84:87:7f:75:
1087
+ # 06:fc:bf:14:4c:0e:cc:6e:c4:df:3d:b7:12:71:f4:e8:f1:51:
1088
+ # 40:22:28:49:e0:1d:4b:87:a8:34:cc:06:a2:dd:12:5a:d1:86:
1089
+ # 36:64:03:35:6f:6f:77:6e:eb:f2:85:50:98:5e:ab:03:53:ad:
1090
+ # 91:23:63:1f:16:9c:cd:b9:b2:05:63:3a:e1:f4:68:1b:17:05:
1091
+ # 35:95:53:ee
1092
+ -----BEGIN CERTIFICATE-----
1093
+ MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx
1094
+ ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
1095
+ RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMTYw
1096
+ MTU0MzdaFw0yNjExMTYwMTU0MzdaMIHKMQswCQYDVQQGEwJVUzEQMA4GA1UECBMH
1097
+ QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5j
1098
+ b20sIEluYy4xMzAxBgNVBAsTKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j
1099
+ b20vcmVwb3NpdG9yeTEwMC4GA1UEAxMnR28gRGFkZHkgU2VjdXJlIENlcnRpZmlj
1100
+ YXRpb24gQXV0aG9yaXR5MREwDwYDVQQFEwgwNzk2OTI4NzCCASIwDQYJKoZIhvcN
1101
+ AQEBBQADggEPADCCAQoCggEBAMQt1RWMnCZM7DI161+4WQFapmGBWTtwY6vj3D3H
1102
+ KrjJM9N55DrtPDAjhI6zMBS2sofDPZVUBJ7fmd0LJR4h3mUpfjWoqVTr9vcyOdQm
1103
+ VZWt7/v+WIbXnvQAjYwqDL1CBM6nPwT27oDyqu9SoWlm2r4arV3aLGbqGmu75RpR
1104
+ SgAvSMeYddi5Kcju+GZtCpyz8/x4fKL4o/K1w/O5epHBp+YlLpyo7RJlbmr2EkRT
1105
+ cDCVw5wrWCs9CHRK8r5RsL+H0EwnWGu1NcWdrxcx+AuP7q2BNgWJCJjPOq8lh8BJ
1106
+ 6qf9Z/dFjpfMFDniNoW1fho3/Rb2cRGadDAW/hOUoz+EDU8CAwEAAaOCATIwggEu
1107
+ MB0GA1UdDgQWBBT9rGEyk2xF1uLuhV+auud2mWjM5zAfBgNVHSMEGDAWgBTSxLDS
1108
+ kdRMEXGzYcs9of7dqGrU4zASBgNVHRMBAf8ECDAGAQH/AgEAMDMGCCsGAQUFBwEB
1109
+ BCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZ29kYWRkeS5jb20wRgYDVR0f
1110
+ BD8wPTA7oDmgN4Y1aHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBv
1111
+ c2l0b3J5L2dkcm9vdC5jcmwwSwYDVR0gBEQwQjBABgRVHSAAMDgwNgYIKwYBBQUH
1112
+ AgEWKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeTAO
1113
+ BgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBANKGwOy9+aG2Z+5mC6IG
1114
+ OgRQjhVyrEp0lVPLN8tESe8HkGsz2ZbwlFalEzAFPIUyIXvJxwqoJKSQ3kbTJSMU
1115
+ A2fCENZvD117esyfxVgqwcSeIaha86ykRvOe5GPLL5CkKSkB2XIsKd83ASe8T+5o
1116
+ 0yGPwLPk9Qnt0hCqU7S+8MxZC9Y7lhyVJEnfzuz9p0iRFEUOOjZv2kWzRaJBydTX
1117
+ RE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsxuxN89txJx9OjxUUAiKEngHUuH
1118
+ qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV
1119
+ U+4=
1120
+ -----END CERTIFICATE-----
1121
+ # Thawte Premium Server CA.pem
1122
+ # Certificate:
1123
+ # Data:
1124
+ # Version: 3 (0x2)
1125
+ # Serial Number: 1 (0x1)
1126
+ # Signature Algorithm: md5WithRSAEncryption
1127
+ # Issuer: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting cc, OU=Certification Services Division, CN=Thawte Premium Server CA/emailAddress=premium-server@thawte.com
1128
+ # Validity
1129
+ # Not Before: Aug 1 00:00:00 1996 GMT
1130
+ # Not After : Dec 31 23:59:59 2020 GMT
1131
+ # Subject: C=ZA, ST=Western Cape, L=Cape Town, O=Thawte Consulting cc, OU=Certification Services Division, CN=Thawte Premium Server CA/emailAddress=premium-server@thawte.com
1132
+ # Subject Public Key Info:
1133
+ # Public Key Algorithm: rsaEncryption
1134
+ # Public-Key: (1024 bit)
1135
+ # Modulus:
1136
+ # 00:d2:36:36:6a:8b:d7:c2:5b:9e:da:81:41:62:8f:
1137
+ # 38:ee:49:04:55:d6:d0:ef:1c:1b:95:16:47:ef:18:
1138
+ # 48:35:3a:52:f4:2b:6a:06:8f:3b:2f:ea:56:e3:af:
1139
+ # 86:8d:9e:17:f7:9e:b4:65:75:02:4d:ef:cb:09:a2:
1140
+ # 21:51:d8:9b:d0:67:d0:ba:0d:92:06:14:73:d4:93:
1141
+ # cb:97:2a:00:9c:5c:4e:0c:bc:fa:15:52:fc:f2:44:
1142
+ # 6e:da:11:4a:6e:08:9f:2f:2d:e3:f9:aa:3a:86:73:
1143
+ # b6:46:53:58:c8:89:05:bd:83:11:b8:73:3f:aa:07:
1144
+ # 8d:f4:42:4d:e7:40:9d:1c:37
1145
+ # Exponent: 65537 (0x10001)
1146
+ # X509v3 extensions:
1147
+ # X509v3 Basic Constraints: critical
1148
+ # CA:TRUE
1149
+ # Signature Algorithm: md5WithRSAEncryption
1150
+ # 26:48:2c:16:c2:58:fa:e8:16:74:0c:aa:aa:5f:54:3f:f2:d7:
1151
+ # c9:78:60:5e:5e:6e:37:63:22:77:36:7e:b2:17:c4:34:b9:f5:
1152
+ # 08:85:fc:c9:01:38:ff:4d:be:f2:16:42:43:e7:bb:5a:46:fb:
1153
+ # c1:c6:11:1f:f1:4a:b0:28:46:c9:c3:c4:42:7d:bc:fa:ab:59:
1154
+ # 6e:d5:b7:51:88:11:e3:a4:85:19:6b:82:4c:a4:0c:12:ad:e9:
1155
+ # a4:ae:3f:f1:c3:49:65:9a:8c:c5:c8:3e:25:b7:94:99:bb:92:
1156
+ # 32:71:07:f0:86:5e:ed:50:27:a6:0d:a6:23:f9:bb:cb:a6:07:
1157
+ # 14:42
1158
+ -----BEGIN CERTIFICATE-----
1159
+ MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx
1160
+ FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
1161
+ VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
1162
+ biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy
1163
+ dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t
1164
+ MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB
1165
+ MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG
1166
+ A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp
1167
+ b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl
1168
+ cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv
1169
+ bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE
1170
+ VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ
1171
+ ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR
1172
+ uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
1173
+ 9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
1174
+ hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM
1175
+ pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==
1176
+ -----END CERTIFICATE-----
1177
+ # Thawte Primary Root CA - G2.pem
1178
+ # Certificate:
1179
+ # Data:
1180
+ # Version: 3 (0x2)
1181
+ # Serial Number:
1182
+ # 35:fc:26:5c:d9:84:4f:c9:3d:26:3d:57:9b:ae:d7:56
1183
+ # Signature Algorithm: ecdsa-with-SHA384
1184
+ # Issuer: C=US, O=thawte, Inc., OU=(c) 2007 thawte, Inc. - For authorized use only, CN=thawte Primary Root CA - G2
1185
+ # Validity
1186
+ # Not Before: Nov 5 00:00:00 2007 GMT
1187
+ # Not After : Jan 18 23:59:59 2038 GMT
1188
+ # Subject: C=US, O=thawte, Inc., OU=(c) 2007 thawte, Inc. - For authorized use only, CN=thawte Primary Root CA - G2
1189
+ # Subject Public Key Info:
1190
+ # Public Key Algorithm: id-ecPublicKey
1191
+ # Public-Key: (384 bit)
1192
+ # pub:
1193
+ # 04:a2:d5:9c:82:7b:95:9d:f1:52:78:87:fe:8a:16:
1194
+ # bf:05:e6:df:a3:02:4f:0d:07:c6:00:51:ba:0c:02:
1195
+ # 52:2d:22:a4:42:39:c4:fe:8f:ea:c9:c1:be:d4:4d:
1196
+ # ff:9f:7a:9e:e2:b1:7c:9a:ad:a7:86:09:73:87:d1:
1197
+ # e7:9a:e3:7a:a5:aa:6e:fb:ba:b3:70:c0:67:88:a2:
1198
+ # 35:d4:a3:9a:b1:fd:ad:c2:ef:31:fa:a8:b9:f3:fb:
1199
+ # 08:c6:91:d1:fb:29:95
1200
+ # ASN1 OID: secp384r1
1201
+ # X509v3 extensions:
1202
+ # X509v3 Basic Constraints: critical
1203
+ # CA:TRUE
1204
+ # X509v3 Key Usage: critical
1205
+ # Certificate Sign, CRL Sign
1206
+ # X509v3 Subject Key Identifier:
1207
+ # 9A:D8:00:30:00:E7:6B:7F:85:18:EE:8B:B6:CE:8A:0C:F8:11:E1:BB
1208
+ # Signature Algorithm: ecdsa-with-SHA384
1209
+ # 30:66:02:31:00:dd:f8:e0:57:47:5b:a7:e6:0a:c3:bd:f5:80:
1210
+ # 8a:97:35:0d:1b:89:3c:54:86:77:28:ca:a1:f4:79:de:b5:e6:
1211
+ # 38:b0:f0:65:70:8c:7f:02:54:c2:bf:ff:d8:a1:3e:d9:cf:02:
1212
+ # 31:00:c4:8d:94:fc:dc:53:d2:dc:9d:78:16:1f:15:33:23:53:
1213
+ # 52:e3:5a:31:5d:9d:ca:ae:bd:13:29:44:0d:27:5b:a8:e7:68:
1214
+ # 9c:12:f7:58:3f:2e:72:02:57:a3:8f:a1:14:2e
1215
+ -----BEGIN CERTIFICATE-----
1216
+ MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL
1217
+ MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp
1218
+ IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi
1219
+ BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw
1220
+ MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
1221
+ d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig
1222
+ YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v
1223
+ dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/
1224
+ BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6
1225
+ papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E
1226
+ BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K
1227
+ DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3
1228
+ KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox
1229
+ XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
1230
+ -----END CERTIFICATE-----
1231
+ # Thawte Primary Root CA - G3.pem
1232
+ # Certificate:
1233
+ # Data:
1234
+ # Version: 3 (0x2)
1235
+ # Serial Number:
1236
+ # 60:01:97:b7:46:a7:ea:b4:b4:9a:d6:4b:2f:f7:90:fb
1237
+ # Signature Algorithm: sha256WithRSAEncryption
1238
+ # Issuer: C=US, O=thawte, Inc., OU=Certification Services Division, OU=(c) 2008 thawte, Inc. - For authorized use only, CN=thawte Primary Root CA - G3
1239
+ # Validity
1240
+ # Not Before: Apr 2 00:00:00 2008 GMT
1241
+ # Not After : Dec 1 23:59:59 2037 GMT
1242
+ # Subject: C=US, O=thawte, Inc., OU=Certification Services Division, OU=(c) 2008 thawte, Inc. - For authorized use only, CN=thawte Primary Root CA - G3
1243
+ # Subject Public Key Info:
1244
+ # Public Key Algorithm: rsaEncryption
1245
+ # Public-Key: (2048 bit)
1246
+ # Modulus:
1247
+ # 00:b2:bf:27:2c:fb:db:d8:5b:dd:78:7b:1b:9e:77:
1248
+ # 66:81:cb:3e:bc:7c:ae:f3:a6:27:9a:34:a3:68:31:
1249
+ # 71:38:33:62:e4:f3:71:66:79:b1:a9:65:a3:a5:8b:
1250
+ # d5:8f:60:2d:3f:42:cc:aa:6b:32:c0:23:cb:2c:41:
1251
+ # dd:e4:df:fc:61:9c:e2:73:b2:22:95:11:43:18:5f:
1252
+ # c4:b6:1f:57:6c:0a:05:58:22:c8:36:4c:3a:7c:a5:
1253
+ # d1:cf:86:af:88:a7:44:02:13:74:71:73:0a:42:59:
1254
+ # 02:f8:1b:14:6b:42:df:6f:5f:ba:6b:82:a2:9d:5b:
1255
+ # e7:4a:bd:1e:01:72:db:4b:74:e8:3b:7f:7f:7d:1f:
1256
+ # 04:b4:26:9b:e0:b4:5a:ac:47:3d:55:b8:d7:b0:26:
1257
+ # 52:28:01:31:40:66:d8:d9:24:bd:f6:2a:d8:ec:21:
1258
+ # 49:5c:9b:f6:7a:e9:7f:55:35:7e:96:6b:8d:93:93:
1259
+ # 27:cb:92:bb:ea:ac:40:c0:9f:c2:f8:80:cf:5d:f4:
1260
+ # 5a:dc:ce:74:86:a6:3e:6c:0b:53:ca:bd:92:ce:19:
1261
+ # 06:72:e6:0c:5c:38:69:c7:04:d6:bc:6c:ce:5b:f6:
1262
+ # f7:68:9c:dc:25:15:48:88:a1:e9:a9:f8:98:9c:e0:
1263
+ # f3:d5:31:28:61:11:6c:67:96:8d:39:99:cb:c2:45:
1264
+ # 24:39
1265
+ # Exponent: 65537 (0x10001)
1266
+ # X509v3 extensions:
1267
+ # X509v3 Basic Constraints: critical
1268
+ # CA:TRUE
1269
+ # X509v3 Key Usage: critical
1270
+ # Certificate Sign, CRL Sign
1271
+ # X509v3 Subject Key Identifier:
1272
+ # AD:6C:AA:94:60:9C:ED:E4:FF:FA:3E:0A:74:2B:63:03:F7:B6:59:BF
1273
+ # Signature Algorithm: sha256WithRSAEncryption
1274
+ # 1a:40:d8:95:65:ac:09:92:89:c6:39:f4:10:e5:a9:0e:66:53:
1275
+ # 5d:78:de:fa:24:91:bb:e7:44:51:df:c6:16:34:0a:ef:6a:44:
1276
+ # 51:ea:2b:07:8a:03:7a:c3:eb:3f:0a:2c:52:16:a0:2b:43:b9:
1277
+ # 25:90:3f:70:a9:33:25:6d:45:1a:28:3b:27:cf:aa:c3:29:42:
1278
+ # 1b:df:3b:4c:c0:33:34:5b:41:88:bf:6b:2b:65:af:28:ef:b2:
1279
+ # f5:c3:aa:66:ce:7b:56:ee:b7:c8:cb:67:c1:c9:9c:1a:18:b8:
1280
+ # c4:c3:49:03:f1:60:0e:50:cd:46:c5:f3:77:79:f7:b6:15:e0:
1281
+ # 38:db:c7:2f:28:a0:0c:3f:77:26:74:d9:25:12:da:31:da:1a:
1282
+ # 1e:dc:29:41:91:22:3c:69:a7:bb:02:f2:b6:5c:27:03:89:f4:
1283
+ # 06:ea:9b:e4:72:82:e3:a1:09:c1:e9:00:19:d3:3e:d4:70:6b:
1284
+ # ba:71:a6:aa:58:ae:f4:bb:e9:6c:b6:ef:87:cc:9b:bb:ff:39:
1285
+ # e6:56:61:d3:0a:a7:c4:5c:4c:60:7b:05:77:26:7a:bf:d8:07:
1286
+ # 52:2c:62:f7:70:63:d9:39:bc:6f:1c:c2:79:dc:76:29:af:ce:
1287
+ # c5:2c:64:04:5e:88:36:6e:31:d4:40:1a:62:34:36:3f:35:01:
1288
+ # ae:ac:63:a0
1289
+ -----BEGIN CERTIFICATE-----
1290
+ MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB
1291
+ rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
1292
+ Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
1293
+ MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV
1294
+ BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa
1295
+ Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl
1296
+ LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u
1297
+ MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl
1298
+ ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz
1299
+ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm
1300
+ gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8
1301
+ YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf
1302
+ b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9
1303
+ 9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S
1304
+ zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk
1305
+ OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV
1306
+ HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA
1307
+ 2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW
1308
+ oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
1309
+ t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c
1310
+ KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM
1311
+ m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu
1312
+ MdRAGmI0Nj81Aa6sY6A=
1313
+ -----END CERTIFICATE-----
1314
+ # Thawte Primary Root CA.pem
1315
+ # Certificate:
1316
+ # Data:
1317
+ # Version: 3 (0x2)
1318
+ # Serial Number:
1319
+ # 34:4e:d5:57:20:d5:ed:ec:49:f4:2f:ce:37:db:2b:6d
1320
+ # Signature Algorithm: sha1WithRSAEncryption
1321
+ # Issuer: C=US, O=thawte, Inc., OU=Certification Services Division, OU=(c) 2006 thawte, Inc. - For authorized use only, CN=thawte Primary Root CA
1322
+ # Validity
1323
+ # Not Before: Nov 17 00:00:00 2006 GMT
1324
+ # Not After : Jul 16 23:59:59 2036 GMT
1325
+ # Subject: C=US, O=thawte, Inc., OU=Certification Services Division, OU=(c) 2006 thawte, Inc. - For authorized use only, CN=thawte Primary Root CA
1326
+ # Subject Public Key Info:
1327
+ # Public Key Algorithm: rsaEncryption
1328
+ # Public-Key: (2048 bit)
1329
+ # Modulus:
1330
+ # 00:ac:a0:f0:fb:80:59:d4:9c:c7:a4:cf:9d:a1:59:
1331
+ # 73:09:10:45:0c:0d:2c:6e:68:f1:6c:5b:48:68:49:
1332
+ # 59:37:fc:0b:33:19:c2:77:7f:cc:10:2d:95:34:1c:
1333
+ # e6:eb:4d:09:a7:1c:d2:b8:c9:97:36:02:b7:89:d4:
1334
+ # 24:5f:06:c0:cc:44:94:94:8d:02:62:6f:eb:5a:dd:
1335
+ # 11:8d:28:9a:5c:84:90:10:7a:0d:bd:74:66:2f:6a:
1336
+ # 38:a0:e2:d5:54:44:eb:1d:07:9f:07:ba:6f:ee:e9:
1337
+ # fd:4e:0b:29:f5:3e:84:a0:01:f1:9c:ab:f8:1c:7e:
1338
+ # 89:a4:e8:a1:d8:71:65:0d:a3:51:7b:ee:bc:d2:22:
1339
+ # 60:0d:b9:5b:9d:df:ba:fc:51:5b:0b:af:98:b2:e9:
1340
+ # 2e:e9:04:e8:62:87:de:2b:c8:d7:4e:c1:4c:64:1e:
1341
+ # dd:cf:87:58:ba:4a:4f:ca:68:07:1d:1c:9d:4a:c6:
1342
+ # d5:2f:91:cc:7c:71:72:1c:c5:c0:67:eb:32:fd:c9:
1343
+ # 92:5c:94:da:85:c0:9b:bf:53:7d:2b:09:f4:8c:9d:
1344
+ # 91:1f:97:6a:52:cb:de:09:36:a4:77:d8:7b:87:50:
1345
+ # 44:d5:3e:6e:29:69:fb:39:49:26:1e:09:a5:80:7b:
1346
+ # 40:2d:eb:e8:27:85:c9:fe:61:fd:7e:e6:7c:97:1d:
1347
+ # d5:9d
1348
+ # Exponent: 65537 (0x10001)
1349
+ # X509v3 extensions:
1350
+ # X509v3 Basic Constraints: critical
1351
+ # CA:TRUE
1352
+ # X509v3 Key Usage: critical
1353
+ # Certificate Sign, CRL Sign
1354
+ # X509v3 Subject Key Identifier:
1355
+ # 7B:5B:45:CF:AF:CE:CB:7A:FD:31:92:1A:6A:B6:F3:46:EB:57:48:50
1356
+ # Signature Algorithm: sha1WithRSAEncryption
1357
+ # 79:11:c0:4b:b3:91:b6:fc:f0:e9:67:d4:0d:6e:45:be:55:e8:
1358
+ # 93:d2:ce:03:3f:ed:da:25:b0:1d:57:cb:1e:3a:76:a0:4c:ec:
1359
+ # 50:76:e8:64:72:0c:a4:a9:f1:b8:8b:d6:d6:87:84:bb:32:e5:
1360
+ # 41:11:c0:77:d9:b3:60:9d:eb:1b:d5:d1:6e:44:44:a9:a6:01:
1361
+ # ec:55:62:1d:77:b8:5c:8e:48:49:7c:9c:3b:57:11:ac:ad:73:
1362
+ # 37:8e:2f:78:5c:90:68:47:d9:60:60:e6:fc:07:3d:22:20:17:
1363
+ # c4:f7:16:e9:c4:d8:72:f9:c8:73:7c:df:16:2f:15:a9:3e:fd:
1364
+ # 6a:27:b6:a1:eb:5a:ba:98:1f:d5:e3:4d:64:0a:9d:13:c8:61:
1365
+ # ba:f5:39:1c:87:ba:b8:bd:7b:22:7f:f6:fe:ac:40:79:e5:ac:
1366
+ # 10:6f:3d:8f:1b:79:76:8b:c4:37:b3:21:18:84:e5:36:00:eb:
1367
+ # 63:20:99:b9:e9:fe:33:04:bb:41:c8:c1:02:f9:44:63:20:9e:
1368
+ # 81:ce:42:d3:d6:3f:2c:76:d3:63:9c:59:dd:8f:a6:e1:0e:a0:
1369
+ # 2e:41:f7:2e:95:47:cf:bc:fd:33:f3:f6:0b:61:7e:7e:91:2b:
1370
+ # 81:47:c2:27:30:ee:a7:10:5d:37:8f:5c:39:2b:e4:04:f0:7b:
1371
+ # 8d:56:8c:68
1372
+ -----BEGIN CERTIFICATE-----
1373
+ MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
1374
+ qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
1375
+ Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
1376
+ MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
1377
+ BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
1378
+ NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
1379
+ LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
1380
+ A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
1381
+ IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
1382
+ SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
1383
+ W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
1384
+ 3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
1385
+ 6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
1386
+ Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
1387
+ NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
1388
+ MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
1389
+ r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
1390
+ DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
1391
+ YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
1392
+ xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
1393
+ /qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
1394
+ LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
1395
+ jVaMaA==
1396
  -----END CERTIFICATE-----
src/Google/Auth/OAuth2.php CHANGED
@@ -502,6 +502,7 @@ class Google_Auth_OAuth2 extends Google_Auth_Abstract
502
  // Check signature
503
  $verified = false;
504
  foreach ($certs as $keyName => $pem) {
 
505
  $public_key = new Google_Verifier_Pem($pem);
506
  if ($public_key->verify($signed, $signature)) {
507
  $verified = true;
502
  // Check signature
503
  $verified = false;
504
  foreach ($certs as $keyName => $pem) {
505
+ // @todo make a fallback using PHPSecLib, since it's completely trivial; this is the only part of the Worker plugin that requires openssl extension.
506
  $public_key = new Google_Verifier_Pem($pem);
507
  if ($public_key->verify($signed, $signature)) {
508
  $verified = true;
src/Google/IO/cacerts.pem CHANGED
@@ -1,738 +1,738 @@
1
- # Certifcate Authority certificates for validating SSL connections.
2
- #
3
- # This file contains PEM format certificates generated from
4
- # http://mxr.mozilla.org/seamonkey/source/security/nss/lib/ckfw/builtins/certdata.txt
5
- #
6
- # ***** BEGIN LICENSE BLOCK *****
7
- # Version: MPL 1.1/GPL 2.0/LGPL 2.1
8
- #
9
- # The contents of this file are subject to the Mozilla Public License Version
10
- # 1.1 (the "License"); you may not use this file except in compliance with
11
- # the License. You may obtain a copy of the License at
12
- # http://www.mozilla.org/MPL/
13
- #
14
- # Software distributed under the License is distributed on an "AS IS" basis,
15
- # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
16
- # for the specific language governing rights and limitations under the
17
- # License.
18
- #
19
- # The Original Code is the Netscape security libraries.
20
- #
21
- # The Initial Developer of the Original Code is
22
- # Netscape Communications Corporation.
23
- # Portions created by the Initial Developer are Copyright (C) 1994-2000
24
- # the Initial Developer. All Rights Reserved.
25
- #
26
- # Contributor(s):
27
- #
28
- # Alternatively, the contents of this file may be used under the terms of
29
- # either the GNU General Public License Version 2 or later (the "GPL"), or
30
- # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
31
- # in which case the provisions of the GPL or the LGPL are applicable instead
32
- # of those above. If you wish to allow use of your version of this file only
33
- # under the terms of either the GPL or the LGPL, and not to allow others to
34
- # use your version of this file under the terms of the MPL, indicate your
35
- # decision by deleting the provisions above and replace them with the notice
36
- # and other provisions required by the GPL or the LGPL. If you do not delete
37
- # the provisions above, a recipient may use your version of this file under
38
- # the terms of any one of the MPL, the GPL or the LGPL.
39
- #
40
- # ***** END LICENSE BLOCK *****
41
-
42
- Verisign/RSA Secure Server CA
43
- =============================
44
-
45
- -----BEGIN CERTIFICATE-----
46
- MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG
47
- A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD
48
- VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0
49
- MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV
50
- BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy
51
- dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ
52
- ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII
53
- 0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI
54
- uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI
55
- hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3
56
- YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc
57
- 1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA==
58
- -----END CERTIFICATE-----
59
-
60
- Thawte Personal Basic CA
61
- ========================
62
-
63
- -----BEGIN CERTIFICATE-----
64
- MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx
65
- FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
66
- VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
67
- ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj
68
- IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X
69
- DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw
70
- EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE
71
- ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy
72
- dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD
73
- QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN
74
- BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53
75
- dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK
76
- wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7
77
- G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF
78
- AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7
79
- c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P
80
- 9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ==
81
- -----END CERTIFICATE-----
82
-
83
- Thawte Personal Premium CA
84
- ==========================
85
-
86
- -----BEGIN CERTIFICATE-----
87
- MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx
88
- FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
89
- VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
90
- ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p
91
- dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv
92
- bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa
93
- QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY
94
- BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u
95
- IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl
96
- bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu
97
- Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs
98
- Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI
99
- Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD
100
- ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
101
- SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH
102
- b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh
103
- KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ
104
- -----END CERTIFICATE-----
105
-
106
- Thawte Personal Freemail CA
107
- ===========================
108
-
109
- -----BEGIN CERTIFICATE-----
110
- MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx
111
- FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
112
- VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
113
- ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt
114
- YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu
115
- Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT
116
- AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa
117
- MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp
118
- b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG
119
- cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh
120
- d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY
121
- DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E
122
- rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq
123
- uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN
124
- BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP
125
- MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa
126
- /RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei
127
- gQ==
128
- -----END CERTIFICATE-----
129
-
130
- Thawte Server CA
131
- ================
132
-
133
- -----BEGIN CERTIFICATE-----
134
- MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx
135
- FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
136
- VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
137
- biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm
138
- MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx
139
- MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
140
- DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3
141
- dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl
142
- cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3
143
- DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD
144
- gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91
145
- yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX
146
- L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj
147
- EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG
148
- 7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e
149
- QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ
150
- qdq5snUb9kLy78fyGPmJvKP/iiMucEc=
151
- -----END CERTIFICATE-----
152
-
153
- Thawte Premium Server CA
154
- ========================
155
-
156
- -----BEGIN CERTIFICATE-----
157
- MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx
158
- FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
159
- VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
160
- biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy
161
- dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t
162
- MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB
163
- MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG
164
- A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp
165
- b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl
166
- cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv
167
- bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE
168
- VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ
169
- ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR
170
- uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
171
- 9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
172
- hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM
173
- pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==
174
- -----END CERTIFICATE-----
175
-
176
- Equifax Secure CA
177
- =================
178
-
179
- -----BEGIN CERTIFICATE-----
180
- MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
181
- UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
182
- dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
183
- MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
184
- dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
185
- AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
186
- BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
187
- cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
188
- AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
189
- MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
190
- aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
191
- ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
192
- IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
193
- MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
194
- A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
195
- 7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
196
- 1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
197
- -----END CERTIFICATE-----
198
-
199
- Verisign Class 1 Public Primary Certification Authority
200
- =======================================================
201
-
202
- -----BEGIN CERTIFICATE-----
203
- MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ
204
- BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh
205
- c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05
206
- NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD
207
- VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp
208
- bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB
209
- jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N
210
- H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR
211
- 4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN
212
- BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo
213
- EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5
214
- FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx
215
- lA==
216
- -----END CERTIFICATE-----
217
-
218
- Verisign Class 2 Public Primary Certification Authority
219
- =======================================================
220
-
221
- -----BEGIN CERTIFICATE-----
222
- MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG
223
- A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
224
- cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
225
- MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
226
- BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt
227
- YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
228
- ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh
229
- YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7
230
- FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G
231
- CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg
232
- J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc
233
- r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY
234
- -----END CERTIFICATE-----
235
-
236
- Verisign Class 3 Public Primary Certification Authority
237
- =======================================================
238
-
239
- -----BEGIN CERTIFICATE-----
240
- MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
241
- A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
242
- cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
243
- MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
244
- BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
245
- YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
246
- ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
247
- BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
248
- I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
249
- CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
250
- lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
251
- AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
252
- -----END CERTIFICATE-----
253
-
254
- Verisign Class 1 Public Primary Certification Authority - G2
255
- ============================================================
256
-
257
- -----BEGIN CERTIFICATE-----
258
- MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
259
- BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
260
- c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
261
- MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
262
- emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
263
- DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
264
- FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg
265
- UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
266
- YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
267
- MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
268
- AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK
269
- VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm
270
- Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID
271
- AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J
272
- h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul
273
- uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68
274
- DzFc6PLZ
275
- -----END CERTIFICATE-----
276
-
277
- Verisign Class 2 Public Primary Certification Authority - G2
278
- ============================================================
279
-
280
- -----BEGIN CERTIFICATE-----
281
- MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw
282
- CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns
283
- YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
284
- MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y
285
- aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe
286
- Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX
287
- MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj
288
- IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx
289
- KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
290
- eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B
291
- AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM
292
- HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw
293
- DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC
294
- AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji
295
- nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX
296
- rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn
297
- jBJ7xUS0rg==
298
- -----END CERTIFICATE-----
299
-
300
- Verisign Class 3 Public Primary Certification Authority - G2
301
- ============================================================
302
-
303
- -----BEGIN CERTIFICATE-----
304
- MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
305
- BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
306
- c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
307
- MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
308
- emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
309
- DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
310
- FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg
311
- UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
312
- YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
313
- MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
314
- AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4
315
- pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0
316
- 13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID
317
- AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk
318
- U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i
319
- F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY
320
- oJ2daZH9
321
- -----END CERTIFICATE-----
322
-
323
- Verisign Class 4 Public Primary Certification Authority - G2
324
- ============================================================
325
-
326
- -----BEGIN CERTIFICATE-----
327
- MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
328
- BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
329
- c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
330
- MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
331
- emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
332
- DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
333
- FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg
334
- UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
335
- YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
336
- MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
337
- AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM
338
- HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK
339
- qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID
340
- AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj
341
- cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y
342
- cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP
343
- T8qAkbYp
344
- -----END CERTIFICATE-----
345
-
346
- Verisign Class 1 Public Primary Certification Authority - G3
347
- ============================================================
348
-
349
- -----BEGIN CERTIFICATE-----
350
- MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw
351
- CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
352
- cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
353
- LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
354
- aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
355
- dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
356
- VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
357
- aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
358
- bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
359
- IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
360
- LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4
361
- nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO
362
- 8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV
363
- ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb
364
- PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2
365
- 6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr
366
- n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a
367
- qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4
368
- wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3
369
- ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs
370
- pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4
371
- E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g==
372
- -----END CERTIFICATE-----
373
-
374
- Verisign Class 2 Public Primary Certification Authority - G3
375
- ============================================================
376
-
377
- -----BEGIN CERTIFICATE-----
378
- MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ
379
- BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy
380
- aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s
381
- IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp
382
- Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
383
- eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV
384
- BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp
385
- Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu
386
- Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g
387
- Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
388
- IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU
389
- J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO
390
- JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY
391
- wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o
392
- koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN
393
- qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E
394
- Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe
395
- xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u
396
- 7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU
397
- sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI
398
- sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP
399
- cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q
400
- -----END CERTIFICATE-----
401
-
402
- Verisign Class 3 Public Primary Certification Authority - G3
403
- ============================================================
404
-
405
- -----BEGIN CERTIFICATE-----
406
- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
407
- CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
408
- cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
409
- LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
410
- aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
411
- dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
412
- VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
413
- aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
414
- bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
415
- IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
416
- LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b
417
- N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t
418
- KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu
419
- kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm
420
- CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
421
- Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu
422
- imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te
423
- 2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe
424
- DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
425
- /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p
426
- F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt
427
- TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
428
- -----END CERTIFICATE-----
429
-
430
- Verisign Class 4 Public Primary Certification Authority - G3
431
- ============================================================
432
-
433
- -----BEGIN CERTIFICATE-----
434
- MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
435
- CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
436
- cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
437
- LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
438
- aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
439
- dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
440
- VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
441
- aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
442
- bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
443
- IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
444
- LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1
445
- GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ
446
- +mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd
447
- U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm
448
- NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY
449
- ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/
450
- ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1
451
- CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq
452
- g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
453
- fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c
454
- 2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/
455
- bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
456
- -----END CERTIFICATE-----
457
-
458
- Equifax Secure Global eBusiness CA
459
- ==================================
460
-
461
- -----BEGIN CERTIFICATE-----
462
- MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc
463
- MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT
464
- ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw
465
- MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj
466
- dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l
467
- c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC
468
- UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc
469
- 58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/
470
- o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH
471
- MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr
472
- aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA
473
- A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA
474
- Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv
475
- 8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
476
- -----END CERTIFICATE-----
477
-
478
- Equifax Secure eBusiness CA 1
479
- =============================
480
-
481
- -----BEGIN CERTIFICATE-----
482
- MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc
483
- MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT
484
- ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw
485
- MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j
486
- LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ
487
- KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo
488
- RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu
489
- WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw
490
- Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD
491
- AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK
492
- eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM
493
- zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+
494
- WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN
495
- /Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ==
496
- -----END CERTIFICATE-----
497
-
498
- Equifax Secure eBusiness CA 2
499
- =============================
500
-
501
- -----BEGIN CERTIFICATE-----
502
- MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
503
- UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj
504
- dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0
505
- NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD
506
- VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B
507
- AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G
508
- vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/
509
- BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C
510
- AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX
511
- MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl
512
- IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw
513
- NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq
514
- y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF
515
- MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
516
- A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy
517
- 0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1
518
- E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN
519
- -----END CERTIFICATE-----
520
-
521
- Thawte Time Stamping CA
522
- =======================
523
-
524
- -----BEGIN CERTIFICATE-----
525
- MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx
526
- FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN
527
- BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd
528
- BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN
529
- MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g
530
- Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG
531
- A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l
532
- c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT
533
- 6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa
534
- Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL
535
- 8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB
536
- Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC
537
- 9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ
538
- pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ
539
- CayJSdM=
540
- -----END CERTIFICATE-----
541
-
542
- thawte Primary Root CA
543
- ======================
544
-
545
- -----BEGIN CERTIFICATE-----
546
- MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
547
- qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
548
- Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
549
- MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
550
- BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
551
- NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
552
- LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
553
- A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
554
- IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
555
- SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
556
- W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
557
- 3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
558
- 6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
559
- Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
560
- NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
561
- MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
562
- r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
563
- DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
564
- YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
565
- xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
566
- /qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
567
- LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
568
- jVaMaA==
569
- -----END CERTIFICATE-----
570
-
571
- VeriSign Class 3 Public Primary Certification Authority - G5
572
- ============================================================
573
-
574
- -----BEGIN CERTIFICATE-----
575
- MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
576
- yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
577
- ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
578
- U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
579
- ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
580
- aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
581
- MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
582
- ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
583
- biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
584
- U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
585
- aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
586
- nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
587
- t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
588
- SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
589
- BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
590
- rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
591
- NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
592
- BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
593
- BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
594
- aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
595
- MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
596
- p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
597
- 5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
598
- WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
599
- 4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
600
- hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
601
- -----END CERTIFICATE-----
602
-
603
- Entrust.net Secure Server Certification Authority
604
- =================================================
605
-
606
- -----BEGIN CERTIFICATE-----
607
- MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
608
- VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
609
- ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
610
- KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
611
- ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
612
- MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
613
- ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
614
- b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
615
- bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
616
- U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
617
- A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
618
- I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
619
- wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
620
- AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
621
- oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
622
- BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
623
- dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
624
- MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
625
- b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
626
- dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
627
- MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
628
- E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
629
- MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
630
- hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
631
- 95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
632
- 2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
633
- -----END CERTIFICATE-----
634
-
635
- Go Daddy Certification Authority Root Certificate Bundle
636
- ========================================================
637
-
638
- -----BEGIN CERTIFICATE-----
639
- MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx
640
- ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
641
- RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMTYw
642
- MTU0MzdaFw0yNjExMTYwMTU0MzdaMIHKMQswCQYDVQQGEwJVUzEQMA4GA1UECBMH
643
- QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5j
644
- b20sIEluYy4xMzAxBgNVBAsTKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j
645
- b20vcmVwb3NpdG9yeTEwMC4GA1UEAxMnR28gRGFkZHkgU2VjdXJlIENlcnRpZmlj
646
- YXRpb24gQXV0aG9yaXR5MREwDwYDVQQFEwgwNzk2OTI4NzCCASIwDQYJKoZIhvcN
647
- AQEBBQADggEPADCCAQoCggEBAMQt1RWMnCZM7DI161+4WQFapmGBWTtwY6vj3D3H
648
- KrjJM9N55DrtPDAjhI6zMBS2sofDPZVUBJ7fmd0LJR4h3mUpfjWoqVTr9vcyOdQm
649
- VZWt7/v+WIbXnvQAjYwqDL1CBM6nPwT27oDyqu9SoWlm2r4arV3aLGbqGmu75RpR
650
- SgAvSMeYddi5Kcju+GZtCpyz8/x4fKL4o/K1w/O5epHBp+YlLpyo7RJlbmr2EkRT
651
- cDCVw5wrWCs9CHRK8r5RsL+H0EwnWGu1NcWdrxcx+AuP7q2BNgWJCJjPOq8lh8BJ
652
- 6qf9Z/dFjpfMFDniNoW1fho3/Rb2cRGadDAW/hOUoz+EDU8CAwEAAaOCATIwggEu
653
- MB0GA1UdDgQWBBT9rGEyk2xF1uLuhV+auud2mWjM5zAfBgNVHSMEGDAWgBTSxLDS
654
- kdRMEXGzYcs9of7dqGrU4zASBgNVHRMBAf8ECDAGAQH/AgEAMDMGCCsGAQUFBwEB
655
- BCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZ29kYWRkeS5jb20wRgYDVR0f
656
- BD8wPTA7oDmgN4Y1aHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBv
657
- c2l0b3J5L2dkcm9vdC5jcmwwSwYDVR0gBEQwQjBABgRVHSAAMDgwNgYIKwYBBQUH
658
- AgEWKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeTAO
659
- BgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBANKGwOy9+aG2Z+5mC6IG
660
- OgRQjhVyrEp0lVPLN8tESe8HkGsz2ZbwlFalEzAFPIUyIXvJxwqoJKSQ3kbTJSMU
661
- A2fCENZvD117esyfxVgqwcSeIaha86ykRvOe5GPLL5CkKSkB2XIsKd83ASe8T+5o
662
- 0yGPwLPk9Qnt0hCqU7S+8MxZC9Y7lhyVJEnfzuz9p0iRFEUOOjZv2kWzRaJBydTX
663
- RE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsxuxN89txJx9OjxUUAiKEngHUuH
664
- qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV
665
- U+4=
666
- -----END CERTIFICATE-----
667
- -----BEGIN CERTIFICATE-----
668
- MIIE+zCCBGSgAwIBAgICAQ0wDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh
669
- bGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu
670
- Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g
671
- QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAe
672
- BgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDYyOTE3MDYyMFoX
673
- DTI0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBE
674
- YWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3MgMiBDZXJ0
675
- aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgC
676
- ggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
677
- 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+q
678
- N1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiO
679
- r18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lN
680
- f4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+YihfukEH
681
- U1jPEX44dMX4/7VpkI+EdOqXG68CAQOjggHhMIIB3TAdBgNVHQ4EFgQU0sSw0pHU
682
- TBFxs2HLPaH+3ahq1OMwgdIGA1UdIwSByjCBx6GBwaSBvjCBuzEkMCIGA1UEBxMb
683
- VmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrMRcwFQYDVQQKEw5WYWxpQ2VydCwg
684
- SW5jLjE1MDMGA1UECxMsVmFsaUNlcnQgQ2xhc3MgMiBQb2xpY3kgVmFsaWRhdGlv
685
- biBBdXRob3JpdHkxITAfBgNVBAMTGGh0dHA6Ly93d3cudmFsaWNlcnQuY29tLzEg
686
- MB4GCSqGSIb3DQEJARYRaW5mb0B2YWxpY2VydC5jb22CAQEwDwYDVR0TAQH/BAUw
687
- AwEB/zAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmdv
688
- ZGFkZHkuY29tMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jZXJ0aWZpY2F0ZXMu
689
- Z29kYWRkeS5jb20vcmVwb3NpdG9yeS9yb290LmNybDBLBgNVHSAERDBCMEAGBFUd
690
- IAAwODA2BggrBgEFBQcCARYqaHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNv
691
- bS9yZXBvc2l0b3J5MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOBgQC1
692
- QPmnHfbq/qQaQlpE9xXUhUaJwL6e4+PrxeNYiY+Sn1eocSxI0YGyeR+sBjUZsE4O
693
- WBsUs5iB0QQeyAfJg594RAoYC5jcdnplDQ1tgMQLARzLrUc+cb53S8wGd9D0Vmsf
694
- SxOaFIqII6hR8INMqzW/Rn453HWkrugp++85j09VZw==
695
- -----END CERTIFICATE-----
696
- -----BEGIN CERTIFICATE-----
697
- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
698
- IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
699
- BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
700
- aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
701
- 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy
702
- NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
703
- azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
704
- YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
705
- Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
706
- cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY
707
- dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9
708
- WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS
709
- v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v
710
- UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu
711
- IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC
712
- W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd
713
- -----END CERTIFICATE-----
714
-
715
- GeoTrust Global CA
716
- ==================
717
-
718
- -----BEGIN CERTIFICATE-----
719
- MIIDfTCCAuagAwIBAgIDErvmMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT
720
- MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0
721
- aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDIwNTIxMDQwMDAwWhcNMTgwODIxMDQwMDAw
722
- WjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE
723
- AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
724
- CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9m
725
- OSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIu
726
- T8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6c
727
- JmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmR
728
- Cw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5asz
729
- PeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo4HwMIHtMB8GA1UdIwQYMBaAFEjm
730
- aPkr0rKV10fYIyAQTzOYkJ/UMB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrM
731
- TjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjA6BgNVHR8EMzAxMC+g
732
- LaArhilodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9jcmxzL3NlY3VyZWNhLmNybDBO
733
- BgNVHSAERzBFMEMGBFUdIAAwOzA5BggrBgEFBQcCARYtaHR0cHM6Ly93d3cuZ2Vv
734
- dHJ1c3QuY29tL3Jlc291cmNlcy9yZXBvc2l0b3J5MA0GCSqGSIb3DQEBBQUAA4GB
735
- AHbhEm5OSxYShjAGsoEIz/AIx8dxfmbuwu3UOx//8PDITtZDOLC5MH0Y0FWDomrL
736
- NhGc6Ehmo21/uBPUR/6LWlxz/K7ZGzIZOKuXNBSqltLroxwUCEm2u+WR74M26x1W
737
- b8ravHNjkOR/ez4iyz0H7V84dJzjA1BOoa+Y7mHyhD8S
738
- -----END CERTIFICATE-----
1
+ # Certifcate Authority certificates for validating SSL connections.
2
+ #
3
+ # This file contains PEM format certificates generated from
4
+ # http://mxr.mozilla.org/seamonkey/source/security/nss/lib/ckfw/builtins/certdata.txt
5
+ #
6
+ # ***** BEGIN LICENSE BLOCK *****
7
+ # Version: MPL 1.1/GPL 2.0/LGPL 2.1
8
+ #
9
+ # The contents of this file are subject to the Mozilla Public License Version
10
+ # 1.1 (the "License"); you may not use this file except in compliance with
11
+ # the License. You may obtain a copy of the License at
12
+ # http://www.mozilla.org/MPL/
13
+ #
14
+ # Software distributed under the License is distributed on an "AS IS" basis,
15
+ # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
16
+ # for the specific language governing rights and limitations under the
17
+ # License.
18
+ #
19
+ # The Original Code is the Netscape security libraries.
20
+ #
21
+ # The Initial Developer of the Original Code is
22
+ # Netscape Communications Corporation.
23
+ # Portions created by the Initial Developer are Copyright (C) 1994-2000
24
+ # the Initial Developer. All Rights Reserved.
25
+ #
26
+ # Contributor(s):
27
+ #
28
+ # Alternatively, the contents of this file may be used under the terms of
29
+ # either the GNU General Public License Version 2 or later (the "GPL"), or
30
+ # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
31
+ # in which case the provisions of the GPL or the LGPL are applicable instead
32
+ # of those above. If you wish to allow use of your version of this file only
33
+ # under the terms of either the GPL or the LGPL, and not to allow others to
34
+ # use your version of this file under the terms of the MPL, indicate your
35
+ # decision by deleting the provisions above and replace them with the notice
36
+ # and other provisions required by the GPL or the LGPL. If you do not delete
37
+ # the provisions above, a recipient may use your version of this file under
38
+ # the terms of any one of the MPL, the GPL or the LGPL.
39
+ #
40
+ # ***** END LICENSE BLOCK *****
41
+
42
+ Verisign/RSA Secure Server CA
43
+ =============================
44
+
45
+ -----BEGIN CERTIFICATE-----
46
+ MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG
47
+ A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD
48
+ VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0
49
+ MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV
50
+ BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy
51
+ dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ
52
+ ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII
53
+ 0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI
54
+ uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI
55
+ hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3
56
+ YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc
57
+ 1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA==
58
+ -----END CERTIFICATE-----
59
+
60
+ Thawte Personal Basic CA
61
+ ========================
62
+
63
+ -----BEGIN CERTIFICATE-----
64
+ MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx
65
+ FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
66
+ VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
67
+ ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj
68
+ IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X
69
+ DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw
70
+ EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE
71
+ ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy
72
+ dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD
73
+ QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN
74
+ BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53
75
+ dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK
76
+ wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7
77
+ G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF
78
+ AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7
79
+ c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P
80
+ 9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ==
81
+ -----END CERTIFICATE-----
82
+
83
+ Thawte Personal Premium CA
84
+ ==========================
85
+
86
+ -----BEGIN CERTIFICATE-----
87
+ MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx
88
+ FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
89
+ VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
90
+ ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p
91
+ dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv
92
+ bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa
93
+ QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY
94
+ BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u
95
+ IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl
96
+ bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu
97
+ Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs
98
+ Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI
99
+ Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD
100
+ ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
101
+ SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH
102
+ b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh
103
+ KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ
104
+ -----END CERTIFICATE-----
105
+
106
+ Thawte Personal Freemail CA
107
+ ===========================
108
+
109
+ -----BEGIN CERTIFICATE-----
110
+ MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx
111
+ FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
112
+ VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
113
+ ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt
114
+ YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu
115
+ Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT
116
+ AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa
117
+ MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp
118
+ b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG
119
+ cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh
120
+ d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY
121
+ DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E
122
+ rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq
123
+ uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN
124
+ BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP
125
+ MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa
126
+ /RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei
127
+ gQ==
128
+ -----END CERTIFICATE-----
129
+
130
+ Thawte Server CA
131
+ ================
132
+
133
+ -----BEGIN CERTIFICATE-----
134
+ MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx
135
+ FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
136
+ VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
137
+ biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm
138
+ MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx
139
+ MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
140
+ DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3
141
+ dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl
142
+ cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3
143
+ DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD
144
+ gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91
145
+ yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX
146
+ L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj
147
+ EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG
148
+ 7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e
149
+ QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ
150
+ qdq5snUb9kLy78fyGPmJvKP/iiMucEc=
151
+ -----END CERTIFICATE-----
152
+
153
+ Thawte Premium Server CA
154
+ ========================
155
+
156
+ -----BEGIN CERTIFICATE-----
157
+ MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx
158
+ FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
159
+ VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
160
+ biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy
161
+ dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t
162
+ MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB
163
+ MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG
164
+ A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp
165
+ b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl
166
+ cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv
167
+ bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE
168
+ VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ
169
+ ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR
170
+ uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
171
+ 9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
172
+ hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM
173
+ pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==
174
+ -----END CERTIFICATE-----
175
+
176
+ Equifax Secure CA
177
+ =================
178
+
179
+ -----BEGIN CERTIFICATE-----
180
+ MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
181
+ UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
182
+ dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
183
+ MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
184
+ dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
185
+ AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
186
+ BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
187
+ cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
188
+ AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
189
+ MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
190
+ aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
191
+ ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
192
+ IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
193
+ MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
194
+ A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
195
+ 7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
196
+ 1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
197
+ -----END CERTIFICATE-----
198
+
199
+ Verisign Class 1 Public Primary Certification Authority
200
+ =======================================================
201
+
202
+ -----BEGIN CERTIFICATE-----
203
+ MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ
204
+ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh
205
+ c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05
206
+ NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD
207
+ VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp
208
+ bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB
209
+ jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N
210
+ H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR
211
+ 4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN
212
+ BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo
213
+ EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5
214
+ FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx
215
+ lA==
216
+ -----END CERTIFICATE-----
217
+
218
+ Verisign Class 2 Public Primary Certification Authority
219
+ =======================================================
220
+
221
+ -----BEGIN CERTIFICATE-----
222
+ MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG
223
+ A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
224
+ cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
225
+ MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
226
+ BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt
227
+ YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
228
+ ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh
229
+ YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7
230
+ FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G
231
+ CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg
232
+ J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc
233
+ r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY
234
+ -----END CERTIFICATE-----
235
+
236
+ Verisign Class 3 Public Primary Certification Authority
237
+ =======================================================
238
+
239
+ -----BEGIN CERTIFICATE-----
240
+ MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
241
+ A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
242
+ cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
243
+ MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
244
+ BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
245
+ YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
246
+ ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
247
+ BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
248
+ I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
249
+ CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
250
+ lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
251
+ AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
252
+ -----END CERTIFICATE-----
253
+
254
+ Verisign Class 1 Public Primary Certification Authority - G2
255
+ ============================================================
256
+
257
+ -----BEGIN CERTIFICATE-----
258
+ MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
259
+ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
260
+ c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
261
+ MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
262
+ emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
263
+ DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
264
+ FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg
265
+ UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
266
+ YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
267
+ MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
268
+ AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK
269
+ VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm
270
+ Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID
271
+ AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J
272
+ h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul
273
+ uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68
274
+ DzFc6PLZ
275
+ -----END CERTIFICATE-----
276
+
277
+ Verisign Class 2 Public Primary Certification Authority - G2
278
+ ============================================================
279
+
280
+ -----BEGIN CERTIFICATE-----
281
+ MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw
282
+ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns
283
+ YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
284
+ MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y
285
+ aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe
286
+ Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX
287
+ MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj
288
+ IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx
289
+ KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
290
+ eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B
291
+ AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM
292
+ HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw
293
+ DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC
294
+ AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji
295
+ nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX
296
+ rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn
297
+ jBJ7xUS0rg==
298
+ -----END CERTIFICATE-----
299
+
300
+ Verisign Class 3 Public Primary Certification Authority - G2
301
+ ============================================================
302
+
303
+ -----BEGIN CERTIFICATE-----
304
+ MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
305
+ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
306
+ c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
307
+ MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
308
+ emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
309
+ DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
310
+ FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg
311
+ UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
312
+ YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
313
+ MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
314
+ AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4
315
+ pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0
316
+ 13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID
317
+ AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk
318
+ U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i
319
+ F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY
320
+ oJ2daZH9
321
+ -----END CERTIFICATE-----
322
+
323
+ Verisign Class 4 Public Primary Certification Authority - G2
324
+ ============================================================
325
+
326
+ -----BEGIN CERTIFICATE-----
327
+ MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
328
+ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
329
+ c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
330
+ MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
331
+ emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
332
+ DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
333
+ FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg
334
+ UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
335
+ YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
336
+ MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
337
+ AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM
338
+ HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK
339
+ qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID
340
+ AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj
341
+ cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y
342
+ cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP
343
+ T8qAkbYp
344
+ -----END CERTIFICATE-----
345
+
346
+ Verisign Class 1 Public Primary Certification Authority - G3
347
+ ============================================================
348
+
349
+ -----BEGIN CERTIFICATE-----
350
+ MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw
351
+ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
352
+ cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
353
+ LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
354
+ aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
355
+ dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
356
+ VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
357
+ aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
358
+ bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
359
+ IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
360
+ LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4
361
+ nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO
362
+ 8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV
363
+ ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb
364
+ PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2
365
+ 6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr
366
+ n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a
367
+ qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4
368
+ wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3
369
+ ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs
370
+ pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4
371
+ E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g==
372
+ -----END CERTIFICATE-----
373
+
374
+ Verisign Class 2 Public Primary Certification Authority - G3
375
+ ============================================================
376
+
377
+ -----BEGIN CERTIFICATE-----
378
+ MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ
379
+ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy
380
+ aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s
381
+ IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp
382
+ Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
383
+ eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV
384
+ BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp
385
+ Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu
386
+ Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g
387
+ Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
388
+ IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU
389
+ J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO
390
+ JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY
391
+ wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o
392
+ koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN
393
+ qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E
394
+ Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe
395
+ xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u
396
+ 7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU
397
+ sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI
398
+ sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP
399
+ cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q
400
+ -----END CERTIFICATE-----
401
+
402
+ Verisign Class 3 Public Primary Certification Authority - G3
403
+ ============================================================
404
+
405
+ -----BEGIN CERTIFICATE-----
406
+ MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
407
+ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
408
+ cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
409
+ LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
410
+ aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
411
+ dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
412
+ VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
413
+ aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
414
+ bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
415
+ IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
416
+ LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b
417
+ N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t
418
+ KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu
419
+ kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm
420
+ CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
421
+ Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu
422
+ imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te
423
+ 2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe
424
+ DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
425
+ /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p
426
+ F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt
427
+ TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
428
+ -----END CERTIFICATE-----
429
+
430
+ Verisign Class 4 Public Primary Certification Authority - G3
431
+ ============================================================
432
+
433
+ -----BEGIN CERTIFICATE-----
434
+ MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
435
+ CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
436
+ cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
437
+ LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
438
+ aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
439
+ dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
440
+ VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
441
+ aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
442
+ bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
443
+ IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
444
+ LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1
445
+ GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ
446
+ +mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd
447
+ U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm
448
+ NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY
449
+ ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/
450
+ ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1
451
+ CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq
452
+ g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
453
+ fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c
454
+ 2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/
455
+ bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
456
+ -----END CERTIFICATE-----
457
+
458
+ Equifax Secure Global eBusiness CA
459
+ ==================================
460
+
461
+ -----BEGIN CERTIFICATE-----
462
+ MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc
463
+ MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT
464
+ ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw
465
+ MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj
466
+ dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l
467
+ c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC
468
+ UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc
469
+ 58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/
470
+ o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH
471
+ MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr
472
+ aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA
473
+ A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA
474
+ Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv
475
+ 8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
476
+ -----END CERTIFICATE-----
477
+
478
+ Equifax Secure eBusiness CA 1
479
+ =============================
480
+
481
+ -----BEGIN CERTIFICATE-----
482
+ MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc
483
+ MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT
484
+ ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw
485
+ MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j
486
+ LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ
487
+ KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo
488
+ RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu
489
+ WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw
490
+ Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD
491
+ AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK
492
+ eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM
493
+ zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+
494
+ WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN
495
+ /Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ==
496
+ -----END CERTIFICATE-----
497
+
498
+ Equifax Secure eBusiness CA 2
499
+ =============================
500
+
501
+ -----BEGIN CERTIFICATE-----
502
+ MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
503
+ UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj
504
+ dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0
505
+ NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD
506
+ VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B
507
+ AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G
508
+ vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/
509
+ BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C
510
+ AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX
511
+ MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl
512
+ IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw
513
+ NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq
514
+ y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF
515
+ MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
516
+ A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy
517
+ 0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1
518
+ E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN
519
+ -----END CERTIFICATE-----
520
+
521
+ Thawte Time Stamping CA
522
+ =======================
523
+
524
+ -----BEGIN CERTIFICATE-----
525
+ MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx
526
+ FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN
527
+ BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd
528
+ BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN
529
+ MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g
530
+ Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG
531
+ A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l
532
+ c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT
533
+ 6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa
534
+ Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL
535
+ 8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB
536
+ Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC
537
+ 9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ
538
+ pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ
539
+ CayJSdM=
540
+ -----END CERTIFICATE-----
541
+
542
+ thawte Primary Root CA
543
+ ======================
544
+
545
+ -----BEGIN CERTIFICATE-----
546
+ MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
547
+ qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
548
+ Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
549
+ MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
550
+ BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
551
+ NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
552
+ LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
553
+ A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
554
+ IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
555
+ SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
556
+ W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
557
+ 3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
558
+ 6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
559
+ Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
560
+ NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
561
+ MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
562
+ r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
563
+ DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
564
+ YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
565
+ xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
566
+ /qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
567
+ LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
568
+ jVaMaA==
569
+ -----END CERTIFICATE-----
570
+
571
+ VeriSign Class 3 Public Primary Certification Authority - G5
572
+ ============================================================
573
+
574
+ -----BEGIN CERTIFICATE-----
575
+ MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
576
+ yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
577
+ ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
578
+ U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
579
+ ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
580
+ aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
581
+ MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
582
+ ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
583
+ biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
584
+ U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
585
+ aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
586
+ nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
587
+ t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
588
+ SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
589
+ BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
590
+ rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
591
+ NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
592
+ BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
593
+ BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
594
+ aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
595
+ MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
596
+ p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
597
+ 5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
598
+ WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
599
+ 4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
600
+ hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
601
+ -----END CERTIFICATE-----
602
+
603
+ Entrust.net Secure Server Certification Authority
604
+ =================================================
605
+
606
+ -----BEGIN CERTIFICATE-----
607
+ MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
608
+ VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
609
+ ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
610
+ KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
611
+ ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
612
+ MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
613
+ ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
614
+ b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
615
+ bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
616
+ U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
617
+ A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
618
+ I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
619
+ wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
620
+ AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
621
+ oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
622
+ BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
623
+ dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
624
+ MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
625
+ b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
626
+ dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
627
+ MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
628
+ E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
629
+ MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
630
+ hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
631
+ 95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
632
+ 2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
633
+ -----END CERTIFICATE-----
634
+
635
+ Go Daddy Certification Authority Root Certificate Bundle
636
+ ========================================================
637
+
638
+ -----BEGIN CERTIFICATE-----
639
+ MIIE3jCCA8agAwIBAgICAwEwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCVVMx
640
+ ITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
641
+ RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMTYw
642
+ MTU0MzdaFw0yNjExMTYwMTU0MzdaMIHKMQswCQYDVQQGEwJVUzEQMA4GA1UECBMH
643
+ QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5j
644
+ b20sIEluYy4xMzAxBgNVBAsTKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5j
645
+ b20vcmVwb3NpdG9yeTEwMC4GA1UEAxMnR28gRGFkZHkgU2VjdXJlIENlcnRpZmlj
646
+ YXRpb24gQXV0aG9yaXR5MREwDwYDVQQFEwgwNzk2OTI4NzCCASIwDQYJKoZIhvcN
647
+ AQEBBQADggEPADCCAQoCggEBAMQt1RWMnCZM7DI161+4WQFapmGBWTtwY6vj3D3H
648
+ KrjJM9N55DrtPDAjhI6zMBS2sofDPZVUBJ7fmd0LJR4h3mUpfjWoqVTr9vcyOdQm
649
+ VZWt7/v+WIbXnvQAjYwqDL1CBM6nPwT27oDyqu9SoWlm2r4arV3aLGbqGmu75RpR
650
+ SgAvSMeYddi5Kcju+GZtCpyz8/x4fKL4o/K1w/O5epHBp+YlLpyo7RJlbmr2EkRT
651
+ cDCVw5wrWCs9CHRK8r5RsL+H0EwnWGu1NcWdrxcx+AuP7q2BNgWJCJjPOq8lh8BJ
652
+ 6qf9Z/dFjpfMFDniNoW1fho3/Rb2cRGadDAW/hOUoz+EDU8CAwEAAaOCATIwggEu
653
+ MB0GA1UdDgQWBBT9rGEyk2xF1uLuhV+auud2mWjM5zAfBgNVHSMEGDAWgBTSxLDS
654
+ kdRMEXGzYcs9of7dqGrU4zASBgNVHRMBAf8ECDAGAQH/AgEAMDMGCCsGAQUFBwEB
655
+ BCcwJTAjBggrBgEFBQcwAYYXaHR0cDovL29jc3AuZ29kYWRkeS5jb20wRgYDVR0f
656
+ BD8wPTA7oDmgN4Y1aHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBv
657
+ c2l0b3J5L2dkcm9vdC5jcmwwSwYDVR0gBEQwQjBABgRVHSAAMDgwNgYIKwYBBQUH
658
+ AgEWKmh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeTAO
659
+ BgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBANKGwOy9+aG2Z+5mC6IG
660
+ OgRQjhVyrEp0lVPLN8tESe8HkGsz2ZbwlFalEzAFPIUyIXvJxwqoJKSQ3kbTJSMU
661
+ A2fCENZvD117esyfxVgqwcSeIaha86ykRvOe5GPLL5CkKSkB2XIsKd83ASe8T+5o
662
+ 0yGPwLPk9Qnt0hCqU7S+8MxZC9Y7lhyVJEnfzuz9p0iRFEUOOjZv2kWzRaJBydTX
663
+ RE4+uXR21aITVSzGh6O1mawGhId/dQb8vxRMDsxuxN89txJx9OjxUUAiKEngHUuH
664
+ qDTMBqLdElrRhjZkAzVvb3du6/KFUJheqwNTrZEjYx8WnM25sgVjOuH0aBsXBTWV
665
+ U+4=
666
+ -----END CERTIFICATE-----
667
+ -----BEGIN CERTIFICATE-----
668
+ MIIE+zCCBGSgAwIBAgICAQ0wDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh
669
+ bGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu
670
+ Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g
671
+ QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAe
672
+ BgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDYyOTE3MDYyMFoX
673
+ DTI0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBE
674
+ YWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3MgMiBDZXJ0
675
+ aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgC
676
+ ggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
677
+ 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+q
678
+ N1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiO
679
+ r18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lN
680
+ f4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+YihfukEH
681
+ U1jPEX44dMX4/7VpkI+EdOqXG68CAQOjggHhMIIB3TAdBgNVHQ4EFgQU0sSw0pHU
682
+ TBFxs2HLPaH+3ahq1OMwgdIGA1UdIwSByjCBx6GBwaSBvjCBuzEkMCIGA1UEBxMb
683
+ VmFsaUNlcnQgVmFsaWRhdGlvbiBOZXR3b3JrMRcwFQYDVQQKEw5WYWxpQ2VydCwg
684
+ SW5jLjE1MDMGA1UECxMsVmFsaUNlcnQgQ2xhc3MgMiBQb2xpY3kgVmFsaWRhdGlv
685
+ biBBdXRob3JpdHkxITAfBgNVBAMTGGh0dHA6Ly93d3cudmFsaWNlcnQuY29tLzEg
686
+ MB4GCSqGSIb3DQEJARYRaW5mb0B2YWxpY2VydC5jb22CAQEwDwYDVR0TAQH/BAUw
687
+ AwEB/zAzBggrBgEFBQcBAQQnMCUwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLmdv
688
+ ZGFkZHkuY29tMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jZXJ0aWZpY2F0ZXMu
689
+ Z29kYWRkeS5jb20vcmVwb3NpdG9yeS9yb290LmNybDBLBgNVHSAERDBCMEAGBFUd
690
+ IAAwODA2BggrBgEFBQcCARYqaHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNv
691
+ bS9yZXBvc2l0b3J5MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOBgQC1
692
+ QPmnHfbq/qQaQlpE9xXUhUaJwL6e4+PrxeNYiY+Sn1eocSxI0YGyeR+sBjUZsE4O
693
+ WBsUs5iB0QQeyAfJg594RAoYC5jcdnplDQ1tgMQLARzLrUc+cb53S8wGd9D0Vmsf
694
+ SxOaFIqII6hR8INMqzW/Rn453HWkrugp++85j09VZw==
695
+ -----END CERTIFICATE-----
696
+ -----BEGIN CERTIFICATE-----
697
+ MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
698
+ IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
699
+ BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
700
+ aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
701
+ 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy
702
+ NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
703
+ azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
704
+ YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
705
+ Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
706
+ cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY
707
+ dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9
708
+ WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS
709
+ v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v
710
+ UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu
711
+ IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC
712
+ W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd
713
+ -----END CERTIFICATE-----
714
+
715
+ GeoTrust Global CA
716
+ ==================
717
+
718
+ -----BEGIN CERTIFICATE-----
719
+ MIIDfTCCAuagAwIBAgIDErvmMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT
720
+ MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0
721
+ aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDIwNTIxMDQwMDAwWhcNMTgwODIxMDQwMDAw
722
+ WjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE
723
+ AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
724
+ CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9m
725
+ OSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIu
726
+ T8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6c
727
+ JmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmR
728
+ Cw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5asz
729
+ PeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo4HwMIHtMB8GA1UdIwQYMBaAFEjm
730
+ aPkr0rKV10fYIyAQTzOYkJ/UMB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrM
731
+ TjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjA6BgNVHR8EMzAxMC+g
732
+ LaArhilodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9jcmxzL3NlY3VyZWNhLmNybDBO
733
+ BgNVHSAERzBFMEMGBFUdIAAwOzA5BggrBgEFBQcCARYtaHR0cHM6Ly93d3cuZ2Vv
734
+ dHJ1c3QuY29tL3Jlc291cmNlcy9yZXBvc2l0b3J5MA0GCSqGSIb3DQEBBQUAA4GB
735
+ AHbhEm5OSxYShjAGsoEIz/AIx8dxfmbuwu3UOx//8PDITtZDOLC5MH0Y0FWDomrL
736
+ NhGc6Ehmo21/uBPUR/6LWlxz/K7ZGzIZOKuXNBSqltLroxwUCEm2u+WR74M26x1W
737
+ b8ravHNjkOR/ez4iyz0H7V84dJzjA1BOoa+Y7mHyhD8S
738
+ -----END CERTIFICATE-----
src/LICENSE CHANGED
@@ -1,360 +1,360 @@
1
- ===============================================================================
2
-
3
- Symfony2 license:
4
-
5
- Copyright (c) 2004-2014 Fabien Potencier
6
-
7
- Permission is hereby granted, free of charge, to any person obtaining a copy
8
- of this software and associated documentation files (the "Software"), to deal
9
- in the Software without restriction, including without limitation the rights
10
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
- copies of the Software, and to permit persons to whom the Software is furnished
12
- to do so, subject to the following conditions:
13
-
14
- The above copyright notice and this permission notice shall be included in all
15
- copies or substantial portions of the Software.
16
-
17
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
- THE SOFTWARE.
24
-
25
- ===============================================================================
26
-
27
- Dropbox PHP SDK license:
28
-
29
- Copyright (c) 2013 Dropbox Inc., http://www.dropbox.com/
30
-
31
- Permission is hereby granted, free of charge, to any person obtaining
32
- a copy of this software and associated documentation files (the
33
- "Software"), to deal in the Software without restriction, including
34
- without limitation the rights to use, copy, modify, merge, publish,
35
- distribute, sublicense, and/or sell copies of the Software, and to
36
- permit persons to whom the Software is furnished to do so, subject to
37
- the following conditions:
38
-
39
- The above copyright notice and this permission notice shall be
40
- included in all copies or substantial portions of the Software.
41
-
42
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
43
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
44
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
45
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
46
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
47
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
48
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
49
-
50
- ===============================================================================
51
-
52
- gelf-php license:
53
-
54
- Copyright (c) 2010-2012 Lennart Koopmann
55
-
56
- Permission is hereby granted, free of charge, to any person obtaining
57
- a copy of this software and associated documentation files (the
58
- "Software"), to deal in the Software without restriction, including
59
- without limitation the rights to use, copy, modify, merge, publish,
60
- distribute, sublicense, and/or sell copies of the Software, and to
61
- permit persons to whom the Software is furnished to do so, subject to
62
- the following conditions:
63
-
64
- The above copyright notice and this permission notice shall be
65
- included in all copies or substantial portions of the Software.
66
-
67
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
68
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
69
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
70
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
71
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
72
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
73
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
74
-
75
- ===============================================================================
76
-
77
- Monolog - Logging for PHP license:
78
-
79
- Copyright (c) Jordi Boggiano
80
-
81
- Permission is hereby granted, free of charge, to any person obtaining a copy
82
- of this software and associated documentation files (the "Software"), to deal
83
- in the Software without restriction, including without limitation the rights
84
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
85
- copies of the Software, and to permit persons to whom the Software is furnished
86
- to do so, subject to the following conditions:
87
-
88
- The above copyright notice and this permission notice shall be included in all
89
- copies or substantial portions of the Software.
90
-
91
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
92
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
93
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
94
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
95
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
96
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
97
- THE SOFTWARE.
98
-
99
- ===============================================================================
100
-
101
- Amazon S3 PHP Class license:
102
-
103
- Copyright (c) 2013, Donovan Schönknecht. All rights reserved.
104
-
105
- Redistribution and use in source and binary forms, with or without
106
- modification, are permitted provided that the following conditions are met:
107
-
108
- - Redistributions of source code must retain the above copyright notice,
109
- this list of conditions and the following disclaimer.
110
- - Redistributions in binary form must reproduce the above copyright
111
- notice, this list of conditions and the following disclaimer in the
112
- documentation and/or other materials provided with the distribution.
113
-
114
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
115
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
116
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
117
- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
118
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
119
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
120
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
121
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
122
- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
123
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
124
- POSSIBILITY OF SUCH DAMAGE.
125
-
126
- Amazon S3 is a trademark of Amazon.com, Inc. or its affiliates.
127
-
128
- ===============================================================================
129
-
130
- Google APIs Client Library for PHP license:
131
-
132
- Apache License
133
- Version 2.0, January 2004
134
- http://www.apache.org/licenses/
135
-
136
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
137
-
138
- 1. Definitions.
139
-
140
- "License" shall mean the terms and conditions for use, reproduction,
141
- and distribution as defined by Sections 1 through 9 of this document.
142
-
143
- "Licensor" shall mean the copyright owner or entity authorized by
144
- the copyright owner that is granting the License.
145
-
146
- "Legal Entity" shall mean the union of the acting entity and all
147
- other entities that control, are controlled by, or are under common
148
- control with that entity. For the purposes of this definition,
149
- "control" means (i) the power, direct or indirect, to cause the
150
- direction or management of such entity, whether by contract or
151
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
152
- outstanding shares, or (iii) beneficial ownership of such entity.
153
-
154
- "You" (or "Your") shall mean an individual or Legal Entity
155
- exercising permissions granted by this License.
156
-
157
- "Source" form shall mean the preferred form for making modifications,
158
- including but not limited to software source code, documentation
159
- source, and configuration files.
160
-
161
- "Object" form shall mean any form resulting from mechanical
162
- transformation or translation of a Source form, including but
163
- not limited to compiled object code, generated documentation,
164
- and conversions to other media types.
165
-
166
- "Work" shall mean the work of authorship, whether in Source or
167
- Object form, made available under the License, as indicated by a
168
- copyright notice that is included in or attached to the work
169
- (an example is provided in the Appendix below).
170
-
171
- "Derivative Works" shall mean any work, whether in Source or Object
172
- form, that is based on (or derived from) the Work and for which the
173
- editorial revisions, annotations, elaborations, or other modifications
174
- represent, as a whole, an original work of authorship. For the purposes
175
- of this License, Derivative Works shall not include works that remain
176
- separable from, or merely link (or bind by name) to the interfaces of,
177
- the Work and Derivative Works thereof.
178
-
179
- "Contribution" shall mean any work of authorship, including
180
- the original version of the Work and any modifications or additions
181
- to that Work or Derivative Works thereof, that is intentionally
182
- submitted to Licensor for inclusion in the Work by the copyright owner
183
- or by an individual or Legal Entity authorized to submit on behalf of
184
- the copyright owner. For the purposes of this definition, "submitted"
185
- means any form of electronic, verbal, or written communication sent
186
- to the Licensor or its representatives, including but not limited to
187
- communication on electronic mailing lists, source code control systems,
188
- and issue tracking systems that are managed by, or on behalf of, the
189
- Licensor for the purpose of discussing and improving the Work, but
190
- excluding communication that is conspicuously marked or otherwise
191
- designated in writing by the copyright owner as "Not a Contribution."
192
-
193
- "Contributor" shall mean Licensor and any individual or Legal Entity
194
- on behalf of whom a Contribution has been received by Licensor and
195
- subsequently incorporated within the Work.
196
-
197
- 2. Grant of Copyright License. Subject to the terms and conditions of
198
- this License, each Contributor hereby grants to You a perpetual,
199
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
200
- copyright license to reproduce, prepare Derivative Works of,
201
- publicly display, publicly perform, sublicense, and distribute the
202
- Work and such Derivative Works in Source or Object form.
203
-
204
- 3. Grant of Patent License. Subject to the terms and conditions of
205
- this License, each Contributor hereby grants to You a perpetual,
206
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
207
- (except as stated in this section) patent license to make, have made,
208
- use, offer to sell, sell, import, and otherwise transfer the Work,
209
- where such license applies only to those patent claims licensable
210
- by such Contributor that are necessarily infringed by their
211
- Contribution(s) alone or by combination of their Contribution(s)
212
- with the Work to which such Contribution(s) was submitted. If You
213
- institute patent litigation against any entity (including a
214
- cross-claim or counterclaim in a lawsuit) alleging that the Work
215
- or a Contribution incorporated within the Work constitutes direct
216
- or contributory patent infringement, then any patent licenses
217
- granted to You under this License for that Work shall terminate
218
- as of the date such litigation is filed.
219
-
220
- 4. Redistribution. You may reproduce and distribute copies of the
221
- Work or Derivative Works thereof in any medium, with or without
222
- modifications, and in Source or Object form, provided that You
223
- meet the following conditions:
224
-
225
- (a) You must give any other recipients of the Work or
226
- Derivative Works a copy of this License; and
227
-
228
- (b) You must cause any modified files to carry prominent notices
229
- stating that You changed the files; and
230
-
231
- (c) You must retain, in the Source form of any Derivative Works
232
- that You distribute, all copyright, patent, trademark, and
233
- attribution notices from the Source form of the Work,
234
- excluding those notices that do not pertain to any part of
235
- the Derivative Works; and
236
-
237
- (d) If the Work includes a "NOTICE" text file as part of its
238
- distribution, then any Derivative Works that You distribute must
239
- include a readable copy of the attribution notices contained
240
- within such NOTICE file, excluding those notices that do not
241
- pertain to any part of the Derivative Works, in at least one
242
- of the following places: within a NOTICE text file distributed
243
- as part of the Derivative Works; within the Source form or
244
- documentation, if provided along with the Derivative Works; or,
245
- within a display generated by the Derivative Works, if and
246
- wherever such third-party notices normally appear. The contents
247
- of the NOTICE file are for informational purposes only and
248
- do not modify the License. You may add Your own attribution
249
- notices within Derivative Works that You distribute, alongside
250
- or as an addendum to the NOTICE text from the Work, provided
251
- that such additional attribution notices cannot be construed
252
- as modifying the License.
253
-
254
- You may add Your own copyright statement to Your modifications and
255
- may provide additional or different license terms and conditions
256
- for use, reproduction, or distribution of Your modifications, or
257
- for any such Derivative Works as a whole, provided Your use,
258
- reproduction, and distribution of the Work otherwise complies with
259
- the conditions stated in this License.
260
-
261
- 5. Submission of Contributions. Unless You explicitly state otherwise,
262
- any Contribution intentionally submitted for inclusion in the Work
263
- by You to the Licensor shall be under the terms and conditions of
264
- this License, without any additional terms or conditions.
265
- Notwithstanding the above, nothing herein shall supersede or modify
266
- the terms of any separate license agreement you may have executed
267
- with Licensor regarding such Contributions.
268
-
269
- 6. Trademarks. This License does not grant permission to use the trade
270
- names, trademarks, service marks, or product names of the Licensor,
271
- except as required for reasonable and customary use in describing the
272
- origin of the Work and reproducing the content of the NOTICE file.
273
-
274
- 7. Disclaimer of Warranty. Unless required by applicable law or
275
- agreed to in writing, Licensor provides the Work (and each
276
- Contributor provides its Contributions) on an "AS IS" BASIS,
277
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
278
- implied, including, without limitation, any warranties or conditions
279
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
280
- PARTICULAR PURPOSE. You are solely responsible for determining the
281
- appropriateness of using or redistributing the Work and assume any
282
- risks associated with Your exercise of permissions under this License.
283
-
284
- 8. Limitation of Liability. In no event and under no legal theory,
285
- whether in tort (including negligence), contract, or otherwise,
286
- unless required by applicable law (such as deliberate and grossly
287
- negligent acts) or agreed to in writing, shall any Contributor be
288
- liable to You for damages, including any direct, indirect, special,
289
- incidental, or consequential damages of any character arising as a
290
- result of this License or out of the use or inability to use the
291
- Work (including but not limited to damages for loss of goodwill,
292
- work stoppage, computer failure or malfunction, or any and all
293
- other commercial damages or losses), even if such Contributor
294
- has been advised of the possibility of such damages.
295
-
296
- 9. Accepting Warranty or Additional Liability. While redistributing
297
- the Work or Derivative Works thereof, You may choose to offer,
298
- and charge a fee for, acceptance of support, warranty, indemnity,
299
- or other liability obligations and/or rights consistent with this
300
- License. However, in accepting such obligations, You may act only
301
- on Your own behalf and on Your sole responsibility, not on behalf
302
- of any other Contributor, and only if You agree to indemnify,
303
- defend, and hold each Contributor harmless for any liability
304
- incurred by, or claims asserted against, such Contributor by reason
305
- of your accepting any such warranty or additional liability.
306
-
307
- END OF TERMS AND CONDITIONS
308
-
309
- APPENDIX: How to apply the Apache License to your work.
310
-
311
- To apply the Apache License to your work, attach the following
312
- boilerplate notice, with the fields enclosed by brackets "[]"
313
- replaced with your own identifying information. (Don't include
314
- the brackets!) The text should be enclosed in the appropriate
315
- comment syntax for the file format. We also recommend that a
316
- file or class name and description of purpose be included on the
317
- same "printed page" as the copyright notice for easier
318
- identification within third-party archives.
319
-
320
- Copyright [yyyy] [name of copyright owner]
321
-
322
- Licensed under the Apache License, Version 2.0 (the "License");
323
- you may not use this file except in compliance with the License.
324
- You may obtain a copy of the License at
325
-
326
- http://www.apache.org/licenses/LICENSE-2.0
327
-
328
- Unless required by applicable law or agreed to in writing, software
329
- distributed under the License is distributed on an "AS IS" BASIS,
330
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
331
- See the License for the specific language governing permissions and
332
- limitations under the License.
333
-
334
- ===============================================================================
335
-
336
- PHPSecLib license:
337
-
338
- Copyright 2007-2013 TerraFrost and other contributors
339
- http://phpseclib.sourceforge.net/
340
-
341
- Permission is hereby granted, free of charge, to any person obtaining
342
- a copy of this software and associated documentation files (the
343
- "Software"), to deal in the Software without restriction, including
344
- without limitation the rights to use, copy, modify, merge, publish,
345
- distribute, sublicense, and/or sell copies of the Software, and to
346
- permit persons to whom the Software is furnished to do so, subject to
347
- the following conditions:
348
-
349
- The above copyright notice and this permission notice shall be
350
- included in all copies or substantial portions of the Software.
351
-
352
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
353
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
354
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
355
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
356
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
357
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
358
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
359
-
360
- ===============================================================================
1
+ ===============================================================================
2
+
3
+ Symfony2 license:
4
+
5
+ Copyright (c) 2004-2014 Fabien Potencier
6
+
7
+ Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ of this software and associated documentation files (the "Software"), to deal
9
+ in the Software without restriction, including without limitation the rights
10
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ copies of the Software, and to permit persons to whom the Software is furnished
12
+ to do so, subject to the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be included in all
15
+ copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
+ THE SOFTWARE.
24
+
25
+ ===============================================================================
26
+
27
+ Dropbox PHP SDK license:
28
+
29
+ Copyright (c) 2013 Dropbox Inc., http://www.dropbox.com/
30
+
31
+ Permission is hereby granted, free of charge, to any person obtaining
32
+ a copy of this software and associated documentation files (the
33
+ "Software"), to deal in the Software without restriction, including
34
+ without limitation the rights to use, copy, modify, merge, publish,
35
+ distribute, sublicense, and/or sell copies of the Software, and to
36
+ permit persons to whom the Software is furnished to do so, subject to
37
+ the following conditions:
38
+
39
+ The above copyright notice and this permission notice shall be
40
+ included in all copies or substantial portions of the Software.
41
+
42
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
43
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
44
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
45
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
46
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
47
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
48
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
49
+
50
+ ===============================================================================
51
+
52
+ gelf-php license:
53
+
54
+ Copyright (c) 2010-2012 Lennart Koopmann
55
+
56
+ Permission is hereby granted, free of charge, to any person obtaining
57
+ a copy of this software and associated documentation files (the
58
+ "Software"), to deal in the Software without restriction, including
59
+ without limitation the rights to use, copy, modify, merge, publish,
60
+ distribute, sublicense, and/or sell copies of the Software, and to
61
+ permit persons to whom the Software is furnished to do so, subject to
62
+ the following conditions:
63
+
64
+ The above copyright notice and this permission notice shall be
65
+ included in all copies or substantial portions of the Software.
66
+
67
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
68
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
69
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
70
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
71
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
72
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
73
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
74
+
75
+ ===============================================================================
76
+
77
+ Monolog - Logging for PHP license:
78
+
79
+ Copyright (c) Jordi Boggiano
80
+
81
+ Permission is hereby granted, free of charge, to any person obtaining a copy
82
+ of this software and associated documentation files (the "Software"), to deal
83
+ in the Software without restriction, including without limitation the rights
84
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
85
+ copies of the Software, and to permit persons to whom the Software is furnished
86
+ to do so, subject to the following conditions:
87
+
88
+ The above copyright notice and this permission notice shall be included in all
89
+ copies or substantial portions of the Software.
90
+
91
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
92
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
93
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
94
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
95
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
96
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
97
+ THE SOFTWARE.
98
+
99
+ ===============================================================================
100
+
101
+ Amazon S3 PHP Class license:
102
+
103
+ Copyright (c) 2013, Donovan Schönknecht. All rights reserved.
104
+
105
+ Redistribution and use in source and binary forms, with or without
106
+ modification, are permitted provided that the following conditions are met:
107
+
108
+ - Redistributions of source code must retain the above copyright notice,
109
+ this list of conditions and the following disclaimer.
110
+ - Redistributions in binary form must reproduce the above copyright
111
+ notice, this list of conditions and the following disclaimer in the
112
+ documentation and/or other materials provided with the distribution.
113
+
114
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
115
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
116
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
117
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
118
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
119
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
120
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
121
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
122
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
123
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
124
+ POSSIBILITY OF SUCH DAMAGE.
125
+
126
+ Amazon S3 is a trademark of Amazon.com, Inc. or its affiliates.
127
+
128
+ ===============================================================================
129
+
130
+ Google APIs Client Library for PHP license:
131
+
132
+ Apache License
133
+ Version 2.0, January 2004
134
+ http://www.apache.org/licenses/
135
+
136
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
137
+
138
+ 1. Definitions.
139
+
140
+ "License" shall mean the terms and conditions for use, reproduction,
141
+ and distribution as defined by Sections 1 through 9 of this document.
142
+
143
+ "Licensor" shall mean the copyright owner or entity authorized by
144
+ the copyright owner that is granting the License.
145
+
146
+ "Legal Entity" shall mean the union of the acting entity and all
147
+ other entities that control, are controlled by, or are under common
148
+ control with that entity. For the purposes of this definition,
149
+ "control" means (i) the power, direct or indirect, to cause the
150
+ direction or management of such entity, whether by contract or
151
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
152
+ outstanding shares, or (iii) beneficial ownership of such entity.
153
+
154
+ "You" (or "Your") shall mean an individual or Legal Entity
155
+ exercising permissions granted by this License.
156
+
157
+ "Source" form shall mean the preferred form for making modifications,
158
+ including but not limited to software source code, documentation
159
+ source, and configuration files.
160
+
161
+ "Object" form shall mean any form resulting from mechanical
162
+ transformation or translation of a Source form, including but
163
+ not limited to compiled object code, generated documentation,
164
+ and conversions to other media types.
165
+
166
+ "Work" shall mean the work of authorship, whether in Source or
167
+ Object form, made available under the License, as indicated by a
168
+ copyright notice that is included in or attached to the work
169
+ (an example is provided in the Appendix below).
170
+
171
+ "Derivative Works" shall mean any work, whether in Source or Object
172
+ form, that is based on (or derived from) the Work and for which the
173
+ editorial revisions, annotations, elaborations, or other modifications
174
+ represent, as a whole, an original work of authorship. For the purposes
175
+ of this License, Derivative Works shall not include works that remain
176
+ separable from, or merely link (or bind by name) to the interfaces of,
177
+ the Work and Derivative Works thereof.
178
+
179
+ "Contribution" shall mean any work of authorship, including
180
+ the original version of the Work and any modifications or additions
181
+ to that Work or Derivative Works thereof, that is intentionally
182
+ submitted to Licensor for inclusion in the Work by the copyright owner
183
+ or by an individual or Legal Entity authorized to submit on behalf of
184
+ the copyright owner. For the purposes of this definition, "submitted"
185
+ means any form of electronic, verbal, or written communication sent
186
+ to the Licensor or its representatives, including but not limited to
187
+ communication on electronic mailing lists, source code control systems,
188
+ and issue tracking systems that are managed by, or on behalf of, the
189
+ Licensor for the purpose of discussing and improving the Work, but
190
+ excluding communication that is conspicuously marked or otherwise
191
+ designated in writing by the copyright owner as "Not a Contribution."
192
+
193
+ "Contributor" shall mean Licensor and any individual or Legal Entity
194
+ on behalf of whom a Contribution has been received by Licensor and
195
+ subsequently incorporated within the Work.
196
+
197
+ 2. Grant of Copyright License. Subject to the terms and conditions of
198
+ this License, each Contributor hereby grants to You a perpetual,
199
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
200
+ copyright license to reproduce, prepare Derivative Works of,
201
+ publicly display, publicly perform, sublicense, and distribute the
202
+ Work and such Derivative Works in Source or Object form.
203
+
204
+ 3. Grant of Patent License. Subject to the terms and conditions of
205
+ this License, each Contributor hereby grants to You a perpetual,
206
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
207
+ (except as stated in this section) patent license to make, have made,
208
+ use, offer to sell, sell, import, and otherwise transfer the Work,
209
+ where such license applies only to those patent claims licensable
210
+ by such Contributor that are necessarily infringed by their
211
+ Contribution(s) alone or by combination of their Contribution(s)
212
+ with the Work to which such Contribution(s) was submitted. If You
213
+ institute patent litigation against any entity (including a
214
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
215
+ or a Contribution incorporated within the Work constitutes direct
216
+ or contributory patent infringement, then any patent licenses
217
+ granted to You under this License for that Work shall terminate
218
+ as of the date such litigation is filed.
219
+
220
+ 4. Redistribution. You may reproduce and distribute copies of the
221
+ Work or Derivative Works thereof in any medium, with or without
222
+ modifications, and in Source or Object form, provided that You
223
+ meet the following conditions:
224
+
225
+ (a) You must give any other recipients of the Work or
226
+ Derivative Works a copy of this License; and
227
+
228
+ (b) You must cause any modified files to carry prominent notices
229
+ stating that You changed the files; and
230
+
231
+ (c) You must retain, in the Source form of any Derivative Works
232
+ that You distribute, all copyright, patent, trademark, and
233
+ attribution notices from the Source form of the Work,
234
+ excluding those notices that do not pertain to any part of
235
+ the Derivative Works; and
236
+
237
+ (d) If the Work includes a "NOTICE" text file as part of its
238
+ distribution, then any Derivative Works that You distribute must
239
+ include a readable copy of the attribution notices contained
240
+ within such NOTICE file, excluding those notices that do not
241
+ pertain to any part of the Derivative Works, in at least one
242
+ of the following places: within a NOTICE text file distributed
243
+ as part of the Derivative Works; within the Source form or
244
+ documentation, if provided along with the Derivative Works; or,
245
+ within a display generated by the Derivative Works, if and
246
+ wherever such third-party notices normally appear. The contents
247
+ of the NOTICE file are for informational purposes only and
248
+ do not modify the License. You may add Your own attribution
249
+ notices within Derivative Works that You distribute, alongside
250
+ or as an addendum to the NOTICE text from the Work, provided
251
+ that such additional attribution notices cannot be construed
252
+ as modifying the License.
253
+
254
+ You may add Your own copyright statement to Your modifications and
255
+ may provide additional or different license terms and conditions
256
+ for use, reproduction, or distribution of Your modifications, or
257
+ for any such Derivative Works as a whole, provided Your use,
258
+ reproduction, and distribution of the Work otherwise complies with
259
+ the conditions stated in this License.
260
+
261
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
262
+ any Contribution intentionally submitted for inclusion in the Work
263
+ by You to the Licensor shall be under the terms and conditions of
264
+ this License, without any additional terms or conditions.
265
+ Notwithstanding the above, nothing herein shall supersede or modify
266
+ the terms of any separate license agreement you may have executed
267
+ with Licensor regarding such Contributions.
268
+
269
+ 6. Trademarks. This License does not grant permission to use the trade
270
+ names, trademarks, service marks, or product names of the Licensor,
271
+ except as required for reasonable and customary use in describing the
272
+ origin of the Work and reproducing the content of the NOTICE file.
273
+
274
+ 7. Disclaimer of Warranty. Unless required by applicable law or
275
+ agreed to in writing, Licensor provides the Work (and each
276
+ Contributor provides its Contributions) on an "AS IS" BASIS,
277
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
278
+ implied, including, without limitation, any warranties or conditions
279
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
280
+ PARTICULAR PURPOSE. You are solely responsible for determining the
281
+ appropriateness of using or redistributing the Work and assume any
282
+ risks associated with Your exercise of permissions under this License.
283
+
284
+ 8. Limitation of Liability. In no event and under no legal theory,
285
+ whether in tort (including negligence), contract, or otherwise,
286
+ unless required by applicable law (such as deliberate and grossly
287
+ negligent acts) or agreed to in writing, shall any Contributor be
288
+ liable to You for damages, including any direct, indirect, special,
289
+ incidental, or consequential damages of any character arising as a
290
+ result of this License or out of the use or inability to use the
291
+ Work (including but not limited to damages for loss of goodwill,
292
+ work stoppage, computer failure or malfunction, or any and all
293
+ other commercial damages or losses), even if such Contributor
294
+ has been advised of the possibility of such damages.
295
+
296
+ 9. Accepting Warranty or Additional Liability. While redistributing
297
+ the Work or Derivative Works thereof, You may choose to offer,
298
+ and charge a fee for, acceptance of support, warranty, indemnity,
299
+ or other liability obligations and/or rights consistent with this
300
+ License. However, in accepting such obligations, You may act only
301
+ on Your own behalf and on Your sole responsibility, not on behalf
302
+ of any other Contributor, and only if You agree to indemnify,
303
+ defend, and hold each Contributor harmless for any liability
304
+ incurred by, or claims asserted against, such Contributor by reason
305
+ of your accepting any such warranty or additional liability.
306
+
307
+ END OF TERMS AND CONDITIONS
308
+
309
+ APPENDIX: How to apply the Apache License to your work.
310
+
311
+ To apply the Apache License to your work, attach the following
312
+ boilerplate notice, with the fields enclosed by brackets "[]"
313
+ replaced with your own identifying information. (Don't include
314
+ the brackets!) The text should be enclosed in the appropriate
315
+ comment syntax for the file format. We also recommend that a
316
+ file or class name and description of purpose be included on the
317
+ same "printed page" as the copyright notice for easier
318
+ identification within third-party archives.
319
+
320
+ Copyright [yyyy] [name of copyright owner]
321
+
322
+ Licensed under the Apache License, Version 2.0 (the "License");
323
+ you may not use this file except in compliance with the License.
324
+ You may obtain a copy of the License at
325
+
326
+ http://www.apache.org/licenses/LICENSE-2.0
327
+
328
+ Unless required by applicable law or agreed to in writing, software
329
+ distributed under the License is distributed on an "AS IS" BASIS,
330
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
331
+ See the License for the specific language governing permissions and
332
+ limitations under the License.
333
+
334
+ ===============================================================================
335
+
336
+ PHPSecLib license:
337
+
338
+ Copyright 2007-2013 TerraFrost and other contributors
339
+ http://phpseclib.sourceforge.net/
340
+
341
+ Permission is hereby granted, free of charge, to any person obtaining
342
+ a copy of this software and associated documentation files (the
343
+ "Software"), to deal in the Software without restriction, including
344
+ without limitation the rights to use, copy, modify, merge, publish,
345
+ distribute, sublicense, and/or sell copies of the Software, and to
346
+ permit persons to whom the Software is furnished to do so, subject to
347
+ the following conditions:
348
+
349
+ The above copyright notice and this permission notice shall be
350
+ included in all copies or substantial portions of the Software.
351
+
352
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
353
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
354
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
355
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
356
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
357
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
358
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
359
+
360
+ ===============================================================================
src/MMB/Backup.php CHANGED
@@ -16,12 +16,19 @@
16
  */
17
  class MMB_Backup extends MMB_Core
18
  {
 
19
  public $site_name;
 
20
  public $statuses;
 
21
  public $tasks;
 
22
  public $s3;
 
23
  public $ftp;
 
24
  public $dropbox;
 
25
  public $google_drive;
26
 
27
  private static $zip_errors = array(
@@ -154,11 +161,26 @@ class MMB_Backup extends MMB_Core
154
  {
155
  //$params => [$task_name, $args, $error]
156
  if (!empty($params)) {
157
- //Make sure backup cron job is set
158
- /*if (!wp_next_scheduled('mwp_backup_tasks')) {
159
- wp_schedule_event(time(), 'tenminutes', 'mwp_backup_tasks');
160
- }*/
161
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
162
  extract($params);
163
 
164
  //$before = $this->get_backup_settings();
@@ -178,11 +200,7 @@ class MMB_Backup extends MMB_Core
178
  }
179
 
180
  $before[$task_name]['task_args'] = $args;
181
- if (!empty($args['schedule']) && strlen($args['schedule'])) {
182
- $before[$task_name]['task_args']['next'] = $this->schedule_next($args['type'], $args['schedule']);
183
- }
184
-
185
- $return = $before[$task_name];
186
  }
187
 
188
  //Update with error
@@ -202,10 +220,10 @@ class MMB_Backup extends MMB_Core
202
  }
203
 
204
  $this->update_tasks($before);
205
- //update_option('mwp_backup_tasks', $before);
206
 
207
  if ($task_name == 'Backup Now') {
208
- $result = $this->backup($args, $task_name);
 
209
  $backup_settings = $this->tasks;
210
 
211
  if (is_array($result) && array_key_exists('error', $result)) {
@@ -221,109 +239,16 @@ class MMB_Backup extends MMB_Core
221
  return false;
222
  }
223
 
224
- /**
225
- * Checks if scheduled task is ready for execution,
226
- * if it is ready master sends google_drive_token, failed_emails, success_emails if are needed.
227
- * @deprecated deprecated since version 3.9.29
228
- * @return void
229
- */
230
- public function check_backup_tasks()
231
- {
232
- $this->check_cron_remove();
233
-
234
- $failed_emails = array();
235
- $settings = $this->tasks;
236
- if (is_array($settings) && !empty($settings)) {
237
- foreach ($settings as $task_name => $setting) {
238
- if (isset($setting['task_args']['next']) && $setting['task_args']['next'] < time()) {
239
- //if ($setting['task_args']['next'] && $_GET['force_backup']) {
240
- if ($setting['task_args']['url'] && $setting['task_args']['task_id'] && $setting['task_args']['site_key']) {
241
- //Check orphan task
242
- $check_data = array(
243
- 'task_name' => $task_name,
244
- 'task_id' => $setting['task_args']['task_id'],
245
- 'site_key' => $setting['task_args']['site_key'],
246
- 'worker_version' => $GLOBALS['MMB_WORKER_VERSION'],
247
- );
248
-
249
- if (isset($setting['task_args']['account_info']['mwp_google_drive']['google_drive_token'])) {
250
- $check_data['mwp_google_drive_refresh_token'] = true;
251
- }
252
-
253
- $check = $this->validate_task($check_data, $setting['task_args']['url']);
254
- if ($check == 'paused' || $check == 'deleted') {
255
- continue;
256
- }
257
- $worker_upto_3_9_22 = ($GLOBALS['MMB_WORKER_VERSION'] <= '3.9.22'); // worker version is less or equals to 3.9.22
258
-
259
- // This is the patch done in worker 3.9.22 because old worked provided message in the following format:
260
- // token - not found or token - {...json...}
261
- // The new message is a serialized string with google_drive_token or message.
262
- if ($worker_upto_3_9_22) {
263
- $potential_token = substr($check, 8);
264
- if (substr($check, 0, 8) == 'token - ' && $potential_token != 'not found') {
265
- $this->tasks[$task_name]['task_args']['account_info']['mwp_google_drive']['google_drive_token'] = $potential_token;
266
- $settings[$task_name]['task_args']['account_info']['mwp_google_drive']['google_drive_token'] = $potential_token;
267
- $setting['task_args']['account_info']['mwp_google_drive']['google_drive_token'] = $potential_token;
268
- }
269
- } else {
270
- $potential_token = isset($check['google_drive_token']) ? $check['google_drive_token'] : false;
271
- if ($potential_token) {
272
- $this->tasks[$task_name]['task_args']['account_info']['mwp_google_drive']['google_drive_token'] = $potential_token;
273
- $settings[$task_name]['task_args']['account_info']['mwp_google_drive']['google_drive_token'] = $potential_token;
274
- $setting['task_args']['account_info']['mwp_google_drive']['google_drive_token'] = $potential_token;
275
- }
276
- }
277
- }
278
-
279
- $update = array(
280
- 'task_name' => $task_name,
281
- 'args' => $settings[$task_name]['task_args'],
282
- );
283
-
284
- if ($check != 'paused') {
285
- $update['time'] = time();
286
- }
287
-
288
- //Update task with next schedule
289
- $this->set_backup_task($update);
290
-
291
- if ($check == 'paused') {
292
- continue;
293
- }
294
-
295
- $result = $this->backup($setting['task_args'], $task_name);
296
- $error = '';
297
-
298
- if (is_array($result) && array_key_exists('error', $result)) {
299
- $error = $result;
300
- $this->set_backup_task(
301
- array(
302
- 'task_name' => $task_name,
303
- 'args' => $settings[$task_name]['task_args'],
304
- 'error' => $error,
305
- ));
306
- } else {
307
- if (@count($setting['task_args']['account_info'])) {
308
- $this->mwp_remote_upload($task_name);
309
- }
310
- }
311
-
312
- break; //Only one backup per cron
313
- }
314
- }
315
- }
316
- }
317
-
318
  /**
319
  * Runs backup task invoked from ManageWP master.
320
  *
321
- * @param string $task_name name of backup task
322
  * @param string|bool[optional] $google_drive_token false if backup destination is not Google Drive, json of Google Drive token if it is remote destination (default: false)
 
323
  *
324
  * @return mixed array with backup statistics if successful, array with error message if not
325
  */
326
- public function task_now($task_name, $google_drive_token = false)
327
  {
328
  if ($google_drive_token) {
329
  $this->tasks[$task_name]['task_args']['account_info']['mwp_google_drive']['google_drive_token'] = $google_drive_token;
@@ -343,7 +268,7 @@ class MMB_Backup extends MMB_Core
343
  ));
344
 
345
  //Run backup
346
- $result = $this->backup($setting['task_args'], $task_name);
347
 
348
  //Check for error
349
  if (is_array($result) && array_key_exists('error', $result)) {
@@ -363,17 +288,18 @@ class MMB_Backup extends MMB_Core
363
  * Backup a full wordpress instance, including a database dump, which is placed in mwp_db dir in root folder.
364
  * All backups are compressed by zip and placed in wp-content/managewp/backups folder.
365
  *
366
- * @param string $args arguments passed from master
367
  * [type] -> db, full
368
  * [what] -> daily, weekly, monthly
369
  * [account_info] -> remote destinations ftp, amazons3, dropbox, google_drive, email with their parameters
370
  * [include] -> array of folders from site root which are included to backup (wp-admin, wp-content, wp-includes are default)
371
  * [exclude] -> array of files of folders to exclude, relative to site's root
372
  * @param bool|string[optional] $task_name the name of backup task, which backup is done (default: false)
 
373
  *
374
  * @return bool|array false if $args are missing, array with error if error has occured, ture if is successful
375
  */
376
- public function backup($args, $task_name = false)
377
  {
378
  if (!$args || empty($args)) {
379
  return false;
@@ -476,6 +402,9 @@ class MMB_Backup extends MMB_Core
476
  }
477
 
478
  $paths['duration'] = $duration.'s';
 
 
 
479
 
480
  if ($task_name != 'Backup Now') {
481
  $paths['server'] = array(
@@ -509,7 +438,10 @@ class MMB_Backup extends MMB_Core
509
  }
510
 
511
  if (isset($backup_settings[$task_name]['task_args']['account_info']['mwp_google_drive'])) {
512
- $paths['google_drive'] = basename($backup_url);
 
 
 
513
  }
514
 
515
  $temp = $backup_settings[$task_name]['task_results'];
@@ -525,7 +457,6 @@ class MMB_Backup extends MMB_Core
525
 
526
  $backup_settings[$task_name]['task_results'] = $temp;
527
  $this->update_tasks($backup_settings);
528
- //update_option('mwp_backup_tasks', $backup_settings);
529
  }
530
 
531
  // If there are not remote destination, set up task status to finished
@@ -540,10 +471,10 @@ class MMB_Backup extends MMB_Core
540
  * Backup a full wordpress instance, including a database dump, which is placed in mwp_db dir in root folder.
541
  * All backups are compressed by zip and placed in wp-content/managewp/backups folder.
542
  *
543
- * @param string $task_name the name of backup task, which backup is done
544
- * @param string $backup_file relative path to file which backup is stored
545
- * @param array [optional] $exclude the list of files and folders, which are excluded from backup (default: array())
546
- * @param array [optional] $include the list of folders in wordpress root which are included to backup, expect wp-admin, wp-content, wp-includes, which are default (default: array())
547
  *
548
  * @return bool|array true if backup is successful, or an array with error message if is failed
549
  */
@@ -602,7 +533,7 @@ class MMB_Backup extends MMB_Core
602
  @unlink($db_result);
603
  @rmdir(MWP_DB_DIR);
604
 
605
- $remove = array(
606
  trim(basename(WP_CONTENT_DIR))."/managewp/backups",
607
  trim(basename(WP_CONTENT_DIR))."/infinitewp/backups",
608
  trim(basename(WP_CONTENT_DIR))."/".md5('mmb-worker')."/mwp_backups",
@@ -613,6 +544,7 @@ class MMB_Backup extends MMB_Core
613
  trim(basename(WP_CONTENT_DIR))."/old-cache",
614
  trim(basename(WP_CONTENT_DIR))."/uploads/backupbuddy_backups",
615
  trim(basename(WP_CONTENT_DIR))."/w3tc",
 
616
  "dbcache",
617
  "pgcache",
618
  "objectcache",
@@ -1193,12 +1125,10 @@ class MMB_Backup extends MMB_Core
1193
  if (!$zip_db_result) {
1194
  $zip_archive_db_result = false;
1195
  if (class_exists("ZipArchive")) {
1196
- $this->_log("DB zip, fallback to ZipArchive");
1197
  $zip_archive_db_result = $this->zip_archive_backup_db($task_name, $db_result, $backup_file);
1198
  }
1199
 
1200
  if (!$zip_archive_db_result) {
1201
- $this->_log("DB zip, fallback to PclZip");
1202
  $pclzip_db_result = $this->pclzip_backup_db($task_name, $backup_file);
1203
  if (!$pclzip_db_result) {
1204
  @unlink(MWP_BACKUP_DIR.'/mwp_db/index.php');
@@ -1491,10 +1421,28 @@ class MMB_Backup extends MMB_Core
1491
  return false;
1492
  }
1493
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1494
  if (isset($params['google_drive_token'])) {
1495
  $this->tasks[$params['task_name']]['task_args']['account_info']['mwp_google_drive']['google_drive_token'] = $params['google_drive_token'];
1496
  }
1497
- if (!empty($params['backup_url']) || !isset($this->tasks[$params['task_name']]['task_results'][$params['result_id']]['server'])) {
1498
  /* If it is on server don't delete zipped file file after restore */
1499
  $deleteBackupAfterRestore = true;
1500
  }
@@ -1502,7 +1450,7 @@ class MMB_Backup extends MMB_Core
1502
  $this->set_memory();
1503
  /* Get backup file*/
1504
  try {
1505
- $backupFile = $this->getBackup(stripslashes($params['task_name']), $params['result_id'], $params['backup_url']);
1506
  } catch (Exception $e) {
1507
  return array(
1508
  'error' => $e->getMessage(),
@@ -1620,14 +1568,28 @@ class MMB_Backup extends MMB_Core
1620
  return $result;
1621
  }
1622
 
 
 
 
1623
  private function getAdminUsers()
1624
  {
1625
- global $wpdb;
1626
  $users = get_users(array(
1627
  'role' => array('administrator'),
1628
  'fields' => array('user_login'),
1629
  ));
1630
 
 
 
 
 
 
 
 
 
 
 
 
 
1631
  return $users;
1632
  }
1633
 
@@ -1683,9 +1645,16 @@ class MMB_Backup extends MMB_Core
1683
  throw new Exception('Failed to download file from Dropbox.');
1684
  }
1685
  } elseif (isset($task['task_results'][$resultId]['google_drive'])) {
1686
- $googleDriveFile = $task['task_results'][$resultId]['google_drive'];
 
 
 
 
 
 
1687
  $params = $task['task_args']['account_info']['mwp_google_drive'];
1688
  $params['backup_file'] = $googleDriveFile;
 
1689
  $backupFile = $this->get_google_drive_backup($params);
1690
 
1691
  if (is_array($backupFile) && isset($backupFile['error'])) {
@@ -1726,6 +1695,7 @@ class MMB_Backup extends MMB_Core
1726
  if (trim($cloneFromUrl) || trim($mwpClone)) {
1727
  $oldOptions['clone_options']['_worker_nossl_key'] = get_option('_worker_nossl_key');
1728
  $oldOptions['clone_options']['_worker_public_key'] = get_option('_worker_public_key');
 
1729
  $oldOptions['clone_options']['_action_message_id'] = get_option('_action_message_id');
1730
  }
1731
  $oldOptions['clone_options']['upload_path'] = get_option('upload_path');
@@ -2383,8 +2353,8 @@ class MMB_Backup extends MMB_Core
2383
  $attachments = array(
2384
  $backup_file,
2385
  );
2386
- $headers = 'From: ManageWP <no-reply@managewp.com>'."\r\n";
2387
- $subject = "ManageWP - ".$task_name." - ".$this->site_name;
2388
  ob_start();
2389
  $result = wp_mail($email, $subject, $subject, $headers, $attachments);
2390
  ob_end_clean();
@@ -3285,6 +3255,8 @@ class MMB_Backup extends MMB_Core
3285
  * Uploads backup file from server to Google Drive.
3286
  *
3287
  * @param array $args arguments passed to the function
 
 
3288
  * [google_drive_token] -> user's Google drive token in json form
3289
  * [google_drive_directory] -> folder on user's Google Drive account which backup file should be upload to
3290
  * [google_drive_site_folder] -> subfolder with site name in google_drive_directory which backup file should be upload to
@@ -3457,6 +3429,7 @@ class MMB_Backup extends MMB_Core
3457
  'error' => 'Upload to Google Drive was not successful.',
3458
  );
3459
  }
 
3460
 
3461
  mwp_logger()->info('Upload to Google Drive completed; average speed is {speed}/s', array(
3462
  'speed' => mwp_format_bytes(round($fileSize / (microtime(true) - $started))),
@@ -3497,6 +3470,16 @@ class MMB_Backup extends MMB_Core
3497
 
3498
  $driveService = new Google_Service_Drive($googleClient);
3499
 
 
 
 
 
 
 
 
 
 
 
3500
  mwp_logger()->info('Fetching Google Drive root folder ID');
3501
  try {
3502
  $about = $driveService->about->get();
@@ -3534,7 +3517,6 @@ class MMB_Backup extends MMB_Core
3534
  $listFiles = $driveService->files->listFiles(array("q" => "title='".addslashes($subFolderTitle)."' and '$managewpFolderId' in parents and trashed = false"));
3535
  $files = $listFiles->getItems();
3536
  } catch (Exception $e) {
3537
- $this->_log($e->getMessage());
3538
  /*return array(
3539
  'error' => $e->getMessage(),
3540
  );*/
@@ -3553,7 +3535,6 @@ class MMB_Backup extends MMB_Core
3553
  $listFiles = $driveService->files->listFiles(array("q" => "title='".addslashes($args['backup_file'])."' and '$backup_folder_id' in parents and trashed = false"));
3554
  $files = $listFiles->getItems();
3555
  } catch (Exception $e) {
3556
- $this->_log($e->getMessage());
3557
  /*return array(
3558
  'error' => $e->getMessage(),
3559
  );*/
@@ -3577,6 +3558,7 @@ class MMB_Backup extends MMB_Core
3577
  * [google_drive_directory] -> folder on user's Google Drive account which backup file should be downloaded from
3578
  * [google_drive_site_folder] -> subfolder with site name in google_drive_directory which backup file should be downloaded from
3579
  * [backup_file] -> absolute path of backup file on local server
 
3580
  *
3581
  * @return bool|array absolute path to downloaded file is successful, array with error message if not
3582
  */
@@ -3600,79 +3582,94 @@ class MMB_Backup extends MMB_Core
3600
  'error' => 'Error while connecting to Google Drive: '.$e->getMessage(),
3601
  );
3602
  }
 
 
 
 
 
 
 
 
 
 
3603
 
3604
- mwp_logger()->info('Looking for backup directory');
3605
- try {
3606
- $backupFolderFiles = $driveService->files->listFiles(array(
3607
- 'q' => sprintf("title='%s' and '%s' in parents and trashed = false", addslashes($args['google_drive_directory']), $rootFolderId),
3608
- ));
3609
- } catch (Exception $e) {
3610
- mwp_logger()->error('Error while looking for backup directory', array(
3611
- 'exception' => $e,
3612
- ));
3613
 
3614
- return array(
3615
- 'error' => 'Error while looking for backup directory: '.$e->getMessage(),
3616
- );
3617
- }
3618
 
3619
- if (!$backupFolderFiles->offsetExists(0)) {
3620
- mwp_logger()->error('Backup directory ("{directory}") does not exist', array(
3621
- 'directory' => $args['google_drive_directory'],
3622
- ));
3623
 
3624
- return array(
3625
- 'error' => sprintf("The backup directory (%s) does not exist.", $args['google_drive_directory']),
3626
- );
3627
- }
 
 
 
 
 
 
 
 
 
3628
 
3629
- /** @var Google_Service_Drive_DriveFile $backupFolder */
3630
- $backupFolder = $backupFolderFiles->offsetGet(0);
 
 
 
 
 
 
 
3631
 
3632
- if ($args['google_drive_site_folder']) {
3633
- mwp_logger()->info('Looking into the site folder');
3634
  try {
3635
- $siteFolderFiles = $driveService->files->listFiles(array(
3636
- 'q' => sprintf("title='%s' and '%s' in parents and trashed = false", addslashes($this->site_name), $backupFolder->getId()),
3637
  ));
3638
  } catch (Exception $e) {
3639
- mwp_logger()->error('Error while looking for the site folder', array(
 
3640
  'exception' => $e,
3641
  ));
3642
 
3643
  return array(
3644
- 'error' => 'Error while looking for the site folder: '.$e->getMessage(),
3645
  );
3646
  }
3647
 
3648
- if ($siteFolderFiles->offsetExists(0)) {
3649
- $backupFolder = $siteFolderFiles->offsetGet(0);
 
 
3650
  }
3651
- }
3652
-
3653
- try {
3654
- $backupFiles = $driveService->files->listFiles(array(
3655
- 'q' => sprintf("title='%s' and '%s' in parents and trashed = false", addslashes($args['backup_file']), $backupFolder->getId()),
3656
- ));
3657
- } catch (Exception $e) {
3658
- mwp_logger()->error('Error while fetching Google Drive backup file', array(
3659
- 'file_name' => $args['backup_file'],
3660
- 'exception' => $e,
3661
- ));
3662
-
3663
- return array(
3664
- 'error' => 'Error while fetching Google Drive backup file: '.$e->getMessage(),
3665
- );
3666
- }
3667
 
3668
- if (!$backupFiles->offsetExists(0)) {
3669
- return array(
3670
- 'error' => sprintf('Backup file "%s" was not found on your Google Drive account.', $args['backup_file']),
3671
- );
3672
  }
3673
 
3674
- /** @var Google_Service_Drive_DriveFile $backupFile */
3675
- $backupFile = $backupFiles->offsetGet(0);
3676
  $downloadUrl = $backupFile->getDownloadUrl();
3677
  $downloadLocation = ABSPATH.'mwp_temp_backup.zip';
3678
  $fileSize = $backupFile->getFileSize();
@@ -3726,101 +3723,6 @@ class MMB_Backup extends MMB_Core
3726
  return $downloadLocation;
3727
  }
3728
 
3729
- /**
3730
- * Schedules the next execution of some backup task.
3731
- *
3732
- * @param string $type daily, weekly or monthly
3733
- * @param string $schedule format: task_time (if daily), task_time|task_day (if weekly), task_time|task_date (if monthly)
3734
- *
3735
- * @return bool|int timestamp if sucessful, false if not
3736
- */
3737
- public function schedule_next($type, $schedule)
3738
- {
3739
- $schedule = explode("|", $schedule);
3740
-
3741
- if (empty($schedule)) {
3742
- return false;
3743
- }
3744
- switch ($type) {
3745
- case 'daily':
3746
- if (isset($schedule[1]) && $schedule[1]) {
3747
- $delay_time = $schedule[1] * 60;
3748
- }
3749
-
3750
- $current_hour = date("H");
3751
- $schedule_hour = $schedule[0];
3752
- if ($current_hour >= $schedule_hour) {
3753
- $time = mktime($schedule_hour, 0, 0, date("m"), date("d") + 1, date("Y"));
3754
- } else {
3755
- $time = mktime($schedule_hour, 0, 0, date("m"), date("d"), date("Y"));
3756
- }
3757
- break;
3758
-
3759
- case 'weekly':
3760
- if (isset($schedule[2]) && $schedule[2]) {
3761
- $delay_time = $schedule[2] * 60;
3762
- }
3763
- $current_weekday = date('w');
3764
- $schedule_weekday = $schedule[1];
3765
- $current_hour = date("H");
3766
- $schedule_hour = $schedule[0];
3767
-
3768
- if ($current_weekday > $schedule_weekday) {
3769
- $weekday_offset = 7 - ($week_day - $task_schedule[1]);
3770
- } else {
3771
- $weekday_offset = $schedule_weekday - $current_weekday;
3772
- }
3773
-
3774
- if (!$weekday_offset) { //today is scheduled weekday
3775
- if ($current_hour >= $schedule_hour) {
3776
- $time = mktime($schedule_hour, 0, 0, date("m"), date("d") + 7, date("Y"));
3777
- } else {
3778
- $time = mktime($schedule_hour, 0, 0, date("m"), date("d"), date("Y"));
3779
- }
3780
- } else {
3781
- $time = mktime($schedule_hour, 0, 0, date("m"), date("d") + $weekday_offset, date("Y"));
3782
- }
3783
- break;
3784
-
3785
- case 'monthly':
3786
- if (isset($schedule[2]) && $schedule[2]) {
3787
- $delay_time = $schedule[2] * 60;
3788
- }
3789
- $current_monthday = date('j');
3790
- $schedule_monthday = $schedule[1];
3791
- $current_hour = date("H");
3792
- $schedule_hour = $schedule[0];
3793
-
3794
- if ($current_monthday > $schedule_monthday) {
3795
- $time = mktime($schedule_hour, 0, 0, date("m") + 1, $schedule_monthday, date("Y"));
3796
- } else {
3797
- if ($current_monthday < $schedule_monthday) {
3798
- $time = mktime($schedule_hour, 0, 0, date("m"), $schedule_monthday, date("Y"));
3799
- } else {
3800
- if ($current_monthday == $schedule_monthday) {
3801
- if ($current_hour >= $schedule_hour) {
3802
- $time = mktime($schedule_hour, 0, 0, date("m") + 1, $schedule_monthday, date("Y"));
3803
- } else {
3804
- $time = mktime($schedule_hour, 0, 0, date("m"), $schedule_monthday, date("Y"));
3805
- }
3806
- break;
3807
- }
3808
- }
3809
- }
3810
-
3811
- break;
3812
-
3813
- default:
3814
- break;
3815
- }
3816
-
3817
- if (isset($delay_time) && $delay_time) {
3818
- $time += $delay_time;
3819
- }
3820
-
3821
- return $time;
3822
- }
3823
-
3824
  /**
3825
  * Parse task arguments for info on master.
3826
  *
@@ -3850,24 +3752,6 @@ class MMB_Backup extends MMB_Core
3850
  return $stats;
3851
  }
3852
 
3853
- /**
3854
- * Returns all backup tasks with information when the next schedule will be.
3855
- *
3856
- * @return mixed associative array with timestamp with next schedule for every backup task
3857
- */
3858
- public function get_next_schedules()
3859
- {
3860
- $stats = array();
3861
- $tasks = $this->tasks;
3862
- if (is_array($tasks) && !empty($tasks)) {
3863
- foreach ($tasks as $task_name => $info) {
3864
- $stats[$task_name] = isset($info['task_args']['next']) ? $info['task_args']['next'] : array();
3865
- }
3866
- }
3867
-
3868
- return $stats;
3869
- }
3870
-
3871
  /**
3872
  * Deletes all old backups from local server.
3873
  * It depends on configuration on master (Number of backups to keep).
@@ -3928,9 +3812,16 @@ class MMB_Backup extends MMB_Core
3928
  }
3929
 
3930
  if (isset($backups[$task_name]['task_results'][$i]['google_drive']) && isset($backups[$task_name]['task_args']['account_info']['mwp_google_drive'])) {
3931
- $google_drive_file = $backups[$task_name]['task_results'][$i]['google_drive'];
 
 
 
 
 
 
3932
  $args = $backups[$task_name]['task_args']['account_info']['mwp_google_drive'];
3933
  $args['backup_file'] = $google_drive_file;
 
3934
  $this->remove_google_drive_backup($args);
3935
  }
3936
 
@@ -3955,8 +3846,9 @@ class MMB_Backup extends MMB_Core
3955
  *
3956
  * @param array $args arguments passed to function
3957
  * [task_name] -> name of backup task
3958
- * [result_id] -> id of baskup task result, which should be restored
3959
  * [google_drive_token] -> json of Google Drive token, if it is remote destination
 
3960
  *
3961
  * @return bool true if successful, false if not
3962
  */
@@ -3973,9 +3865,21 @@ class MMB_Backup extends MMB_Core
3973
 
3974
  $tasks = $this->tasks;
3975
 
3976
- $task = $tasks[$task_name];
3977
- $backups = $task['task_results'];
3978
- $backup = $backups[$result_id];
 
 
 
 
 
 
 
 
 
 
 
 
3979
 
3980
  if (isset($backup['server'])) {
3981
  @unlink($backup['server']['file_path']);
@@ -4010,9 +3914,16 @@ class MMB_Backup extends MMB_Core
4010
  }
4011
 
4012
  if (isset($backup['google_drive'])) {
4013
- $google_drive_file = $backup['google_drive'];
 
 
 
 
 
 
4014
  $args = $tasks[$task_name]['task_args']['account_info']['mwp_google_drive'];
4015
  $args['backup_file'] = $google_drive_file;
 
4016
  $this->remove_google_drive_backup($args);
4017
  }
4018
 
@@ -4026,7 +3937,6 @@ class MMB_Backup extends MMB_Core
4026
 
4027
  $this->update_tasks($tasks);
4028
 
4029
- //update_option('mwp_backup_tasks', $tasks);
4030
  return true;
4031
  }
4032
 
@@ -4129,10 +4039,22 @@ class MMB_Backup extends MMB_Core
4129
  extract($task['task_args']);
4130
  }
4131
 
4132
- $results = $task['task_results'];
 
 
4133
 
4134
  if (is_array($results) && count($results)) {
4135
- $backup_file = $results[count($results) - 1]['server']['file_path'];
 
 
 
 
 
 
 
 
 
 
4136
  }
4137
 
4138
  if ($backup_file && file_exists($backup_file)) {
@@ -4200,8 +4122,11 @@ class MMB_Backup extends MMB_Core
4200
 
4201
  if (isset($account_info['mwp_google_drive']) && !empty($account_info['mwp_google_drive'])) {
4202
  $this->update_status($task_name, $this->statuses['google_drive']);
4203
- $account_info['mwp_google_drive']['backup_file'] = $backup_file;
4204
- $return = $this->google_drive_backup($account_info['mwp_google_drive']);
 
 
 
4205
  $this->wpdb_reconnect();
4206
 
4207
  if (!(is_array($return) && isset($return['error']))) {
@@ -4217,6 +4142,7 @@ class MMB_Backup extends MMB_Core
4217
  unset($tasks[$task_name]['task_results'][count($tasks[$task_name]['task_results']) - 1]['server']);
4218
  }
4219
  $this->update_tasks($tasks);
 
4220
  } else {
4221
  $return = array(
4222
  'error' => 'Backup file not found on your server. Please try again.',
@@ -4227,65 +4153,6 @@ class MMB_Backup extends MMB_Core
4227
  return $return;
4228
  }
4229
 
4230
- /**
4231
- * Checks if scheduled backup tasks should be executed.
4232
- *
4233
- * @param array $args arguments passed to function
4234
- * [task_name] -> name of backup task
4235
- * [task_id] -> id of backup task
4236
- * [$site_key] -> hash key of backup task
4237
- * [worker_version] -> version of worker
4238
- * [mwp_google_drive_refresh_token] -> should be Google Drive token be refreshed, true if it is remote destination of task
4239
- * @param string $url url on master where worker validate task
4240
- *
4241
- * @return string|array|boolean
4242
- */
4243
- public function validate_task($args, $url)
4244
- {
4245
- if (!class_exists('WP_Http')) {
4246
- include_once ABSPATH.WPINC.'/class-http.php';
4247
- }
4248
-
4249
- $worker_upto_3_9_22 = ($GLOBALS['MMB_WORKER_VERSION'] <= '3.9.22'); // worker version is less or equals to 3.9.22
4250
- $params = array('timeout' => 100);
4251
- $params['body'] = $args;
4252
- $result = wp_remote_post($url, $params);
4253
-
4254
- if ($worker_upto_3_9_22) {
4255
- if (is_array($result) && $result['body'] == 'mwp_delete_task') {
4256
- //$tasks = $this->get_backup_settings();
4257
- $tasks = $this->tasks;
4258
- unset($tasks[$args['task_name']]);
4259
- $this->update_tasks($tasks);
4260
- $this->cleanup();
4261
-
4262
- return 'deleted';
4263
- } elseif (is_array($result) && $result['body'] == 'mwp_pause_task') {
4264
- return 'paused';
4265
- } elseif (is_array($result) && substr($result['body'], 0, 8) == 'token - ') {
4266
- return $result['body'];
4267
- }
4268
- } else {
4269
- if (is_array($result) && $result['body']) {
4270
- $response = unserialize($result['body']);
4271
- if ($response['message'] == 'mwp_delete_task') {
4272
- $tasks = $this->tasks;
4273
- unset($tasks[$args['task_name']]);
4274
- $this->update_tasks($tasks);
4275
- $this->cleanup();
4276
-
4277
- return 'deleted';
4278
- } elseif ($response['message'] == 'mwp_pause_task') {
4279
- return 'paused';
4280
- } elseif ($response['message'] == 'mwp_do_task') {
4281
- return $response;
4282
- }
4283
- }
4284
- }
4285
-
4286
- return false;
4287
- }
4288
-
4289
  /**
4290
  * Updates status of backup task.
4291
  * Positive number if completed, negative if not.
@@ -4324,7 +4191,6 @@ class MMB_Backup extends MMB_Core
4324
  }
4325
 
4326
  $this->update_tasks($tasks);
4327
- //update_option('mwp_backup_tasks',$tasks);
4328
  }
4329
  }
4330
 
@@ -4382,93 +4248,6 @@ class MMB_Backup extends MMB_Core
4382
  }
4383
  }
4384
 
4385
- /**
4386
- * Removes cron for checking scheduled tasks, if there are not any scheduled task.
4387
- *
4388
- * @return void
4389
- */
4390
- public function check_cron_remove()
4391
- {
4392
- if (empty($this->tasks) || (count($this->tasks) == 1 && isset($this->tasks['Backup Now']))) {
4393
- wp_clear_scheduled_hook('mwp_backup_tasks');
4394
- exit;
4395
- }
4396
- }
4397
-
4398
- /**
4399
- * Re-add tasks on website re-add.
4400
- *
4401
- * @param array $params arguments passed to function
4402
- *
4403
- * @return array $params without backups
4404
- */
4405
- public function readd_tasks($params = array())
4406
- {
4407
- global $mmb_core;
4408
-
4409
- if (empty($params) || !isset($params['backups'])) {
4410
- return $params;
4411
- }
4412
-
4413
- $before = array();
4414
- $tasks = $params['backups'];
4415
- if (!empty($tasks)) {
4416
- $mmb_backup = new MMB_Backup();
4417
-
4418
- if (function_exists('wp_next_scheduled')) {
4419
- /*if (!wp_next_scheduled('mwp_backup_tasks')) {
4420
- wp_schedule_event(time(), 'tenminutes', 'mwp_backup_tasks');
4421
- }*/
4422
- }
4423
-
4424
- foreach ($tasks as $task) {
4425
- $before[$task['task_name']] = array();
4426
-
4427
- if (isset($task['secure'])) {
4428
- if (is_array($task['secure'])) {
4429
- $secureParams = $task['secure'];
4430
- foreach ($secureParams as $key => $value) {
4431
- $secureParams[$key] = base64_decode($value);
4432
- }
4433
- $task['secure'] = $secureParams;
4434
- } else {
4435
- $task['secure'] = base64_decode($task['secure']);
4436
- }
4437
- if ($decrypted = $mmb_core->_secure_data($task['secure'])) {
4438
- $decrypted = maybe_unserialize($decrypted);
4439
- if (is_array($decrypted)) {
4440
- foreach ($decrypted as $key => $val) {
4441
- if (!is_numeric($key)) {
4442
- $task[$key] = $val;
4443
- }
4444
- }
4445
- unset($task['secure']);
4446
- } else {
4447
- $task['secure'] = $decrypted;
4448
- }
4449
- }
4450
- if (!$decrypted && $mmb_core->get_random_signature() !== false) {
4451
- $cipher = new Crypt_AES(CRYPT_AES_MODE_ECB);
4452
- $cipher->setKey($mmb_core->get_random_signature());
4453
- $decrypted = $cipher->decrypt($task['secure']);
4454
- $task['account_info'] = json_decode($decrypted, true);
4455
- }
4456
- }
4457
- if (isset($task['account_info']) && is_array($task['account_info'])) { //only if sends from master first time(secure data)
4458
- $task['args']['account_info'] = $task['account_info'];
4459
- }
4460
-
4461
- $before[$task['task_name']]['task_args'] = $task['args'];
4462
- $before[$task['task_name']]['task_args']['next'] = $mmb_backup->schedule_next($task['args']['type'], $task['args']['schedule']);
4463
- }
4464
- }
4465
- update_option('mwp_backup_tasks', $before);
4466
-
4467
- unset($params['backups']);
4468
-
4469
- return $params;
4470
- }
4471
-
4472
  /**
4473
  * Start backup process. Invoked from remote ping
4474
  *
@@ -4492,11 +4271,12 @@ class MMB_Backup extends MMB_Core
4492
  $this->tasks[$task_name]['task_args']['account_info']['mwp_google_drive']['google_drive_token'] = $potential_token;
4493
  $task['task_args']['account_info']['mwp_google_drive']['google_drive_token'] = $potential_token;
4494
  }
 
4495
  /**
4496
  * From this point I am simulating previous way of working. In order to fix this,
4497
  * I need to refactor greater part, and release is tomorrow morning
4498
  */
4499
- $update = array(
4500
  'task_name' => $task_name,
4501
  'args' => $task['task_args'],
4502
  );
@@ -4505,7 +4285,7 @@ class MMB_Backup extends MMB_Core
4505
  $this->tasks = get_option('mwp_backup_tasks');
4506
  $task = $this->tasks[$task_name];
4507
 
4508
- $result = $this->backup($task['task_args'], $task_name);
4509
 
4510
  if (is_array($result) && array_key_exists('error', $result)) {
4511
  $return = $result;
@@ -4548,10 +4328,6 @@ class MMB_Backup extends MMB_Core
4548
  }
4549
  }
4550
 
4551
- /*if( function_exists('add_filter') ) {
4552
- add_filter( 'mwp_website_add', 'MMB_Backup::readd_tasks' );
4553
- }*/
4554
-
4555
  if (!function_exists('get_all_files_from_dir')) {
4556
  /**
4557
  * Get all files in directory
@@ -4677,8 +4453,8 @@ function restore_migrate_urls()
4677
  $path = getKey('path', $parsedOldSiteUrl, '');
4678
  $oldSiteUrlNoWww = preg_replace('#^www\.(.+\.)#i', '$1', $host).$path;
4679
  $parsedOldSiteUrlNoWww = parse_url(strpos($oldSiteUrlNoWww, '://') === false
4680
- ? "http://$oldSiteUrlNoWww"
4681
- : $oldSiteUrlNoWww
4682
  );
4683
  if (isset($parse['scheme'])) {
4684
  $oldSiteUrlNoWww = "{$parse['scheme']}://$oldSiteUrlNoWww";
@@ -4788,6 +4564,12 @@ function restore_htaccess()
4788
  if ($htaccessRealpath) {
4789
  @rename($htaccessRealpath, "$htaccessRealpath.old");
4790
  }
4791
- @include ABSPATH.'wp-admin/includes/admin.php';
4792
- @flush_rewrite_rules(true);
 
 
 
 
 
 
4793
  }
16
  */
17
  class MMB_Backup extends MMB_Core
18
  {
19
+
20
  public $site_name;
21
+
22
  public $statuses;
23
+
24
  public $tasks;
25
+
26
  public $s3;
27
+
28
  public $ftp;
29
+
30
  public $dropbox;
31
+
32
  public $google_drive;
33
 
34
  private static $zip_errors = array(
161
  {
162
  //$params => [$task_name, $args, $error]
163
  if (!empty($params)) {
164
+ if (!empty($params['secure'])) {
165
+ $secure = (array) $params['secure'];
166
+ $secure = array_map('base64_decode', $secure);
167
+ if ($secureKey = mwp_container()->getConfiguration()->getSecureKey()) {
168
+ $secure = implode('', $secure);
169
+ require_once dirname(__FILE__).'/../PHPSecLib/Crypt/AES.php';
170
+ $cipher = new Crypt_AES(CRYPT_AES_MODE_ECB);
171
+ $cipher->setKey($secureKey);
172
+ $decrypted = array('account_info' => json_decode($cipher->decrypt($secure), true));
173
+ } else {
174
+ $decrypted = '';
175
+ $publicKey = mwp_container()->getConfiguration()->getPublicKey();
176
+ $crypter = mwp_container()->getCrypter();
177
+ foreach ($secure as $segment) {
178
+ $decrypted .= $crypter->publicDecrypt($segment, $publicKey);
179
+ }
180
+ $decrypted = unserialize($decrypted);
181
+ }
182
+ $params = array_merge($params, (array) $decrypted);
183
+ }
184
  extract($params);
185
 
186
  //$before = $this->get_backup_settings();
200
  }
201
 
202
  $before[$task_name]['task_args'] = $args;
203
+ $return = $before[$task_name];
 
 
 
 
204
  }
205
 
206
  //Update with error
220
  }
221
 
222
  $this->update_tasks($before);
 
223
 
224
  if ($task_name == 'Backup Now') {
225
+ $resultUuid = !empty($params['resultUuid']) ? $params['resultUuid'] : false;
226
+ $result = $this->backup($args, $task_name, $resultUuid);
227
  $backup_settings = $this->tasks;
228
 
229
  if (is_array($result) && array_key_exists('error', $result)) {
239
  return false;
240
  }
241
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
242
  /**
243
  * Runs backup task invoked from ManageWP master.
244
  *
245
+ * @param string $task_name name of backup task
246
  * @param string|bool[optional] $google_drive_token false if backup destination is not Google Drive, json of Google Drive token if it is remote destination (default: false)
247
+ * @param bool $resultUuid
248
  *
249
  * @return mixed array with backup statistics if successful, array with error message if not
250
  */
251
+ public function task_now($task_name, $google_drive_token = false, $resultUuid = false)
252
  {
253
  if ($google_drive_token) {
254
  $this->tasks[$task_name]['task_args']['account_info']['mwp_google_drive']['google_drive_token'] = $google_drive_token;
268
  ));
269
 
270
  //Run backup
271
+ $result = $this->backup($setting['task_args'], $task_name, $resultUuid);
272
 
273
  //Check for error
274
  if (is_array($result) && array_key_exists('error', $result)) {
288
  * Backup a full wordpress instance, including a database dump, which is placed in mwp_db dir in root folder.
289
  * All backups are compressed by zip and placed in wp-content/managewp/backups folder.
290
  *
291
+ * @param string $args arguments passed from master
292
  * [type] -> db, full
293
  * [what] -> daily, weekly, monthly
294
  * [account_info] -> remote destinations ftp, amazons3, dropbox, google_drive, email with their parameters
295
  * [include] -> array of folders from site root which are included to backup (wp-admin, wp-content, wp-includes are default)
296
  * [exclude] -> array of files of folders to exclude, relative to site's root
297
  * @param bool|string[optional] $task_name the name of backup task, which backup is done (default: false)
298
+ * @param bool $resultUuid unique identifier for backup result
299
  *
300
  * @return bool|array false if $args are missing, array with error if error has occured, ture if is successful
301
  */
302
+ public function backup($args, $task_name = false, $resultUuid = false)
303
  {
304
  if (!$args || empty($args)) {
305
  return false;
402
  }
403
 
404
  $paths['duration'] = $duration.'s';
405
+ if ($resultUuid) {
406
+ $paths['resultUuid'] = $resultUuid;
407
+ }
408
 
409
  if ($task_name != 'Backup Now') {
410
  $paths['server'] = array(
438
  }
439
 
440
  if (isset($backup_settings[$task_name]['task_args']['account_info']['mwp_google_drive'])) {
441
+ $paths['google_drive'] = array(
442
+ 'file' => basename($backup_url),
443
+ 'file_id' => ''
444
+ );
445
  }
446
 
447
  $temp = $backup_settings[$task_name]['task_results'];
457
 
458
  $backup_settings[$task_name]['task_results'] = $temp;
459
  $this->update_tasks($backup_settings);
 
460
  }
461
 
462
  // If there are not remote destination, set up task status to finished
471
  * Backup a full wordpress instance, including a database dump, which is placed in mwp_db dir in root folder.
472
  * All backups are compressed by zip and placed in wp-content/managewp/backups folder.
473
  *
474
+ * @param string $task_name the name of backup task, which backup is done
475
+ * @param string $backup_file relative path to file which backup is stored
476
+ * @param array [optional] $exclude the list of files and folders, which are excluded from backup (default: array())
477
+ * @param array [optional] $include the list of folders in wordpress root which are included to backup, expect wp-admin, wp-content, wp-includes, which are default (default: array())
478
  *
479
  * @return bool|array true if backup is successful, or an array with error message if is failed
480
  */
533
  @unlink($db_result);
534
  @rmdir(MWP_DB_DIR);
535
 
536
+ $remove = array(
537
  trim(basename(WP_CONTENT_DIR))."/managewp/backups",
538
  trim(basename(WP_CONTENT_DIR))."/infinitewp/backups",
539
  trim(basename(WP_CONTENT_DIR))."/".md5('mmb-worker')."/mwp_backups",
544
  trim(basename(WP_CONTENT_DIR))."/old-cache",
545
  trim(basename(WP_CONTENT_DIR))."/uploads/backupbuddy_backups",
546
  trim(basename(WP_CONTENT_DIR))."/w3tc",
547
+ "error_log",
548
  "dbcache",
549
  "pgcache",
550
  "objectcache",
1125
  if (!$zip_db_result) {
1126
  $zip_archive_db_result = false;
1127
  if (class_exists("ZipArchive")) {
 
1128
  $zip_archive_db_result = $this->zip_archive_backup_db($task_name, $db_result, $backup_file);
1129
  }
1130
 
1131
  if (!$zip_archive_db_result) {
 
1132
  $pclzip_db_result = $this->pclzip_backup_db($task_name, $backup_file);
1133
  if (!$pclzip_db_result) {
1134
  @unlink(MWP_BACKUP_DIR.'/mwp_db/index.php');
1421
  return false;
1422
  }
1423
 
1424
+ $task = $this->tasks[$params['task_name']];
1425
+ $backups = $task['task_results'];
1426
+ $result_id = !empty($params['result_id']) ? $params['result_id'] : null;
1427
+ $backup = !empty($backups[$result_id]) ? $backups[$result_id] : false;
1428
+ foreach ($backups as $key => $result) {
1429
+ if ($result['resultUuid'] == $params['resultUuid']) {
1430
+ $backup = $result;
1431
+ $result_id = $key;
1432
+ break;
1433
+ }
1434
+ }
1435
+
1436
+ if (!$backup && empty($params['backup_url'])) {
1437
+ return array(
1438
+ 'error' => 'Unknown result UUID or backup URL.',
1439
+ );
1440
+ }
1441
+
1442
  if (isset($params['google_drive_token'])) {
1443
  $this->tasks[$params['task_name']]['task_args']['account_info']['mwp_google_drive']['google_drive_token'] = $params['google_drive_token'];
1444
  }
1445
+ if (!empty($params['backup_url']) || !isset($this->tasks[$params['task_name']]['task_results'][$result_id]['server'])) {
1446
  /* If it is on server don't delete zipped file file after restore */
1447
  $deleteBackupAfterRestore = true;
1448
  }
1450
  $this->set_memory();
1451
  /* Get backup file*/
1452
  try {
1453
+ $backupFile = $this->getBackup(stripslashes($params['task_name']), $result_id, $params['backup_url']);
1454
  } catch (Exception $e) {
1455
  return array(
1456
  'error' => $e->getMessage(),
1568
  return $result;
1569
  }
1570
 
1571
+ /**
1572
+ * @return array An array of stdClass-es with the single property 'user_login' (string). Example: [ (object) ['user_login' => 'admin' ] ]
1573
+ */
1574
  private function getAdminUsers()
1575
  {
 
1576
  $users = get_users(array(
1577
  'role' => array('administrator'),
1578
  'fields' => array('user_login'),
1579
  ));
1580
 
1581
+ if (!count($users)) {
1582
+ // @todo Investigate why the above doesn't work on PHP 5.2.
1583
+ $users = get_users(array('role' => 'administrator', 'number' => 1, 'orderby' => 'ID'));
1584
+ if (!empty($users[0]->user_login)) {
1585
+ $users = array(
1586
+ (object) array(
1587
+ 'user_login' => $users[0]->user_login,
1588
+ ),
1589
+ );
1590
+ }
1591
+ }
1592
+
1593
  return $users;
1594
  }
1595
 
1645
  throw new Exception('Failed to download file from Dropbox.');
1646
  }
1647
  } elseif (isset($task['task_results'][$resultId]['google_drive'])) {
1648
+ if (is_array($task['task_results'][$resultId]['google_drive'])) {
1649
+ $googleDriveFile = $task['task_results'][$resultId]['google_drive']['file'];
1650
+ $googleDriveFileId = $task['task_results'][$resultId]['google_drive']['file_id'];
1651
+ } else {
1652
+ $googleDriveFile = $task['task_results'][$resultId]['google_drive'];
1653
+ $googleDriveFileId = "";
1654
+ }
1655
  $params = $task['task_args']['account_info']['mwp_google_drive'];
1656
  $params['backup_file'] = $googleDriveFile;
1657
+ $params['file_id'] = $googleDriveFileId;
1658
  $backupFile = $this->get_google_drive_backup($params);
1659
 
1660
  if (is_array($backupFile) && isset($backupFile['error'])) {
1695
  if (trim($cloneFromUrl) || trim($mwpClone)) {
1696
  $oldOptions['clone_options']['_worker_nossl_key'] = get_option('_worker_nossl_key');
1697
  $oldOptions['clone_options']['_worker_public_key'] = get_option('_worker_public_key');
1698
+ $oldOptions['clone_options']['_worker_orion_key'] = get_option('_worker_orion_key');
1699
  $oldOptions['clone_options']['_action_message_id'] = get_option('_action_message_id');
1700
  }
1701
  $oldOptions['clone_options']['upload_path'] = get_option('upload_path');
2353
  $attachments = array(
2354
  $backup_file,
2355
  );
2356
+ $headers = 'From: ManageWP <no-reply@managewp.com>'."\r\n";
2357
+ $subject = "ManageWP - ".$task_name." - ".$this->site_name;
2358
  ob_start();
2359
  $result = wp_mail($email, $subject, $subject, $headers, $attachments);
2360
  ob_end_clean();
3255
  * Uploads backup file from server to Google Drive.
3256
  *
3257
  * @param array $args arguments passed to the function
3258
+ * [task_name] -> Task name for wich we are uploading
3259
+ * [task_result_key] -> Result key that we are uploading
3260
  * [google_drive_token] -> user's Google drive token in json form
3261
  * [google_drive_directory] -> folder on user's Google Drive account which backup file should be upload to
3262
  * [google_drive_site_folder] -> subfolder with site name in google_drive_directory which backup file should be upload to
3429
  'error' => 'Upload to Google Drive was not successful.',
3430
  );
3431
  }
3432
+ $this->tasks[$args['task_name']]['task_results'][$args['task_result_key']]['google_drive']['file_id'] = $status->getId();
3433
 
3434
  mwp_logger()->info('Upload to Google Drive completed; average speed is {speed}/s', array(
3435
  'speed' => mwp_format_bytes(round($fileSize / (microtime(true) - $started))),
3470
 
3471
  $driveService = new Google_Service_Drive($googleClient);
3472
 
3473
+ if (!empty($args['file_id'])) {
3474
+ mwp_logger()->info('Deleting Google file by id');
3475
+ try {
3476
+ $driveService->files->delete($args['file_id']);
3477
+ } catch (Exception $e) {
3478
+ mwp_logger()->error('Error deleting google file by id', array('file_id' => $args['file_id']));
3479
+ }
3480
+
3481
+ return;
3482
+ }
3483
  mwp_logger()->info('Fetching Google Drive root folder ID');
3484
  try {
3485
  $about = $driveService->about->get();
3517
  $listFiles = $driveService->files->listFiles(array("q" => "title='".addslashes($subFolderTitle)."' and '$managewpFolderId' in parents and trashed = false"));
3518
  $files = $listFiles->getItems();
3519
  } catch (Exception $e) {
 
3520
  /*return array(
3521
  'error' => $e->getMessage(),
3522
  );*/
3535
  $listFiles = $driveService->files->listFiles(array("q" => "title='".addslashes($args['backup_file'])."' and '$backup_folder_id' in parents and trashed = false"));
3536
  $files = $listFiles->getItems();
3537
  } catch (Exception $e) {
 
3538
  /*return array(
3539
  'error' => $e->getMessage(),
3540
  );*/
3558
  * [google_drive_directory] -> folder on user's Google Drive account which backup file should be downloaded from
3559
  * [google_drive_site_folder] -> subfolder with site name in google_drive_directory which backup file should be downloaded from
3560
  * [backup_file] -> absolute path of backup file on local server
3561
+ * [file_id] -> google file id
3562
  *
3563
  * @return bool|array absolute path to downloaded file is successful, array with error message if not
3564
  */
3582
  'error' => 'Error while connecting to Google Drive: '.$e->getMessage(),
3583
  );
3584
  }
3585
+ if (empty($args['file_id'])) {
3586
+ mwp_logger()->info('Looking for backup directory');
3587
+ try {
3588
+ $backupFolderFiles = $driveService->files->listFiles(array(
3589
+ 'q' => sprintf("title='%s' and '%s' in parents and trashed = false", addslashes($args['google_drive_directory']), $rootFolderId),
3590
+ ));
3591
+ } catch (Exception $e) {
3592
+ mwp_logger()->error('Error while looking for backup directory', array(
3593
+ 'exception' => $e,
3594
+ ));
3595
 
3596
+ return array(
3597
+ 'error' => 'Error while looking for backup directory: '.$e->getMessage(),
3598
+ );
3599
+ }
 
 
 
 
 
3600
 
3601
+ if (!$backupFolderFiles->offsetExists(0)) {
3602
+ mwp_logger()->error('Backup directory ("{directory}") does not exist', array(
3603
+ 'directory' => $args['google_drive_directory'],
3604
+ ));
3605
 
3606
+ return array(
3607
+ 'error' => sprintf("The backup directory (%s) does not exist.", $args['google_drive_directory']),
3608
+ );
3609
+ }
3610
 
3611
+ /** @var Google_Service_Drive_DriveFile $backupFolder */
3612
+ $backupFolder = $backupFolderFiles->offsetGet(0);
3613
+
3614
+ if ($args['google_drive_site_folder']) {
3615
+ mwp_logger()->info('Looking into the site folder');
3616
+ try {
3617
+ $siteFolderFiles = $driveService->files->listFiles(array(
3618
+ 'q' => sprintf("title='%s' and '%s' in parents and trashed = false", addslashes($this->site_name), $backupFolder->getId()),
3619
+ ));
3620
+ } catch (Exception $e) {
3621
+ mwp_logger()->error('Error while looking for the site folder', array(
3622
+ 'exception' => $e,
3623
+ ));
3624
 
3625
+ return array(
3626
+ 'error' => 'Error while looking for the site folder: '.$e->getMessage(),
3627
+ );
3628
+ }
3629
+
3630
+ if ($siteFolderFiles->offsetExists(0)) {
3631
+ $backupFolder = $siteFolderFiles->offsetGet(0);
3632
+ }
3633
+ }
3634
 
 
 
3635
  try {
3636
+ $backupFiles = $driveService->files->listFiles(array(
3637
+ 'q' => sprintf("title='%s' and '%s' in parents and trashed = false", addslashes($args['backup_file']), $backupFolder->getId()),
3638
  ));
3639
  } catch (Exception $e) {
3640
+ mwp_logger()->error('Error while fetching Google Drive backup file', array(
3641
+ 'file_name' => $args['backup_file'],
3642
  'exception' => $e,
3643
  ));
3644
 
3645
  return array(
3646
+ 'error' => 'Error while fetching Google Drive backup file: '.$e->getMessage(),
3647
  );
3648
  }
3649
 
3650
+ if (!$backupFiles->offsetExists(0)) {
3651
+ return array(
3652
+ 'error' => sprintf('Backup file "%s" was not found on your Google Drive account.', $args['backup_file']),
3653
+ );
3654
  }
3655
+ /** @var Google_Service_Drive_DriveFile $backupFile */
3656
+ $backupFile = $backupFiles->offsetGet(0);
3657
+ } else {
3658
+ try {
3659
+ /** @var Google_Service_Drive_DriveFile $backupFile */
3660
+ $backupFile = $driveService->files->get($args['file_id']);
3661
+ } catch (Exception $e) {
3662
+ mwp_logger()->error('Error while fetching Google Drive backup file by id', array(
3663
+ 'file_id' => $args['file_id'],
3664
+ 'exception' => $e,
3665
+ ));
 
 
 
 
 
3666
 
3667
+ return array(
3668
+ 'error' => 'Error while fetching Google Drive backup file: '.$e->getMessage(),
3669
+ );
3670
+ }
3671
  }
3672
 
 
 
3673
  $downloadUrl = $backupFile->getDownloadUrl();
3674
  $downloadLocation = ABSPATH.'mwp_temp_backup.zip';
3675
  $fileSize = $backupFile->getFileSize();
3723
  return $downloadLocation;
3724
  }
3725
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3726
  /**
3727
  * Parse task arguments for info on master.
3728
  *
3752
  return $stats;
3753
  }
3754
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3755
  /**
3756
  * Deletes all old backups from local server.
3757
  * It depends on configuration on master (Number of backups to keep).
3812
  }
3813
 
3814
  if (isset($backups[$task_name]['task_results'][$i]['google_drive']) && isset($backups[$task_name]['task_args']['account_info']['mwp_google_drive'])) {
3815
+ if (is_array($backups[$task_name]['task_results'][$i]['google_drive'])) {
3816
+ $google_drive_file = $backups[$task_name]['task_results'][$i]['google_drive']['file'];
3817
+ $google_file_id = $backups[$task_name]['task_results'][$i]['google_drive']['file_id'];
3818
+ } else {
3819
+ $google_drive_file = $backups[$task_name]['task_results'][$i]['google_drive'];
3820
+ $google_file_id = "";
3821
+ }
3822
  $args = $backups[$task_name]['task_args']['account_info']['mwp_google_drive'];
3823
  $args['backup_file'] = $google_drive_file;
3824
+ $args['file_id'] = $google_file_id;
3825
  $this->remove_google_drive_backup($args);
3826
  }
3827
 
3846
  *
3847
  * @param array $args arguments passed to function
3848
  * [task_name] -> name of backup task
3849
+ * [result_id] -> id of baskup task result, which should be restored (deprecated, use result Uuid now)
3850
  * [google_drive_token] -> json of Google Drive token, if it is remote destination
3851
+ * [resultUuid] -> unique backup identifier
3852
  *
3853
  * @return bool true if successful, false if not
3854
  */
3865
 
3866
  $tasks = $this->tasks;
3867
 
3868
+ $task = $tasks[$task_name];
3869
+ $backups = $task['task_results'];
3870
+ $result_id = !empty($args['result_id']) ? $args['result_id'] : null;
3871
+ $backup = !empty($backups[$result_id]) ? $backups[$result_id] : false;
3872
+ foreach ($backups as $key => $result) {
3873
+ if ($result['resultUuid'] == $args['resultUuid']) {
3874
+ $backup = $result;
3875
+ $result_id = $key;
3876
+ break;
3877
+ }
3878
+ }
3879
+
3880
+ if (!$backup) {
3881
+ return false;
3882
+ }
3883
 
3884
  if (isset($backup['server'])) {
3885
  @unlink($backup['server']['file_path']);
3914
  }
3915
 
3916
  if (isset($backup['google_drive'])) {
3917
+ if (is_array($backup['google_drive'])) {
3918
+ $google_drive_file = $backup['google_drive']['file'];
3919
+ $google_file_id = $backup['google_drive']['file_id'];
3920
+ } else {
3921
+ $google_drive_file = $backup['google_drive'];
3922
+ $google_file_id = "";
3923
+ }
3924
  $args = $tasks[$task_name]['task_args']['account_info']['mwp_google_drive'];
3925
  $args['backup_file'] = $google_drive_file;
3926
+ $args['file_id'] = $google_file_id;
3927
  $this->remove_google_drive_backup($args);
3928
  }
3929
 
3937
 
3938
  $this->update_tasks($tasks);
3939
 
 
3940
  return true;
3941
  }
3942
 
4039
  extract($task['task_args']);
4040
  }
4041
 
4042
+ $results = $task['task_results'];
4043
+ $taskResultKey = null;
4044
+ $backup_file = false;
4045
 
4046
  if (is_array($results) && count($results)) {
4047
+ foreach ($results as $key => $result) {
4048
+ if (array_key_exists('resultUuid', $result) && $result['resultUuid'] == $args['resultUuid']) {
4049
+ $backup_file = $result['server']['file_path'];
4050
+ $taskResultKey = $key;
4051
+ break;
4052
+ }
4053
+ }
4054
+ if (!$backup_file) {
4055
+ $backup_file = $results[count($results) - 1]['server']['file_path'];
4056
+ $taskResultKey = count($results) - 1;
4057
+ }
4058
  }
4059
 
4060
  if ($backup_file && file_exists($backup_file)) {
4122
 
4123
  if (isset($account_info['mwp_google_drive']) && !empty($account_info['mwp_google_drive'])) {
4124
  $this->update_status($task_name, $this->statuses['google_drive']);
4125
+ $account_info['mwp_google_drive']['backup_file'] = $backup_file;
4126
+ $account_info['mwp_google_drive']['task_name'] = $task_name;
4127
+ $account_info['mwp_google_drive']['task_result_key'] = $taskResultKey;
4128
+
4129
+ $return = $this->google_drive_backup($account_info['mwp_google_drive']);
4130
  $this->wpdb_reconnect();
4131
 
4132
  if (!(is_array($return) && isset($return['error']))) {
4142
  unset($tasks[$task_name]['task_results'][count($tasks[$task_name]['task_results']) - 1]['server']);
4143
  }
4144
  $this->update_tasks($tasks);
4145
+ $return = $this->tasks[$task_name]['task_results'][$taskResultKey];
4146
  } else {
4147
  $return = array(
4148
  'error' => 'Backup file not found on your server. Please try again.',
4153
  return $return;
4154
  }
4155
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4156
  /**
4157
  * Updates status of backup task.
4158
  * Positive number if completed, negative if not.
4191
  }
4192
 
4193
  $this->update_tasks($tasks);
 
4194
  }
4195
  }
4196
 
4248
  }
4249
  }
4250
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4251
  /**
4252
  * Start backup process. Invoked from remote ping
4253
  *
4271
  $this->tasks[$task_name]['task_args']['account_info']['mwp_google_drive']['google_drive_token'] = $potential_token;
4272
  $task['task_args']['account_info']['mwp_google_drive']['google_drive_token'] = $potential_token;
4273
  }
4274
+ $resultUuid = !empty($args['resultUuid']) ? $args['resultUuid'] : false;
4275
  /**
4276
  * From this point I am simulating previous way of working. In order to fix this,
4277
  * I need to refactor greater part, and release is tomorrow morning
4278
  */
4279
+ $update = array(
4280
  'task_name' => $task_name,
4281
  'args' => $task['task_args'],
4282
  );
4285
  $this->tasks = get_option('mwp_backup_tasks');
4286
  $task = $this->tasks[$task_name];
4287
 
4288
+ $result = $this->backup($task['task_args'], $task_name, $resultUuid);
4289
 
4290
  if (is_array($result) && array_key_exists('error', $result)) {
4291
  $return = $result;
4328
  }
4329
  }
4330
 
 
 
 
 
4331
  if (!function_exists('get_all_files_from_dir')) {
4332
  /**
4333
  * Get all files in directory
4453
  $path = getKey('path', $parsedOldSiteUrl, '');
4454
  $oldSiteUrlNoWww = preg_replace('#^www\.(.+\.)#i', '$1', $host).$path;
4455
  $parsedOldSiteUrlNoWww = parse_url(strpos($oldSiteUrlNoWww, '://') === false
4456
+ ? "http://$oldSiteUrlNoWww"
4457
+ : $oldSiteUrlNoWww
4458
  );
4459
  if (isset($parse['scheme'])) {
4460
  $oldSiteUrlNoWww = "{$parse['scheme']}://$oldSiteUrlNoWww";
4564
  if ($htaccessRealpath) {
4565
  @rename($htaccessRealpath, "$htaccessRealpath.old");
4566
  }
4567
+
4568
+ if (isset($GLOBALS['wp_rewrite'])) {
4569
+ $wpRewrite = $GLOBALS['wp_rewrite'];
4570
+ } else {
4571
+ $wpRewrite = new WP_Rewrite();
4572
+ }
4573
+
4574
+ $wpRewrite->flush_rules(true);
4575
  }
src/MMB/Core.php CHANGED
@@ -8,55 +8,56 @@
8
  **************************************************************/
9
  class MMB_Core extends MMB_Helper
10
  {
11
- public $name;
12
  public $slug;
 
13
  public $settings;
 
14
  public $remote_client;
 
15
  public $comment_instance;
 
16
  public $plugin_instance;
 
17
  public $theme_instance;
 
18
  public $wp_instance;
 
19
  public $post_instance;
 
20
  public $stats_instance;
 
21
  public $search_instance;
22
- public $links_instance;
23
  public $user_instance;
24
- public $security_instance;
25
  public $backup_instance;
 
26
  public $installer_instance;
 
27
  public $mmb_multisite;
 
28
  public $network_admin_install;
 
29
  private $action_call;
 
30
  private $action_params;
31
- private $mmb_pre_init_actions;
32
- private $mmb_pre_init_filters;
33
  private $mmb_init_actions;
34
 
35
  public function __construct()
36
  {
37
- global $wpmu_version, $blog_id, $_mmb_plugin_actions, $_mmb_item_filter, $_mmb_options;
38
 
39
- $_mmb_plugin_actions = array();
40
  $_mmb_options = get_option('wrksettings');
41
  $_mmb_options = !empty($_mmb_options) ? $_mmb_options : array();
42
 
43
- $this->name = 'Manage Multiple Blogs';
44
- $this->action_call = null;
45
- $this->action_params = null;
46
-
47
- if (function_exists('is_multisite')) {
48
- if (is_multisite()) {
49
- $this->mmb_multisite = $blog_id;
50
- $this->network_admin_install = get_option('mmb_network_admin_install');
51
- }
52
  } else {
53
- if (!empty($wpmu_version)) {
54
- $this->mmb_multisite = $blog_id;
55
- $this->network_admin_install = get_option('mmb_network_admin_install');
56
- } else {
57
- $this->mmb_multisite = false;
58
- $this->network_admin_install = null;
59
- }
60
  }
61
 
62
  // admin notices
@@ -77,100 +78,13 @@ class MMB_Core extends MMB_Helper
77
  }
78
  }
79
 
80
- // default filters
81
- //$this->mmb_pre_init_filters['get_stats']['mmb_stats_filter'][] = array('MMB_Stats', 'pre_init_stats'); // called with class name, use global $mmb_core inside the function instead of $this
82
- $this->mmb_pre_init_filters['get_stats']['mmb_stats_filter'][] = 'mmb_pre_init_stats';
83
-
84
- $_mmb_item_filter['pre_init_stats'] = array('core_update', 'hit_counter', 'comments', 'backups', 'posts', 'drafts', 'scheduled');
85
  $_mmb_item_filter['get'] = array('updates', 'errors');
86
 
87
- $this->mmb_pre_init_actions = array(
88
- 'backup_req' => 'mmb_get_backup_req',
89
- );
90
-
91
- $this->mmb_init_actions = array(
92
- 'do_upgrade' => 'mmb_do_upgrade',
93
- 'get_stats' => 'mmb_stats_get',
94
- 'remove_site' => 'mmb_remove_site',
95
- 'backup_clone' => 'mmb_backup_now',
96
- 'restore' => 'mmb_restore_now',
97
- 'optimize_tables' => 'mmb_optimize_tables',
98
- 'check_wp_version' => 'mmb_wp_checkversion',
99
- 'create_post' => 'mmb_post_create',
100
- 'update_worker' => 'mmb_update_worker_plugin',
101
- 'change_comment_status' => 'mmb_change_comment_status',
102
- 'change_post_status' => 'mmb_change_post_status',
103
- 'get_comment_stats' => 'mmb_comment_stats_get',
104
- 'install_addon' => 'mmb_install_addon',
105
- 'install_addons' => 'mmb_install_addons',
106
- 'get_links' => 'mmb_get_links',
107
- 'add_link' => 'mmb_add_link',
108
- 'delete_link' => 'mmb_delete_link',
109
- 'delete_links' => 'mmb_delete_links',
110
- 'get_comments' => 'mmb_get_comments',
111
- 'action_comment' => 'mmb_action_comment',
112
- 'bulk_action_comments' => 'mmb_bulk_action_comments',
113
- 'replyto_comment' => 'mmb_reply_comment',
114
- 'add_user' => 'mmb_add_user',
115
- 'email_backup' => 'mmb_email_backup',
116
- 'check_backup_compat' => 'mmb_check_backup_compat',
117
- 'scheduled_backup' => 'mmb_scheduled_backup',
118
- 'run_task' => 'mmb_run_task_now',
119
- 'execute_php_code' => 'mmb_execute_php_code',
120
- 'delete_backup' => 'mmm_delete_backup',
121
- 'remote_backup_now' => 'mmb_remote_backup_now',
122
- 'set_notifications' => 'mmb_set_notifications',
123
- 'clean_orphan_backups' => 'mmb_clean_orphan_backups',
124
- 'get_users' => 'mmb_get_users',
125
- 'edit_users' => 'mmb_edit_users',
126
- 'get_posts' => 'mmb_get_posts',
127
- 'delete_post' => 'mmb_delete_post',
128
- 'delete_posts' => 'mmb_delete_posts',
129
- 'edit_posts' => 'mmb_edit_posts',
130
- 'get_pages' => 'mmb_get_pages',
131
- 'delete_page' => 'mmb_delete_page',
132
- 'get_plugins_themes' => 'mmb_get_plugins_themes',
133
- 'edit_plugins_themes' => 'mmb_edit_plugins_themes',
134
- 'worker_brand' => 'mmb_worker_brand',
135
- 'maintenance' => 'mmb_maintenance_mode',
136
- 'get_dbname' => 'mmb_get_dbname',
137
- 'security_check' => 'mbb_security_check',
138
- 'security_fix_folder_listing' => 'mbb_security_fix_folder_listing',
139
- 'security_fix_php_reporting' => 'mbb_security_fix_php_reporting',
140
- 'security_fix_database_reporting' => 'mbb_security_fix_database_reporting',
141
- 'security_fix_wp_version' => 'mbb_security_fix_wp_version',
142
- 'security_fix_admin_username' => 'mbb_security_fix_admin_username',
143
- 'security_fix_htaccess_permission' => 'mbb_security_fix_htaccess_permission',
144
- 'security_fix_scripts_styles' => 'mbb_security_fix_scripts_styles',
145
- 'security_fix_file_permission' => 'mbb_security_fix_file_permission',
146
- 'security_fix_all' => 'mbb_security_fix_all',
147
- 'get_autoupdate_plugins_themes' => 'mmb_get_autoupdate_plugins_themes',
148
- 'edit_autoupdate_plugins_themes' => 'mmb_edit_autoupdate_plugins_themes',
149
- 'ping_backup' => 'mwp_ping_backup',
150
- );
151
 
152
- $mwp_worker_brand = get_option("mwp_worker_brand");
153
- //!$mwp_worker_brand['hide_managed_remotely']
154
- if ($mwp_worker_brand == false || (is_array($mwp_worker_brand) && !array_key_exists('hide_managed_remotely', $mwp_worker_brand))) {
155
- add_action('rightnow_end', array(&$this, 'add_right_now_info'));
156
- }
157
- if ($mwp_worker_brand != false && is_array($mwp_worker_brand) && isset($mwp_worker_brand['text_for_client']) && ($mwp_worker_brand['email_or_link'] != 0)) {
158
- add_action('admin_init', array($this, 'enqueue_scripts'));
159
- add_action('admin_init', array($this, 'enqueue_styles'));
160
- add_action('admin_menu', array($this, 'add_support_page'));
161
- add_action('admin_head', array($this, 'support_page_script'));
162
- add_action('admin_footer', array($this, 'support_page_dialog'));
163
- add_action('admin_init', array($this, 'send_email_to_admin'));
164
- }
165
- add_action('plugins_loaded', array(&$this, 'dissalow_text_editor'));
166
-
167
- add_action('admin_init', array(&$this, 'admin_actions'));
168
  add_action('init', array(&$this, 'mmb_remote_action'), 9999);
169
  add_action('setup_theme', 'mmb_run_forked_action', 1);
170
- add_action('plugins_loaded', 'mmb_authenticate', 1);
171
- add_action('setup_theme', 'mmb_parse_request');
172
- add_action('set_auth_cookie', array(&$this, 'mmb_set_auth_cookie'));
173
- add_action('set_logged_in_cookie', array(&$this, 'mmb_set_logged_in_cookie'));
174
 
175
  if (!get_option('_worker_nossl_key') && !get_option('_worker_public_key')) {
176
  add_action('init', array(&$this, 'deactivateWorkerIfNotAddedAfterTenMinutes'));
@@ -185,42 +99,6 @@ class MMB_Core extends MMB_Helper
185
  }
186
  }
187
 
188
- public function register_action_params($action = false, $params = array())
189
- {
190
- if (isset($this->mmb_pre_init_actions[$action]) && function_exists($this->mmb_pre_init_actions[$action])) {
191
- call_user_func($this->mmb_pre_init_actions[$action], $params);
192
- }
193
-
194
- if (isset($this->mmb_init_actions[$action]) && function_exists($this->mmb_init_actions[$action])) {
195
- $this->action_call = $this->mmb_init_actions[$action];
196
- $this->action_params = $params;
197
-
198
- if (isset($this->mmb_pre_init_filters[$action]) && !empty($this->mmb_pre_init_filters[$action])) {
199
- global $mmb_filters;
200
-
201
- foreach ($this->mmb_pre_init_filters[$action] as $_name => $_functions) {
202
- if (!empty($_functions)) {
203
- $data = array();
204
-
205
- foreach ($_functions as $_callback) {
206
- if (is_array($_callback) && method_exists($_callback[0], $_callback[1])) {
207
- $data = call_user_func($_callback, $params);
208
- } elseif (is_string($_callback) && function_exists($_callback)) {
209
- $data = call_user_func($_callback, $params);
210
- }
211
- $mmb_filters[$_name] = isset($mmb_filters[$_name]) && !empty($mmb_filters[$_name]) ? array_merge($mmb_filters[$_name], $data) : $data;
212
- add_filter($_name, create_function('$a', 'global $mmb_filters; return array_merge($a, $mmb_filters["'.$_name.'"]);'));
213
- }
214
- }
215
- }
216
- }
217
-
218
- return true;
219
- }
220
-
221
- return false;
222
- }
223
-
224
  /**
225
  * Add notice to network admin dashboard for security reasons
226
  */
@@ -262,78 +140,6 @@ class MMB_Core extends MMB_Helper
262
  echo $notice;
263
  }
264
 
265
- //
266
-
267
- /**
268
- * Add an item into the Right Now Dashboard widget
269
- * to inform that the blog can be managed remotely
270
- */
271
- public function add_right_now_info()
272
- {
273
- $mwp_worker_brand = get_option('mwp_worker_brand');
274
- echo '<div class="mmb-slave-info">';
275
- if ($mwp_worker_brand && isset($mwp_worker_brand['remotely_managed_text'])) {
276
- /*$url = isset($mwp_worker_brand['author_url']) ? $mwp_worker_brand['author_url'] : null;
277
- if($url) {
278
- $scheme = parse_url($mwp_worker_brand['author_url'], PHP_URL_SCHEME);
279
- if(empty($scheme)) {
280
- $url = 'http://' . $url;
281
- }
282
- }
283
- if($url) {
284
- $managedBy = '<a target="_blank" href="'.htmlspecialchars($url).'">'
285
- .htmlspecialchars($mwp_worker_brand['author'])
286
- .'</a>';
287
- } else {
288
- $managedBy = htmlspecialchars($mwp_worker_brand['author']);
289
- }
290
- echo sprintf('<p>This site is managed by %s.</p>', $managedBy);*/
291
- echo '<p>'.$mwp_worker_brand['remotely_managed_text'].'</p>';
292
- } else {
293
- echo '<p>This site can be managed remotely.</p>';
294
- }
295
- echo '</div>';
296
- }
297
-
298
- public function enqueue_scripts()
299
- {
300
- wp_enqueue_script('jquery');
301
- wp_enqueue_script('jquery-ui-core');
302
- wp_enqueue_script('jquery-ui-dialog');
303
- }
304
-
305
- public function enqueue_styles()
306
- {
307
- wp_enqueue_style('wp-jquery-ui');
308
- wp_enqueue_style('jquery-style', 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/themes/smoothness/jquery-ui.css');
309
- }
310
-
311
- public function send_email_to_admin()
312
- {
313
- if (!isset($_POST['support_mwp_message'])) {
314
- return;
315
- }
316
- global $current_user;
317
- if (empty($_POST['support_mwp_message'])) {
318
- $this->mwp_send_ajax_response(false, "Please enter a message.");
319
- }
320
- $mwp_worker_brand = get_option('mwp_worker_brand');
321
- if (empty($mwp_worker_brand['admin_email'])) {
322
- $this->mwp_send_ajax_response(false, "Unable to send email to admin.");
323
- }
324
- $subject = 'New ticket for site '.get_bloginfo('url');
325
- $message = <<<EOF
326
- Hi,
327
- User with a username {$current_user->user_login} has a new question:
328
- {$_POST['support_mwp_message']}
329
- EOF;
330
- $has_been_sent = wp_mail($mwp_worker_brand['admin_email'], $subject, $message);
331
- if (!$has_been_sent) {
332
- $this->mwp_send_ajax_response(false, "Unable to send email. Please try again.");
333
- }
334
- $this->mwp_send_ajax_response(true, "Message successfully sent.");
335
- }
336
-
337
  public function mwp_send_ajax_response($success = true, $message = '')
338
  {
339
  $response = json_encode(
@@ -346,121 +152,6 @@ EOF;
346
  exit;
347
  }
348
 
349
- public function support_page_dialog()
350
- {
351
- $mwp_worker_brand = get_option('mwp_worker_brand');
352
-
353
- if ($mwp_worker_brand && isset($mwp_worker_brand['text_for_client']) && ($mwp_worker_brand['text_for_client'] != '')) {
354
- $notification_text = $mwp_worker_brand['text_for_client'];
355
- }
356
- ?>
357
- <div id="support_dialog" style="display: none;">
358
- <?php if (!empty($notification_text)): ?>
359
- <div>
360
- <p><?php echo $notification_text;
361
- ?></p>
362
- </div>
363
- <?php endif ?>
364
- <?php if ($mwp_worker_brand['email_or_link'] == 1): ?>
365
- <div style="margin: 19px 0 0;">
366
- <form method="post" id="support_form">
367
- <textarea name="support_mwp_message" id="support_message" style="width:500px;height:150px;display:block;margin-left:auto;margin-right:auto;"></textarea>
368
- <button type="submit" class="button-primary" style="display:block;margin:20px auto 7px auto;border:1px solid #a1a1a1;padding:0 31px;border-radius: 4px;">Send</button>
369
- </form>
370
- <div id="support_response_id" style="margin-top: 14px"></div>
371
- <style scoped="scoped">
372
- .mwp-support-dialog.ui-dialog {
373
- z-index: 300002;
374
- }
375
- </style>
376
- </div>
377
- <?php endif ?>
378
- </div>
379
- <?php
380
-
381
- }
382
-
383
- public function support_page_script()
384
- {
385
- ?>
386
- <script type="text/javascript">
387
- jQuery(document).ready(function ($) {
388
- var $dialog = $('#support_dialog');
389
- var $form = $('#support_form');
390
- var $messageContainer = $('#support_response_id');
391
- $form.submit(function (e) {
392
- e.preventDefault();
393
- var data = $(this).serialize();
394
- $.ajax({
395
- type: "POST",
396
- url: 'index.php',
397
- dataType: 'json',
398
- data: data,
399
- success: function (data, textStatus, jqXHR) {
400
- if (data.success) {
401
- $form.slideUp();
402
- }
403
- $messageContainer.html(data.message);
404
- },
405
- error: function (jqXHR, textStatus, errorThrown) {
406
- $messageContainer.html('An error occurred, please try again.');
407
- }
408
- });
409
- });
410
- $('.toplevel_page_mwp-support').click(function (e) {
411
- e.preventDefault();
412
- $form.show();
413
- $messageContainer.empty();
414
- $dialog.dialog({
415
- draggable: false,
416
- resizable: false,
417
- modal: true,
418
- width: '530px',
419
- height: 'auto',
420
- title: 'Contact Support',
421
- dialogClass: 'mwp-support-dialog',
422
- close: function () {
423
- $('#support_response_id').html('');
424
- $(this).dialog("destroy");
425
- }
426
- });
427
- });
428
- });
429
- </script>
430
- <?php
431
-
432
- }
433
-
434
- /**
435
- * Add Support page on Top Menu
436
- */
437
- public function add_support_page()
438
- {
439
- $mwp_worker_brand = get_option('mwp_worker_brand');
440
- if ($mwp_worker_brand && isset($mwp_worker_brand['text_for_client']) && ($mwp_worker_brand['text_for_client'] != '')) {
441
- add_menu_page(__('Support', 'wp-support'), __('Support', 'wp-support'), 'read', 'mwp-support', array(&$this, 'support_function'), '');
442
- }
443
- }
444
-
445
- /**
446
- * Support page handler
447
- */
448
- public function support_function()
449
- {
450
- }
451
-
452
- /**
453
- * Remove editor from plugins&themes submenu page
454
- */
455
- public function dissalow_text_editor()
456
- {
457
- $mwp_worker_brand = get_option('mwp_worker_brand');
458
- if ($mwp_worker_brand && isset($mwp_worker_brand['dissalow_edit']) && ($mwp_worker_brand['dissalow_edit'] == 'checked')) {
459
- define('DISALLOW_FILE_EDIT', true);
460
- define('DISALLOW_FILE_MODS', true);
461
- }
462
- }
463
-
464
  /**
465
  * Get parent blog options
466
  */
@@ -509,18 +200,6 @@ EOF;
509
  return $this->user_instance;
510
  }
511
 
512
- /**
513
- * Gets an instance of Security
514
- */
515
- public function get_security_instance()
516
- {
517
- if (!isset($this->security_instance)) {
518
- $this->security_instance = new MMB_Security();
519
- }
520
-
521
- return $this->security_instance;
522
- }
523
-
524
  /**
525
  * Gets an instance of stats class
526
  */
@@ -545,26 +224,87 @@ EOF;
545
  return $this->backup_instance;
546
  }
547
 
548
- /**
549
- * Gets an instance of links class
 
 
 
550
 
551
- */
552
- public function get_link_instance()
 
 
553
  {
554
- if (!isset($this->link_instance)) {
555
- $this->link_instance = new MMB_Link();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
556
  }
557
 
558
- return $this->link_instance;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
559
  }
560
 
561
- public function get_installer_instance()
562
  {
563
- if (!isset($this->installer_instance)) {
564
- $this->installer_instance = new MMB_Installer();
 
 
 
565
  }
566
 
567
- return $this->installer_instance;
 
 
 
 
 
568
  }
569
 
570
  /**
@@ -573,6 +313,12 @@ EOF;
573
  */
574
  public function install()
575
  {
 
 
 
 
 
 
576
  /** @var wpdb $wpdb */
577
  global $wpdb, $_wp_using_ext_object_cache;
578
  $_wp_using_ext_object_cache = false;
@@ -607,7 +353,6 @@ EOF;
607
  delete_option('_action_message_id');
608
  }
609
 
610
- //delete_option('mwp_backup_tasks');
611
  delete_option('mwp_notifications');
612
  delete_option('mwp_worker_brand');
613
  delete_option('mwp_pageview_alerts');
@@ -635,11 +380,21 @@ EOF;
635
  update_option('wrksettings', $options);
636
  }
637
 
 
 
 
 
 
 
 
 
 
638
  /**
639
  * Deletes options for communication with master
640
  */
641
- public function uninstall($deactivate = false)
642
  {
 
643
  /** @var wpdb $wpdb */
644
  global $current_user, $wpdb, $_wp_using_ext_object_cache;
645
  $_wp_using_ext_object_cache = false;
@@ -656,7 +411,6 @@ EOF;
656
  delete_blog_option($blog_id, '_worker_public_key');
657
  delete_blog_option($blog_id, '_action_message_id');
658
  delete_blog_option($blog_id, 'mwp_maintenace_mode');
659
- //delete_blog_option($blog_id, 'mwp_backup_tasks');
660
  delete_blog_option($blog_id, 'mwp_notifications');
661
  delete_blog_option($blog_id, 'mwp_worker_brand');
662
  delete_blog_option($blog_id, 'mwp_pageview_alerts');
@@ -681,7 +435,6 @@ EOF;
681
 
682
  //Delete options
683
  delete_option('mwp_maintenace_mode');
684
- //delete_option('mwp_backup_tasks');
685
  delete_option('mwp_notifications');
686
  delete_option('mwp_worker_brand');
687
  delete_option('mwp_pageview_alerts');
@@ -726,6 +479,8 @@ EOF;
726
  );
727
  }
728
 
 
 
729
  ob_start();
730
  @unlink(dirname(__FILE__));
731
  $upgrader = new Plugin_Upgrader();
@@ -757,128 +512,6 @@ EOF;
757
  );
758
  }
759
 
760
- /**
761
- * Automatically logs in when called from Master
762
- */
763
- public function automatic_login()
764
- {
765
- $where = isset($_GET['mwp_goto']) ? $_GET['mwp_goto'] : false;
766
- $username = isset($_GET['username']) ? $_GET['username'] : '';
767
- $auto_login = isset($_GET['auto_login']) ? $_GET['auto_login'] : 0;
768
-
769
- if (!function_exists('is_user_logged_in')) {
770
- include_once ABSPATH.'wp-includes/pluggable.php';
771
- }
772
-
773
- if (($auto_login && strlen(trim($username)) && !is_user_logged_in()) || (isset($this->mmb_multisite) && $this->mmb_multisite)) {
774
- $signature = base64_decode($_GET['signature']);
775
- $message_id = trim($_GET['message_id']);
776
-
777
- $auth = $this->authenticate_message($where.$message_id, $signature, $message_id);
778
- if ($auth === true) {
779
- if (!headers_sent()) {
780
- header('P3P: CP="CAO PSA OUR"');
781
- }
782
-
783
- if (!defined('MMB_USER_LOGIN')) {
784
- define('MMB_USER_LOGIN', true);
785
- }
786
-
787
- $siteurl = function_exists('get_site_option') ? get_site_option('siteurl') : get_option('siteurl');
788
- $user = $this->mmb_get_user_info($username);
789
- wp_set_current_user($user->ID);
790
- // Compatibility with All In One Security
791
- update_user_meta($user->ID, 'last_login_time', current_time('mysql'));
792
-
793
- if (!defined('COOKIEHASH') || (isset($this->mmb_multisite) && $this->mmb_multisite)) {
794
- wp_cookie_constants();
795
- }
796
-
797
- wp_set_auth_cookie($user->ID);
798
- @mmb_worker_header();
799
-
800
- if ((isset($this->mmb_multisite) && $this->mmb_multisite) || isset($_REQUEST['mwpredirect'])) {
801
- if (function_exists('wp_safe_redirect') && function_exists('admin_url')) {
802
- wp_safe_redirect(admin_url($where));
803
- exit();
804
- }
805
- }
806
- } else {
807
- wp_die($auth['error']);
808
- }
809
- } elseif (is_user_logged_in()) {
810
- @mmb_worker_header();
811
- if (isset($_REQUEST['mwpredirect'])) {
812
- if (function_exists('wp_safe_redirect') && function_exists('admin_url')) {
813
- wp_safe_redirect(admin_url($where));
814
- exit();
815
- }
816
- }
817
- }
818
- }
819
-
820
- public function mmb_set_auth_cookie($auth_cookie)
821
- {
822
- if (!defined('MMB_USER_LOGIN')) {
823
- return;
824
- }
825
-
826
- if (!defined('COOKIEHASH')) {
827
- wp_cookie_constants();
828
- }
829
-
830
- $_COOKIE['wordpress_'.COOKIEHASH] = $auth_cookie;
831
- }
832
-
833
- public function mmb_set_logged_in_cookie($logged_in_cookie)
834
- {
835
- if (!defined('MMB_USER_LOGIN')) {
836
- return;
837
- }
838
-
839
- if (!defined('COOKIEHASH')) {
840
- wp_cookie_constants();
841
- }
842
-
843
- $_COOKIE['wordpress_logged_in_'.COOKIEHASH] = $logged_in_cookie;
844
- }
845
-
846
- public function admin_actions()
847
- {
848
- add_filter('all_plugins', array($this, 'worker_replace'));
849
- }
850
-
851
- public function worker_replace($all_plugins)
852
- {
853
- $replace = get_option("mwp_worker_brand");
854
- if (is_array($replace)) {
855
- if ($replace['name'] || $replace['desc'] || $replace['author'] || $replace['author_url']) {
856
- $all_plugins['worker/init.php']['Name'] = $replace['name'];
857
- $all_plugins['worker/init.php']['Title'] = $replace['name'];
858
- $all_plugins['worker/init.php']['Description'] = $replace['desc'];
859
- $all_plugins['worker/init.php']['AuthorURI'] = $replace['author_url'];
860
- $all_plugins['worker/init.php']['Author'] = $replace['author'];
861
- $all_plugins['worker/init.php']['AuthorName'] = $replace['author'];
862
- $all_plugins['worker/init.php']['PluginURI'] = '';
863
- }
864
-
865
- if ($replace['hide']) {
866
- if (!function_exists('get_plugins')) {
867
- include_once ABSPATH.'wp-admin/includes/plugin.php';
868
- }
869
- $activated_plugins = get_option('active_plugins');
870
- if (!$activated_plugins) {
871
- $activated_plugins = array();
872
- }
873
- if (in_array('worker/init.php', $activated_plugins)) {
874
- unset($all_plugins['worker/init.php']);
875
- }
876
- }
877
- }
878
-
879
- return $all_plugins;
880
- }
881
-
882
  public function deactivateWorkerIfNotAddedAfterTenMinutes()
883
  {
884
  $workerActivationTime = get_option("mmb_worker_activation_time");
8
  **************************************************************/
9
  class MMB_Core extends MMB_Helper
10
  {
11
+
12
  public $slug;
13
+
14
  public $settings;
15
+
16
  public $remote_client;
17
+
18
  public $comment_instance;
19
+
20
  public $plugin_instance;
21
+
22
  public $theme_instance;
23
+
24
  public $wp_instance;
25
+
26
  public $post_instance;
27
+
28
  public $stats_instance;
29
+
30
  public $search_instance;
31
+
32
  public $user_instance;
33
+
34
  public $backup_instance;
35
+
36
  public $installer_instance;
37
+
38
  public $mmb_multisite;
39
+
40
  public $network_admin_install;
41
+
42
  private $action_call;
43
+
44
  private $action_params;
45
+
 
46
  private $mmb_init_actions;
47
 
48
  public function __construct()
49
  {
50
+ global $blog_id, $_mmb_item_filter, $_mmb_options;
51
 
 
52
  $_mmb_options = get_option('wrksettings');
53
  $_mmb_options = !empty($_mmb_options) ? $_mmb_options : array();
54
 
55
+ if (is_multisite()) {
56
+ $this->mmb_multisite = $blog_id;
57
+ $this->network_admin_install = get_option('mmb_network_admin_install');
 
 
 
 
 
 
58
  } else {
59
+ $this->mmb_multisite = false;
60
+ $this->network_admin_install = null;
 
 
 
 
 
61
  }
62
 
63
  // admin notices
78
  }
79
  }
80
 
81
+ $_mmb_item_filter['pre_init_stats'] = array('core_update', 'hit_counter', 'comments', 'backups', 'posts', 'drafts', 'scheduled', 'site_statistics');
 
 
 
 
82
  $_mmb_item_filter['get'] = array('updates', 'errors');
83
 
84
+ $this->mmb_init_actions = array();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
  add_action('init', array(&$this, 'mmb_remote_action'), 9999);
87
  add_action('setup_theme', 'mmb_run_forked_action', 1);
 
 
 
 
88
 
89
  if (!get_option('_worker_nossl_key') && !get_option('_worker_public_key')) {
90
  add_action('init', array(&$this, 'deactivateWorkerIfNotAddedAfterTenMinutes'));
99
  }
100
  }
101
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
102
  /**
103
  * Add notice to network admin dashboard for security reasons
104
  */
140
  echo $notice;
141
  }
142
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
143
  public function mwp_send_ajax_response($success = true, $message = '')
144
  {
145
  $response = json_encode(
152
  exit;
153
  }
154
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
155
  /**
156
  * Get parent blog options
157
  */
200
  return $this->user_instance;
201
  }
202
 
 
 
 
 
 
 
 
 
 
 
 
 
203
  /**
204
  * Gets an instance of stats class
205
  */
224
  return $this->backup_instance;
225
  }
226
 
227
+ public function get_installer_instance()
228
+ {
229
+ if (!isset($this->installer_instance)) {
230
+ $this->installer_instance = new MMB_Installer();
231
+ }
232
 
233
+ return $this->installer_instance;
234
+ }
235
+
236
+ public function buildLoaderContent($pluginBasename)
237
  {
238
+ $loader = <<<EOF
239
+ <?php
240
+
241
+ /*
242
+ Plugin Name: ManageWP - Worker Loader
243
+ Plugin URI: https://managewp.com
244
+ Description: This is automatically generated by the ManageWP Worker plugin to increase performance and reliability. It is automatically disabled when disabling the main plugin.
245
+ Author: ManageWP
246
+ Author URI: https://managewp.com
247
+ License: GPL2
248
+ */
249
+
250
+ if (!function_exists('untrailingslashit') || !defined('WP_PLUGIN_DIR')) {
251
+ // WordPress is probably not bootstrapped.
252
+ exit;
253
+ }
254
+
255
+ if (file_exists(untrailingslashit(WP_PLUGIN_DIR).'/$pluginBasename')) {
256
+ if (in_array('$pluginBasename', (array) get_option('active_plugins'))) {
257
+ \$GLOBALS['mwp_is_mu'] = true;
258
+ include_once untrailingslashit(WP_PLUGIN_DIR).'/$pluginBasename';
259
+ }
260
+ }
261
+
262
+ EOF;
263
+
264
+ return $loader;
265
+ }
266
+
267
+ public function registerMustUse($loaderName, $loaderContent)
268
+ {
269
+ $mustUsePluginDir = rtrim(WPMU_PLUGIN_DIR, '/');
270
+ $loaderPath = $mustUsePluginDir.'/'.$loaderName;
271
+
272
+ if (file_exists($loaderPath) && md5($loaderContent) === md5_file($loaderPath)) {
273
+ return;
274
  }
275
 
276
+ if (!is_dir($mustUsePluginDir)) {
277
+ $dirMade = @mkdir($mustUsePluginDir);
278
+
279
+ if (!$dirMade) {
280
+ $error = error_get_last();
281
+ throw new Exception(sprintf('Unable to create loader directory: %s', $error['message']));
282
+ }
283
+ }
284
+
285
+ $loaderWritten = @file_put_contents($loaderPath, $loaderContent);
286
+
287
+ if (!$loaderWritten) {
288
+ $error = error_get_last();
289
+ throw new Exception(sprintf('Unable to write loader: %s', $error['message']));
290
+ }
291
  }
292
 
293
+ public function unRegisterMustUse($loaderName)
294
  {
295
+ $mustUsePluginDir = rtrim(WPMU_PLUGIN_DIR, '/');
296
+ $loaderPath = $mustUsePluginDir.'/'.$loaderName;
297
+
298
+ if (!file_exists($loaderPath)) {
299
+ return;
300
  }
301
 
302
+ $removed = @unlink($loaderPath);
303
+
304
+ if (!$removed) {
305
+ $error = error_get_last();
306
+ throw new Exception(sprintf('Unable to remove loader: %s', $error['message']));
307
+ }
308
  }
309
 
310
  /**
313
  */
314
  public function install()
315
  {
316
+ try {
317
+ $this->registerMustUse('0-worker.php', $this->buildLoaderContent('worker/init.php'));
318
+ } catch (Exception $e) {
319
+ mwp_logger()->error('Unable to write ManageWP loader', array('exception' => $e));
320
+ }
321
+
322
  /** @var wpdb $wpdb */
323
  global $wpdb, $_wp_using_ext_object_cache;
324
  $_wp_using_ext_object_cache = false;
353
  delete_option('_action_message_id');
354
  }
355
 
 
356
  delete_option('mwp_notifications');
357
  delete_option('mwp_worker_brand');
358
  delete_option('mwp_pageview_alerts');
380
  update_option('wrksettings', $options);
381
  }
382
 
383
+ public function uninstall()
384
+ {
385
+ try {
386
+ $this->unRegisterMustUse('0-worker.php');
387
+ } catch (Exception $e) {
388
+ mwp_logger()->error('Unable to remove loader', array('exception' => $e));
389
+ }
390
+ }
391
+
392
  /**
393
  * Deletes options for communication with master
394
  */
395
+ public function deactivate($deactivate = false)
396
  {
397
+ $this->uninstall();
398
  /** @var wpdb $wpdb */
399
  global $current_user, $wpdb, $_wp_using_ext_object_cache;
400
  $_wp_using_ext_object_cache = false;
411
  delete_blog_option($blog_id, '_worker_public_key');
412
  delete_blog_option($blog_id, '_action_message_id');
413
  delete_blog_option($blog_id, 'mwp_maintenace_mode');
 
414
  delete_blog_option($blog_id, 'mwp_notifications');
415
  delete_blog_option($blog_id, 'mwp_worker_brand');
416
  delete_blog_option($blog_id, 'mwp_pageview_alerts');
435
 
436
  //Delete options
437
  delete_option('mwp_maintenace_mode');
 
438
  delete_option('mwp_notifications');
439
  delete_option('mwp_worker_brand');
440
  delete_option('mwp_pageview_alerts');
479
  );
480
  }
481
 
482
+ mwp_load_required_components();
483
+
484
  ob_start();
485
  @unlink(dirname(__FILE__));
486
  $upgrader = new Plugin_Upgrader();
512
  );
513
  }
514
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
515
  public function deactivateWorkerIfNotAddedAfterTenMinutes()
516
  {
517
  $workerActivationTime = get_option("mmb_worker_activation_time");
src/MMB/Helper.php CHANGED
@@ -8,38 +8,8 @@
8
  **************************************************************/
9
  class MMB_Helper
10
  {
11
- public $mmb_multisite;
12
-
13
- /**
14
- * A helper function to log data
15
- *
16
- * @deprecated use mwp_logger() instead
17
- *
18
- * @param mixed $mixed
19
- */
20
- public function _log($mixed)
21
- {
22
- if ((defined('MWP_SHOW_LOG') && MWP_SHOW_LOG == true) || get_option('mwp_debug_enable')) {
23
- if (is_array($mixed)) {
24
- $mixed = print_r($mixed, 1);
25
- } else {
26
- if (is_object($mixed)) {
27
- ob_start();
28
- var_dump($mixed);
29
- $mixed = ob_get_clean();
30
- }
31
- }
32
 
33
- $md5 = get_option('mwp_log_md5');
34
- if ($md5 === false) {
35
- $md5 = md5(date('jS F Y h:i:s A'));
36
- update_option('mwp_log_md5', $md5);
37
- }
38
- $handle = fopen(dirname(__FILE__).'/log_'.$md5, 'a');
39
- fwrite($handle, $mixed.PHP_EOL);
40
- fclose($handle);
41
- }
42
- }
43
 
44
  /**
45
  * Initializes the file system
@@ -257,22 +227,6 @@ class MMB_Helper
257
  return false;
258
  }
259
 
260
- public function get_worker_message_id()
261
- {
262
- return (int) get_option('_action_message_id');
263
- }
264
-
265
- public function set_master_public_key($public_key = false)
266
- {
267
- if ($public_key && !get_option('_worker_public_key')) {
268
- add_option('_worker_public_key', base64_encode($public_key));
269
-
270
- return true;
271
- }
272
-
273
- return false;
274
- }
275
-
276
  public function get_master_public_key()
277
  {
278
  if (!get_option('_worker_public_key')) {
@@ -291,76 +245,6 @@ class MMB_Helper
291
  return base64_decode(get_option('_worker_nossl_key'));
292
  }
293
 
294
- public function set_random_signature($random_key = false)
295
- {
296
- if ($random_key && !get_option('_worker_nossl_key')) {
297
- add_option('_worker_nossl_key', base64_encode($random_key));
298
-
299
- return true;
300
- }
301
-
302
- return false;
303
- }
304
-
305
- public function authenticate_message($data = false, $signature = false, $message_id = false)
306
- {
307
- if (!$data && !$signature) {
308
- return array(
309
- 'error' => 'Authentication failed.',
310
- );
311
- }
312
- $nonce = new MWP_Security_HashNonce();
313
- $nonce->setValue($message_id);
314
- if (!$nonce->verify()) {
315
- return array(
316
- 'error' => 'Invalid nonce used. Please contact support',
317
- );
318
- }
319
-
320
- $pl_key = $this->get_master_public_key();
321
- if (!$pl_key) {
322
- return array(
323
- 'error' => 'Authentication failed. Deactivate and activate the ManageWP Worker plugin on this site, then re-add it to your ManageWP account.',
324
- );
325
- }
326
-
327
- if (function_exists('openssl_verify') && !$this->get_random_signature()) {
328
- $verify = openssl_verify($data, $signature, $pl_key);
329
- if ($verify == 1) {
330
- //$this->set_worker_message_id($message_id);
331
-
332
- return true;
333
- } else {
334
- if ($verify == 0) {
335
- return array(
336
- 'error' => 'Invalid message signature. Deactivate and activate the ManageWP Worker plugin on this site, then re-add it to your ManageWP account.',
337
- );
338
- } else {
339
- return array(
340
- 'error' => 'Command not successful! Please try again.',
341
- );
342
- }
343
- }
344
- } else {
345
- if ($this->get_random_signature()) {
346
- if (md5($data.$this->get_random_signature()) === $signature) {
347
- //$this->set_worker_message_id($message_id);
348
-
349
- return true;
350
- }
351
-
352
- return array(
353
- 'error' => 'Invalid message signature. Deactivate and activate the ManageWP Worker plugin on this site, then re-add it to your ManageWP account.',
354
- );
355
- } // no rand key - deleted in get_stat maybe
356
- else {
357
- return array(
358
- 'error' => 'Invalid message signature. Deactivate and activate the ManageWP Worker plugin on this site, then re-add it to your ManageWP account.',
359
- );
360
- }
361
- }
362
- }
363
-
364
  public function get_secure_hash()
365
  {
366
  $pl_key = $this->get_master_public_key();
@@ -584,4 +468,19 @@ class MMB_Helper
584
 
585
  return $users_authors;
586
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
587
  }
8
  **************************************************************/
9
  class MMB_Helper
10
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
 
12
+ public $mmb_multisite;
 
 
 
 
 
 
 
 
 
13
 
14
  /**
15
  * Initializes the file system
227
  return false;
228
  }
229
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
230
  public function get_master_public_key()
231
  {
232
  if (!get_option('_worker_public_key')) {
245
  return base64_decode(get_option('_worker_nossl_key'));
246
  }
247
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
248
  public function get_secure_hash()
249
  {
250
  $pl_key = $this->get_master_public_key();
468
 
469
  return $users_authors;
470
  }
471
+
472
+ private function verifySignature($data, $signature, $publicKey)
473
+ {
474
+ if (function_exists('openssl_verify')) {
475
+ return (openssl_verify($data, $signature, $publicKey) === 1);
476
+ }
477
+
478
+ require_once dirname(__FILE__).'/../PHPSecLib/Crypt/RSA.php';
479
+ $rsa = new Crypt_RSA();
480
+ $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
481
+ $rsa->loadKey($publicKey);
482
+ $verify = $rsa->verify($data, $signature);
483
+
484
+ return $verify;
485
+ }
486
  }
src/MMB/Installer.php CHANGED
@@ -156,7 +156,8 @@ class MMB_Installer extends MMB_Core
156
  }
157
  }
158
  }
159
- ob_clean();
 
160
  $this->mmb_maintenance_mode(false);
161
 
162
  return $install_info;
@@ -254,7 +255,7 @@ class MMB_Installer extends MMB_Core
254
  }
255
  }
256
  }
257
- ob_clean();
258
  $this->mmb_maintenance_mode(false);
259
 
260
  return $upgrades;
@@ -321,7 +322,7 @@ class MMB_Installer extends MMB_Core
321
  );
322
  }
323
  if ($current_update != false) {
324
- global $mmb_wp_version, $wp_filesystem, $wp_version;
325
 
326
  if (version_compare($wp_version, '3.1.9', '>')) {
327
  if (!class_exists('Core_Upgrader')) {
@@ -567,8 +568,6 @@ class MMB_Installer extends MMB_Core
567
 
568
  public function upgrade_premium($premium = false)
569
  {
570
- global $mmb_plugin_url;
571
-
572
  if (!class_exists('WP_Upgrader')) {
573
  include_once ABSPATH.'wp-admin/includes/class-wp-upgrader.php';
574
  }
156
  }
157
  }
158
  }
159
+ // Can generate "E_NOTICE: ob_clean(): failed to delete buffer. No buffer to delete."
160
+ @ob_clean();
161
  $this->mmb_maintenance_mode(false);
162
 
163
  return $install_info;
255
  }
256
  }
257
  }
258
+ @ob_clean();
259
  $this->mmb_maintenance_mode(false);
260
 
261
  return $upgrades;
322
  );
323
  }
324
  if ($current_update != false) {
325
+ global $wp_filesystem, $wp_version;
326
 
327
  if (version_compare($wp_version, '3.1.9', '>')) {
328
  if (!class_exists('Core_Upgrader')) {
568
 
569
  public function upgrade_premium($premium = false)
570
  {
 
 
571
  if (!class_exists('WP_Upgrader')) {
572
  include_once ABSPATH.'wp-admin/includes/class-wp-upgrader.php';
573
  }
src/MMB/Link.php DELETED
@@ -1,172 +0,0 @@
1
- <?php
2
-
3
- /*************************************************************
4
- * link.class.php
5
- * Manage/Add Links
6
- * Copyright (c) 2011 Prelovac Media
7
- * www.prelovac.com
8
- **************************************************************/
9
- class MMB_Link extends MMB_Core
10
- {
11
- public function __construct()
12
- {
13
- parent::__construct();
14
- }
15
-
16
- public function add_link($args)
17
- {
18
- extract($args);
19
-
20
- $params['link_url'] = esc_html($url);
21
- $params['link_url'] = esc_url($params['link_url']);
22
- $params['link_name'] = esc_html($name);
23
- $params['link_id'] = '';
24
- $params['link_description'] = $description;
25
- $params['link_target'] = $link_target;
26
- $params['link_category'] = array();
27
-
28
- //Add Link category
29
- if (is_array($link_category) && !empty($link_category)) {
30
- $terms = get_terms('link_category', array('hide_empty' => 0));
31
-
32
- if ($terms) {
33
- foreach ($terms as $term) {
34
- if (in_array($term->name, $link_category)) {
35
- $params['link_category'][] = $term->term_id;
36
- $link_category = $this->remove_element($link_category, $term->name);
37
- }
38
- }
39
- }
40
- if (!empty($link_category)) {
41
- foreach ($link_category as $linkkey => $linkval) {
42
- if (!empty($linkval)) {
43
- $link = wp_insert_term($linkval, 'link_category');
44
-
45
- if (isset($link['term_id']) && !empty($link['term_id'])) {
46
- $params['link_category'][] = $link['term_id'];
47
- }
48
- }
49
- }
50
- }
51
- }
52
-
53
- //Add Link Owner
54
- $user_obj = get_userdatabylogin($user);
55
- if ($user_obj && $user_obj->ID) {
56
- $params['link_owner'] = $user_obj->ID;
57
- }
58
-
59
- if (!function_exists('wp_insert_link')) {
60
- include_once ABSPATH.'wp-admin/includes/bookmark.php';
61
- }
62
-
63
- $is_success = wp_insert_link($params);
64
-
65
- return $is_success ? true : array('error' => 'Failed to add link.');
66
- }
67
-
68
- public function remove_element($arr, $val)
69
- {
70
- foreach ($arr as $key => $value) {
71
- if ($value == $val) {
72
- unset($arr[$key]);
73
- }
74
- }
75
-
76
- return $arr = array_values($arr);
77
- }
78
-
79
- public function get_links($args)
80
- {
81
- global $wpdb;
82
-
83
- $where = '';
84
-
85
- extract($args);
86
-
87
- if (!empty($filter_links)) {
88
- $where .= " AND (link_name LIKE '%".esc_sql($filter_links)."%' OR link_url LIKE '%".esc_sql($filter_links)."%')";
89
- }
90
-
91
- $linkcats = $this->getLinkCats();
92
- $sql_query = "$wpdb->links WHERE 1=1 ".$where;
93
-
94
- $links_total = $wpdb->get_results("SELECT count(*) as total_links FROM ".$sql_query);
95
- $total = $links_total[0]->total_links;
96
-
97
- $query_links = $wpdb->get_results("SELECT link_id, link_url, link_name, link_target, link_visible, link_rating, link_rel FROM ".$sql_query." ORDER BY link_name ASC LIMIT 500");
98
- $links = array();
99
- foreach ($query_links as $link_info) {
100
- $link_cat = $linkcats[$link_info->link_id];
101
- $cats = array();
102
- foreach ($link_cat as $catkey => $catval) {
103
- $cats[] = $catval;
104
- }
105
-
106
- $links[$link_info->link_id] = array(
107
- "link_url" => $link_info->link_url,
108
- "link_name" => $link_info->link_name,
109
- "link_target" => $link_info->link_target,
110
- "link_visible" => $link_info->link_visible,
111
- "link_rating" => $link_info->link_rating,
112
- "link_rel" => $link_info->link_rel,
113
- "link_cats" => $cats,
114
- );
115
- }
116
-
117
- return array('links' => $links, 'total' => $total);
118
- }
119
-
120
- public function getLinkCats($taxonomy = 'link_category')
121
- {
122
- global $wpdb;
123
-
124
- $cats = $wpdb->get_results(
125
- "SELECT l.link_id, $wpdb->terms.name
126
- FROM $wpdb->links AS l
127
- INNER JOIN $wpdb->term_relationships ON ( l.link_id = $wpdb->term_relationships.object_id )
128
- INNER JOIN $wpdb->term_taxonomy ON ( $wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id
129
- AND $wpdb->term_taxonomy.taxonomy = '".$taxonomy."' )
130
- INNER JOIN $wpdb->terms ON ( $wpdb->term_taxonomy.term_id = $wpdb->terms.term_id )"
131
- );
132
-
133
- foreach ($cats as $post_val) {
134
- $post_cats[$post_val->link_id][] = $post_val->name;
135
- }
136
-
137
- return $post_cats;
138
- }
139
-
140
- public function delete_link($args)
141
- {
142
- global $wpdb;
143
-
144
- if (!empty($args['link_id'])) {
145
- $delete_query = "DELETE FROM $wpdb->links WHERE link_id = ".$args['link_id'];
146
- $wpdb->get_results($delete_query);
147
-
148
- return 'Link deleted.';
149
- } else {
150
- return 'No ID...';
151
- }
152
- }
153
-
154
- public function delete_links($args)
155
- {
156
- global $wpdb;
157
- extract($args);
158
-
159
- if ($deleteaction == 'delete') {
160
- $delete_query_intro = "DELETE FROM $wpdb->links WHERE link_id = ";
161
- }
162
- foreach ($args as $key => $val) {
163
- if (!empty($val) && is_numeric($val)) {
164
- $delete_query = $delete_query_intro.$val;
165
-
166
- $wpdb->query($delete_query);
167
- }
168
- }
169
-
170
- return "Link deleted";
171
- }
172
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/MMB/Post.php CHANGED
@@ -10,7 +10,6 @@ class MMB_Post extends MMB_Core
10
  {
11
  public function create($args)
12
  {
13
- //$this->_log($args);
14
  global $wpdb;
15
 
16
  /**
10
  {
11
  public function create($args)
12
  {
 
13
  global $wpdb;
14
 
15
  /**
src/MMB/Security.php DELETED
@@ -1,384 +0,0 @@
1
- <?php
2
-
3
- class MMB_Security extends MMB_Core
4
- {
5
- public function security_check($args)
6
- {
7
- if (MMB_Security::prevent_listing_ok()) {
8
- $output["prevent_listing_ok"] = true;
9
- } else {
10
- $output["prevent_listing_ok"] = false;
11
- }
12
-
13
- if (MMB_Security::remove_wp_version_ok()) {
14
- $output["remove_wp_version_ok"] = true;
15
- } else {
16
- $output["remove_wp_version_ok"] = false;
17
- }
18
-
19
- if (MMB_Security::remove_database_reporting_ok()) {
20
- $output["remove_database_reporting_ok"] = true;
21
- } else {
22
- $output["remove_database_reporting_ok"] = false;
23
- }
24
-
25
- if (MMB_Security::remove_php_reporting_ok()) {
26
- $output["remove_php_reporting_ok"] = true;
27
- } else {
28
- $output["remove_php_reporting_ok"] = false;
29
- }
30
-
31
- if (MMB_Security::admin_user_ok()) {
32
- $output["admin_user_ok"] = true;
33
- } else {
34
- $output["admin_user_ok"] = false;
35
- }
36
-
37
- if (MMB_Security::htaccess_permission_ok()) {
38
- $output["htaccess_permission_ok"] = true;
39
- } else {
40
- $output["htaccess_permission_ok"] = false;
41
- }
42
- if (MMB_Security::remove_scripts_version_ok() && MMB_Security::remove_styles_version_ok()) {
43
- $output["remove_scripts_and_styles_version_ok"] = true;
44
- } else {
45
- $output["remove_scripts_and_styles_version_ok"] = false;
46
- }
47
- if (MMB_Security::file_permission_ok()) {
48
- $output["file_permission_ok"] = true;
49
- } else {
50
- $output["file_permission_ok"] = false;
51
- }
52
-
53
- return $output;
54
- }
55
-
56
- public function security_fix_dir_listing($args)
57
- {
58
- MMB_Security::prevent_listing();
59
-
60
- return $this->security_check($args);
61
- }
62
-
63
- public function security_fix_permissions($args)
64
- {
65
- MMB_Security::file_permission();
66
-
67
- return $this->security_check($args);
68
- }
69
-
70
- public function security_fix_php_reporting($args)
71
- {
72
- MMB_Security::remove_php_reporting();
73
-
74
- return $this->security_check($args);
75
- }
76
-
77
- public function security_fix_database_reporting($args)
78
- {
79
- MMB_Security::remove_database_reporting();
80
-
81
- return $this->security_check($args);
82
- }
83
-
84
- public function security_fix_wp_version($args)
85
- {
86
- MMB_Security::remove_wp_version();
87
-
88
- return $this->security_check($args);
89
- }
90
-
91
- public function security_fix_admin_username($args)
92
- {
93
- $username = $args[0];
94
- MMB_Security::change_admin_username($username);
95
- $scan_res = $this->security_check($args);
96
- $scan_res["admin_user_ok"] = true;
97
-
98
- return $scan_res;
99
- }
100
-
101
- public function security_fix_scripts_styles($args)
102
- {
103
- MMB_Security::remove_styles_version();
104
- MMB_Security::remove_scripts_version();
105
-
106
- return $this->security_check($args);
107
- }
108
-
109
- public function security_fix_htaccess_permission($args)
110
- {
111
- MMB_Security::htaccess_permission();
112
-
113
- return $this->security_check($args);
114
- }
115
-
116
- //Prevent listing wp-content, wp-content/plugins, wp-content/themes, wp-content/uploads
117
- private static $listingDirectories = null;
118
-
119
- private static function init_listingDirectories()
120
- {
121
- if (MMB_Security::$listingDirectories == null) {
122
- $wp_upload_dir = wp_upload_dir();
123
- MMB_Security::$listingDirectories = array(WP_CONTENT_DIR, WP_PLUGIN_DIR, get_theme_root(), $wp_upload_dir['basedir']);
124
- }
125
- }
126
-
127
- public static function prevent_listing_ok()
128
- {
129
- MMB_Security::init_listingDirectories();
130
- foreach (MMB_Security::$listingDirectories as $directory) {
131
- $file = $directory.DIRECTORY_SEPARATOR.'index.php';
132
- if (!file_exists($file)) {
133
- return false;
134
- }
135
- }
136
-
137
- return true;
138
- }
139
-
140
- public static function prevent_listing()
141
- {
142
- MMB_Security::init_listingDirectories();
143
- foreach (MMB_Security::$listingDirectories as $directory) {
144
- $file = $directory.DIRECTORY_SEPARATOR.'index.php';
145
- if (!file_exists($file)) {
146
- chmod($directory, 0777);
147
- $h = fopen($file, 'w');
148
- fwrite($h, '<?php die(); ?>');
149
- fclose($h);
150
- chmod($directory, 0755);
151
- }
152
- }
153
- }
154
-
155
- //Removed wp-version
156
- public static function remove_wp_version_ok()
157
- {
158
- return !(has_action('wp_head', 'wp_generator') || has_filter('wp_head', 'wp_generator'));
159
- }
160
-
161
- public static function remove_wp_version()
162
- {
163
- update_option('mwp_remove_wp_version', 'T');
164
- if (get_option('mwp_remove_wp_version') == 'T') {
165
- remove_action('wp_head', 'wp_generator');
166
- remove_filter('wp_head', 'wp_generator');
167
- }
168
- }
169
-
170
- //Database error reporting turned on/off
171
- public static function remove_database_reporting_ok()
172
- {
173
- global $wpdb;
174
-
175
- return ($wpdb->show_errors == false);
176
- }
177
-
178
- public static function remove_database_reporting()
179
- {
180
- global $wpdb;
181
-
182
- $wpdb->hide_errors();
183
- $wpdb->suppress_errors();
184
- }
185
-
186
- //PHP error reporting turned on/off
187
- public static function remove_php_reporting_ok()
188
- {
189
- return !(((ini_get('display_errors') != 0) && (ini_get('display_errors') != 'off')) || ((ini_get('display_startup_errors') != 0) && (ini_get('display_startup_errors') != 'off')));
190
- }
191
-
192
- public static function remove_php_reporting()
193
- {
194
- update_option('mwp_remove_php_reporting', 'T');
195
- if (get_option('mwp_remove_php_reporting') == 'T') {
196
- @ini_set('display_errors', 'off');
197
- @ini_set('display_startup_errors', "off");
198
- }
199
- }
200
-
201
- //Admin user name is not admin
202
- public static function admin_user_ok()
203
- {
204
- $user = get_user_by('login', 'admin');
205
-
206
- return !($user && ($user->wp_user_level == 10 || (isset($user->user_level) && $user->user_level == 10)));
207
- }
208
-
209
- public static function change_admin_username($new_username)
210
- {
211
- global $wpdb;
212
- $wpdb->query($wpdb->prepare("Update {$wpdb->prefix}users SET user_login='%s' where user_login='admin'", $new_username));
213
- }
214
-
215
- //Admin user name is not admin
216
- public static function htaccess_permission_ok()
217
- {
218
- $htaccessPerm = substr(sprintf('%o', fileperms(ABSPATH."/.htaccess")), -4);
219
- if ($htaccessPerm === "0644" || $htaccessPerm === "0444") {
220
- return true;
221
- } else {
222
- return false;
223
- }
224
- }
225
-
226
- public static function htaccess_permission()
227
- {
228
- $htaccessPerm = fileperms(ABSPATH.".htaccess");
229
- $succ = chmod(ABSPATH.".htaccess", 0644);
230
- }
231
-
232
- public static function remove_scripts_version_ok()
233
- {
234
- return (get_option('managewp_remove_scripts_version') == 'T');
235
- }
236
-
237
- public static function remove_script_versions($src)
238
- {
239
- update_option('managewp_remove_scripts_version', 'T');
240
- if (get_option('managewp_remove_scripts_version') == 'T') {
241
- if (strpos($src, '?ver=')) {
242
- $src = remove_query_arg('ver', $src);
243
- }
244
-
245
- return $src;
246
- }
247
-
248
- return $src;
249
- }
250
-
251
- public static function remove_theme_versions($src)
252
- {
253
- update_option('managewp_remove_styles_version', 'T');
254
- if (get_option('managewp_remove_styles_version') == 'T') {
255
- if (strpos($src, '?ver=')) {
256
- $src = remove_query_arg('ver', $src);
257
- }
258
-
259
- return $src;
260
- }
261
-
262
- return $src;
263
- }
264
-
265
- public static function remove_scripts_version()
266
- {
267
- update_option('managewp_remove_scripts_version', 'T');
268
- if (get_option('managewp_remove_scripts_version') == 'T') {
269
- global $wp_scripts;
270
- if (!is_a($wp_scripts, 'WP_Scripts')) {
271
- return;
272
- }
273
-
274
- foreach ($wp_scripts->registered as $handle => $script) {
275
- $wp_scripts->registered[$handle]->ver = null;
276
- }
277
- }
278
- }
279
-
280
- public static function remove_styles_version_ok()
281
- {
282
- return (get_option('managewp_remove_styles_version') == 'T');
283
- }
284
-
285
- public static function remove_styles_version()
286
- {
287
- update_option('managewp_remove_styles_version', 'T');
288
- if (get_option('managewp_remove_styles_version') == 'T') {
289
- global $wp_styles;
290
- if (!is_a($wp_styles, 'WP_Styles')) {
291
- return;
292
- }
293
-
294
- foreach ($wp_styles->registered as $handle => $style) {
295
- $wp_styles->registered[$handle]->ver = null;
296
- }
297
- }
298
- }
299
-
300
- public static function file_permission_ok($dir = ABSPATH)
301
- {
302
- $files = scandir($dir);
303
- $dir = rtrim($dir, "/");
304
- foreach ($files as $file) {
305
- if ($file !== "." && $file !== ".." && $file !== "wp-admin" && $file !== "wp-includes" && $file !== "plugins" && $file !== "themes" && $file !== "uploads") {
306
- if (is_dir($dir."/".$file)) {
307
- $dirPerm = substr(sprintf('%o', fileperms($dir."/".$file)), -4);
308
- if ($dirPerm !== "0755") {
309
- return false;
310
- }
311
- $res = MMB_Security::file_permission_ok($dir."/".$file);
312
- if ($res === false) {
313
- return false;
314
- }
315
- } else {
316
- $filePerm = substr(sprintf('%o', fileperms($dir."/".$file)), -4);
317
- if ($filePerm !== "0644") {
318
- return false;
319
- }
320
- }
321
- }
322
- }
323
-
324
- return true;
325
- }
326
-
327
- public static function file_permission($dir = ABSPATH)
328
- {
329
- $files = scandir($dir);
330
- $dir = rtrim($dir, "/");
331
- foreach ($files as $file) {
332
- if ($file !== "." && $file !== ".." && $file !== "wp-admin" && $file !== "wp-includes" && $file !== "plugins" && $file !== "themes" && $file !== "uploads") {
333
- if (is_dir($dir."/".$file)) {
334
- $dirPerm = substr(sprintf('%o', fileperms($dir."/".$file)), -4);
335
- if ($dirPerm !== "0755") {
336
- chmod($dir."/".$file, 0755);
337
- }
338
-
339
- MMB_Security::file_permission($dir."/".$file);
340
- } else {
341
- $filePerm = substr(sprintf('%o', fileperms($dir."/".$file)), -4);
342
- if ($filePerm !== "0644") {
343
- chmod($dir."/".$file, 0644);
344
- }
345
- }
346
- }
347
- }
348
- }
349
-
350
- public function security_fix_all($args) // Potrebno dosta promena pre release
351
- {
352
- $user_name = $args['new_user_name'];
353
-
354
- if ($args['fix_listing']) {
355
- MMB_Security::security_fix_dir_listing($args); // ovo drugacije implementirati, ovako ne moze
356
- }
357
- if ($args['fix_wp_version']) {
358
- MMB_Security::security_fix_wp_version($args);
359
- }
360
- if ($args['fix_database_reporting']) {
361
- MMB_Security::security_fix_database_reporting($args); // treba da iskljuci samo prikazivanje errora
362
- }
363
- if ($args['fix_php_reporting']) {
364
- MMB_Security::security_fix_php_reporting($args); // treba da iskljuci samo prikazivanje errora
365
- }
366
- if ($args['security_fix_scripts_styles']) {
367
- MMB_Security::security_fix_scripts_styles($args); // ovo skloniti
368
- }
369
- if ($args['fix_htaccess_permission']) {
370
- MMB_Security::security_fix_htaccess_permission($args); // skloniti, sve bez chmod-a
371
- }
372
- if ($args['security_fix_permissions']) {
373
- MMB_Security::security_fix_permissions($args); // skloniti, sve bez chmod-a
374
- }
375
- $scan_res = $this->security_check($args);
376
- if ($args['fix_admin_username']) {
377
- $params[] = $user_name;
378
- MMB_Security::security_fix_admin_username($params);
379
- $scan_res["admin_user_ok"] = true;
380
- }
381
-
382
- return $scan_res;
383
- }
384
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/MMB/Stats.php CHANGED
@@ -13,15 +13,56 @@ class MMB_Stats extends MMB_Core
13
  * (functions to be called after a remote call from Master)
14
  **************************************************************/
15
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  public function get_core_update($stats, $options = array())
17
  {
18
- global $wp_version, $wp_local_package;
19
  $current_transient = null;
20
  if (isset($options['core']) && $options['core']) {
21
- $core = $this->mmb_get_transient('update_core');
 
22
  if (isset($core->updates) && !empty($core->updates)) {
23
  foreach ($core->updates as $update) {
24
- if ($update->locale == get_locale() && strtolower($update->response) == "upgrade") {
25
  $current_transient = $update;
26
  break;
27
  }
@@ -30,7 +71,7 @@ class MMB_Stats extends MMB_Core
30
  if (!$current_transient) {
31
  $current_transient = $core->updates[0];
32
  }
33
- if ($current_transient->response == "development" || version_compare($wp_version, $current_transient->current, '<') || get_locale() !== $current_transient->locale) {
34
  $current_transient->current_version = $wp_version;
35
  $stats['core_updates'] = $current_transient;
36
  } else {
@@ -46,15 +87,6 @@ class MMB_Stats extends MMB_Core
46
 
47
  public function get_hit_counter($stats, $options = array())
48
  {
49
- $mmb_user_hits = get_option('user_hit_count');
50
- if (is_array($mmb_user_hits)) {
51
- end($mmb_user_hits);
52
- $last_key_date = key($mmb_user_hits);
53
- $current_date = date('Y-m-d');
54
- if ($last_key_date != $current_date) {
55
- $this->set_hit_count(true);
56
- }
57
- }
58
  $stats['hit_counter'] = get_option('user_hit_count');
59
 
60
  return $stats;
@@ -186,13 +218,7 @@ class MMB_Stats extends MMB_Core
186
  }
187
  }
188
  if (!empty($recent_drafts)) {
189
- usort(
190
- $recent_drafts,
191
- array(
192
- $this,
193
- 'cmp_posts_worker',
194
- )
195
- );
196
  $stats['drafts'] = array_slice($recent_drafts, 0, $nposts);
197
  }
198
  }
@@ -202,46 +228,37 @@ class MMB_Stats extends MMB_Core
202
 
203
  public function get_scheduled($stats, $options = array())
204
  {
205
- $nposts = isset($options['numberposts']) ? (int) $options['numberposts'] : 20;
 
206
 
207
- if ($nposts) {
208
- $scheduled = get_posts('post_status=future&numberposts='.$nposts.'&orderby=post_date&order=desc');
209
- $scheduled_posts = array();
210
- if (!empty($scheduled)) {
211
- foreach ($scheduled as $id => $scheduled) {
212
- $recent = new stdClass();
213
- $recent->post_permalink = get_permalink($scheduled->ID);
214
- $recent->ID = $scheduled->ID;
215
- $recent->post_date = $scheduled->post_date;
216
- $recent->post_type = $scheduled->post_type;
217
- $recent->post_title = $scheduled->post_title;
218
- $scheduled_posts[] = $recent;
219
- }
220
- }
221
- $scheduled = get_pages('post_status=future&numberposts='.$nposts.'&orderby=post_date&order=desc');
222
- $recent_pages_drafts = array();
223
- if (!empty($scheduled)) {
224
- foreach ((array) $scheduled as $id => $scheduled) {
225
- $recent = new stdClass();
226
- $recent->post_permalink = get_permalink($scheduled->ID);
227
- $recent->ID = $scheduled->ID;
228
- $recent->post_type = $scheduled->post_type;
229
- $recent->post_date = $scheduled->post_date;
230
- $recent->post_title = $scheduled->post_title;
231
 
232
- $scheduled_posts[] = $recent;
233
- }
234
- }
235
- if (!empty($scheduled_posts)) {
236
- usort(
237
- $scheduled_posts,
238
- array(
239
- $this,
240
- 'cmp_posts_worker',
241
- )
242
- );
243
- $stats['scheduled'] = array_slice($scheduled_posts, 0, $nposts);
244
- }
 
 
 
245
  }
246
 
247
  return $stats;
@@ -249,25 +266,22 @@ class MMB_Stats extends MMB_Core
249
 
250
  public function get_backups($stats, $options = array())
251
  {
252
- $stats['mwp_backups'] = $this->get_backup_instance()->get_backup_stats();
253
- $stats['mwp_next_backups'] = $this->get_backup_instance()->get_next_schedules();
254
 
255
  return $stats;
256
  }
257
 
258
  public function get_backup_req($stats = array(), $options = array())
259
  {
260
- $stats['mwp_backups'] = $this->get_backup_instance()->get_backup_stats();
261
- $stats['mwp_next_backups'] = $this->get_backup_instance()->get_next_schedules();
262
- $stats['mwp_backup_req'] = $this->get_backup_instance()->check_backup_compat();
263
 
264
  return $stats;
265
  }
266
 
267
  public function get_updates($stats, $options = array())
268
  {
269
- $upgrades = false;
270
- $premium = array();
271
  if (isset($options['premium']) && $options['premium']) {
272
  $premium_updates = array();
273
  $upgrades = apply_filters('mwp_premium_update_notification', $premium_updates);
@@ -278,7 +292,6 @@ class MMB_Stats extends MMB_Core
278
  }
279
  }
280
  $stats['premium_updates'] = $upgrades;
281
- $upgrades = false;
282
  }
283
  }
284
  if (isset($options['themes']) && $options['themes']) {
@@ -286,7 +299,6 @@ class MMB_Stats extends MMB_Core
286
  $upgrades = $this->installer_instance->get_upgradable_themes($premium);
287
  if (!empty($upgrades)) {
288
  $stats['upgradable_themes'] = $upgrades;
289
- $upgrades = false;
290
  }
291
  }
292
 
@@ -295,7 +307,6 @@ class MMB_Stats extends MMB_Core
295
  $upgrades = $this->installer_instance->get_upgradable_plugins($premium);
296
  if (!empty($upgrades)) {
297
  $stats['upgradable_plugins'] = $upgrades;
298
- $upgrades = false;
299
  }
300
  }
301
 
@@ -360,7 +371,7 @@ class MMB_Stats extends MMB_Core
360
  'username' => '',
361
  'username_filter' => '',
362
  );
363
- $users = $this->get_user_instance()->get_users($filter);
364
 
365
  if (empty($users['users']) || !is_array($users['users'])) {
366
  return array();
@@ -376,10 +387,8 @@ class MMB_Stats extends MMB_Core
376
 
377
  public function pre_init_stats($params)
378
  {
379
- global $_mmb_item_filter;
380
-
381
  include_once ABSPATH.'wp-includes/update.php';
382
- include_once ABSPATH.'/wp-admin/includes/update.php';
383
 
384
  $stats = $this->mmb_parse_action_params('pre_init_stats', $params, $this);
385
  $num = extract($params);
@@ -393,7 +402,7 @@ class MMB_Stats extends MMB_Core
393
  @wp_update_themes();
394
  }
395
 
396
- if ($refresh == 'transient') {
397
  $current = $this->mmb_get_transient('update_core');
398
  if (isset($current->last_checked) || get_option('mmb_forcerefresh')) {
399
  update_option('mmb_forcerefresh', false);
@@ -405,12 +414,13 @@ class MMB_Stats extends MMB_Core
405
  }
406
  }
407
 
408
- global $wpdb, $mmb_wp_version, $mmb_plugin_dir, $wp_version, $wp_local_package;
 
409
 
410
  $stats['worker_version'] = $GLOBALS['MMB_WORKER_VERSION'];
411
  $stats['worker_revision'] = $GLOBALS['MMB_WORKER_REVISION'];
412
  $stats['wordpress_version'] = $wp_version;
413
- $stats['wordpress_locale_pckg'] = $wp_local_package;
414
  $stats['php_version'] = phpversion();
415
  $stats['mysql_version'] = $wpdb->db_version();
416
  $stats['server_functionality'] = $this->get_backup_instance()->getServerInformationForStats();
@@ -419,10 +429,16 @@ class MMB_Stats extends MMB_Core
419
  $stats['cookies'] = $this->get_stat_cookies();
420
  $stats['admin_usernames'] = $this->getUserList();
421
  $stats['site_title'] = get_bloginfo('name');
 
 
 
 
422
 
423
  if (!function_exists('get_filesystem_method')) {
424
  include_once ABSPATH.'wp-admin/includes/file.php';
425
  }
 
 
426
  $mmode = get_option('mwp_maintenace_mode');
427
 
428
  if (!empty($mmode) && isset($mmode['active']) && $mmode['active'] == true) {
@@ -435,8 +451,6 @@ class MMB_Stats extends MMB_Core
435
 
436
  public function get($params)
437
  {
438
- global $wpdb, $mmb_wp_version, $mmb_plugin_dir, $_mmb_item_filter;
439
-
440
  include_once ABSPATH.'wp-includes/update.php';
441
  include_once ABSPATH.'wp-admin/includes/update.php';
442
 
@@ -476,6 +490,7 @@ class MMB_Stats extends MMB_Core
476
 
477
  public function get_multisite($stats = array())
478
  {
 
479
  global $current_user, $wpdb;
480
  $user_blogs = get_blogs_of_user($current_user->ID);
481
  $network_blogs = $wpdb->get_results("select `blog_id`, `site_id` from `{$wpdb->blogs}`");
@@ -584,7 +599,7 @@ class MMB_Stats extends MMB_Core
584
 
585
  public function get_initial_stats()
586
  {
587
- global $mmb_plugin_dir, $_mmb_item_filter, $current_user;
588
 
589
  $stats = array(
590
  'email' => get_option('admin_email'),
@@ -601,6 +616,8 @@ class MMB_Stats extends MMB_Core
601
  'wp_multisite' => $this->mmb_multisite,
602
  'network_install' => $this->network_admin_install,
603
  'cookies' => $this->get_stat_cookies(),
 
 
604
  );
605
 
606
  if ($this->mmb_multisite) {
@@ -618,7 +635,7 @@ class MMB_Stats extends MMB_Core
618
 
619
  $stats['writable'] = $this->is_server_writable();
620
 
621
- $_mmb_item_filter['pre_init_stats'] = array('core_update', 'hit_counter', 'comments', 'backups', 'posts', 'drafts', 'scheduled');
622
  $_mmb_item_filter['get'] = array('updates', 'errors');
623
 
624
  $filter = array(
@@ -633,11 +650,12 @@ class MMB_Stats extends MMB_Core
633
  array('hit_counter'),
634
  array('comments', array('numberposts' => 5)),
635
  array('backups'),
 
636
  'plugins' => array(
637
  'cleanup' => array(
638
  'overhead' => array(),
639
  'revisions' => array('num_to_keep' => 'r_5'),
640
- 'spam' => array(),
641
  ),
642
  ),
643
  ),
@@ -663,171 +681,11 @@ class MMB_Stats extends MMB_Core
663
  return $active_db;
664
  }
665
 
666
- public static function set_hit_count($fix_count = false)
667
- {
668
- global $mmb_core;
669
- $uptime_robot = array(
670
- "74.86.158.106",
671
- "74.86.158.107",
672
- "74.86.158.109",
673
- "74.86.158.110",
674
- "74.86.158.108",
675
- "46.137.190.132",
676
- "122.248.234.23",
677
- "188.226.183.141",
678
- "178.62.52.237",
679
- "54.79.28.129",
680
- "54.94.142.218",
681
- ); //don't let uptime robot to affect visit count
682
-
683
- if ($fix_count || (!is_admin() && !MMB_Stats::is_bot() && !isset($_GET['doing_wp_cron']) && !in_array($_SERVER['REMOTE_ADDR'], $uptime_robot))) {
684
- $date = date('Y-m-d');
685
- $user_hit_count = (array) get_option('user_hit_count');
686
- if (!$user_hit_count) {
687
- $user_hit_count[$date] = 1;
688
- update_option('user_hit_count', $user_hit_count);
689
- } else {
690
- $dated_keys = array_keys($user_hit_count);
691
- $last_visit_date = $dated_keys[count($dated_keys) - 1];
692
-
693
- $days = intval((strtotime($date) - strtotime($last_visit_date)) / 60 / 60 / 24);
694
-
695
- if ($days > 1) {
696
- $date_to_add = date('Y-m-d', strtotime($last_visit_date));
697
-
698
- for ($i = 1; $i < $days; $i++) {
699
- if (count($user_hit_count) > 14) {
700
- $shifted = @array_shift($user_hit_count);
701
- }
702
-
703
- $next_key = strtotime('+1 day', strtotime($date_to_add));
704
- if ($next_key == $date) {
705
- break;
706
- } else {
707
- $user_hit_count[$next_key] = 0;
708
- }
709
- }
710
- }
711
-
712
- if (!isset($user_hit_count[$date])) {
713
- $user_hit_count[$date] = 0;
714
- }
715
- if (!$fix_count) {
716
- $user_hit_count[$date] = ((int) $user_hit_count[$date]) + 1;
717
- }
718
-
719
- if (count($user_hit_count) > 14) {
720
- $shifted = @array_shift($user_hit_count);
721
- }
722
-
723
- update_option('user_hit_count', $user_hit_count);
724
- }
725
- }
726
- }
727
-
728
  public function get_hit_count()
729
  {
730
- // Check if there are no hits on last key date
731
- $mmb_user_hits = get_option('user_hit_count');
732
- if (is_array($mmb_user_hits)) {
733
- end($mmb_user_hits);
734
- $last_key_date = key($mmb_user_hits);
735
- $current_date = date('Y-m-d');
736
- if ($last_key_date != $curent_date) {
737
- $this->set_hit_count(true);
738
- }
739
- }
740
-
741
  return get_option('user_hit_count');
742
  }
743
 
744
- public static function is_bot()
745
- {
746
- $agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
747
-
748
- if ($agent == '') {
749
- return true;
750
- }
751
-
752
- $bot_list = array(
753
- 'bot',
754
- 'crawl',
755
- 'feed',
756
- 'java/',
757
- 'spider',
758
- 'curl',
759
- 'libwww',
760
- 'alexa',
761
- 'altavista',
762
- 'aolserver',
763
- 'appie',
764
- 'Ask Jeeves',
765
- 'baidu',
766
- 'Bing',
767
- 'borg',
768
- 'BrowserMob',
769
- 'ccooter',
770
- 'dataparksearch',
771
- 'Download Demon',
772
- 'echoping',
773
- 'FAST',
774
- 'findlinks',
775
- 'Firefly',
776
- 'froogle',
777
- 'GomezA',
778
- 'Google',
779
- 'grub-client',
780
- 'htdig',
781
- 'http%20client',
782
- 'HttpMonitor',
783
- 'ia_archiver',
784
- 'InfoSeek',
785
- 'inktomi',
786
- 'larbin',
787
- 'looksmart',
788
- 'Microsoft URL Control',
789
- 'Minimo',
790
- 'mogimogi',
791
- 'NationalDirectory',
792
- 'netcraftsurvey',
793
- 'nuhk',
794
- 'oegp',
795
- 'panopta',
796
- 'rabaz',
797
- 'Read%20Later',
798
- 'Scooter',
799
- 'scrubby',
800
- 'SearchExpress',
801
- 'searchsight',
802
- 'semanticdiscovery',
803
- 'Slurp',
804
- 'snappy',
805
- 'Spade',
806
- 'TechnoratiSnoop',
807
- 'TECNOSEEK',
808
- 'teoma',
809
- 'twiceler',
810
- 'URL2PNG',
811
- 'vortex',
812
- 'WebBug',
813
- 'www.galaxy.com',
814
- 'yahoo',
815
- 'yandex',
816
- 'zao',
817
- 'zeal',
818
- 'ZooShot',
819
- 'ZyBorg',
820
- );
821
-
822
- foreach ($bot_list as $bot) {
823
- if (stripos($agent, $bot) !== false) {
824
- return true;
825
- }
826
- }
827
-
828
- return false;
829
- }
830
-
831
  public function set_notifications($params)
832
  {
833
  if (empty($params)) {
@@ -856,7 +714,7 @@ class MMB_Stats extends MMB_Core
856
  //Cron update check for notifications
857
  public function check_notifications()
858
  {
859
- global $wpdb, $mmb_wp_version, $mmb_plugin_dir, $wp_version, $wp_local_package;
860
 
861
  $mwp_notifications = get_option('mwp_notifications', true);
862
 
@@ -961,18 +819,4 @@ class MMB_Stats extends MMB_Core
961
 
962
  return $content;
963
  }
964
-
965
- public static function readd_alerts($params = array())
966
- {
967
- if (empty($params) || !isset($params['alerts'])) {
968
- return $params;
969
- }
970
-
971
- if (!empty($params['alerts'])) {
972
- update_option('mwp_pageview_alerts', $params['alerts']);
973
- unset($params['alerts']);
974
- }
975
-
976
- return $params;
977
- }
978
  }
13
  * (functions to be called after a remote call from Master)
14
  **************************************************************/
15
 
16
+ public function get_site_statistics($stats, $options = array())
17
+ {
18
+ /** @var wpdb $wpdb */
19
+ global $wpdb;
20
+ $siteStatistics = array();
21
+ $prefix = $wpdb->prefix;
22
+
23
+ if (!empty($options['users'])) {
24
+ $siteStatistics['users'] = (int) $wpdb->get_var("SELECT COUNT(*) FROM {$prefix}users");
25
+ }
26
+
27
+ if (!empty($options['approvedComments'])) {
28
+ $siteStatistics['approvedComments'] = (int) $wpdb->get_var("SELECT COUNT(*) FROM {$prefix}comments WHERE comment_approved='1'");
29
+ }
30
+
31
+ if (!empty($options['activePlugins'])) {
32
+ $siteStatistics['activePlugins'] = count((array) array(get_option('active_plugins', array())));
33
+ }
34
+
35
+ if (!empty($options['publishedPosts'])) {
36
+ $siteStatistics['publishedPosts'] = (int) $wpdb->get_var("SELECT COUNT(*) FROM {$prefix}posts WHERE post_type='post' AND post_status='publish'");
37
+ }
38
+
39
+ if (!empty($options['draftPosts'])) {
40
+ $siteStatistics['draftPosts'] = (int) $wpdb->get_var("SELECT COUNT(*) FROM {$prefix}posts WHERE post_type='post' AND post_status='draft'");
41
+ }
42
+
43
+ if (!empty($options['publishedPages'])) {
44
+ $siteStatistics['publishedPages'] = (int) $wpdb->get_var("SELECT COUNT(*) FROM {$prefix}posts WHERE post_type='page' AND post_status='publish'");
45
+ }
46
+
47
+ if (!empty($options['draftPages'])) {
48
+ $siteStatistics['draftPages'] = (int) $wpdb->get_var("SELECT COUNT(*) FROM {$prefix}posts WHERE post_type='page' AND post_status='draft'");
49
+ }
50
+
51
+ $stats['site_statistics'] = $siteStatistics;
52
+
53
+ return $stats;
54
+ }
55
+
56
  public function get_core_update($stats, $options = array())
57
  {
58
+ global $wp_version;
59
  $current_transient = null;
60
  if (isset($options['core']) && $options['core']) {
61
+ $locale = get_locale();
62
+ $core = $this->mmb_get_transient('update_core');
63
  if (isset($core->updates) && !empty($core->updates)) {
64
  foreach ($core->updates as $update) {
65
+ if ($update->locale == $locale && strtolower($update->response) == "upgrade") {
66
  $current_transient = $update;
67
  break;
68
  }
71
  if (!$current_transient) {
72
  $current_transient = $core->updates[0];
73
  }
74
+ if ($current_transient->response == "development" || version_compare($wp_version, $current_transient->current, '<') || $locale !== $current_transient->locale) {
75
  $current_transient->current_version = $wp_version;
76
  $stats['core_updates'] = $current_transient;
77
  } else {
87
 
88
  public function get_hit_counter($stats, $options = array())
89
  {
 
 
 
 
 
 
 
 
 
90
  $stats['hit_counter'] = get_option('user_hit_count');
91
 
92
  return $stats;
218
  }
219
  }
220
  if (!empty($recent_drafts)) {
221
+ usort($recent_drafts, array($this, 'cmp_posts_worker',));
 
 
 
 
 
 
222
  $stats['drafts'] = array_slice($recent_drafts, 0, $nposts);
223
  }
224
  }
228
 
229
  public function get_scheduled($stats, $options = array())
230
  {
231
+ $numberOfItems = isset($options['numberposts']) ? (int) $options['numberposts'] : 20;
232
+ $scheduledItems = array();
233
 
234
+ if (!$numberOfItems) {
235
+ return $stats;
236
+ }
237
+ $scheduledPosts = get_posts('post_status=future&numberposts='.$numberOfItems.'&orderby=post_date&order=desc');
238
+ foreach ($scheduledPosts as $id => $scheduledPost) {
239
+ $recentPost = new stdClass();
240
+ $recentPost->post_permalink = get_permalink($scheduledPost->ID);
241
+ $recentPost->ID = $scheduledPost->ID;
242
+ $recentPost->post_date = $scheduledPost->post_date;
243
+ $recentPost->post_type = $scheduledPost->post_type;
244
+ $recentPost->post_title = $scheduledPost->post_title;
 
 
 
 
 
 
 
 
 
 
 
 
 
245
 
246
+ $scheduledItems[] = $recentPost;
247
+ }
248
+ $scheduledPages = get_pages('post_status=future&numberposts='.$numberOfItems.'&orderby=post_date&order=desc');
249
+ foreach ((array) $scheduledPages as $id => $scheduledPage) {
250
+ $recentPage = new stdClass();
251
+ $recentPage->post_permalink = get_permalink($scheduledPage->ID);
252
+ $recentPage->ID = $scheduledPage->ID;
253
+ $recentPage->post_type = $scheduledPage->post_type;
254
+ $recentPage->post_date = $scheduledPage->post_date;
255
+ $recentPage->post_title = $scheduledPage->post_title;
256
+
257
+ $scheduledItems[] = $recentPage;
258
+ }
259
+ if (!empty($scheduledItems)) {
260
+ usort($scheduledItems, array($this, 'cmp_posts_worker'));
261
+ $stats['scheduled'] = array_slice($scheduledItems, 0, $numberOfItems);
262
  }
263
 
264
  return $stats;
266
 
267
  public function get_backups($stats, $options = array())
268
  {
269
+ $stats['mwp_backups'] = $this->get_backup_instance()->get_backup_stats();
 
270
 
271
  return $stats;
272
  }
273
 
274
  public function get_backup_req($stats = array(), $options = array())
275
  {
276
+ $stats['mwp_backups'] = $this->get_backup_instance()->get_backup_stats();
277
+ $stats['mwp_backup_req'] = $this->get_backup_instance()->check_backup_compat();
 
278
 
279
  return $stats;
280
  }
281
 
282
  public function get_updates($stats, $options = array())
283
  {
284
+ $premium = array();
 
285
  if (isset($options['premium']) && $options['premium']) {
286
  $premium_updates = array();
287
  $upgrades = apply_filters('mwp_premium_update_notification', $premium_updates);
292
  }
293
  }
294
  $stats['premium_updates'] = $upgrades;
 
295
  }
296
  }
297
  if (isset($options['themes']) && $options['themes']) {
299
  $upgrades = $this->installer_instance->get_upgradable_themes($premium);
300
  if (!empty($upgrades)) {
301
  $stats['upgradable_themes'] = $upgrades;
 
302
  }
303
  }
304
 
307
  $upgrades = $this->installer_instance->get_upgradable_plugins($premium);
308
  if (!empty($upgrades)) {
309
  $stats['upgradable_plugins'] = $upgrades;
 
310
  }
311
  }
312
 
371
  'username' => '',
372
  'username_filter' => '',
373
  );
374
+ $users = $this->get_user_instance()->get_users($filter);
375
 
376
  if (empty($users['users']) || !is_array($users['users'])) {
377
  return array();
387
 
388
  public function pre_init_stats($params)
389
  {
 
 
390
  include_once ABSPATH.'wp-includes/update.php';
391
+ include_once ABSPATH.'wp-admin/includes/update.php';
392
 
393
  $stats = $this->mmb_parse_action_params('pre_init_stats', $params, $this);
394
  $num = extract($params);
402
  @wp_update_themes();
403
  }
404
 
405
+ if ($params['refresh'] == 'transient') {
406
  $current = $this->mmb_get_transient('update_core');
407
  if (isset($current->last_checked) || get_option('mmb_forcerefresh')) {
408
  update_option('mmb_forcerefresh', false);
414
  }
415
  }
416
 
417
+ /** @var $wpdb wpdb */
418
+ global $wpdb, $wp_version;
419
 
420
  $stats['worker_version'] = $GLOBALS['MMB_WORKER_VERSION'];
421
  $stats['worker_revision'] = $GLOBALS['MMB_WORKER_REVISION'];
422
  $stats['wordpress_version'] = $wp_version;
423
+ $stats['wordpress_locale_pckg'] = get_locale();
424
  $stats['php_version'] = phpversion();
425
  $stats['mysql_version'] = $wpdb->db_version();
426
  $stats['server_functionality'] = $this->get_backup_instance()->getServerInformationForStats();
429
  $stats['cookies'] = $this->get_stat_cookies();
430
  $stats['admin_usernames'] = $this->getUserList();
431
  $stats['site_title'] = get_bloginfo('name');
432
+ $stats['site_tagline'] = get_bloginfo('description');
433
+ $stats['blog_public'] = get_option('blog_public');
434
+ $stats['timezone'] = get_option('timezone_string');
435
+ $stats['timezone_offset'] = get_option('gmt_offset');
436
 
437
  if (!function_exists('get_filesystem_method')) {
438
  include_once ABSPATH.'wp-admin/includes/file.php';
439
  }
440
+ $stats['fs_method'] = get_filesystem_method();
441
+
442
  $mmode = get_option('mwp_maintenace_mode');
443
 
444
  if (!empty($mmode) && isset($mmode['active']) && $mmode['active'] == true) {
451
 
452
  public function get($params)
453
  {
 
 
454
  include_once ABSPATH.'wp-includes/update.php';
455
  include_once ABSPATH.'wp-admin/includes/update.php';
456
 
490
 
491
  public function get_multisite($stats = array())
492
  {
493
+ /** @var $wpdb wpdb */
494
  global $current_user, $wpdb;
495
  $user_blogs = get_blogs_of_user($current_user->ID);
496
  $network_blogs = $wpdb->get_results("select `blog_id`, `site_id` from `{$wpdb->blogs}`");
599
 
600
  public function get_initial_stats()
601
  {
602
+ global $mmb_plugin_dir, $_mmb_item_filter;
603
 
604
  $stats = array(
605
  'email' => get_option('admin_email'),
616
  'wp_multisite' => $this->mmb_multisite,
617
  'network_install' => $this->network_admin_install,
618
  'cookies' => $this->get_stat_cookies(),
619
+ 'timezone' => get_option('timezone_string'),
620
+ 'timezone_offset' => get_option('gmt_offset'),
621
  );
622
 
623
  if ($this->mmb_multisite) {
635
 
636
  $stats['writable'] = $this->is_server_writable();
637
 
638
+ $_mmb_item_filter['pre_init_stats'] = array('core_update', 'hit_counter', 'comments', 'backups', 'posts', 'drafts', 'scheduled', 'site_statistics');
639
  $_mmb_item_filter['get'] = array('updates', 'errors');
640
 
641
  $filter = array(
650
  array('hit_counter'),
651
  array('comments', array('numberposts' => 5)),
652
  array('backups'),
653
+ array('site_statistics', array('users' => true, 'approvedComments' => true, 'activePlugins' => true, 'publishedPosts' => true, 'draftPosts' => true, 'publishedPages' => true, 'draftPages' => true)),
654
  'plugins' => array(
655
  'cleanup' => array(
656
  'overhead' => array(),
657
  'revisions' => array('num_to_keep' => 'r_5'),
658
+ 'spam' => array(),
659
  ),
660
  ),
661
  ),
681
  return $active_db;
682
  }
683
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
684
  public function get_hit_count()
685
  {
 
 
 
 
 
 
 
 
 
 
 
686
  return get_option('user_hit_count');
687
  }
688
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
689
  public function set_notifications($params)
690
  {
691
  if (empty($params)) {
714
  //Cron update check for notifications
715
  public function check_notifications()
716
  {
717
+ global $wp_version;
718
 
719
  $mwp_notifications = get_option('mwp_notifications', true);
720
 
819
 
820
  return $content;
821
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
822
  }
src/MMB/Updater.php CHANGED
@@ -28,19 +28,19 @@ class MMB_Updater
28
  $autoUpdateCore = get_option('mwp_core_autoupdate');
29
 
30
  if ($autoUpdateCore === 'never') {
31
- add_filter('allow_minor_auto_core_updates', '__return_false', 100);
32
- add_filter('allow_major_auto_core_updates', '__return_false', 100);
33
  } elseif ($autoUpdateCore === 'minor') {
34
- add_filter('allow_minor_auto_core_updates', '__return_true', 100);
35
- add_filter('allow_major_auto_core_updates', '__return_false', 100);
36
  } elseif ($autoUpdateCore === 'major') {
37
- add_filter('allow_minor_auto_core_updates', '__return_true', 100);
38
- add_filter('allow_major_auto_core_updates', '__return_true', 100);
39
  }
40
 
41
- add_filter('auto_update_plugin', array($updater, 'updatePlugin'), 100, 2);
42
- add_filter('auto_update_theme', array($updater, 'updateTheme'), 100, 2);
43
- add_filter('auto_update_translation', array($updater, 'updateTranslation'), 100, 1);
44
  }
45
 
46
  public function updatePlugin($update, $item)
@@ -56,7 +56,7 @@ class MMB_Updater
56
  }
57
  */
58
  $slug = $item->plugin;
59
- if ($slug == 'worker/init.php') {
60
  return false;
61
  }
62
  $alwaysUpdatePlugins = get_option('mwp_global_plugins_autoupdate', 'disabled');
28
  $autoUpdateCore = get_option('mwp_core_autoupdate');
29
 
30
  if ($autoUpdateCore === 'never') {
31
+ add_filter('allow_minor_auto_core_updates', '__return_false', PHP_INT_MAX);
32
+ add_filter('allow_major_auto_core_updates', '__return_false', PHP_INT_MAX);
33
  } elseif ($autoUpdateCore === 'minor') {
34
+ add_filter('allow_minor_auto_core_updates', '__return_true', PHP_INT_MAX);
35
+ add_filter('allow_major_auto_core_updates', '__return_false', PHP_INT_MAX);
36
  } elseif ($autoUpdateCore === 'major') {
37
+ add_filter('allow_minor_auto_core_updates', '__return_true', PHP_INT_MAX);
38
+ add_filter('allow_major_auto_core_updates', '__return_true', PHP_INT_MAX);
39
  }
40
 
41
+ add_filter('auto_update_plugin', array($updater, 'updatePlugin'), PHP_INT_MAX, 2);
42
+ add_filter('auto_update_theme', array($updater, 'updateTheme'), PHP_INT_MAX, 2);
43
+ add_filter('auto_update_translation', array($updater, 'updateTranslation'), PHP_INT_MAX, 1);
44
  }
45
 
46
  public function updatePlugin($update, $item)
56
  }
57
  */
58
  $slug = $item->plugin;
59
+ if ($slug === 'worker/init.php') {
60
  return false;
61
  }
62
  $alwaysUpdatePlugins = get_option('mwp_global_plugins_autoupdate', 'disabled');
src/MMB/Widget.php DELETED
@@ -1,44 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * MMB_Widget Class
5
- */
6
- class MMB_Widget extends WP_Widget
7
- {
8
- /** constructor -- name this the same as the class above */
9
- public function __construct()
10
- {
11
- parent::__construct(false, 'ManageWP', array('description' => 'ManageWP widget.'));
12
- }
13
-
14
- /** @see WP_Widget::widget -- do not rename this */
15
- public function widget($args, $instance)
16
- {
17
- extract($args);
18
- $instance['title'] = 'ManageWP';
19
- $instance['message'] = 'We are happily using <a href="http://managewp.com" target="_blank">ManageWP</a>';
20
- $title = apply_filters('widget_title', $instance['title']);
21
- $message = $instance['message'];
22
- ?>
23
- <?php echo $before_widget;
24
- ?>
25
- <?php if ($title) {
26
- echo $before_title.$title.$after_title;
27
- }
28
- ?>
29
- <ul>
30
- <li><?php echo $message ?></li>
31
- </ul>
32
- <?php echo $after_widget ?>
33
- <?php
34
-
35
- }
36
-
37
- /** @see WP_Widget::form -- do not rename this */
38
- public function form($instance)
39
- {
40
- $title = 'ManageWP';
41
- $message = 'We are happily using <a href="http://managewp.com" target="_blank">ManageWP</a>';
42
- echo '<p>'.$message.'</p>';
43
- }
44
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/MMB/img/mwp.png CHANGED
Binary file
src/MWP/Action/Abstract.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ abstract class MWP_Action_Abstract implements MWP_ServiceContainer_ContainerAwareInterface
12
+ {
13
+
14
+ /**
15
+ * @var MWP_ServiceContainer_Interface
16
+ */
17
+ protected $container;
18
+
19
+ public function setContainer(MWP_ServiceContainer_Interface $container)
20
+ {
21
+ $this->container = $container;
22
+ }
23
+ }
src/MWP/Action/ConnectWebsite.php ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Action_ConnectWebsite extends MWP_Action_Abstract
12
+ {
13
+
14
+ public function execute(array $params = array(), MWP_Worker_Request $request)
15
+ {
16
+ if (empty($params['public_key'])) {
17
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::CONNECTION_PUBLIC_KEY_NOT_PROVIDED);
18
+ }
19
+
20
+ $publicKey = base64_decode($params['public_key']);
21
+ $configuration = $this->container->getConfiguration();
22
+ $existingPublicKey = $configuration->getPublicKey();
23
+
24
+ if (!empty($existingPublicKey) && ($publicKey !== $existingPublicKey)) {
25
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::CONNECTION_PUBLIC_KEY_EXISTS, "Sorry, the site appears to be already added to a ManageWP account. Please deactivate, then activate ManageWP Worker plugin on your website and try again or contact our support.");
26
+ }
27
+
28
+ if (!empty($params['skipVerificationTest'])) {
29
+ // Legacy support for worker key.
30
+ $signer = $this->container->getSigner();
31
+ $messageId = $request->getAction().$request->getNonce();
32
+ $verify = $signer->verify($messageId, $request->getSignature(), $publicKey);
33
+
34
+ if (!$verify) {
35
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::CONNECTION_VERIFICATION_TEST_FAILED, "Unable to verify security signature. Contact your hosting support to check the OpenSSL configuration.");
36
+ }
37
+ }
38
+
39
+ $configuration->setPublicKey($publicKey);
40
+
41
+ $this->setBrand($params);
42
+
43
+ return array();
44
+ }
45
+
46
+ private function setBrand(array $params)
47
+ {
48
+ if (!empty($params['brand']) && is_array($params['brand'])) {
49
+ $this->container->getBrand()->update($params['brand']);
50
+
51
+ return;
52
+ }
53
+
54
+ $this->container->getBrand()->delete();
55
+ }
56
+ }
src/MWP/Action/Definition.php ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Action_Definition
12
+ {
13
+
14
+ /**
15
+ * @var callable
16
+ */
17
+ private $callback;
18
+
19
+ /**
20
+ * @var array
21
+ */
22
+ private $options;
23
+
24
+ private static $defaultOptions = array(
25
+ 'hook_name' => null,
26
+ 'hook_priority' => 10,
27
+ );
28
+
29
+ /**
30
+ * First parameter is callback to be executed.
31
+ * Second parameter accepts the following option names:
32
+ * - 'hook_name' - WordPress hook to attach the action to.
33
+ * - 'hook_priority' - WordPress hook priority; used only when 'hook_name' is set.
34
+ *
35
+ * @param callable $callback
36
+ * @param array $options
37
+ */
38
+ public function __construct($callback, array $options = array())
39
+ {
40
+ $this->validateOptions($options);
41
+ $options += self::$defaultOptions;
42
+
43
+ $this->callback = $callback;
44
+ $this->options = $options;
45
+ }
46
+
47
+ private function validateOptions(array $options)
48
+ {
49
+ foreach ($options as $optionName => $optionDefault) {
50
+ if (!array_key_exists($optionName, self::$defaultOptions)) {
51
+ throw new InvalidArgumentException(sprintf('Option "%s" is not registered, valid options are "%s"', $optionName, implode('", "', array_keys(self::$defaultOptions))));
52
+ }
53
+ }
54
+ }
55
+
56
+ /**
57
+ * @return callable
58
+ */
59
+ public function getCallback()
60
+ {
61
+ return $this->callback;
62
+ }
63
+
64
+ public function getOption($name)
65
+ {
66
+ if (!array_key_exists($name, $this->options)) {
67
+ throw new InvalidArgumentException(sprintf('Option "%s" is not recognized', $name));
68
+ }
69
+
70
+ return $this->options[$name];
71
+ }
72
+ }
src/MWP/Action/Exception.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Action_Exception extends MWP_Worker_Exception
12
+ {
13
+ }
src/MWP/Action/GetState.php ADDED
@@ -0,0 +1,280 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Action_GetState extends MWP_Action_Abstract
12
+ {
13
+ const USERS = 'users';
14
+
15
+ const POSTS = 'posts';
16
+
17
+ const COMMENTS = 'comments';
18
+
19
+ const PLUGINS = 'plugins';
20
+
21
+ const THEMES = 'themes';
22
+
23
+ const PLUGIN_UPDATES = 'pluginUpdates';
24
+
25
+ const THEME_UPDATES = 'themeUpdates';
26
+
27
+ const CORE_UPDATES = 'coreUpdates';
28
+
29
+ const ROLES = 'roles';
30
+
31
+ const SITE_INFO = 'siteInfo';
32
+
33
+ const SERVER_INFO = 'serverInfo';
34
+
35
+ public function execute(array $params = array())
36
+ {
37
+ $result = array();
38
+
39
+ foreach ($params as $fieldName => $queryInfo) {
40
+ $start = microtime(true);
41
+ $queryResult = $this->getField($queryInfo['type'], $queryInfo['options']);
42
+ $end = sprintf("%.6f", microtime(true) - $start);
43
+ $result[$fieldName] = array(
44
+ 'type' => $queryInfo['type'],
45
+ 'options' => $queryInfo['options'],
46
+ 'benchmark' => $end,
47
+ 'result' => $queryResult,
48
+ 'resultCount' => count($queryResult),
49
+ );
50
+ }
51
+
52
+ return $result;
53
+ }
54
+
55
+ private function getField($type, $options)
56
+ {
57
+ switch ($type) {
58
+ case self::USERS:
59
+ return $this->getUsers($options);
60
+ case self::POSTS:
61
+ return $this->getPosts($options);
62
+ case self::COMMENTS:
63
+ return $this->getComments($options);
64
+ case self::PLUGINS:
65
+ return $this->getPlugins($options);
66
+ case self::THEMES:
67
+ return $this->getThemes($options);
68
+ case self::PLUGIN_UPDATES:
69
+ return $this->getPluginUpdates($options);
70
+ case self::THEME_UPDATES:
71
+ return $this->getThemeUpdates($options);
72
+ case self::CORE_UPDATES:
73
+ return $this->getCoreUpdates($options);
74
+ case self::ROLES:
75
+ return $this->getRoles($options);
76
+ case self::SITE_INFO:
77
+ return $this->getSiteInfo($options);
78
+ case self::SERVER_INFO:
79
+ return $this->getServerInfo($options);
80
+ default:
81
+ throw new RuntimeException(sprintf('Undefined field type provided: "%s".', $type));
82
+ }
83
+ }
84
+
85
+ protected function getUsers(array $options = array())
86
+ {
87
+ $userQuery = $this->container->getUserQuery();
88
+
89
+ $users = $userQuery->query($options);
90
+
91
+ return $users;
92
+ }
93
+
94
+ protected function getPosts(array $options = array())
95
+ {
96
+ $postQuery = $this->container->getPostQuery();
97
+ $posts = $postQuery->query($options);
98
+
99
+ return $posts;
100
+ }
101
+
102
+ protected function getComments(array $options = array())
103
+ {
104
+ $commentQuery = $this->container->getCommentQuery();
105
+ $comments = $commentQuery->query($options);
106
+
107
+ return $comments;
108
+ }
109
+
110
+ protected function getPlugins(array $options = array())
111
+ {
112
+ $options += array(
113
+ 'fetchAutoUpdate' => true,
114
+ 'fetchAvailableUpdate' => true,
115
+ 'fetchActivatedAt' => true,
116
+ );
117
+
118
+ $pluginProvider = $this->container->getPluginProvider();
119
+ $plugins = $pluginProvider->fetch();
120
+ $autoUpdateManager = $this->container->getAutoUpdateManager();
121
+
122
+ if ($options['fetchAutoUpdate']) {
123
+ foreach ($plugins as &$plugin) {
124
+ $plugin['autoUpdate'] = $autoUpdateManager->isEnabledForPlugin($plugin['slug']);
125
+ }
126
+ }
127
+
128
+ if ($options['fetchAvailableUpdate']) {
129
+ $um = $this->container->getUpdateManager();
130
+ foreach ($plugins as &$plugin) {
131
+ $update = $um->getPluginUpdate($plugin['basename']);
132
+ if ($update !== null) {
133
+ $plugin['updateVersion'] = $update->version;
134
+ $plugin['updatePackage'] = $update->package;
135
+ }
136
+ }
137
+ }
138
+
139
+ if ($options['fetchActivatedAt']) {
140
+ $recentlyActivated = $this->container->getWordPressContext()->optionGet('recently_activated');
141
+ foreach ($plugins as &$plugin) {
142
+ if (isset($recentlyActivated[$plugin['basename']])) {
143
+ $plugin['activatedAt'] = date('Y-m-d\TH:i:sO', $recentlyActivated[$plugin['basename']]);
144
+ }
145
+ }
146
+ }
147
+
148
+ return $plugins;
149
+ }
150
+
151
+ protected function getThemes(array $options = array())
152
+ {
153
+ $options += array(
154
+ 'fetchAutoUpdate' => true,
155
+ 'fetchAvailableUpdate' => true,
156
+ );
157
+
158
+ $themeProvider = $this->container->getThemeProvider();
159
+ $themes = $themeProvider->fetch();
160
+ $autoUpdateManager = $this->container->getAutoUpdateManager();
161
+
162
+ if ($options['fetchAutoUpdate']) {
163
+ foreach ($themes as &$theme) {
164
+ $theme['autoUpdate'] = $autoUpdateManager->isEnabledForTheme($theme['name']);
165
+ }
166
+ }
167
+
168
+ if ($options['fetchAvailableUpdate']) {
169
+ $um = $this->container->getUpdateManager();
170
+ foreach ($themes as &$theme) {
171
+ $update = $um->getThemeUpdate($theme['slug']);
172
+ if ($update !== null) {
173
+ $theme['updateVersion'] = $update->version;
174
+ $theme['updatePackage'] = $update->package;
175
+ }
176
+ }
177
+ }
178
+
179
+ return $themes;
180
+ }
181
+
182
+ public function getPluginUpdates(array $options = array())
183
+ {
184
+ $um = $this->container->getUpdateManager();
185
+
186
+ return $um->getPluginUpdates();
187
+ }
188
+
189
+ public function getThemeUpdates(array $options = array())
190
+ {
191
+ $um = $this->container->getUpdateManager();
192
+
193
+ return $um->getThemeUpdates();
194
+ }
195
+
196
+ public function getCoreUpdates(array $options = array())
197
+ {
198
+ $um = $this->container->getUpdateManager();
199
+
200
+ return $um->getCoreUpdates();
201
+ }
202
+
203
+ public function getRoles(array $options = array())
204
+ {
205
+ $options += array(
206
+ 'capabilities' => false,
207
+ );
208
+
209
+ $roles = $this->container->getWordPressContext()->getUserRoles();
210
+
211
+ $result = array();
212
+
213
+ foreach ($roles as $roleSlug => $roleInfo) {
214
+ $role = array(
215
+ 'slug' => $roleSlug,
216
+ 'name' => $roleInfo['name'],
217
+ );
218
+ if ($options['capabilities']) {
219
+ $role['capabilities'] = $roleInfo['capabilities'];
220
+ }
221
+ $result[] = $role;
222
+ }
223
+
224
+ return $result;
225
+ }
226
+
227
+ public function getSiteInfo(array $options = array())
228
+ {
229
+ $context = $this->container->getWordPressContext();
230
+
231
+ return array(
232
+ 'title' => $context->getSiteTitle(),
233
+ 'description' => $context->getSiteDescription(),
234
+ 'siteUrl' => $context->getSiteUrl(),
235
+ 'homeUrl' => $context->getHomeUrl(),
236
+ 'masterSiteUrl' => $context->getMasterSiteUrl(),
237
+ 'isMultisite' => $context->isMultisite(),
238
+ 'public' => $context->optionGet('blog_public'),
239
+ 'siteId' => $context->getSiteId(),
240
+ 'currentUserId' => $context->getCurrentUser()->ID,
241
+ 'currentUserUsername' => $context->getCurrentUser()->user_login,
242
+ 'workerRealpath' => $this->container->getParameter('worker_realpath'),
243
+ 'workerVersion' => $this->container->getParameter('worker_version'),
244
+ 'workerRevision' => $this->container->getParameter('worker_revision'),
245
+ 'timezone' => $this->container->getWordPressContext()->optionGet('timezone_string'),
246
+ 'timezoneOffset' => $this->container->getWordPressContext()->optionGet('gmt_offset'),
247
+ );
248
+ }
249
+
250
+ public function getServerInfo(array $options = array())
251
+ {
252
+ $context = $this->container->getWordPressContext();
253
+
254
+ return array(
255
+ // @todo: move the checks below to a separate component.
256
+ 'phpVersion' => PHP_VERSION,
257
+ 'mysqlVersion' => $context->getDb()->db_version(),
258
+ 'extensionPdoMysql' => extension_loaded('pdo_mysql'),
259
+ 'extensionOpenSsl' => extension_loaded('openssl'),
260
+ 'extensionFtp' => extension_loaded('ftp'),
261
+ 'extensionZlib' => extension_loaded('zlib'),
262
+ 'extensionBz2' => extension_loaded('bz2'),
263
+ 'extensionZip' => extension_loaded('zip'),
264
+ 'extensionCurl' => extension_loaded('curl'),
265
+ 'extensionGd' => extension_loaded('gd'),
266
+ 'extensionImagick' => extension_loaded('imagick'),
267
+ 'extensionSockets' => extension_loaded('sockets'),
268
+ 'extensionSsh2' => extension_loaded('ssh2'),
269
+ 'shellAvailable' => mwp_is_shell_available(),
270
+ 'safeMode' => mwp_is_safe_mode(),
271
+ 'memoryLimit' => mwp_format_memory_limit(ini_get('memory_limit')),
272
+ 'disabledFunctions' => mwp_get_disabled_functions(),
273
+ 'processArchitecture' => strlen(decbin(~0)), // Results in 32 or 62.
274
+ 'internalIp' => $this->container->getRequestStack()->getMasterRequest()->server['SERVER_ADDR'],
275
+ 'uname' => php_uname('a'),
276
+ 'hostname' => php_uname('n'),
277
+ 'os' => (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') ? 'windows' : 'unix',
278
+ );
279
+ }
280
+ }
src/MWP/Action/Registry.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Action_Registry
12
+ {
13
+
14
+ /**
15
+ * @var MWP_Action_Definition[]
16
+ */
17
+ private $definitions = array();
18
+
19
+ public function addDefinition($name, MWP_Action_Definition $definition)
20
+ {
21
+ $this->definitions[$name] = $definition;
22
+ }
23
+
24
+ public function getDefinition($name)
25
+ {
26
+ if (!isset($this->definitions[$name])) {
27
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::ACTION_NOT_REGISTERED, sprintf('Action "%s" is not registered', $name), array(
28
+ 'action' => $name,
29
+ ));
30
+ }
31
+
32
+ return $this->definitions[$name];
33
+ }
34
+
35
+ public function hasDefinition($name)
36
+ {
37
+ return isset($this->definitions[$name]);
38
+ }
39
+ }
src/MWP/Backup/ArrayHelper.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
 
3
  class MWP_Backup_ArrayHelper
4
  {
1
  <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
 
11
  class MWP_Backup_ArrayHelper
12
  {
src/MWP/Backup/Buffer/File.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
 
3
  class MWP_Backup_Buffer_File
4
  {
1
  <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
 
11
  class MWP_Backup_Buffer_File
12
  {
src/MWP/Backup/Database.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
 
3
  /**
4
  * Class MWP_Backup_Database
1
  <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
 
11
  /**
12
  * Class MWP_Backup_Database
src/MWP/Backup/Exception.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
 
3
  /**
4
  * Backup Exception
1
  <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
 
11
  /**
12
  * Backup Exception
src/MWP/Backup/MysqlDump/DumpFactory.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
 
3
  class MWP_Backup_MysqlDump_DumpFactory
4
  {
1
  <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
 
11
  class MWP_Backup_MysqlDump_DumpFactory
12
  {
src/MWP/Backup/MysqlDump/MysqlDump.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
 
3
  abstract class MWP_Backup_MysqlDump_MysqlDump
4
  {
1
  <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
 
11
  abstract class MWP_Backup_MysqlDump_MysqlDump
12
  {
src/MWP/Backup/MysqlDump/QuerySequenceDump.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
 
3
  class MWP_Backup_MysqlDump_QuerySequenceDump extends MWP_Backup_MysqlDump_MysqlDump
4
  {
1
  <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
 
11
  class MWP_Backup_MysqlDump_QuerySequenceDump extends MWP_Backup_MysqlDump_MysqlDump
12
  {
src/MWP/Backup/MysqlDump/ShellDump.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
 
3
  class MWP_Backup_MysqlDump_ShellDump extends MWP_Backup_MysqlDump_MysqlDump
4
  {
1
  <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
 
11
  class MWP_Backup_MysqlDump_ShellDump extends MWP_Backup_MysqlDump_MysqlDump
12
  {
src/MWP/Backup/Writer/GzipWriter.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
 
3
  class MWP_Backup_Writer_GzipWriter implements MWP_Backup_Writer_WriterInterface
4
  {
1
  <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
 
11
  class MWP_Backup_Writer_GzipWriter implements MWP_Backup_Writer_WriterInterface
12
  {
src/MWP/Backup/Writer/PlainWriter.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
 
3
  class MWP_Backup_Writer_PlainWriter implements MWP_Backup_Writer_WriterInterface
4
  {
1
  <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
 
11
  class MWP_Backup_Writer_PlainWriter implements MWP_Backup_Writer_WriterInterface
12
  {
src/MWP/Backup/Writer/WriterFactory.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
 
3
  class MWP_Backup_Writer_WriterFactory
4
  {
1
  <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
 
11
  class MWP_Backup_Writer_WriterFactory
12
  {
src/MWP/Backup/Writer/WriterInterface.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
 
3
  interface MWP_Backup_Writer_WriterInterface
4
  {
1
  <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
 
11
  interface MWP_Backup_Writer_WriterInterface
12
  {
src/MWP/Crypter/Factory.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Crypter_Factory
12
+ {
13
+ public static function createCrypter()
14
+ {
15
+ if (extension_loaded('openssl')) {
16
+ return self::createOpenSslCrypter();
17
+ }
18
+
19
+ return self::createPhpSecLibCrypter();
20
+ }
21
+
22
+ public static function createOpenSslCrypter()
23
+ {
24
+ return new MWP_Crypter_OpenSslCrypter();
25
+ }
26
+
27
+ public static function createPhpSecLibCrypter()
28
+ {
29
+ return new MWP_Crypter_PhpSecLibCrypter();
30
+ }
31
+ }
src/MWP/Crypter/Interface.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ interface MWP_Crypter_Interface
12
+ {
13
+ /**
14
+ * Encrypts data with public key. It can be only encrypted with the corresponding private key.
15
+ *
16
+ * @param string $data
17
+ * @param string $publicKey
18
+ *
19
+ * @return string
20
+ *
21
+ * @throws MWP_Worker_Exception If there's anything wrong with the OpenSSL extension.
22
+ */
23
+ public function publicEncrypt($data, $publicKey);
24
+
25
+ /**
26
+ * Decrypts data encrypted with private key. It can be only decrypted with the corresponding public key.
27
+ *
28
+ * @param string $data
29
+ * @param string $publicKey
30
+ *
31
+ * @return string|null
32
+ *
33
+ * @throws MWP_Worker_Exception If there's anything wrong with the OpenSSL extension.
34
+ */
35
+ public function publicDecrypt($data, $publicKey);
36
+ }
src/MWP/Crypter/OpenSslCrypter.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Crypter_OpenSslCrypter implements MWP_Crypter_Interface
12
+ {
13
+ public function publicEncrypt($data, $publicKey)
14
+ {
15
+ $errorCatcher = new MWP_Debug_ErrorCatcher();
16
+ $errorCatcher->register('openssl_public_encrypt');
17
+ $success = @openssl_public_encrypt($data, $crypted, $publicKey);
18
+ $lastError = $errorCatcher->yieldErrorMessage(true);
19
+
20
+ if ($success === false) {
21
+ $error = $errorRow = '';
22
+
23
+ while (($errorRow = openssl_error_string()) !== false) {
24
+ $error = $errorRow."\n".$error;
25
+ }
26
+
27
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::OPENSSL_ENCRYPT_ERROR, "There was an error while trying to use OpenSSL to encrypt a message.", array(
28
+ 'openSslError' => $error,
29
+ 'error' => isset($lastError['message']) ? $lastError['message'] : null,
30
+ ));
31
+ }
32
+
33
+ return $crypted;
34
+ }
35
+
36
+ public function publicDecrypt($data, $publicKey)
37
+ {
38
+ $errorCatcher = new MWP_Debug_ErrorCatcher();
39
+ $errorCatcher->register('openssl_public_decrypt');
40
+ $success = @openssl_public_decrypt($data, $decrypted, $publicKey);
41
+ $lastError = $errorCatcher->yieldErrorMessage(true);
42
+
43
+ if ($success === false && $lastError !== null) {
44
+ $error = $errorRow = '';
45
+
46
+ while (($errorRow = openssl_error_string()) !== false) {
47
+ $error = $errorRow."\n".$error;
48
+ }
49
+
50
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::OPENSSL_DECRYPT_ERROR, "There was an error while trying to use OpenSSL to decrypt a message.", array(
51
+ 'openSslError' => $error,
52
+ 'error' => $lastError,
53
+ ));
54
+ }
55
+
56
+ return $decrypted === false ? null : $decrypted;
57
+ }
58
+ }
src/MWP/Crypter/PhpSecLibCrypter.php ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Crypter_PhpSecLibCrypter implements MWP_Crypter_Interface
12
+ {
13
+ public function publicEncrypt($data, $publicKey)
14
+ {
15
+ $this->requireLibrary();
16
+
17
+ $rsa = new Crypt_RSA();
18
+ $rsa->setEncryptionMode(CRYPT_RSA_SIGNATURE_PKCS1);
19
+ $rsa->loadKey($publicKey);
20
+
21
+ $errorCatcher = new MWP_Debug_ErrorCatcher();
22
+ $errorCatcher->register();
23
+ $encrypted = $rsa->encrypt($data);
24
+ $error = $errorCatcher->yieldErrorMessage(true);
25
+
26
+ if ($encrypted === false && $error !== null) {
27
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::PHPSECLIB_ENCRYPT_ERROR, "Error while trying to use OpenSSL to encrypt a message.", array(
28
+ 'error' => $error,
29
+ ));
30
+ }
31
+
32
+ return $encrypted;
33
+ }
34
+
35
+ public function publicDecrypt($data, $publicKey)
36
+ {
37
+ $this->requireLibrary();
38
+
39
+ $rsa = new Crypt_RSA();
40
+ $rsa->setEncryptionMode(CRYPT_RSA_SIGNATURE_PKCS1);
41
+ $rsa->loadKey($publicKey);
42
+
43
+ $errorCatcher = new MWP_Debug_ErrorCatcher();
44
+ $errorCatcher->register();
45
+ $decrypted = $rsa->decrypt($data);
46
+ $error = $errorCatcher->yieldErrorMessage(true);
47
+
48
+ // "Decryption error" is generated by the library when the public key is not correct.
49
+ if ($decrypted === false && $error !== 'Decryption error') {
50
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::PHPSECLIB_DECRYPT_ERROR, "Error while trying to use OpenSSL to decrypt a message.", array(
51
+ 'error' => $error,
52
+ ));
53
+ }
54
+
55
+ return $decrypted === false ? null : $decrypted;
56
+ }
57
+
58
+ private function requireLibrary()
59
+ {
60
+ require_once dirname(__FILE__).'/../../PHPSecLib/Crypt/RSA.php';
61
+ }
62
+ }
src/MWP/Debug/ErrorCatcher.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
 
3
  class MWP_Debug_ErrorCatcher
4
  {
@@ -8,7 +16,7 @@ class MWP_Debug_ErrorCatcher
8
 
9
  public function handleError($code, $message, $file = '', $line = 0, $context = array())
10
  {
11
- if (is_string($this->registered) && !($message = preg_replace('{^'.$this->registered.'\(.*?\): }', '', $message))) {
12
  return;
13
  }
14
 
@@ -20,14 +28,25 @@ class MWP_Debug_ErrorCatcher
20
  return $this->errorMessage;
21
  }
22
 
23
- public function yieldErrorMessage()
24
  {
25
  $message = $this->errorMessage;
26
  $this->errorMessage = null;
27
 
 
 
 
 
28
  return $message;
29
  }
30
 
 
 
 
 
 
 
 
31
  public function register($capture = true)
32
  {
33
  if ($this->registered) {
1
  <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
 
11
  class MWP_Debug_ErrorCatcher
12
  {
16
 
17
  public function handleError($code, $message, $file = '', $line = 0, $context = array())
18
  {
19
+ if (is_string($this->registered) && !($message = preg_replace('{^'.$this->registered.'\(.*?\): }i', '', $message))) {
20
  return;
21
  }
22
 
28
  return $this->errorMessage;
29
  }
30
 
31
+ public function yieldErrorMessage($unRegister = false)
32
  {
33
  $message = $this->errorMessage;
34
  $this->errorMessage = null;
35
 
36
+ if ($unRegister) {
37
+ $this->unRegister();
38
+ }
39
+
40
  return $message;
41
  }
42
 
43
+ /**
44
+ * Set the $capture parameter to "true" to capture any error message; or to a function name
45
+ * to capture only error messages for that function. It will rely on PHP's standard error
46
+ * reporting which always starts with the name of the function that generated the error.
47
+ *
48
+ * @param bool|string $capture
49
+ */
50
  public function register($capture = true)
51
  {
52
  if ($this->registered) {
src/MWP/Debug/EvalErrorHandler.php ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Debug_EvalErrorHandler
12
+ {
13
+
14
+ private $errorMessages = array();
15
+
16
+ public function getErrorMessages()
17
+ {
18
+ return $this->errorMessages;
19
+ }
20
+
21
+ public function handleError($code, $message, $file = '', $line = 0, $context = array())
22
+ {
23
+ $this->errorMessages[] = array(
24
+ // Use 'type' instead of 'code' to be consistent with error_get_last()
25
+ 'type' => $code,
26
+ 'message' => $message,
27
+ 'file' => $file,
28
+ 'line' => $line,
29
+ 'datetime' => date('Y-m-d H:i:s'),
30
+ );
31
+ }
32
+ }
src/MWP/Debug/FatalErrorException.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Debug_FatalErrorException extends Exception
12
+ {
13
+ public function setLine($line)
14
+ {
15
+ $this->line = $line;
16
+ }
17
+
18
+ public function setFile($file)
19
+ {
20
+ $this->file = $file;
21
+ }
22
+ }
src/MWP/Event/AbstractRequest.php ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ abstract class MWP_Event_AbstractRequest extends Symfony_EventDispatcher_Event
12
+ {
13
+
14
+ private $request;
15
+
16
+ /**
17
+ * @var MWP_Http_ResponseInterface|null
18
+ */
19
+ private $response;
20
+
21
+ /**
22
+ * @param MWP_Worker_Request $request
23
+ */
24
+ public function __construct(MWP_Worker_Request $request)
25
+ {
26
+ $this->request = $request;
27
+ }
28
+
29
+ /**
30
+ * @return MWP_Worker_Request
31
+ */
32
+ public function getRequest()
33
+ {
34
+ return $this->request;
35
+ }
36
+
37
+ /**
38
+ * @return MWP_Http_ResponseInterface
39
+ *
40
+ * @throws RuntimeException If the response does not exist.
41
+ */
42
+ public function getResponse()
43
+ {
44
+ if ($this->response === null) {
45
+ throw new RuntimeException('Response is not set');
46
+ }
47
+
48
+ return $this->response;
49
+ }
50
+
51
+ /**
52
+ * @param MWP_Http_ResponseInterface|null $response
53
+ */
54
+ public function setResponse(MWP_Http_ResponseInterface $response)
55
+ {
56
+ $this->response = $response;
57
+ }
58
+
59
+ public function hasResponse()
60
+ {
61
+ if ($this->response === null) {
62
+ return false;
63
+ }
64
+
65
+ return true;
66
+ }
67
+ }
src/MWP/Event/ActionException.php ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Event_ActionException extends Symfony_EventDispatcher_Event
12
+ {
13
+
14
+ private $request;
15
+
16
+ private $exception;
17
+
18
+ private $data = array();
19
+
20
+ /**
21
+ * @var MWP_Http_ResponseInterface|null
22
+ */
23
+ private $response;
24
+
25
+ public function __construct(MWP_Worker_Request $request, Exception $exception)
26
+ {
27
+ $this->request = $request;
28
+ $this->exception = $exception;
29
+ }
30
+
31
+ /**
32
+ * @return Exception
33
+ */
34
+ public function getException()
35
+ {
36
+ return $this->exception;
37
+ }
38
+
39
+ /**
40
+ * @return MWP_Http_ResponseInterface|null
41
+ */
42
+ public function getResponse()
43
+ {
44
+ return $this->response;
45
+ }
46
+
47
+ /**
48
+ * @param MWP_Http_ResponseInterface|null $response
49
+ */
50
+ public function setResponse(MWP_Http_ResponseInterface $response = null)
51
+ {
52
+ $this->response = $response;
53
+ }
54
+
55
+ /**
56
+ * @return array
57
+ */
58
+ public function getData()
59
+ {
60
+ return $this->data;
61
+ }
62
+
63
+ /**
64
+ * @param array $data
65
+ */
66
+ public function setData(array $data)
67
+ {
68
+ $this->data = $data;
69
+ }
70
+
71
+ /**
72
+ * @return MWP_Worker_Request
73
+ */
74
+ public function getRequest()
75
+ {
76
+ return $this->request;
77
+ }
78
+ }
src/MWP/Event/ActionRequest.php ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Event_ActionRequest extends Symfony_EventDispatcher_Event
12
+ {
13
+
14
+ /**
15
+ * @var MWP_Worker_Request
16
+ */
17
+ private $request;
18
+
19
+ /**
20
+ * @var array
21
+ */
22
+ private $params;
23
+
24
+ public function __construct(MWP_Worker_Request $request, array $params)
25
+ {
26
+ $this->request = $request;
27
+ $this->params = $params;
28
+ }
29
+
30
+ /**
31
+ * @return MWP_Worker_Request
32
+ */
33
+ public function getRequest()
34
+ {
35
+ return $this->request;
36
+ }
37
+
38
+ /**
39
+ * @return array
40
+ */
41
+ public function getParams()
42
+ {
43
+ return $this->params;
44
+ }
45
+
46
+ /**
47
+ * @param array $params
48
+ */
49
+ public function setParams(array $params)
50
+ {
51
+ $this->params = $params;
52
+ }
53
+ }
src/MWP/Event/ActionResponse.php ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Event_ActionResponse extends Symfony_EventDispatcher_Event
12
+ {
13
+
14
+ private $request;
15
+
16
+ private $params;
17
+
18
+ private $data;
19
+
20
+ /**
21
+ * @var MWP_Http_ResponseInterface
22
+ */
23
+ private $response;
24
+
25
+ public function __construct(MWP_Worker_Request $request, array $params, $data)
26
+ {
27
+ $this->request = $request;
28
+ $this->params = $params;
29
+ $this->data = $data;
30
+ }
31
+
32
+ /**
33
+ * @return mixed
34
+ */
35
+ public function getData()
36
+ {
37
+ return $this->data;
38
+ }
39
+
40
+ /**
41
+ * @param mixed $data
42
+ */
43
+ public function setData($data)
44
+ {
45
+ $this->data = $data;
46
+ }
47
+
48
+ /**
49
+ * @return MWP_Http_ResponseInterface|null
50
+ */
51
+ public function getResponse()
52
+ {
53
+ return $this->response;
54
+ }
55
+
56
+ /**
57
+ * @param MWP_Http_ResponseInterface|null $response
58
+ */
59
+ public function setResponse(MWP_Http_ResponseInterface $response = null)
60
+ {
61
+ $this->response = $response;
62
+ }
63
+
64
+ /**
65
+ * @return MWP_Worker_Request
66
+ */
67
+ public function getRequest()
68
+ {
69
+ return $this->request;
70
+ }
71
+
72
+ /**
73
+ * @return array
74
+ */
75
+ public function getParams()
76
+ {
77
+ return $this->params;
78
+ }
79
+ }
src/MWP/Event/Events.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Event_Events
12
+ {
13
+ /**
14
+ * Fired if the master response is detected.
15
+ *
16
+ * @see MWP_Event_MasterRequest
17
+ */
18
+ const MASTER_REQUEST = 'kernel.master_request';
19
+
20
+ /**
21
+ * Fired if non-master response is detected.
22
+ *
23
+ * @see MWP_Event_PublicRequest
24
+ */
25
+ const PUBLIC_REQUEST = 'kernel.public_request';
26
+
27
+ /**
28
+ * Fired when the HTTP response is ready to be sent.
29
+ *
30
+ * @see MWP_Event_MasterResponse
31
+ */
32
+ const MASTER_RESPONSE = 'kernel.master_response';
33
+
34
+ /**
35
+ * Fired just before the action and arguments are passed to it.
36
+ *
37
+ * @see MWP_Event_ActionRequest
38
+ */
39
+ const ACTION_REQUEST = 'action.request';
40
+
41
+ /**
42
+ * Fired right after the action sends a response.
43
+ *
44
+ * @see MWP_Event_ActionResponse
45
+ */
46
+ const ACTION_RESPONSE = 'action.response';
47
+
48
+ /**
49
+ * Fired after an exception is thrown.
50
+ *
51
+ * @see MWP_Event_ActionException
52
+ */
53
+ const ACTION_EXCEPTION = 'action.exception';
54
+
55
+ private function __construct()
56
+ {
57
+ }
58
+ }
src/MWP/Event/MasterRequest.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Event_MasterRequest extends MWP_Event_AbstractRequest
12
+ {
13
+
14
+ /**
15
+ * @var array
16
+ */
17
+ private $params;
18
+
19
+ function __construct(MWP_Worker_Request $request, array $params)
20
+ {
21
+ $this->params = $params;
22
+
23
+ parent::__construct($request);
24
+ }
25
+
26
+ public function getParams()
27
+ {
28
+ return $this->params;
29
+ }
30
+
31
+ public function setParams(array $params)
32
+ {
33
+ $this->params = $params;
34
+ }
35
+ }
src/MWP/Event/MasterResponse.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Event_MasterResponse extends Symfony_EventDispatcher_Event
12
+ {
13
+
14
+ /**
15
+ * @var MWP_Http_ResponseInterface|null
16
+ */
17
+ private $response;
18
+
19
+ public function __construct(MWP_Http_ResponseInterface $response)
20
+ {
21
+ $this->response = $response;
22
+ }
23
+
24
+ /**
25
+ * @return MWP_Http_ResponseInterface
26
+ */
27
+ public function getResponse()
28
+ {
29
+ return $this->response;
30
+ }
31
+
32
+ /**
33
+ * Give listeners a chance to remove the response.
34
+ *
35
+ * @param MWP_Http_ResponseInterface|null $response
36
+ */
37
+ public function setResponse(MWP_Http_ResponseInterface $response = null)
38
+ {
39
+ $this->response = $response;
40
+ }
41
+ }
src/MWP/Event/PublicRequest.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Event_PublicRequest extends MWP_Event_AbstractRequest
12
+ {
13
+ }
src/MWP/EventListener/ActionException/SetExceptionData.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_EventListener_ActionException_SetExceptionData implements Symfony_EventDispatcher_EventSubscriberInterface
12
+ {
13
+ public static function getSubscribedEvents()
14
+ {
15
+ return array(
16
+ MWP_Event_Events::ACTION_EXCEPTION => array('onActionException', 200),
17
+ );
18
+ }
19
+
20
+ public function onActionException(MWP_Event_ActionException $event)
21
+ {
22
+ $exception = $event->getException();
23
+
24
+ if ($exception instanceof MWP_Worker_Exception) {
25
+ $exceptionData = $this->getDataForWorkerException($exception);
26
+ } else {
27
+ $exceptionData = $this->getDataForGenericException($exception);
28
+ }
29
+
30
+ $data = array(
31
+ 'error' => $exception->getMessage(),
32
+ 'exception' => $exceptionData,
33
+ );
34
+
35
+ $event->setData($data);
36
+ }
37
+
38
+ public function getDataForWorkerException(MWP_Worker_Exception $exception)
39
+ {
40
+ return array(
41
+ 'context' => $exception->getContext(),
42
+ 'type' => $exception->getErrorName(),
43
+ ) + $this->getDataForGenericException($exception);
44
+ }
45
+
46
+ public function getDataForGenericException(Exception $exception)
47
+ {
48
+ return array(
49
+ 'class' => get_class($exception),
50
+ 'message' => $exception->getMessage(),
51
+ 'line' => $exception->getLine(),
52
+ 'file' => $exception->getFile(),
53
+ 'code' => $exception->getCode(),
54
+ 'traceString' => $exception->getTraceAsString(),
55
+ );
56
+ }
57
+ }
src/MWP/EventListener/ActionRequest/SetSettings.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_EventListener_ActionRequest_SetSettings implements Symfony_EventDispatcher_EventSubscriberInterface
12
+ {
13
+
14
+ private $context;
15
+
16
+ public function __construct(MWP_WordPress_Context $context)
17
+ {
18
+ $this->context = $context;
19
+ }
20
+
21
+ public static function getSubscribedEvents()
22
+ {
23
+ return array(
24
+ MWP_Event_Events::ACTION_REQUEST => 'onActionRequest',
25
+ );
26
+ }
27
+
28
+ public function onActionRequest(MWP_Event_ActionRequest $event)
29
+ {
30
+ set_time_limit(1800);
31
+
32
+ $this->context->set('_wp_using_ext_object_cache', false);
33
+
34
+ $data = $event->getRequest()->getData();
35
+
36
+ if (empty($data['setting'])) {
37
+ return;
38
+ }
39
+
40
+ if (!empty($data['setting']['dataown'])) {
41
+ $oldSettings = (array) $this->context->optionGet('wrksettings');
42
+ $this->context->optionSet('wrksettings', array_merge($oldSettings, array('dataown' => $data['setting']['dataown'])));
43
+ }
44
+
45
+ $configurationService = new MWP_Configuration_Service();
46
+ $configuration = new MWP_Configuration_Conf($data['setting']);
47
+ $configurationService->saveConfiguration($configuration);
48
+ }
49
+ }
src/MWP/EventListener/ActionResponse/ChainState.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_EventListener_ActionResponse_ChainState implements Symfony_EventDispatcher_EventSubscriberInterface
12
+ {
13
+
14
+ private $container;
15
+
16
+ public function __construct(MWP_ServiceContainer_Interface $container)
17
+ {
18
+ $this->container;
19
+ }
20
+
21
+ public static function getSubscribedEvents()
22
+ {
23
+ return array(
24
+ MWP_Event_Events::ACTION_RESPONSE => array('onActionResponse', -500),
25
+ );
26
+ }
27
+
28
+ public function onActionResponse(MWP_Event_ActionResponse $event)
29
+ {
30
+ $rawData = $event->getRequest()->getData();
31
+
32
+ if (empty($rawData['stateParams'])) {
33
+ return;
34
+ }
35
+
36
+ $stateAction = new MWP_Action_GetState();
37
+ $stateAction->setContainer($this->container);
38
+ $stateData = $stateAction->execute($rawData['stateParams']);
39
+
40
+ $actionData = $event->getData();
41
+ $actionData['state'] = $stateData;
42
+ }
43
+ }
src/MWP/EventListener/ActionResponse/SetActionData.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_EventListener_ActionResponse_SetActionData implements Symfony_EventDispatcher_EventSubscriberInterface
12
+ {
13
+ public static function getSubscribedEvents()
14
+ {
15
+ return array(
16
+ MWP_Event_Events::ACTION_RESPONSE => array('encodeResponse', 100),
17
+ );
18
+ }
19
+
20
+ public function encodeResponse(MWP_Event_ActionResponse $event)
21
+ {
22
+ $event->setData(array('success' => $event->getData()));
23
+ }
24
+ }
src/MWP/EventListener/ActionResponse/SetLegacyPhpExecutionData.php ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ /**
12
+ * @deprecated This is used to convert the result of PHP execution to raw response or an error response.
13
+ */
14
+ class MWP_EventListener_ActionResponse_SetLegacyPhpExecutionData implements Symfony_EventDispatcher_EventSubscriberInterface
15
+ {
16
+
17
+ private static $errorMap = array(
18
+ E_PARSE => 'E_PARSE',
19
+ E_ERROR => 'E_ERROR',
20
+ E_CORE_ERROR => 'E_CORE_ERROR',
21
+ E_COMPILE_ERROR => 'E_COMPILE_ERROR',
22
+ );
23
+
24
+ public static function getSubscribedEvents()
25
+ {
26
+ return array(
27
+ MWP_Event_Events::ACTION_RESPONSE => array('onActionResponse', 500),
28
+ );
29
+ }
30
+
31
+ public function onActionResponse(MWP_Event_ActionResponse $event)
32
+ {
33
+ $data = $event->getData();
34
+
35
+ if ($event->getRequest()->getAction() !== 'execute_php_code') {
36
+ return;
37
+ }
38
+
39
+ if ($event->getRequest()->getProtocol() >= 1) {
40
+ return;
41
+ }
42
+
43
+ if (!empty($data['fatalError']['message'])) {
44
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::PHP_EVAL_ERROR, sprintf('Fatal error [%s]: %s in %s on line %d', self::$errorMap[$data['fatalError']['type']], $data['fatalError']['message'], $data['fatalError']['file'], $data['fatalError']['line']));
45
+ }
46
+
47
+ if (isset($data['output'])) {
48
+ $event->setData($data['output']);
49
+ }
50
+ }
51
+ }
src/MWP/EventListener/ActionResponse/SetLegacyWebsiteConnectionData.php ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ /**
12
+ * Attaches initial site statistics after connecting the worker to a master instance.
13
+ *
14
+ * @deprecated Not used in master v2.
15
+ */
16
+ class MWP_EventListener_ActionResponse_SetLegacyWebsiteConnectionData implements Symfony_EventDispatcher_EventSubscriberInterface
17
+ {
18
+
19
+ private $context;
20
+
21
+ public function __construct(MWP_WordPress_Context $context)
22
+ {
23
+ $this->context = $context;
24
+ }
25
+
26
+ public static function getSubscribedEvents()
27
+ {
28
+ return array(
29
+ MWP_Event_Events::ACTION_RESPONSE => array('onActionResponse', 200),
30
+ );
31
+ }
32
+
33
+ public function onActionResponse(MWP_Event_ActionResponse $event)
34
+ {
35
+ if ($event->getRequest()->getAction() !== 'add_site') {
36
+ return;
37
+ }
38
+
39
+ $params = $event->getRequest()->getParams();
40
+
41
+ if (!array_key_exists('notifications', $params)) {
42
+ // This is not a legacy call.
43
+ return;
44
+ }
45
+
46
+ $this->context->requireWpRewrite();
47
+ $this->context->requireTaxonomies();
48
+ $this->context->requirePostTypes();
49
+ $this->context->requireTheme();
50
+
51
+ $stats = new MMB_Stats();
52
+ $this->context->optionSet('mwp_notifications', $params['notifications']);
53
+ $event->setData($stats->get_initial_stats());
54
+ }
55
+ }
src/MWP/EventListener/EncodeMasterResponse.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_EventListener_EncodeMasterResponse implements Symfony_EventDispatcher_EventSubscriberInterface
12
+ {
13
+ public static function getSubscribedEvents()
14
+ {
15
+ return array(
16
+ MWP_Event_Events::ACTION_RESPONSE => array('onActionResponse', 100),
17
+ MWP_Event_Events::ACTION_EXCEPTION => array('onActionException', 100),
18
+ );
19
+ }
20
+
21
+ public function onActionResponse(MWP_Event_ActionResponse $event)
22
+ {
23
+ $event->setResponse($this->getResponseForRequest($event->getRequest(), $event->getData()));
24
+ }
25
+
26
+ public function onActionException(MWP_Event_ActionException $event)
27
+ {
28
+ $event->setResponse($this->getResponseForRequest($event->getRequest(), $event->getData()));
29
+ }
30
+
31
+ private function getResponseForRequest(MWP_Worker_Request $request, $data)
32
+ {
33
+ if (strpos($request->getHeader('Accept'), 'application/json') === false) {
34
+ return new MWP_Http_LegacyWorkerResponse($data);
35
+ }
36
+
37
+ return new MWP_Http_JsonResponse($data);
38
+ }
39
+ }
src/MWP/EventListener/MasterRequest/AttachJsonMessageHandler.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_EventListener_MasterRequest_AttachJsonMessageHandler implements Symfony_EventDispatcher_EventSubscriberInterface
12
+ {
13
+
14
+ private $logger;
15
+
16
+ private $handler;
17
+
18
+ function __construct(Monolog_Logger $logger, MWP_Monolog_Handler_JsonMessageHandler $handler)
19
+ {
20
+ $this->logger = $logger;
21
+ $this->handler = $handler;
22
+ }
23
+
24
+ public static function getSubscribedEvents()
25
+ {
26
+ return array(
27
+ MWP_Event_Events::MASTER_REQUEST => array('onMasterRequest', -400),
28
+ );
29
+ }
30
+
31
+ public function onMasterRequest(MWP_Event_MasterRequest $event)
32
+ {
33
+ if (!$event->getRequest()->isAuthenticated()) {
34
+ return;
35
+ }
36
+
37
+ if (strpos($event->getRequest()->getHeader('ACCEPT'), 'application/ldjson') === false) {
38
+ return;
39
+ }
40
+
41
+ $this->logger->pushHandler($this->handler);
42
+ }
43
+ }
src/MWP/EventListener/MasterRequest/AuthenticateLegacyRequest.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ /**
12
+ * Authenticates requests that use hash authentication instead of public/private key.
13
+ *
14
+ * @deprecated Rely on the more secure AuthenticateRequest class.
15
+ */
16
+ class MWP_EventListener_MasterRequest_AuthenticateLegacyRequest implements Symfony_EventDispatcher_EventSubscriberInterface
17
+ {
18
+
19
+ private $configuration;
20
+
21
+ function __construct(MWP_Worker_Configuration $configuration)
22
+ {
23
+ $this->configuration = $configuration;
24
+ }
25
+
26
+ public static function getSubscribedEvents()
27
+ {
28
+ return array(
29
+ MWP_Event_Events::MASTER_REQUEST => array('onMasterRequest', 350),
30
+ );
31
+ }
32
+
33
+ public function onMasterRequest(MWP_Event_MasterRequest $event)
34
+ {
35
+ $request = $event->getRequest();
36
+ $secureKey = $this->configuration->getSecureKey();
37
+ $params = $event->getParams();
38
+ $givenPublicKey = isset($params['public_key']) ? base64_decode($params['public_key']) : null;
39
+ $existingPublicKey = $this->configuration->getPublicKey();
40
+
41
+ if ($request->getAction() === 'add_site') {
42
+ if ($secureKey && (!$existingPublicKey || $givenPublicKey !== $existingPublicKey)) {
43
+ // Secure key exists, and public key either doesn't exist, or doesn't match.
44
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::LEGACY_AUTHENTICATION_KEY_EXISTS, "Sorry, the site appears to be already added to a ManageWP account. Please deactivate, then activate ManageWP Worker plugin on your website and try again or contact our support.");
45
+ }
46
+
47
+ return;
48
+ }
49
+
50
+ if (!$secureKey) {
51
+ // The site is relying on public key.
52
+ return;
53
+ }
54
+
55
+ $messageId = $request->getAction().$request->getNonce();
56
+ $signature = $request->getSignature();
57
+
58
+ if (md5($messageId.$secureKey) !== $signature) {
59
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::LEGACY_AUTHENTICATION_INVALID_SIGNATURE, "Invalid message signature. Deactivate and activate the ManageWP Worker plugin on this site, then re-add it to your ManageWP account.");
60
+ }
61
+
62
+ $request->setAuthenticated(true);
63
+
64
+ // Skip verification test because the signature is not an SSL signature.
65
+ $params = $event->getParams();
66
+ $params['skipVerificationTest'] = true;
67
+ $event->setParams($params);
68
+ }
69
+ }
src/MWP/EventListener/MasterRequest/AuthenticateRequest.php ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_EventListener_MasterRequest_AuthenticateRequest implements Symfony_EventDispatcher_EventSubscriberInterface
12
+ {
13
+ private $configuration;
14
+
15
+ private $signer;
16
+
17
+ function __construct(MWP_Worker_Configuration $configuration, MWP_Signer_Interface $signer)
18
+ {
19
+ $this->configuration = $configuration;
20
+ $this->signer = $signer;
21
+ }
22
+
23
+ public static function getSubscribedEvents()
24
+ {
25
+ return array(
26
+ MWP_Event_Events::MASTER_REQUEST => array('onMasterRequest', 300),
27
+ );
28
+ }
29
+
30
+ public function onMasterRequest(MWP_Event_MasterRequest $event)
31
+ {
32
+ $request = $event->getRequest();
33
+
34
+ if ($request->isAuthenticated()) {
35
+ return;
36
+ }
37
+
38
+ if ($request->getAction() === 'add_site') {
39
+ return;
40
+ }
41
+
42
+ $publicKey = $this->configuration->getPublicKey();
43
+
44
+ if (!$publicKey) {
45
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::AUTHENTICATION_PUBLIC_KEY_EMPTY, "Authentication failed. Deactivate and activate the ManageWP Worker plugin on this site, then re-add it to your ManageWP account.");
46
+ }
47
+
48
+ $messageId = $request->getAction().$request->getNonce();
49
+ $signature = $request->getSignature();
50
+
51
+ if (!$messageId) {
52
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::AUTHENTICATION_MESSAGE_ID_EMPTY, null, array(
53
+ 'messageId' => $messageId,
54
+ 'signature' => base64_encode($signature),
55
+ ));
56
+ }
57
+
58
+ $verify = $this->signer->verify($messageId, $signature, $publicKey);
59
+
60
+ if (!$verify) {
61
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::AUTHENTICATION_INVALID_SIGNATURE, "Invalid message signature. Deactivate and activate the ManageWP Worker plugin on this site, then re-add it to your ManageWP account.");
62
+ }
63
+
64
+ $request->setAuthenticated(true);
65
+ }
66
+ }
src/MWP/EventListener/MasterRequest/RemoveUsernameParam.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ /**
12
+ * @deprecated Legacy protocol support.
13
+ */
14
+ class MWP_EventListener_MasterRequest_RemoveUsernameParam implements Symfony_EventDispatcher_EventSubscriberInterface
15
+ {
16
+ public static function getSubscribedEvents()
17
+ {
18
+ return array(
19
+ MWP_Event_Events::MASTER_REQUEST => 'onMasterRequest',
20
+ );
21
+ }
22
+
23
+ public function onMasterRequest(MWP_Event_MasterRequest $event)
24
+ {
25
+ $params = $event->getParams();
26
+
27
+ if (!array_key_exists('username', $params)) {
28
+ return;
29
+ }
30
+
31
+ unset($params['username']);
32
+
33
+ $event->setParams($params);
34
+ }
35
+ }
src/MWP/EventListener/MasterRequest/SetCurrentUser.php ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_EventListener_MasterRequest_SetCurrentUser implements Symfony_EventDispatcher_EventSubscriberInterface
12
+ {
13
+
14
+ private $context;
15
+
16
+ public function __construct(MWP_WordPress_Context $context)
17
+ {
18
+ $this->context = $context;
19
+ }
20
+
21
+ public static function getSubscribedEvents()
22
+ {
23
+ return array(
24
+ MWP_Event_Events::MASTER_REQUEST => array('onMasterRequest', -300),
25
+ );
26
+ }
27
+
28
+ public function onMasterRequest(MWP_Event_MasterRequest $event)
29
+ {
30
+ if (!$event->getRequest()->isAuthenticated()) {
31
+ return;
32
+ }
33
+
34
+ $usernameUsed = $event->getRequest()->getUsername();
35
+ $user = null;
36
+
37
+ if ($usernameUsed) {
38
+ $user = $this->context->getUserByUsername($usernameUsed);
39
+ }
40
+
41
+ if ($user === null) {
42
+ // No user provided, find one instead.
43
+ $users = $this->context->getUsers(array('role' => 'administrator', 'number' => 1, 'orderby' => 'ID'));
44
+ if (count($users) === 0) {
45
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::AUTHENTICATION_NO_ADMIN_USER, "We could not find an administrator user to use. Please contact support.");
46
+ }
47
+ $user = $users[0];
48
+ }
49
+
50
+ $this->context->setCurrentUser($user);
51
+
52
+ /*
53
+ if (isset($user)) {
54
+ wp_set_current_user($user->ID);
55
+ // Compatibility with All In One Security
56
+ update_user_meta($user->ID, 'last_login_time', current_time('mysql'));
57
+ }
58
+
59
+ if (defined('ALTERNATE_WP_CRON') && !defined('DOING_AJAX') && ALTERNATE_WP_CRON === true) {
60
+ define('DOING_AJAX', true);
61
+ }
62
+ */
63
+ }
64
+ }
src/MWP/EventListener/MasterRequest/SetErrorHandler.php ADDED
@@ -0,0 +1,177 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ /**
12
+ * Converts any fatal PHP error into a valid worker response.
13
+ */
14
+ class MWP_EventListener_MasterRequest_SetErrorHandler extends Monolog_Handler_AbstractHandler implements Symfony_EventDispatcher_EventSubscriberInterface
15
+ {
16
+
17
+ private $logger;
18
+
19
+ private $errorHandler;
20
+
21
+ private $requestStack;
22
+
23
+ private $responseCallback;
24
+
25
+ private $container;
26
+
27
+ private $errors = array();
28
+
29
+ private $logErrors;
30
+
31
+ private $reservedMemorySize;
32
+
33
+ public function __construct(Monolog_Logger $logger, Monolog_ErrorHandler $errorHandler, MWP_Worker_RequestStack $requestStack, MWP_Worker_ResponseCallback $responseCallback, MWP_ServiceContainer_Interface $container, $logErrors = false, $reservedMemorySize = 20)
34
+ {
35
+ $this->logger = $logger;
36
+ $this->errorHandler = $errorHandler;
37
+ $this->requestStack = $requestStack;
38
+ $this->responseCallback = $responseCallback;
39
+ $this->logErrors = $logErrors;
40
+ $this->reservedMemorySize = $reservedMemorySize;
41
+ // We need the container here, since referencing the event dispatcher component will create a circular reference,
42
+ // since this is an event listener.
43
+ $this->container = $container;
44
+
45
+ parent::__construct(Monolog_Logger::NOTICE, false);
46
+ }
47
+
48
+ /**
49
+ * Error data ($record) looks like this:
50
+ * array (
51
+ * 'message' => 'Fatal Error (E_ERROR): Call to undefined function wp_set_current_user()',
52
+ * // or
53
+ * 'message' => 'Uncaught exception',
54
+ * 'context' =>
55
+ * array (
56
+ * 'code' => 1,
57
+ * 'message' => 'Call to undefined function wp_set_current_user()',
58
+ * 'file' => '/home/vagrant/www/wptest.dev/wp-content/plugins/worker/src/MWP/WordPress/Context.php',
59
+ * 'line' => 483,
60
+ * // or
61
+ * 'exception' => Exception
62
+ * ),
63
+ * 'level' => 550,
64
+ * 'level_name' => 'ALERT',
65
+ * 'channel' => 'worker',
66
+ * 'datetime' =>
67
+ * DateTime::__set_state(array(
68
+ * 'date' => '2015-01-06 14:50:44.404504',
69
+ * 'timezone_type' => 3,
70
+ * 'timezone' => 'UTC',
71
+ * )),
72
+ * 'extra' =>
73
+ * array (
74
+ * ),
75
+ * )
76
+ *
77
+ * @param array $record
78
+ *
79
+ * @return bool
80
+ */
81
+ public function handle(array $record)
82
+ {
83
+ $request = $this->requestStack->getMasterRequest();
84
+
85
+ // Everything below ERROR is recoverable, so we can log it.
86
+ if ($record['level'] < Monolog_Logger::ERROR) {
87
+ if ($this->logErrors) {
88
+ $this->errors[] = $record;
89
+ }
90
+
91
+ return false;
92
+ }
93
+
94
+ // Everything after this point is a fatal error.
95
+ if (!$request->isAuthenticated()) {
96
+ return false;
97
+ }
98
+
99
+ $responseCallback = $this->responseCallback->get();
100
+
101
+ if ($responseCallback === null) {
102
+ return false;
103
+ }
104
+
105
+ if (isset($record['context']['exception'])) {
106
+ $exception = $record['context']['exception'];
107
+ } else {
108
+ $exception = new MWP_Debug_FatalErrorException($record['message'], $record['context']['code']);
109
+ $exception->setFile($record['context']['file']);
110
+ $exception->setLine($record['context']['line']);
111
+ }
112
+
113
+ $errorEvent = new MWP_Event_ActionException($request, $exception);
114
+ $this->container->getEventDispatcher()->dispatch(MWP_Event_Events::ACTION_EXCEPTION, $errorEvent);
115
+
116
+ call_user_func($responseCallback, $exception, $errorEvent->getResponse());
117
+
118
+ return true;
119
+ }
120
+
121
+ public static function getSubscribedEvents()
122
+ {
123
+ return array(
124
+ MWP_Event_Events::MASTER_REQUEST => array('onMasterRequest', 200),
125
+ MWP_Event_Events::MASTER_RESPONSE => array('onMasterResponse', -200),
126
+ );
127
+ }
128
+
129
+ public function onMasterRequest(MWP_Event_MasterRequest $event)
130
+ {
131
+ if (!$event->getRequest()->isAuthenticated()) {
132
+ return;
133
+ }
134
+
135
+ $this->logger->pushHandler($this);
136
+ $this->errorHandler->registerFatalHandler(null, $this->reservedMemorySize);
137
+ $this->errorHandler->registerExceptionHandler();
138
+
139
+ if ($this->logErrors) {
140
+ error_reporting(E_ALL);
141
+ ini_set('display_errors', false);
142
+ $this->errorHandler->registerErrorHandler();
143
+ }
144
+ }
145
+
146
+ public function onMasterResponse(MWP_Event_MasterResponse $event)
147
+ {
148
+ if (!$this->logErrors) {
149
+ return;
150
+ }
151
+
152
+ if (!$this->requestStack->getMasterRequest()->isAuthenticated() || count($this->errors) === 0) {
153
+ return;
154
+ }
155
+
156
+ $response = $event->getResponse();
157
+ $content = $response->getContent();
158
+
159
+ if (!is_array($content)) {
160
+ return;
161
+ }
162
+
163
+ $content['errorLog'] = array();
164
+
165
+ foreach ($this->errors as $error) {
166
+ /** @var DateTime $date */
167
+ $date = $error['datetime'];
168
+ $log = $error['context'];
169
+ $log['level'] = $error['level_name'];
170
+ $log['time'] = $date->format('Y-m-d H:i:s');
171
+
172
+ $content['errorLog'][] = $log;
173
+ }
174
+
175
+ $response->setContent($content);
176
+ }
177
+ }
src/MWP/EventListener/MasterRequest/VerifyConnectionInfo.php ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ /**
12
+ * Checks if the website connection attempt is providing valid signature for our keychain.
13
+ * This works in conjunction with "AuthenticateRequest" class, since it handles all other cases.
14
+ */
15
+ class MWP_EventListener_MasterRequest_VerifyConnectionInfo implements Symfony_EventDispatcher_EventSubscriberInterface
16
+ {
17
+
18
+ private $context;
19
+
20
+ private $signer;
21
+
22
+ public function __construct(MWP_WordPress_Context $context, MWP_Signer_Interface $signer)
23
+ {
24
+ $this->context = $context;
25
+ $this->signer = $signer;
26
+ }
27
+
28
+ public static function getSubscribedEvents()
29
+ {
30
+ return array(
31
+ MWP_Event_Events::MASTER_REQUEST => array('onMasterRequest', 300),
32
+ );
33
+ }
34
+
35
+ public function onMasterRequest(MWP_Event_MasterRequest $event)
36
+ {
37
+ $request = $event->getRequest();
38
+
39
+ if ($request->getAction() !== 'add_site') {
40
+ return;
41
+ }
42
+
43
+ $data = $request->getData();
44
+
45
+ if (empty($data['add_site_signature']) || empty($data['add_site_signature_id'])) {
46
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::CONNECTION_SIGNATURE_EMPTY);
47
+ }
48
+
49
+ $connectionSignature = base64_decode($data['add_site_signature']);
50
+ $publicKeyId = $data['add_site_signature_id'];
51
+
52
+ $publicKeyId = preg_replace('{[^a-z0-9_]}i', '', $publicKeyId);
53
+ $publicKeyLocation = dirname(__FILE__).'/../../../../publickeys/'.$publicKeyId.'.pub';
54
+
55
+ if (!file_exists($publicKeyLocation)) {
56
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::CONNECTION_PUBLIC_KEY_NOT_FOUND, null, array(
57
+ 'publicKeyId' => $publicKeyId,
58
+ ));
59
+ }
60
+
61
+ $publicKey = file_get_contents($publicKeyLocation);
62
+
63
+ $message = json_encode(array('setting' => $request->getSetting(), 'params' => $request->getParams()));
64
+
65
+ $verify = $this->signer->verify($message, $connectionSignature, $publicKey);
66
+
67
+ if (!$verify) {
68
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::CONNECTION_SIGNATURE_NOT_VALID, "Invalid message signature. Deactivate and activate the ManageWP Worker plugin on this site, then re-add it to your ManageWP account.");
69
+ }
70
+
71
+ $request->setAuthenticated(true);
72
+ }
73
+ }
src/MWP/EventListener/MasterRequest/VerifyNonce.php ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_EventListener_MasterRequest_VerifyNonce implements Symfony_EventDispatcher_EventSubscriberInterface
12
+ {
13
+
14
+ private $nonceManager;
15
+
16
+ public function __construct(MWP_Security_NonceManager $nonceManager)
17
+ {
18
+ $this->nonceManager = $nonceManager;
19
+ }
20
+
21
+ public static function getSubscribedEvents()
22
+ {
23
+ return array(
24
+ MWP_Event_Events::MASTER_REQUEST => array('onMasterRequest', 400),
25
+ );
26
+ }
27
+
28
+ public function onMasterRequest(MWP_Event_MasterRequest $event)
29
+ {
30
+ $nonce = $event->getRequest()->getNonce();
31
+
32
+ try {
33
+ $this->nonceManager->useNonce($nonce);
34
+ } catch (MWP_Security_Exception_NonceFormatInvalid $e) {
35
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::NONCE_FORMAT_INVALID, "Invalid nonce used. Please contact support.", array(
36
+ 'nonce' => $nonce,
37
+ ));
38
+ } catch (MWP_Security_Exception_NonceExpired $e) {
39
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::NONCE_EXPIRED, "Nonce expired. Please contact support.", array(
40
+ 'nonce' => $nonce,
41
+ ));
42
+ } catch (MWP_Security_Exception_NonceAlreadyUsed $e) {
43
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::NONCE_ALREADY_USED, "Nonce already used. Please contact support.", array(
44
+ 'nonce' => $nonce,
45
+ ));
46
+ }
47
+ }
48
+ }
src/MWP/EventListener/PublicRequest/AutomaticLogin.php ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_EventListener_PublicRequest_AutomaticLogin implements Symfony_EventDispatcher_EventSubscriberInterface
12
+ {
13
+
14
+ private $context;
15
+
16
+ private $signer;
17
+
18
+ private $nonceManager;
19
+
20
+ private $configuration;
21
+
22
+ public function __construct(MWP_WordPress_Context $context, MWP_Security_NonceManager $nonceManager, MWP_Signer_Interface $signer, MWP_Worker_Configuration $configuration)
23
+ {
24
+ $this->context = $context;
25
+ $this->nonceManager = $nonceManager;
26
+ $this->signer = $signer;
27
+ $this->configuration = $configuration;
28
+ }
29
+
30
+ public static function getSubscribedEvents()
31
+ {
32
+ return array(
33
+ MWP_Event_Events::PUBLIC_REQUEST => array(
34
+ array('checkLoginToken', 2),
35
+ array('setXframeHeader', 3),
36
+ ),
37
+ );
38
+ }
39
+
40
+ public function checkLoginToken(MWP_Event_PublicRequest $event)
41
+ {
42
+ $request = $event->getRequest();
43
+
44
+ if (empty($request->query['auto_login']) || empty($request->query['signature']) || empty($request->query['message_id']) || !array_key_exists('mwp_goto', $request->query)) {
45
+ return;
46
+ }
47
+
48
+ if (!$this->configuration->getPublicKey()) {
49
+ // Site is not connected to a master instance.
50
+ return;
51
+ }
52
+
53
+ $username = empty($request->query['username']) ? null : $request->query['username'];
54
+
55
+ if ($username === null) {
56
+ $users = $this->context->getUsers(array('role' => 'administrator', 'number' => 1, 'orderby' => 'ID'));
57
+ if (empty($users[0]->user_login)) {
58
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::AUTO_LOGIN_USERNAME_REQUIRED, "We could not find an administrator user to use. Please contact support.");
59
+ }
60
+ $username = $users[0]->user_login;
61
+ }
62
+
63
+ $where = isset($request->query['mwp_goto']) ? $request->query['mwp_goto'] : '';
64
+
65
+ $signature = base64_decode($request->query['signature']);
66
+ $messageId = $request->query['message_id'];
67
+
68
+ try {
69
+ $this->nonceManager->useNonce($messageId);
70
+ } catch (MWP_Security_Exception_NonceFormatInvalid $e) {
71
+ $this->context->wpDie("The automatic login token is invalid. Please try again, or, if this keeps happening, contact support.");
72
+ } catch (MWP_Security_Exception_NonceExpired $e) {
73
+ $this->context->wpDie("The automatic login token has expired. Please try again, or, if this keeps happening, contact support.");
74
+ } catch (MWP_Security_Exception_NonceAlreadyUsed $e) {
75
+ $this->context->wpDie("The automatic login token was already used. Please try again, or, if this keeps happening, contact support.");
76
+ }
77
+
78
+ if ($secureKey = $this->configuration->getSecureKey()) {
79
+ // Legacy support, to be removed.
80
+ $verify = (md5($where.$messageId.$secureKey) === $signature);
81
+ } else {
82
+ $verify = $this->signer->verify($where.$messageId, $signature, $this->configuration->getPublicKey());
83
+ }
84
+
85
+ if (!$verify) {
86
+ $this->context->wpDie("The automatic login token is invalid. Please check if this website is properly connected with your dashboard, or, if this keeps happening, contact support.");
87
+ }
88
+
89
+ $user = $this->context->getUserByUsername($username);
90
+
91
+ if ($user === null) {
92
+ $this->context->wpDie(sprintf("User <strong>%s</strong> could not be found.", htmlspecialchars($username)));
93
+ }
94
+
95
+ $this->context->setCurrentUser($user);
96
+ $this->context->setAuthCookie($user);
97
+
98
+ $currentUri = empty($request->server['REQUEST_URI']) ? '/' : $request->server['REQUEST_URI'];
99
+ $redirectUri = $this->omitUriParameters($currentUri, array('signature', 'username', 'auto_login', 'message_id', 'mwp_goto', 'mwpredirect'));
100
+
101
+ $this->context->setCookie($this->getCookieName(), '1');
102
+
103
+ $event->setResponse(new MWP_Http_RedirectResponse($redirectUri, 302, array(
104
+ 'P3P' => 'CP="CAO PSA OUR"',
105
+ )));
106
+ }
107
+
108
+ private function getCookieName()
109
+ {
110
+ return 'wordpress_'.md5($this->context->getSiteUrl()).'_xframe';
111
+ }
112
+
113
+ public function setXframeHeader(MWP_Event_PublicRequest $event)
114
+ {
115
+ if (!isset($_COOKIE[$this->getCookieName()])) {
116
+ return;
117
+ }
118
+
119
+ $this->context->removeAction('admin_init', 'send_frame_options_header');
120
+ $this->context->removeAction('login_init', 'send_frame_options_header');
121
+
122
+ if (!headers_sent()) {
123
+ header('P3P: CP="CAO PSA OUR"');
124
+ }
125
+ }
126
+
127
+ private function omitUriParameters($uri, array $omitParameters)
128
+ {
129
+ if (strpos($uri, '?') === false) {
130
+ return $uri;
131
+ }
132
+
133
+ $rawQuery = parse_url($uri, PHP_URL_QUERY);
134
+ parse_str($rawQuery, $query);
135
+
136
+ foreach ($omitParameters as $key) {
137
+ if (array_key_exists($key, $query)) {
138
+ unset($query[$key]);
139
+ }
140
+ }
141
+
142
+ // Replace everything from "?" onwards with "?key=value" or an empty string.
143
+ return substr($uri, 0, strpos($uri, '?')).(count($query) ? '?'.http_build_query($query) : '');
144
+ }
145
+ }
src/MWP/EventListener/PublicRequest/BrandContactSupport.php ADDED
@@ -0,0 +1,222 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_EventListener_PublicRequest_BrandContactSupport implements Symfony_EventDispatcher_EventSubscriberInterface
12
+ {
13
+
14
+ private $context;
15
+
16
+ private $brand;
17
+
18
+ /**
19
+ * Required WordPress capability to access the page.
20
+ *
21
+ * @var string
22
+ */
23
+ private $capability = 'read';
24
+
25
+ public function __construct(MWP_WordPress_Context $context, MWP_Worker_Brand $brand)
26
+ {
27
+ $this->context = $context;
28
+ $this->brand = $brand;
29
+ }
30
+
31
+ public static function getSubscribedEvents()
32
+ {
33
+ return array(
34
+ MWP_Event_Events::PUBLIC_REQUEST => 'enableContactSupport',
35
+ );
36
+ }
37
+
38
+ public function enableContactSupport(MWP_Event_PublicRequest $event)
39
+ {
40
+ if (!$this->brand->isActive()) {
41
+ return;
42
+ }
43
+
44
+ if ($this->brand->getContactType() === MWP_Worker_Brand::CONTACT_TYPE_NONE) {
45
+ return;
46
+ }
47
+
48
+ $this->context->addAction('admin_init', array($this, 'enqueueSupportScripts'));
49
+ $this->context->addAction('admin_init', array($this, 'enqueueSupportStyles'));
50
+ $this->context->addAction('admin_menu', array($this, 'addSupportLink'));
51
+ $this->context->addAction('admin_head', array($this, 'printSupportScript'));
52
+ $this->context->addAction('admin_footer', array($this, 'printSupportDialog'));
53
+
54
+ $this->handleSupportForm($event);
55
+ }
56
+
57
+ /**
58
+ * @wp_hook admin_init
59
+ */
60
+ public function enqueueSupportScripts()
61
+ {
62
+ $this->context->enqueueScript('jquery');
63
+ $this->context->enqueueScript('jquery-ui-core');
64
+ $this->context->enqueueScript('jquery-ui-dialog');
65
+ }
66
+
67
+ /**
68
+ * @wp_hook admin_init
69
+ */
70
+ public function enqueueSupportStyles()
71
+ {
72
+ $this->context->enqueueStyle('wp-jquery-ui');
73
+ $this->context->enqueueStyle('jquery-style', 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/themes/smoothness/jquery-ui.css');
74
+ }
75
+
76
+ /**
77
+ * @wp_hook admin_menu
78
+ */
79
+ public function addSupportLink()
80
+ {
81
+ $this->context->addMenuPage('Support', 'Support', $this->capability, 'mwp-support');
82
+ }
83
+
84
+ /**
85
+ * @wp_hook admin_head
86
+ */
87
+ public function printSupportScript()
88
+ {
89
+ ob_start()
90
+ ?>
91
+ <script type="text/javascript">
92
+ jQuery(document).ready(function ($) {
93
+ var $dialog = $('#support_dialog');
94
+ var $form = $('#support_form');
95
+ var $messageContainer = $('#support_response_id');
96
+ $form.submit(function (e) {
97
+ e.preventDefault();
98
+ var data = $(this).serialize();
99
+ $.ajax({
100
+ type: "POST",
101
+ url: 'index.php',
102
+ dataType: 'json',
103
+ data: data,
104
+ success: function (data, textStatus, jqXHR) {
105
+ if (data.success) {
106
+ $form.slideUp();
107
+ }
108
+ $messageContainer.html(data.message);
109
+ },
110
+ error: function (jqXHR, textStatus, errorThrown) {
111
+ $messageContainer.html('An error occurred, please try again.');
112
+ }
113
+ });
114
+ });
115
+ $('.toplevel_page_mwp-support').click(function (e) {
116
+ e.preventDefault();
117
+ $form.show();
118
+ $messageContainer.empty();
119
+ $dialog.dialog({
120
+ draggable: false,
121
+ resizable: false,
122
+ modal: true,
123
+ width: '530px',
124
+ height: 'auto',
125
+ title: 'Contact Support',
126
+ dialogClass: 'mwp-support-dialog',
127
+ close: function () {
128
+ $('#support_response_id').html('');
129
+ $(this).dialog("destroy");
130
+ }
131
+ });
132
+ });
133
+ });
134
+ </script>
135
+ <?php
136
+
137
+ $content = ob_get_clean();
138
+ $this->context->output($content);
139
+ }
140
+
141
+ /**
142
+ * @wp_hook admin_footer
143
+ */
144
+ public function printSupportDialog()
145
+ {
146
+ $contactText = $this->brand->getTextForClient();
147
+ $contactType = $this->brand->getContactType();
148
+
149
+ ob_start();
150
+ ?>
151
+ <div id="support_dialog" style="display: none;">
152
+ <?php if (!empty($contactText)): ?>
153
+ <div>
154
+ <p><?php echo $contactText ?></p>
155
+ </div>
156
+ <?php endif ?>
157
+ <?php if ($contactType == MWP_Worker_Brand::CONTACT_TYPE_TEXT_PLUS_FORM): ?>
158
+ <div style="margin: 19px 0 0;">
159
+ <form method="post" id="support_form">
160
+ <textarea name="support_mwp_message" id="support_message" style="width:500px;height:150px;display:block;margin-left:auto;margin-right:auto;"></textarea>
161
+ <button type="submit" class="button-primary" style="display:block;margin:20px auto 7px auto;border:1px solid #a1a1a1;padding:0 31px;border-radius: 4px;">Send</button>
162
+ </form>
163
+ <div id="support_response_id" style="margin-top: 14px"></div>
164
+ <style scoped="scoped">
165
+ .mwp-support-dialog.ui-dialog {
166
+ z-index: 300002;
167
+ }
168
+ </style>
169
+ </div>
170
+ <?php endif ?>
171
+ </div>
172
+ <?php
173
+
174
+ $content = ob_get_clean();
175
+ $this->context->output($content);
176
+ }
177
+
178
+ private function handleSupportForm(MWP_Event_PublicRequest $event)
179
+ {
180
+ $request = $event->getRequest();
181
+ if (!isset($request->request['support_mwp_message']) || !is_scalar($request->request['support_mwp_message'])) {
182
+ return;
183
+ }
184
+
185
+ if ($this->context->isGranted($this->capability)) {
186
+ return;
187
+ }
188
+
189
+ if ($this->brand->getContactType() !== MWP_Worker_Brand::CONTACT_TYPE_TEXT_PLUS_FORM) {
190
+ return;
191
+ }
192
+
193
+ $message = (string) $request->request['support_mwp_message'];
194
+ $currentUser = $this->context->getCurrentUser();
195
+
196
+ if (empty($message)) {
197
+ // Message is set, but it's empty.
198
+ $event->setResponse(new MWP_Http_JsonResponse(array(
199
+ 'success' => false,
200
+ 'message' => "Please enter a message.",
201
+ )));
202
+ $event->stopPropagation();
203
+
204
+ return;
205
+ }
206
+ $subject = 'New ticket for site '.$this->context->getHomeUrl();
207
+ $message = <<<EOF
208
+ Hi,
209
+ User {$currentUser->user_login} has sent a support ticket:
210
+
211
+ {$message}
212
+ EOF;
213
+ $emailSent = $this->context->sendMail($this->brand->getAdminEmail(), $subject, $message);
214
+ $status = array(
215
+ 'success' => $emailSent,
216
+ 'message' => $emailSent ? "Message successfully sent." : "Unable to send email. Please try again.",
217
+ );
218
+
219
+ $event->setResponse(new MWP_Http_JsonResponse($status));
220
+ $event->stopPropagation();
221
+ }
222
+ }
src/MWP/EventListener/PublicRequest/DisableEditor.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_EventListener_PublicRequest_DisableEditor implements Symfony_EventDispatcher_EventSubscriberInterface
12
+ {
13
+
14
+ private $context;
15
+
16
+ private $brand;
17
+
18
+ function __construct(MWP_WordPress_Context $context, MWP_Worker_Brand $brand)
19
+ {
20
+ $this->context = $context;
21
+ $this->brand = $brand;
22
+ }
23
+
24
+ public static function getSubscribedEvents()
25
+ {
26
+ return array(
27
+ MWP_Event_Events::PUBLIC_REQUEST => 'onPublicRequest',
28
+ );
29
+ }
30
+
31
+ /**
32
+ * Remove editor from plugins and themes.
33
+ */
34
+ public function onPublicRequest()
35
+ {
36
+ if (!$this->brand->isActive() || !$this->brand->isDisallowEdit()) {
37
+ return;
38
+ }
39
+
40
+ $this->context->setConstant('DISALLOW_FILE_EDIT', true, false);
41
+ $this->context->setConstant('DISALLOW_FILE_MODS', true, false);
42
+ }
43
+ }
src/MWP/EventListener/PublicRequest/SetHitCounter.php ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_EventListener_PublicRequest_SetHitCounter implements Symfony_EventDispatcher_EventSubscriberInterface
12
+ {
13
+ const METHOD_BLACKLIST = false;
14
+
15
+ const METHOD_WHITELIST = true;
16
+
17
+ private $context;
18
+
19
+ /**
20
+ * @var MWP_Extension_HitCounter
21
+ */
22
+ private $hitCounter;
23
+
24
+ /**
25
+ * If set to METHOD_BLACKLIST, all non-master requests except those that match at least one
26
+ * rule from the list.
27
+ * If set to METHOD_WHITELIST, only requests that match at least one rule from the list will
28
+ * be counted.
29
+ *
30
+ * @var bool
31
+ */
32
+ private $userAgentMatchingMethod;
33
+
34
+ /**
35
+ * @var array
36
+ */
37
+ private $blacklistedIps = array();
38
+
39
+ private $userAgentList = array();
40
+
41
+ /**
42
+ * @param MWP_WordPress_Context $context
43
+ * @param MWP_Extension_HitCounter $hitCounter
44
+ * @param string[] $blacklistedIps
45
+ * @param string[] $userAgentList
46
+ * @param bool $userAgentMatchingMethod
47
+ */
48
+ public function __construct(MWP_WordPress_Context $context, MWP_Extension_HitCounter $hitCounter, array $blacklistedIps = array(), array $userAgentList = array(), $userAgentMatchingMethod = self::METHOD_BLACKLIST)
49
+ {
50
+ $this->context = $context;
51
+ $this->hitCounter = $hitCounter;
52
+ $this->blacklistedIps = $blacklistedIps;
53
+ $this->userAgentList = $userAgentList;
54
+ $this->userAgentMatchingMethod = $userAgentMatchingMethod;
55
+ }
56
+
57
+ /**
58
+ * @return array
59
+ */
60
+ public static function getSubscribedEvents()
61
+ {
62
+ return array(
63
+ MWP_Event_Events::PUBLIC_REQUEST => array('onPublicRequest', -300),
64
+ );
65
+ }
66
+
67
+ public function onPublicRequest(MWP_Event_PublicRequest $event)
68
+ {
69
+ $request = $event->getRequest();
70
+
71
+ if ($this->context->isInAdminPanel()) {
72
+ return;
73
+ }
74
+
75
+ if ($this->isBlacklisted($request)) {
76
+ return;
77
+ }
78
+
79
+ $this->hitCounter->increment();
80
+ }
81
+
82
+ /**
83
+ * @param MWP_Worker_Request $request
84
+ *
85
+ * @return bool
86
+ */
87
+ protected function isBlacklisted(MWP_Worker_Request $request)
88
+ {
89
+ $userAgent = $request->getHeader('USER_AGENT');
90
+ $ip = $request->getHeader('REMOTE_ADDR');
91
+
92
+ foreach ($this->blacklistedIps as $ipRegex) {
93
+ if (preg_match($ipRegex, $ip)) {
94
+ return true;
95
+ }
96
+ }
97
+
98
+ foreach ($this->userAgentList as $uaRegex) {
99
+ if (preg_match($uaRegex, $userAgent)) {
100
+ return !$this->userAgentMatchingMethod;
101
+ }
102
+ }
103
+
104
+ return $this->userAgentMatchingMethod;
105
+ }
106
+ }
src/MWP/EventListener/PublicRequest/SetPluginInfo.php ADDED
@@ -0,0 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_EventListener_PublicRequest_SetPluginInfo implements Symfony_EventDispatcher_EventSubscriberInterface
12
+ {
13
+
14
+ private $context;
15
+
16
+ private $brand;
17
+
18
+ private $slug = 'worker/init.php';
19
+
20
+ private $loaderName = '0-worker.php';
21
+
22
+ function __construct(MWP_WordPress_Context $context, MWP_Worker_Brand $brand)
23
+ {
24
+ $this->context = $context;
25
+ $this->brand = $brand;
26
+ }
27
+
28
+ public static function getSubscribedEvents()
29
+ {
30
+ return array(
31
+ MWP_Event_Events::PUBLIC_REQUEST => 'onPublicRequest',
32
+ );
33
+ }
34
+
35
+ public function onPublicRequest()
36
+ {
37
+ $this->context->addFilter('all_plugins', array($this, 'pluginInfoFilter'));
38
+ $this->context->addFilter('all_plugins', array($this, 'pluginListFilter'));
39
+ // This is a horrible hack, but it will allow us to hide a MU plugin in rebranded installations.
40
+ $this->context->addFilter('show_advanced_plugins', array($this, 'muPluginListFilter'), 10, 2);
41
+ $this->context->addFilter('plugin_row_meta', array($this, 'hidePluginDetails'), 10, 2);
42
+ }
43
+
44
+ /**
45
+ * @wp_filter all_plugins
46
+ */
47
+ public function pluginInfoFilter($plugins)
48
+ {
49
+ if (!isset($plugins[$this->slug])) {
50
+ return $plugins;
51
+ }
52
+
53
+ if (!$this->brand->isActive()) {
54
+ return $plugins;
55
+ }
56
+
57
+ if (!$this->brand->getName() && !$this->brand->getDescription() && !$this->brand->getAuthor() && !$this->brand->getAuthorUrl()) {
58
+ return $plugins;
59
+ }
60
+
61
+ $plugins[$this->slug]['Name'] = $this->brand->getName();
62
+ $plugins[$this->slug]['Title'] = $this->brand->getName();
63
+ $plugins[$this->slug]['Description'] = $this->brand->getDescription();
64
+ $plugins[$this->slug]['AuthorURI'] = $this->brand->getAuthorUrl();
65
+ $plugins[$this->slug]['Author'] = $this->brand->getAuthor();
66
+ $plugins[$this->slug]['AuthorName'] = $this->brand->getAuthor();
67
+ $plugins[$this->slug]['PluginURI'] = '';
68
+
69
+ return $plugins;
70
+ }
71
+
72
+ /**
73
+ * @wp_filter all_plugins
74
+ */
75
+ public function pluginListFilter($plugins)
76
+ {
77
+ if (!isset($plugins[$this->slug])) {
78
+ return $plugins;
79
+ }
80
+
81
+ if (!$this->brand->isActive()) {
82
+ return $plugins;
83
+ }
84
+
85
+ if ($this->brand->isHide()) {
86
+ unset($plugins[$this->slug]);
87
+ }
88
+
89
+ return $plugins;
90
+ }
91
+
92
+ /**
93
+ * @wp_filter show_advanced_plugins
94
+ */
95
+ public function muPluginListFilter($previousValue, $type)
96
+ {
97
+ if (!$this->brand->isActive() || !$this->brand->isHide()) {
98
+ return $previousValue;
99
+ }
100
+
101
+ // Drop-in's are filtered after MU plugins.
102
+ if ($type !== 'dropins') {
103
+ return $previousValue;
104
+ }
105
+
106
+ if (!$this->context->hasContextValue('plugins')) {
107
+ return $previousValue;
108
+ }
109
+
110
+ $plugins = &$this->context->getContextValue('plugins');
111
+
112
+ if (!isset($plugins['mustuse'][$this->loaderName])) {
113
+ return $previousValue;
114
+ }
115
+
116
+ unset($plugins['mustuse'][$this->loaderName]);
117
+
118
+ return $previousValue;
119
+ }
120
+
121
+ /**
122
+ * @wp_filter
123
+ */
124
+ public function hidePluginDetails($meta, $slug)
125
+ {
126
+ if ($slug !== $this->slug) {
127
+ return $meta;
128
+ }
129
+
130
+ if (!$this->brand->getName() && !$this->brand->getDescription() && !$this->brand->getAuthor() && !$this->brand->getAuthorUrl()) {
131
+ return $meta;
132
+ }
133
+
134
+ foreach ($meta as $metaKey => $metaValue) {
135
+ if (strpos($metaValue, sprintf('>%s<', $this->context->translate('View details'))) === false) {
136
+ continue;
137
+ }
138
+ unset($meta[$metaKey]);
139
+ break;
140
+ }
141
+
142
+ return $meta;
143
+ }
144
+ }
src/MWP/Extension/HitCounter.php ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Extension_HitCounter
12
+ {
13
+
14
+ private $context;
15
+
16
+ /**
17
+ * @var int
18
+ */
19
+ private $numberOfDays;
20
+
21
+ const OPTION_NAME = 'user_hit_count';
22
+
23
+ /**
24
+ * @param MWP_WordPress_Context $context
25
+ * @param int $numberOfDays Number of days to keep the log.
26
+ */
27
+ public function __construct(MWP_WordPress_Context $context, $numberOfDays = 1)
28
+ {
29
+ $this->context = $context;
30
+ $this->numberOfDays = $numberOfDays;
31
+ }
32
+
33
+ /**
34
+ * @param int $incrementBy
35
+ * @param DateTime $dateTime
36
+ */
37
+ public function increment($incrementBy = 1, DateTime $dateTime = null)
38
+ {
39
+ if ($dateTime === null) {
40
+ $dateTime = new DateTime('now', new DateTimeZone('UTC'));
41
+ }
42
+ $date = $dateTime->format('Y-m-d');
43
+
44
+ $hitCount = $this->getHitCount();
45
+
46
+ if (!isset($hitCount[$date])) {
47
+ $hitCount[$date] = 0;
48
+
49
+ ksort($hitCount);
50
+
51
+ $logSince = clone $dateTime;
52
+ $logSince->modify(sprintf('-%d day', $this->numberOfDays));
53
+ $logSinceDate = $logSince->format('Y-m-d');
54
+ foreach ($hitCount as $hitDate => $hitTotal) {
55
+ // The old functionality had a bug where keys were invalid dates, hence the date length check.
56
+ if ($hitDate <= $logSinceDate || strlen($hitDate) !== 10) {
57
+ unset($hitCount[$hitDate]);
58
+ }
59
+ }
60
+ }
61
+
62
+ $hitCount[$date] += $incrementBy;
63
+
64
+ $this->context->optionSet(self::OPTION_NAME, $hitCount);
65
+ }
66
+
67
+ /**
68
+ * @return array
69
+ */
70
+ public function getHitCount()
71
+ {
72
+ $hitCount = $this->context->optionGet(self::OPTION_NAME, array());
73
+
74
+ return $hitCount;
75
+ }
76
+ }
src/MWP/Http/JsonResponse.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Http_JsonResponse extends MWP_Http_Response
12
+ {
13
+ public function __construct($content, $headers = array())
14
+ {
15
+ $headers['content-type'] = 'application/json';
16
+ parent::__construct($content, $headers);
17
+ }
18
+
19
+ public function getContentAsString()
20
+ {
21
+ return "\n".json_encode($this->content);
22
+ }
23
+ }
src/MWP/Http/LegacyWorkerResponse.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ /**
12
+ * @deprecated
13
+ */
14
+ class MWP_Http_LegacyWorkerResponse extends MWP_Http_Response
15
+ {
16
+ public function getContentAsString()
17
+ {
18
+ return '<MWPHEADER>'.base64_encode(serialize($this->content)).'<ENDMWPHEADER>';
19
+ }
20
+ }
src/MWP/Http/RedirectResponse.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Http_RedirectResponse extends MWP_Http_Response
12
+ {
13
+ public function __construct($url, $code = 302, array $headers = array())
14
+ {
15
+ $headers['location'] = $url;
16
+ parent::__construct($url, $headers);
17
+ }
18
+
19
+ public function getContentAsString()
20
+ {
21
+ return sprintf('<!DOCTYPE html>
22
+ <html>
23
+ <head>
24
+ <meta charset="UTF-8" />
25
+ <meta http-equiv="refresh" content="1;url=%1$s" />
26
+
27
+ <title>Redirecting to %1$s</title>
28
+ </head>
29
+ <body>
30
+ Redirecting to <a href="%1$s">%1$s</a>.
31
+ </body>
32
+ </html>', htmlspecialchars($this->content, ENT_QUOTES, 'UTF-8'));
33
+ }
34
+ }
src/MWP/Http/Response.php ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Http_Response implements MWP_Http_ResponseInterface
12
+ {
13
+
14
+ protected $content;
15
+
16
+ protected $headers = array();
17
+
18
+ public function __construct($content, $headers = array())
19
+ {
20
+ $this->content = $content;
21
+ $this->headers = array_change_key_case($headers, CASE_LOWER);
22
+ }
23
+
24
+ public function getContentAsString()
25
+ {
26
+ return $this->content;
27
+ }
28
+
29
+ /**
30
+ * @param mixed $content
31
+ *
32
+ * @return mixed
33
+ */
34
+ public function setContent($content)
35
+ {
36
+ $this->content = $content;
37
+ }
38
+
39
+ /**
40
+ * @return mixed
41
+ */
42
+ public function getContent()
43
+ {
44
+ return $this->content;
45
+ }
46
+
47
+ /**
48
+ * @return void
49
+ */
50
+ public function send()
51
+ {
52
+ $this->sendHeaders();
53
+ print $this->getContentAsString();
54
+ }
55
+
56
+ protected function sendHeaders()
57
+ {
58
+ if (headers_sent()) {
59
+ return;
60
+ }
61
+
62
+ foreach ($this->headers as $headerName => $headerValue) {
63
+ header(sprintf('%s: %s', $headerName, $headerValue), true);
64
+ }
65
+ }
66
+ }
src/MWP/Http/ResponseInterface.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ interface MWP_Http_ResponseInterface
12
+ {
13
+ /**
14
+ * @param mixed $content
15
+ *
16
+ * @return mixed
17
+ */
18
+ public function setContent($content);
19
+
20
+ /**
21
+ * @return mixed
22
+ */
23
+ public function getContent();
24
+
25
+ /**
26
+ * @return string
27
+ */
28
+ public function getContentAsString();
29
+
30
+ /**
31
+ * @return void
32
+ */
33
+ public function send();
34
+ }
src/MWP/Monolog/Handler/JsonMessageHandler.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Monolog_Handler_JsonMessageHandler extends Monolog_Handler_AbstractHandler
12
+ {
13
+
14
+ private $implicitFlushEnabled = false;
15
+
16
+ const PAD_CHARACTER = ' ';
17
+
18
+ private $padLength;
19
+
20
+ /**
21
+ * @param int $padLength
22
+ */
23
+ public function setPadLength($padLength)
24
+ {
25
+ $this->padLength = $padLength;
26
+ }
27
+
28
+ public function handle(array $record)
29
+ {
30
+ if (!$this->implicitFlushEnabled) {
31
+ ob_implicit_flush(1);
32
+ $this->implicitFlushEnabled = true;
33
+ }
34
+
35
+ /** @var DateTime $date */
36
+ $date = $record['datetime'];
37
+ $message = array(
38
+ 'level' => $record['level_name'],
39
+ 'time' => $date->format('Y-m-d H:i:s'),
40
+ 'message' => $record['message'],
41
+ 'context' => $record['context'],
42
+ 'extra' => $record['extra'],
43
+ );
44
+
45
+ @ob_start();
46
+ echo "\n", str_pad(json_encode($message), $this->padLength, self::PAD_CHARACTER), "\n";
47
+ @ob_end_flush();
48
+ }
49
+ }
src/MWP/Monolog/Processor/ExceptionProcessor.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
 
3
  class MWP_Monolog_Processor_ExceptionProcessor implements Monolog_Processor_ProcessorInterface
4
  {
1
  <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
 
11
  class MWP_Monolog_Processor_ExceptionProcessor implements Monolog_Processor_ProcessorInterface
12
  {
src/MWP/Monolog/Processor/ProcessProcessor.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
 
3
  class MWP_Monolog_Processor_ProcessProcessor implements Monolog_Processor_ProcessorInterface
4
  {
1
  <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
 
11
  class MWP_Monolog_Processor_ProcessProcessor implements Monolog_Processor_ProcessorInterface
12
  {
src/MWP/Monolog/Processor/TimeUsageProcessor.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
 
3
  class MWP_Monolog_Processor_TimeUsageProcessor implements Monolog_Processor_ProcessorInterface
4
  {
1
  <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
 
11
  class MWP_Monolog_Processor_TimeUsageProcessor implements Monolog_Processor_ProcessorInterface
12
  {
src/MWP/Parser/DefinitionTokenizer.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
 
3
  /**
4
  * A simple parser able to extract 'define' calls with their first constant string, from a PHP source code.
1
  <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
 
11
  /**
12
  * A simple parser able to extract 'define' calls with their first constant string, from a PHP source code.
src/MWP/Progress/Abstract.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
 
3
  abstract class MWP_Progress_Abstract implements MWP_Progress_CurlCallbackInterface
4
  {
1
  <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
 
11
  abstract class MWP_Progress_Abstract implements MWP_Progress_CurlCallbackInterface
12
  {
src/MWP/Progress/CurlCallbackInterface.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
 
3
  interface MWP_Progress_CurlCallbackInterface
4
  {
1
  <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
 
11
  interface MWP_Progress_CurlCallbackInterface
12
  {
src/MWP/Progress/Download.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
 
3
  class MWP_Progress_Download extends MWP_Progress_Abstract
4
  {
1
  <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
 
11
  class MWP_Progress_Download extends MWP_Progress_Abstract
12
  {
src/MWP/Progress/Upload.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
 
3
  class MWP_Progress_Upload extends MWP_Progress_Abstract
4
  {
1
  <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
 
11
  class MWP_Progress_Upload extends MWP_Progress_Abstract
12
  {
src/MWP/Security/Exception/NonceAlreadyUsed.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Security_Exception_NonceAlreadyUsed extends Exception
12
+ {
13
+
14
+ }
src/MWP/Security/Exception/NonceExpired.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Security_Exception_NonceExpired extends Exception
12
+ {
13
+
14
+ }
src/MWP/Security/Exception/NonceFormatInvalid.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Security_Exception_NonceFormatInvalid extends Exception
12
+ {
13
+
14
+ }
src/MWP/Security/HashNonce.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
 
3
  /**
4
  * Created by miljenko.rebernisak@prelovac.com
1
  <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
 
11
  /**
12
  * Created by miljenko.rebernisak@prelovac.com
src/MWP/Security/NonceInterface.php CHANGED
@@ -1,4 +1,12 @@
1
  <?php
 
 
 
 
 
 
 
 
2
 
3
  /**
4
  * Created by miljenko.rebernisak@prelovac.com
1
  <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
 
11
  /**
12
  * Created by miljenko.rebernisak@prelovac.com
src/MWP/Security/NonceManager.php ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Security_NonceManager
12
+ {
13
+
14
+ private $context;
15
+
16
+ private $nonceValidFor;
17
+
18
+ private $nonceBlacklistedFor;
19
+
20
+ /**
21
+ * @param MWP_WordPress_Context $context
22
+ * @param int $nonceValidFor How long (in seconds) is the nonce valid since its issue time.
23
+ * @param int $nonceBlacklistedFor How long (in seconds) to keep used nonce in storage.
24
+ */
25
+ public function __construct(MWP_WordPress_Context $context, $nonceValidFor = 43200, $nonceBlacklistedFor = 86400)
26
+ {
27
+ if ($nonceBlacklistedFor < $nonceValidFor) {
28
+ throw new LogicException('Nonce blacklist time must be higher than nonce lifetime.');
29
+ }
30
+
31
+ $this->context = $context;
32
+ $this->nonceValidFor = $nonceValidFor;
33
+ $this->nonceBlacklistedFor = $nonceBlacklistedFor;
34
+ }
35
+
36
+ /**
37
+ * @param string $nonce
38
+ *
39
+ * @throws MWP_Security_Exception_NonceFormatInvalid
40
+ * @throws MWP_Security_Exception_NonceExpired
41
+ * @throws MWP_Security_Exception_NonceAlreadyUsed
42
+ */
43
+ public function useNonce($nonce)
44
+ {
45
+ $parts = explode('_', $nonce);
46
+
47
+ if (count($parts) !== 2) {
48
+ throw new MWP_Security_Exception_NonceFormatInvalid();
49
+ }
50
+
51
+ list($nonceValue, $issuedAt) = $parts;
52
+ $issuedAt = (int) $issuedAt;
53
+
54
+ if (!$nonceValue || !$issuedAt) {
55
+ throw new MWP_Security_Exception_NonceFormatInvalid();
56
+ }
57
+
58
+ if ($issuedAt + $this->nonceValidFor < time()) {
59
+ throw new MWP_Security_Exception_NonceExpired();
60
+ }
61
+
62
+ // There was a bug where the generated nonce was 42 characters long.
63
+ $transientKey = substr('n_'.$nonceValue, 0, 40);
64
+ $nonceUsed = $this->context->transientGet($transientKey);
65
+
66
+ if ($nonceUsed !== false) {
67
+ throw new MWP_Security_Exception_NonceAlreadyUsed();
68
+ }
69
+
70
+ $this->context->transientSet($transientKey, $issuedAt, $this->nonceBlacklistedFor);
71
+ }
72
+ }
src/MWP/ServiceContainer/Abstract.php ADDED
@@ -0,0 +1,490 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ abstract class MWP_ServiceContainer_Abstract implements MWP_ServiceContainer_Interface
12
+ {
13
+
14
+ private $parameters;
15
+
16
+ private $wordPressContext;
17
+
18
+ private $eventDispatcher;
19
+
20
+ private $actionMapper;
21
+
22
+ private $requestStack;
23
+
24
+ private $userQuery;
25
+
26
+ private $postQuery;
27
+
28
+ private $commentQuery;
29
+
30
+ private $pluginProvider;
31
+
32
+ private $themeProvider;
33
+
34
+ private $workerBrand;
35
+
36
+ private $autoUpdateManager;
37
+
38
+ private $updateManager;
39
+
40
+ private $signer;
41
+
42
+ private $crypter;
43
+
44
+ private $nonceManager;
45
+
46
+ private $configuration;
47
+
48
+ private $logger;
49
+
50
+ private $responseCallback;
51
+
52
+ private $errorHandler;
53
+
54
+ private $executableFinder;
55
+
56
+ private $hitCounter;
57
+
58
+ private $jsonMessageHandler;
59
+
60
+ private $errorLogger;
61
+
62
+ public function __construct(array $parameters = array())
63
+ {
64
+ $this->parameters = $parameters;
65
+
66
+ $this->parameters += array(
67
+ // This plugin's main file absolute path.
68
+ 'worker_realpath' => null,
69
+ // This plugin's "basename", ie. 'worker/init.php'.
70
+ 'worker_basename' => null,
71
+ // Always use PhpSecLib, even if the PHP extension 'openssl' is loaded.
72
+ 'prefer_phpseclib' => false,
73
+ // Log file to use for all worker logs.
74
+ 'log_file' => null,
75
+ // GrayLog2 server to use for all worker logs.
76
+ 'gelf_server' => null,
77
+ 'gelf_port' => null,
78
+ // Capture errors in master response.
79
+ 'log_errors' => false,
80
+ // Pad length used for progress message flushing.
81
+ 'message_pad_length' => 16384,
82
+ // Minimum log level for streamed messages.
83
+ 'message_minimum_level' => Monolog_Logger::INFO,
84
+ // Memory size (in kilobytes) to allocate for fatal error handling when the request is authenticated.
85
+ 'fatal_error_reserved_memory_size' => 1024,
86
+ 'hit_counter_blacklisted_ips' => array(
87
+ // Uptime monitoring robot.
88
+ '/^74\.86\.158\.106$/',
89
+ '/^74\.86\.158\.107$/',
90
+ '/^74\.86\.158\.109$/',
91
+ '/^74\.86\.158\.110$/',
92
+ '/^74\.86\.158\.108$/',
93
+ '/^46\.137\.190\.132$/',
94
+ '/^122\.248\.234\.23$/',
95
+ '/^188\.226\.183\.141$/',
96
+ '/^178\.62\.52\.237$/',
97
+ '/^54\.79\.28\.129$/',
98
+ '/^54\.94\.142\.218$/',
99
+ ),
100
+ 'hit_counter_blacklisted_user_agents' => array(
101
+ '/bot/',
102
+ '/crawl/',
103
+ '/feed/',
104
+ '/java\//',
105
+ '/spider/',
106
+ '/curl/',
107
+ '/libwww/',
108
+ '/alexa/',
109
+ '/altavista/',
110
+ '/aolserver/',
111
+ '/appie/',
112
+ '/Ask Jeeves/',
113
+ '/baidu/',
114
+ '/Bing/',
115
+ '/borg/',
116
+ '/BrowserMob/',
117
+ '/ccooter/',
118
+ '/dataparksearch/',
119
+ '/Download Demon/',
120
+ '/echoping/',
121
+ '/FAST/',
122
+ '/findlinks/',
123
+ '/Firefly/',
124
+ '/froogle/',
125
+ '/GomezA/',
126
+ '/Google/',
127
+ '/grub-client/',
128
+ '/htdig/',
129
+ '/http%20client/',
130
+ '/HttpMonitor/',
131
+ '/ia_archiver/',
132
+ '/InfoSeek/',
133
+ '/inktomi/',
134
+ '/larbin/',
135
+ '/looksmart/',
136
+ '/Microsoft URL Control/',
137
+ '/Minimo/',
138
+ '/mogimogi/',
139
+ '/NationalDirectory/',
140
+ '/netcraftsurvey/',
141
+ '/nuhk/',
142
+ '/oegp/',
143
+ '/panopta/',
144
+ '/rabaz/',
145
+ '/Read%20Later/',
146
+ '/Scooter/',
147
+ '/scrubby/',
148
+ '/SearchExpress/',
149
+ '/searchsight/',
150
+ '/semanticdiscovery/',
151
+ '/Slurp/',
152
+ '/snappy/',
153
+ '/Spade/',
154
+ '/TechnoratiSnoop/',
155
+ '/TECNOSEEK/',
156
+ '/teoma/',
157
+ '/twiceler/',
158
+ '/URL2PNG/',
159
+ '/vortex/',
160
+ '/WebBug/',
161
+ '/www\.galaxy\.com/',
162
+ '/yahoo/',
163
+ '/yandex/',
164
+ '/zao/',
165
+ '/zeal/',
166
+ '/ZooShot/',
167
+ '/ZyBorg/',
168
+ ),
169
+ );
170
+ }
171
+
172
+ public function getParameter($name)
173
+ {
174
+ if (!array_key_exists($name, $this->parameters)) {
175
+ throw new InvalidArgumentException(sprintf('The parameter named "%s" does not exist.', $name));
176
+ }
177
+
178
+ return $this->parameters[$name];
179
+ }
180
+
181
+ public function getWordPressContext()
182
+ {
183
+ if ($this->wordPressContext === null) {
184
+ $this->wordPressContext = $this->createWordPressContext();
185
+ }
186
+
187
+ return $this->wordPressContext;
188
+ }
189
+
190
+ /**
191
+ * @return MWP_WordPress_Context
192
+ */
193
+ protected abstract function createWordPressContext();
194
+
195
+ public function getEventDispatcher()
196
+ {
197
+ if ($this->eventDispatcher === null) {
198
+ $this->eventDispatcher = $this->createEventDispatcher();
199
+ }
200
+
201
+ return $this->eventDispatcher;
202
+ }
203
+
204
+ /**
205
+ * @return Symfony_EventDispatcher_EventDispatcherInterface
206
+ */
207
+ protected abstract function createEventDispatcher();
208
+
209
+ public function getRequestStack()
210
+ {
211
+ if ($this->requestStack === null) {
212
+ $this->requestStack = $this->createRequestStack();
213
+ }
214
+
215
+ return $this->requestStack;
216
+ }
217
+
218
+ protected abstract function createRequestStack();
219
+
220
+ public function getActionRegistry()
221
+ {
222
+ if ($this->actionMapper === null) {
223
+ $this->actionMapper = $this->createActionRegistry();
224
+ }
225
+
226
+ return $this->actionMapper;
227
+ }
228
+
229
+ /**
230
+ * @return MWP_Action_Registry
231
+ */
232
+ protected abstract function createActionRegistry();
233
+
234
+ public function getUserQuery()
235
+ {
236
+ if ($this->userQuery === null) {
237
+ $this->userQuery = $this->createUserQuery();
238
+ }
239
+
240
+ return $this->userQuery;
241
+ }
242
+
243
+ /**
244
+ * @return MWP_WordPress_Query_User
245
+ */
246
+ protected abstract function createUserQuery();
247
+
248
+ public function getPostQuery()
249
+ {
250
+ if ($this->postQuery === null) {
251
+ $this->postQuery = $this->createPostQuery();
252
+ }
253
+
254
+ return $this->postQuery;
255
+ }
256
+
257
+ protected abstract function createPostQuery();
258
+
259
+ public function getCommentQuery()
260
+ {
261
+ if ($this->commentQuery === null) {
262
+ $this->commentQuery = $this->createCommentQuery();
263
+ }
264
+
265
+ return $this->commentQuery;
266
+ }
267
+
268
+ protected abstract function createCommentQuery();
269
+
270
+ /**
271
+ * @return MWP_WordPress_Provider_Plugin
272
+ */
273
+ public function getPluginProvider()
274
+ {
275
+ if ($this->pluginProvider === null) {
276
+ $this->pluginProvider = $this->createPluginProvider();
277
+ }
278
+
279
+ return $this->pluginProvider;
280
+ }
281
+
282
+ protected abstract function createPluginProvider();
283
+
284
+ /**
285
+ * @return MWP_WordPress_Provider_Theme
286
+ */
287
+ public function getThemeProvider()
288
+ {
289
+ if ($this->themeProvider === null) {
290
+ $this->themeProvider = $this->createThemeProvider();
291
+ }
292
+
293
+ return $this->themeProvider;
294
+ }
295
+
296
+ protected abstract function createThemeProvider();
297
+
298
+ /**
299
+ * @return MWP_Worker_Brand
300
+ */
301
+ public function getBrand()
302
+ {
303
+ if ($this->workerBrand === null) {
304
+ $this->workerBrand = $this->createWorkerBrand();
305
+ }
306
+
307
+ return $this->workerBrand;
308
+ }
309
+
310
+ protected abstract function createWorkerBrand();
311
+
312
+ public function getAutoUpdateManager()
313
+ {
314
+ if ($this->autoUpdateManager === null) {
315
+ $this->autoUpdateManager = $this->createAutoUpdateManager();
316
+ }
317
+
318
+ return $this->autoUpdateManager;
319
+ }
320
+
321
+ protected abstract function createAutoUpdateManager();
322
+
323
+ public function getUpdateManager()
324
+ {
325
+ if ($this->updateManager === null) {
326
+ $this->updateManager = $this->createUpdateManager();
327
+ }
328
+
329
+ return $this->updateManager;
330
+ }
331
+
332
+ /**
333
+ * @return MWP_Updater_UpdateManager
334
+ */
335
+ protected abstract function createUpdateManager();
336
+
337
+ public function getSigner()
338
+ {
339
+ if ($this->signer === null) {
340
+ $this->signer = $this->createSigner();
341
+ }
342
+
343
+ return $this->signer;
344
+ }
345
+
346
+ /**
347
+ * @return MWP_Signer_Interface
348
+ */
349
+ protected abstract function createSigner();
350
+
351
+ public function getCrypter()
352
+ {
353
+ if ($this->crypter === null) {
354
+ $this->crypter = $this->createCrypter();
355
+ }
356
+
357
+ return $this->crypter;
358
+ }
359
+
360
+ /**
361
+ * @return MWP_Crypter_Interface
362
+ */
363
+ protected abstract function createCrypter();
364
+
365
+ public function getNonceManager()
366
+ {
367
+ if ($this->nonceManager === null) {
368
+ $this->nonceManager = $this->createNonceManager();
369
+ }
370
+
371
+ return $this->nonceManager;
372
+ }
373
+
374
+ /**
375
+ * @return MWP_Security_NonceManager
376
+ */
377
+ protected abstract function createNonceManager();
378
+
379
+ public function getConfiguration()
380
+ {
381
+ if ($this->configuration === null) {
382
+ $this->configuration = $this->createConfiguration();
383
+ }
384
+
385
+ return $this->configuration;
386
+ }
387
+
388
+ /**
389
+ * @return MWP_Worker_Configuration
390
+ */
391
+ protected abstract function createConfiguration();
392
+
393
+ public function getLogger()
394
+ {
395
+ if ($this->logger === null) {
396
+ $this->logger = $this->createLogger();
397
+ }
398
+
399
+ return $this->logger;
400
+ }
401
+
402
+ /**
403
+ * @return Monolog_Logger
404
+ */
405
+ protected abstract function createLogger();
406
+
407
+ /**
408
+ * @return MWP_Worker_ResponseCallback
409
+ */
410
+ public function getResponseCallback()
411
+ {
412
+ if ($this->responseCallback === null) {
413
+ $this->responseCallback = $this->createResponseCallback();
414
+ }
415
+
416
+ return $this->responseCallback;
417
+ }
418
+
419
+ protected abstract function createResponseCallback();
420
+
421
+ public function getErrorHandler()
422
+ {
423
+ if ($this->errorHandler === null) {
424
+ $this->errorHandler = $this->createErrorHandler();
425
+ }
426
+
427
+ return $this->errorHandler;
428
+ }
429
+
430
+ /**
431
+ * @return Monolog_ErrorHandler
432
+ */
433
+ protected abstract function createErrorHandler();
434
+
435
+ public function getExecutableFinder()
436
+ {
437
+ if ($this->executableFinder === null) {
438
+ $this->executableFinder = $this->createExecutableFinder();
439
+ }
440
+
441
+ return $this->executableFinder;
442
+ }
443
+
444
+ /**
445
+ * @return Symfony_Process_ExecutableFinder
446
+ */
447
+ protected abstract function createExecutableFinder();
448
+
449
+ public function getHitCounter()
450
+ {
451
+ if ($this->hitCounter === null) {
452
+ $this->hitCounter = $this->createHitCounter();
453
+ }
454
+
455
+ return $this->hitCounter;
456
+ }
457
+
458
+ /**
459
+ * @return MWP_Extension_HitCounter
460
+ */
461
+ protected abstract function createHitCounter();
462
+
463
+ public function getJsonMessageHandler()
464
+ {
465
+ if ($this->jsonMessageHandler === null) {
466
+ $this->jsonMessageHandler = $this->createJsonMessageHandler();
467
+ }
468
+
469
+ return $this->jsonMessageHandler;
470
+ }
471
+
472
+ /**
473
+ * @return MWP_Monolog_Handler_JsonMessageHandler
474
+ */
475
+ protected abstract function createJsonMessageHandler();
476
+
477
+ public function getErrorLogger()
478
+ {
479
+ if ($this->errorLogger === null) {
480
+ $this->errorLogger = $this->createErrorLogger();
481
+ }
482
+
483
+ return $this->errorLogger;
484
+ }
485
+
486
+ /**
487
+ * @return Monolog_Logger
488
+ */
489
+ protected abstract function createErrorLogger();
490
+ }
src/MWP/ServiceContainer/ContainerAwareInterface.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ interface MWP_ServiceContainer_ContainerAwareInterface
12
+ {
13
+ public function setContainer(MWP_ServiceContainer_Interface $container);
14
+ }
src/MWP/ServiceContainer/Interface.php ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ interface MWP_ServiceContainer_Interface
12
+ {
13
+ /**
14
+ * @param array $parameters
15
+ */
16
+ public function __construct(array $parameters = array());
17
+
18
+ /**
19
+ * @param string $name
20
+ *
21
+ * @return mixed
22
+ *
23
+ * @throws InvalidArgumentException If the parameter does not exist.
24
+ */
25
+ public function getParameter($name);
26
+
27
+ /**
28
+ * @return MWP_WordPress_Context
29
+ */
30
+ public function getWordPressContext();
31
+
32
+ /**
33
+ * @return Symfony_EventDispatcher_EventDispatcherInterface
34
+ */
35
+ public function getEventDispatcher();
36
+
37
+ /**
38
+ * @return MWP_Worker_RequestStack
39
+ */
40
+ public function getRequestStack();
41
+
42
+ /**
43
+ * @return MWP_Action_Registry
44
+ */
45
+ public function getActionRegistry();
46
+
47
+ /**
48
+ * @return MWP_WordPress_Query_User
49
+ */
50
+ public function getUserQuery();
51
+
52
+ /**
53
+ * @return MWP_WordPress_Query_Post
54
+ */
55
+ public function getPostQuery();
56
+
57
+ /**
58
+ * @return MWP_WordPress_Query_Comment
59
+ */
60
+ public function getCommentQuery();
61
+
62
+ /**
63
+ * @return MWP_WordPress_Provider_Plugin
64
+ */
65
+ public function getPluginProvider();
66
+
67
+ /**
68
+ * @return MWP_WordPress_Provider_Theme
69
+ */
70
+ public function getThemeProvider();
71
+
72
+ /**
73
+ * @return MWP_Worker_Brand
74
+ */
75
+ public function getBrand();
76
+
77
+ /**
78
+ * @return MWP_Updater_AutoUpdateManager
79
+ */
80
+ public function getAutoUpdateManager();
81
+
82
+ /**
83
+ * @return MWP_Updater_UpdateManager
84
+ */
85
+ public function getUpdateManager();
86
+
87
+ /**
88
+ * @return MWP_Signer_Interface
89
+ */
90
+ public function getSigner();
91
+
92
+ /**
93
+ * @return MWP_Crypter_Interface
94
+ */
95
+ public function getCrypter();
96
+
97
+ /**
98
+ * @return MWP_Security_NonceManager
99
+ */
100
+ public function getNonceManager();
101
+
102
+ /**
103
+ * @return MWP_Worker_Configuration
104
+ */
105
+ public function getConfiguration();
106
+
107
+ /**
108
+ * @return Monolog_Logger
109
+ */
110
+ public function getLogger();
111
+
112
+ /**
113
+ * @return MWP_Worker_ResponseCallback
114
+ */
115
+ public function getResponseCallback();
116
+
117
+ /**
118
+ * @return Monolog_ErrorHandler
119
+ */
120
+ public function getErrorHandler();
121
+
122
+ /**
123
+ * @return Symfony_Process_ExecutableFinder
124
+ */
125
+ public function getExecutableFinder();
126
+
127
+ /**
128
+ * @return MWP_Extension_HitCounter
129
+ */
130
+ public function getHitCounter();
131
+
132
+ /**
133
+ * @return MWP_Monolog_Handler_JsonMessageHandler
134
+ */
135
+ public function getJsonMessageHandler();
136
+
137
+ /**
138
+ * @return Monolog_Logger
139
+ */
140
+ public function getErrorLogger();
141
+ }
src/MWP/ServiceContainer/Production.php ADDED
@@ -0,0 +1,293 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_ServiceContainer_Production extends MWP_ServiceContainer_Abstract
12
+ {
13
+ /**
14
+ * @return MWP_WordPress_Context
15
+ */
16
+ protected function createWordPressContext()
17
+ {
18
+ return new MWP_WordPress_Context();
19
+ }
20
+
21
+ /**
22
+ * @return Symfony_EventDispatcher_EventDispatcherInterface
23
+ */
24
+ protected function createEventDispatcher()
25
+ {
26
+ $dispatcher = new Symfony_EventDispatcher_EventDispatcher();
27
+
28
+ $dispatcher->addSubscriber(new MWP_EventListener_PublicRequest_BrandContactSupport($this->getWordPressContext(), $this->getBrand()));
29
+ $dispatcher->addSubscriber(new MWP_EventListener_PublicRequest_DisableEditor($this->getWordPressContext(), $this->getBrand()));
30
+ $dispatcher->addSubscriber(new MWP_EventListener_PublicRequest_SetPluginInfo($this->getWordPressContext(), $this->getBrand()));
31
+ $dispatcher->addSubscriber(new MWP_EventListener_PublicRequest_SetHitCounter($this->getWordPressContext(), $this->getHitCounter(), $this->getParameter('hit_counter_blacklisted_ips'), $this->getParameter('hit_counter_blacklisted_user_agents')));
32
+ $dispatcher->addSubscriber(new MWP_EventListener_PublicRequest_AutomaticLogin($this->getWordPressContext(), $this->getNonceManager(), $this->getSigner(), $this->getConfiguration()));
33
+
34
+ $dispatcher->addSubscriber(new MWP_EventListener_MasterRequest_VerifyConnectionInfo($this->getWordPressContext(), $this->getSigner()));
35
+ $dispatcher->addSubscriber(new MWP_EventListener_MasterRequest_VerifyNonce($this->getNonceManager()));
36
+ $dispatcher->addSubscriber(new MWP_EventListener_MasterRequest_SetCurrentUser($this->getWordPressContext()));
37
+ $dispatcher->addSubscriber(new MWP_EventListener_MasterRequest_AuthenticateRequest($this->getConfiguration(), $this->getSigner()));
38
+ $dispatcher->addSubscriber(new MWP_EventListener_MasterRequest_SetErrorHandler($this->getErrorLogger(), $this->getErrorHandler(), $this->getRequestStack(), $this->getResponseCallback(), $this, $this->getParameter('log_errors'), $this->getParameter('fatal_error_reserved_memory_size')));
39
+ $dispatcher->addSubscriber(new MWP_EventListener_MasterRequest_AttachJsonMessageHandler($this->getLogger(), $this->getJsonMessageHandler()));
40
+ $dispatcher->addSubscriber(new MWP_EventListener_MasterRequest_RemoveUsernameParam());
41
+ $dispatcher->addSubscriber(new MWP_EventListener_MasterRequest_AuthenticateLegacyRequest($this->getConfiguration()));
42
+
43
+ $dispatcher->addSubscriber(new MWP_EventListener_ActionRequest_SetSettings($this->getWordPressContext()));
44
+
45
+ $dispatcher->addSubscriber(new MWP_EventListener_ActionException_SetExceptionData());
46
+
47
+ $dispatcher->addSubscriber(new MWP_EventListener_ActionResponse_SetActionData());
48
+ $dispatcher->addSubscriber(new MWP_EventListener_ActionResponse_SetLegacyWebsiteConnectionData($this->getWordPressContext()));
49
+ $dispatcher->addSubscriber(new MWP_EventListener_ActionResponse_ChainState($this));
50
+ $dispatcher->addSubscriber(new MWP_EventListener_ActionResponse_SetLegacyPhpExecutionData());
51
+
52
+ $dispatcher->addSubscriber(new MWP_EventListener_EncodeMasterResponse());
53
+
54
+ return $dispatcher;
55
+ }
56
+
57
+ protected function createRequestStack()
58
+ {
59
+ return new MWP_Worker_RequestStack();
60
+ }
61
+
62
+ /**
63
+ * @return MWP_Action_Registry
64
+ */
65
+ protected function createActionRegistry()
66
+ {
67
+ $mapper = new MWP_Action_Registry();
68
+
69
+ $mapper->addDefinition('do_upgrade', new MWP_Action_Definition('mmb_do_upgrade', array('hook_name' => 'setup_theme')));
70
+ $mapper->addDefinition('get_stats', new MWP_Action_Definition('mmb_stats_get', array('hook_name' => 'setup_theme')));
71
+ $mapper->addDefinition('remove_site', new MWP_Action_Definition('mmb_remove_site'));
72
+ $mapper->addDefinition('backup_clone', new MWP_Action_Definition('mmb_backup_now'));
73
+ $mapper->addDefinition('restore', new MWP_Action_Definition('mmb_restore_now'));
74
+ $mapper->addDefinition('create_post', new MWP_Action_Definition('mmb_post_create', array('hook_name' => 'setup_theme')));
75
+ $mapper->addDefinition('update_worker', new MWP_Action_Definition('mmb_update_worker_plugin'));
76
+ $mapper->addDefinition('change_post_status', new MWP_Action_Definition('mmb_change_post_status', array('hook_name' => 'setup_theme')));
77
+ $mapper->addDefinition('install_addon', new MWP_Action_Definition('mmb_install_addon', array('hook_name' => 'setup_theme')));
78
+ $mapper->addDefinition('get_comments', new MWP_Action_Definition('mmb_get_comments', array('hook_name' => 'setup_theme')));
79
+ $mapper->addDefinition('bulk_action_comments', new MWP_Action_Definition('mmb_bulk_action_comments', array('hook_name' => 'setup_theme')));
80
+ $mapper->addDefinition('replyto_comment', new MWP_Action_Definition('mmb_reply_comment', array('hook_name' => 'setup_theme')));
81
+ $mapper->addDefinition('add_user', new MWP_Action_Definition('mmb_add_user', array('hook_name' => 'setup_theme')));
82
+ $mapper->addDefinition('scheduled_backup', new MWP_Action_Definition('mmb_scheduled_backup'));
83
+ $mapper->addDefinition('run_task', new MWP_Action_Definition('mmb_run_task_now'));
84
+ $mapper->addDefinition('execute_php_code', new MWP_Action_Definition('mmb_execute_php_code'));
85
+ $mapper->addDefinition('delete_backup', new MWP_Action_Definition('mmm_delete_backup'));
86
+ $mapper->addDefinition('remote_backup_now', new MWP_Action_Definition('mmb_remote_backup_now'));
87
+ $mapper->addDefinition('get_users', new MWP_Action_Definition('mmb_get_users', array('hook_name' => 'setup_theme')));
88
+ $mapper->addDefinition('edit_users', new MWP_Action_Definition('mmb_edit_users', array('hook_name' => 'setup_theme')));
89
+ $mapper->addDefinition('get_posts', new MWP_Action_Definition('mmb_get_posts', array('hook_name' => 'setup_theme')));
90
+ $mapper->addDefinition('delete_post', new MWP_Action_Definition('mmb_delete_post', array('hook_name' => 'setup_theme')));
91
+ $mapper->addDefinition('delete_posts', new MWP_Action_Definition('mmb_delete_posts', array('hook_name' => 'setup_theme')));
92
+ $mapper->addDefinition('get_pages', new MWP_Action_Definition('mmb_get_pages', array('hook_name' => 'setup_theme')));
93
+ $mapper->addDefinition('delete_page', new MWP_Action_Definition('mmb_delete_page', array('hook_name' => 'setup_theme')));
94
+ $mapper->addDefinition('get_plugins_themes', new MWP_Action_Definition('mmb_get_plugins_themes', array('hook_name' => 'setup_theme')));
95
+ $mapper->addDefinition('edit_plugins_themes', new MWP_Action_Definition('mmb_edit_plugins_themes', array('hook_name' => 'setup_theme')));
96
+ $mapper->addDefinition('worker_brand', new MWP_Action_Definition('mmb_worker_brand'));
97
+ $mapper->addDefinition('maintenance', new MWP_Action_Definition('mmb_maintenance_mode'));
98
+ $mapper->addDefinition('get_autoupdate_plugins_themes', new MWP_Action_Definition('mmb_get_autoupdate_plugins_themes'));
99
+ $mapper->addDefinition('edit_autoupdate_plugins_themes', new MWP_Action_Definition('mmb_edit_autoupdate_plugins_themes'));
100
+ $mapper->addDefinition('ping_backup', new MWP_Action_Definition('mwp_ping_backup'));
101
+ $mapper->addDefinition('cleanup_delete', new MWP_Action_Definition('cleanup_delete_worker'));
102
+ $mapper->addDefinition('backup_req', new MWP_Action_Definition('mmb_get_backup_req'));
103
+ $mapper->addDefinition('change_comment_status', new MWP_Action_Definition('mmb_change_comment_status', array('hook_name' => null)));
104
+ $mapper->addDefinition('get_state', new MWP_Action_Definition(array('MWP_Action_GetState', 'execute')));
105
+ $mapper->addDefinition('add_site', new MWP_Action_Definition(array('MWP_Action_ConnectWebsite', 'execute')));
106
+
107
+ return $mapper;
108
+ }
109
+
110
+ protected function createUserQuery()
111
+ {
112
+ return new MWP_WordPress_Query_User($this->getWordPressContext());
113
+ }
114
+
115
+ protected function createPostQuery()
116
+ {
117
+ return new MWP_WordPress_Query_Post($this->getWordPressContext());
118
+ }
119
+
120
+ protected function createCommentQuery()
121
+ {
122
+ return new MWP_WordPress_Query_Comment($this->getWordPressContext());
123
+ }
124
+
125
+ protected function createPluginProvider()
126
+ {
127
+ return new MWP_WordPress_Provider_Plugin($this->getWordPressContext());
128
+ }
129
+
130
+ protected function createThemeProvider()
131
+ {
132
+ return new MWP_WordPress_Provider_Theme($this->getWordPressContext());
133
+ }
134
+
135
+ protected function createWorkerBrand()
136
+ {
137
+ return new MWP_Worker_Brand($this->getWordPressContext());
138
+ }
139
+
140
+ protected function createAutoUpdateManager()
141
+ {
142
+ return new MWP_Updater_AutoUpdateManager($this->getWordPressContext());
143
+ }
144
+
145
+ /**
146
+ * @return MWP_Updater_UpdateManager
147
+ */
148
+ protected function createUpdateManager()
149
+ {
150
+ return new MWP_Updater_UpdateManager($this->getWordPressContext());
151
+ }
152
+
153
+ /**
154
+ * @return MWP_Signer_Interface
155
+ */
156
+ public function createSigner()
157
+ {
158
+ if ($this->getParameter('prefer_phpseclib')) {
159
+ return MWP_Signer_Factory::createPhpSecLibSigner();
160
+ }
161
+
162
+ return MWP_Signer_Factory::createSigner();
163
+ }
164
+
165
+ /**
166
+ * @return MWP_Crypter_Interface
167
+ */
168
+ public function createCrypter()
169
+ {
170
+ if ($this->getParameter('prefer_phpseclib')) {
171
+ return MWP_Crypter_Factory::createPhpSecLibCrypter();
172
+ }
173
+
174
+ return MWP_Crypter_Factory::createCrypter();
175
+ }
176
+
177
+ /**
178
+ * @return MWP_Security_NonceManager
179
+ */
180
+ protected function createNonceManager()
181
+ {
182
+ return new MWP_Security_NonceManager($this->getWordPressContext());
183
+ }
184
+
185
+ /**
186
+ * @return MWP_Worker_Configuration
187
+ */
188
+ protected function createConfiguration()
189
+ {
190
+ return new MWP_Worker_Configuration($this->getWordPressContext());
191
+ }
192
+
193
+ protected function createLogger()
194
+ {
195
+ $handlers = array();
196
+
197
+ if ($this->getParameter('log_file')) {
198
+ $fileHandler = new Monolog_Handler_StreamHandler(fopen(dirname(__FILE__).'/../../../'.$this->getParameter('log_file'), 'a'));
199
+ $fileHandler->setFormatter(new Monolog_Formatter_HtmlFormatter());
200
+ $handlers[] = $fileHandler;
201
+ }
202
+
203
+ if ($this->getParameter('gelf_server')) {
204
+ $publisher = new Gelf_Publisher($this->getParameter('gelf_server'), $this->getParameter('gelf_port') ? $this->getParameter('gelf_port') : Gelf_Publisher::GRAYLOG2_DEFAULT_PORT);
205
+ $handlers[] = new Monolog_Handler_LegacyGelfHandler($publisher);
206
+ }
207
+
208
+ $processors = array();
209
+ if (count($handlers) > 0) {
210
+ // We do have some loggers set up.
211
+ $processors += array(
212
+ array(new Monolog_Processor_MemoryUsageProcessor(), 'callback'),
213
+ array(new Monolog_Processor_MemoryPeakUsageProcessor(), 'callback'),
214
+ array(new Monolog_Processor_IntrospectionProcessor(), 'callback'),
215
+ array(new Monolog_Processor_PsrLogMessageProcessor(), 'callback'),
216
+ array(new Monolog_Processor_UidProcessor(), 'callback'),
217
+ array(new Monolog_Processor_WebProcessor(), 'callback'),
218
+ array(new MWP_Monolog_Processor_TimeUsageProcessor(), 'callback'),
219
+ array(new MWP_Monolog_Processor_ExceptionProcessor(), 'callback'),
220
+ array(new MWP_Monolog_Processor_ProcessProcessor(), 'callback'),
221
+ );
222
+ }
223
+
224
+ $logger = new Monolog_Logger('worker', $handlers, $processors);
225
+
226
+ return $logger;
227
+ }
228
+
229
+ protected function createResponseCallback()
230
+ {
231
+ return new MWP_Worker_ResponseCallback();
232
+ }
233
+
234
+ protected function createErrorHandler()
235
+ {
236
+ return new Monolog_ErrorHandler($this->getErrorLogger());
237
+ }
238
+
239
+ /**
240
+ * @return Symfony_Process_ExecutableFinder
241
+ */
242
+ protected function createExecutableFinder()
243
+ {
244
+ $finder = new Symfony_Process_ExecutableFinder();
245
+
246
+ $db = $this->getWordPressContext()->getDb();
247
+
248
+ if (is_callable(array($db, 'get_var'))) {
249
+ $basePath = rtrim($db->get_var('select @@basedir'), '/\\');
250
+ if ($basePath) {
251
+ $basePath .= '/bin';
252
+ $finder->addExtraDir($basePath);
253
+ }
254
+ }
255
+
256
+ return $finder;
257
+ }
258
+
259
+ /**
260
+ * @return MWP_Extension_HitCounter
261
+ */
262
+ protected function createHitCounter()
263
+ {
264
+ $counter = new MWP_Extension_HitCounter($this->getWordPressContext(), 14);
265
+
266
+ return $counter;
267
+ }
268
+
269
+ /**
270
+ * @return MWP_Monolog_Handler_JsonMessageHandler
271
+ */
272
+ protected function createJsonMessageHandler()
273
+ {
274
+ $handler = new MWP_Monolog_Handler_JsonMessageHandler($this->getParameter('message_minimum_level'));
275
+ $handler->setPadLength($this->getParameter('message_pad_length'));
276
+
277
+ return $handler;
278
+ }
279
+
280
+ /**
281
+ * @return Monolog_Logger
282
+ */
283
+ protected function createErrorLogger()
284
+ {
285
+ $processors = array(
286
+ array(new Monolog_Processor_PsrLogMessageProcessor(), 'callback'),
287
+ );
288
+
289
+ $logger = new Monolog_Logger('worker.error', array(), $processors);
290
+
291
+ return $logger;
292
+ }
293
+ }
src/MWP/Signer/Factory.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Signer_Factory
12
+ {
13
+ public static function createSigner()
14
+ {
15
+ if (extension_loaded('openssl')) {
16
+ return self::createOpenSslSigner();
17
+ }
18
+
19
+ return self::createPhpSecLibSigner();
20
+ }
21
+
22
+ public static function createOpenSslSigner()
23
+ {
24
+ return new MWP_Signer_OpenSslSigner();
25
+ }
26
+
27
+ public static function createPhpSecLibSigner()
28
+ {
29
+ return new MWP_Signer_PhpSecLibSigner();
30
+ }
31
+ }
src/MWP/Signer/Interface.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ interface MWP_Signer_Interface
12
+ {
13
+ /**
14
+ * @param string $data
15
+ * @param string $signature
16
+ * @param string $publicKey
17
+ *
18
+ * @return bool
19
+ */
20
+ public function verify($data, $signature, $publicKey);
21
+ }
src/MWP/Signer/OpenSslSigner.php ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Signer_OpenSslSigner implements MWP_Signer_Interface
12
+ {
13
+ public function sign($data, $publicKey)
14
+ {
15
+ $success = @openssl_sign($data, $signature, $publicKey);
16
+
17
+ if ($success === false) {
18
+ $error = $errorRow = '';
19
+ $lastError = error_get_last();
20
+
21
+ while (($errorRow = openssl_error_string()) !== false) {
22
+ $error = $errorRow."\n".$error;
23
+ }
24
+
25
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::OPENSSL_SIGN_ERROR, "There was an error while trying to use OpenSSL to sign a message.", array(
26
+ 'openSslError' => $error,
27
+ 'error' => isset($lastError['message']) ? $lastError['message'] : null,
28
+ ));
29
+ }
30
+
31
+ return $signature;
32
+ }
33
+
34
+ public function verify($data, $signature, $publicKey)
35
+ {
36
+ $verify = @openssl_verify($data, $signature, $publicKey);
37
+
38
+ if ($verify === -1) {
39
+ $error = $errorRow = '';
40
+ $lastError = error_get_last();
41
+
42
+ while (($errorRow = openssl_error_string()) !== false) {
43
+ $error = $errorRow."\n".$error;
44
+ }
45
+
46
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::OPENSSL_VERIFY_ERROR, "There was an error while trying to use OpenSSL to verify a message.", array(
47
+ 'openSslError' => $error,
48
+ 'error' => isset($lastError['message']) ? $lastError['message'] : null,
49
+ ));
50
+ }
51
+
52
+ return (bool) $verify;
53
+ }
54
+ }
src/MWP/Signer/PhpSecLibSigner.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Signer_PhpSecLibSigner implements MWP_Signer_Interface
12
+ {
13
+
14
+ public function verify($data, $signature, $publicKey)
15
+ {
16
+ $this->requireLibrary();
17
+
18
+ $rsa = new Crypt_RSA();
19
+ $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
20
+ $rsa->loadKey($publicKey);
21
+ $errorCatcher = new MWP_Debug_ErrorCatcher();
22
+ $errorCatcher->register();
23
+ $verify = $rsa->verify($data, $signature);
24
+ $errorMessage = $errorCatcher->yieldErrorMessage(true);
25
+
26
+ if ($errorMessage !== null && $errorMessage !== 'Signature representative out of range') {
27
+ throw new MWP_Worker_Exception(MWP_Worker_Exception::PHPSECLIB_VERIFY_ERROR);
28
+ }
29
+
30
+ return $verify;
31
+ }
32
+
33
+ private function requireLibrary()
34
+ {
35
+ require_once dirname(__FILE__).'/../../PHPSecLib/Crypt/RSA.php';
36
+ }
37
+ }
src/MWP/Updater/AutoUpdateManager.php ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Updater_AutoUpdateManager
12
+ {
13
+
14
+ private $context;
15
+
16
+ private $pluginList;
17
+
18
+ private $themeList;
19
+
20
+ public function __construct(MWP_WordPress_Context $context)
21
+ {
22
+ $this->context = $context;
23
+ }
24
+
25
+ /**
26
+ * @param string $pluginSlug Ie. 'worker/init.php';
27
+ *
28
+ * @return bool
29
+ */
30
+ public function isEnabledForPlugin($pluginSlug)
31
+ {
32
+ return in_array($pluginSlug, $this->getPluginList());
33
+ }
34
+
35
+ /**
36
+ * @param string $themeName Ie. 'Twenty Fourteen'.
37
+ *
38
+ * @return bool
39
+ */
40
+ public function isEnabledForTheme($themeName)
41
+ {
42
+ return in_array($themeName, $this->getThemeList());
43
+ }
44
+
45
+ private function getPluginList()
46
+ {
47
+ if ($this->pluginList === null) {
48
+ $this->pluginList = $this->context->optionGet('mwp_active_autoupdate_plugins', array(), null, false);
49
+ }
50
+
51
+ return $this->pluginList;
52
+ }
53
+
54
+ private function getThemeList()
55
+ {
56
+ if ($this->themeList === null) {
57
+ $this->themeList = $this->context->optionGet('mwp_active_autoupdate_themes', array(), null, false);
58
+ }
59
+
60
+ return $this->themeList;
61
+ }
62
+ }
src/MWP/Updater/CoreUpdate.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Updater_CoreUpdate
12
+ {
13
+
14
+ public $locale;
15
+
16
+ public $version;
17
+
18
+ public $type;
19
+
20
+ public $phpVersion;
21
+
22
+ public $mysqlVersion;
23
+
24
+ }
src/MWP/Updater/PluginUpdate.php ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Updater_PluginUpdate
12
+ {
13
+
14
+ /**
15
+ * Numeric value, but let's play it safe.
16
+ *
17
+ * @var string
18
+ */
19
+ public $id;
20
+
21
+ /**
22
+ * @var string
23
+ */
24
+ public $slug;
25
+
26
+ /**
27
+ * @var string
28
+ */
29
+ public $basename;
30
+
31
+ /**
32
+ * @var string
33
+ */
34
+ public $version;
35
+
36
+ /**
37
+ * @var string
38
+ */
39
+ public $url;
40
+
41
+ /**
42
+ * @var string
43
+ */
44
+ public $package;
45
+ }
src/MWP/Updater/ThemeUpdate.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Updater_ThemeUpdate
12
+ {
13
+
14
+ /**
15
+ * @var string
16
+ */
17
+ public $slug;
18
+
19
+ /**
20
+ * @var string
21
+ */
22
+ public $version;
23
+
24
+ /**
25
+ * @var string
26
+ */
27
+ public $url;
28
+
29
+ /**
30
+ * @var string
31
+ */
32
+ public $package;
33
+
34
+ }
src/MWP/Updater/UpdateManager.php ADDED
@@ -0,0 +1,168 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Updater_UpdateManager
12
+ {
13
+
14
+ private $context;
15
+
16
+ private $coreInfo;
17
+
18
+ private $pluginInfo;
19
+
20
+ private $themeInfo;
21
+
22
+ public function __construct(MWP_WordPress_Context $context)
23
+ {
24
+ $this->context = $context;
25
+ $this->reload();
26
+ }
27
+
28
+ /**
29
+ * @return int|null UNIX timestamp of last update check.
30
+ */
31
+ public function getLastChecked()
32
+ {
33
+ if (empty($this->pluginInfo->last_checked)) {
34
+ return null;
35
+ }
36
+
37
+ return $this->pluginInfo->last_checked;
38
+ }
39
+
40
+ /**
41
+ * @param string $pluginBasename Ie. 'worker/init.php'
42
+ *
43
+ * @return MWP_Updater_PluginUpdate|null
44
+ */
45
+ public function getPluginUpdate($pluginBasename)
46
+ {
47
+ if (empty($this->pluginInfo->response[$pluginBasename])) {
48
+ return null;
49
+ }
50
+
51
+ $info = $this->pluginInfo->response[$pluginBasename];
52
+
53
+ $update = new MWP_Updater_PluginUpdate();
54
+ $update->id = $info->id;
55
+ $update->version = $info->new_version;
56
+ $update->basename = $pluginBasename;
57
+ $update->url = $info->url;
58
+ $update->package = $info->package;
59
+ $update->slug = $info->plugin;
60
+
61
+ return $update;
62
+ }
63
+
64
+ /**
65
+ * @param string $themeSlug Ie. 'twentyeleven'.
66
+ *
67
+ * @return MWP_Updater_ThemeUpdate|null
68
+ */
69
+ public function getThemeUpdate($themeSlug)
70
+ {
71
+ if (empty($this->themeInfo->response[$themeSlug])) {
72
+ return null;
73
+ }
74
+
75
+ $info = $this->themeInfo->response[$themeSlug];
76
+
77
+ $update = new MWP_Updater_ThemeUpdate();
78
+ $update->slug = $info['theme']; // === $themeSlug
79
+ $update->version = $info['new_version'];
80
+ $update->url = $info['url'];
81
+ $update->package = $info['package'];
82
+
83
+ return $update;
84
+ }
85
+
86
+ /**
87
+ * @return MWP_Updater_PluginUpdate[]
88
+ */
89
+ public function getPluginUpdates()
90
+ {
91
+ if (empty($this->pluginInfo->response)) {
92
+ return array();
93
+ }
94
+
95
+ $updates = array();
96
+ foreach (array_keys($this->pluginInfo->response) as $basename) {
97
+ $updates[] = $this->getPluginUpdate($basename);
98
+ }
99
+
100
+ return $updates;
101
+ }
102
+
103
+ /**
104
+ * @return MWP_Updater_ThemeUpdate[]
105
+ */
106
+ public function getThemeUpdates()
107
+ {
108
+ if (empty($this->themeInfo->response)) {
109
+ return array();
110
+ }
111
+
112
+ $updates = array();
113
+ foreach (array_keys($this->themeInfo->response) as $slug) {
114
+ $updates[] = $this->getThemeUpdate($slug);
115
+ }
116
+
117
+ return $updates;
118
+ }
119
+
120
+ /**
121
+ * @return MWP_Updater_CoreUpdate[]
122
+ *
123
+ * @see core_upgrade_preamble
124
+ */
125
+ public function getCoreUpdates()
126
+ {
127
+ if (empty($this->coreInfo->updates)) {
128
+ return array();
129
+ }
130
+
131
+ $firstUpdate = $this->coreInfo->updates[0];
132
+
133
+ if (!isset($firstUpdate->response) || 'latest' === $firstUpdate->response) {
134
+ return array();
135
+ }
136
+
137
+ $locale = $this->context->getLocale();
138
+ $latestUpdate = null;
139
+
140
+ foreach ($this->coreInfo->updates as $update) {
141
+ if ($update->response === 'upgrade' && $update->locale === $locale) {
142
+ $latestUpdate = $update;
143
+ }
144
+ }
145
+
146
+ $updates = array();
147
+
148
+ if ($latestUpdate !== null) {
149
+ $showUpdate = new MWP_Updater_CoreUpdate();
150
+ $showUpdate->locale = $latestUpdate->locale;
151
+ $showUpdate->type = $latestUpdate->response;
152
+ $showUpdate->version = $latestUpdate->version;
153
+ $showUpdate->phpVersion = $latestUpdate->php_version;
154
+ $showUpdate->mysqlVersion = $latestUpdate->mysql_version;
155
+
156
+ $updates[] = $showUpdate;
157
+ }
158
+
159
+ return $updates;
160
+ }
161
+
162
+ private function reload()
163
+ {
164
+ $this->coreInfo = $this->context->transientGet('update_core');
165
+ $this->pluginInfo = $this->context->transientGet('update_plugins');
166
+ $this->themeInfo = $this->context->transientGet('update_themes');
167
+ }
168
+ }
src/MWP/WordPress/Context.php ADDED
@@ -0,0 +1,674 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ /**
12
+ * Proxy class for WordPress' function calls. This is the only class that should be able to use WordPress' internal functions.
13
+ * The rule of thumb is that if a function does not exist since WordPress 3.0.0, it should be defined here.
14
+ */
15
+ class MWP_WordPress_Context
16
+ {
17
+
18
+ private $context;
19
+
20
+ private $constants;
21
+
22
+ /**
23
+ * @param array $globals The context to work with. Defaults to $GLOBALS, using the same global variables as WordPress.
24
+ * @param array $constants The list of constants to use. Defaults to global constants.
25
+ */
26
+ public function __construct(array &$globals = null, array $constants = null)
27
+ {
28
+ if ($globals !== null) {
29
+ $this->context = $globals;
30
+ } else {
31
+ $this->context = &$GLOBALS;
32
+ }
33
+
34
+ if ($constants !== null) {
35
+ $this->constants = $constants;
36
+ }
37
+ }
38
+
39
+ public function set($name, $value)
40
+ {
41
+ $this->context[$name] = $value;
42
+ }
43
+
44
+ public function get($name)
45
+ {
46
+ return isset($this->context[$name]) ? $this->context[$name] : null;
47
+ }
48
+
49
+ /**
50
+ * @return wpdb
51
+ */
52
+ public function getDb()
53
+ {
54
+ return $this->context['wpdb'];
55
+ }
56
+
57
+ /**
58
+ * @return string
59
+ */
60
+ public function getVersion()
61
+ {
62
+ return $this->context['wp_version'];
63
+ }
64
+
65
+ /**
66
+ * @param string $version
67
+ *
68
+ * @return bool
69
+ */
70
+ public function isVersionAtLeast($version)
71
+ {
72
+ if (version_compare($version, $this->getVersion(), '<=')) {
73
+ return true;
74
+ }
75
+
76
+ return false;
77
+ }
78
+
79
+ /**
80
+ * @param string $tag
81
+ * @param Callable $functionToAdd
82
+ * @param int $priority
83
+ * @param int $acceptedArgs
84
+ *
85
+ * @see add_action()
86
+ * @link http://codex.wordpress.org/Function_Reference/add_action
87
+ */
88
+ public function addAction($tag, $functionToAdd, $priority = 10, $acceptedArgs = 1)
89
+ {
90
+ add_action($tag, $functionToAdd, $priority, $acceptedArgs);
91
+ }
92
+
93
+ /**
94
+ * @param string $name
95
+ * @param array $args
96
+ */
97
+ public function doAction($name, array $args = array())
98
+ {
99
+ do_action($name, $args);
100
+ }
101
+
102
+ /**
103
+ * @param string $optionName The option to delete.
104
+ * @param bool $global Whether to delete the option from the whole network. Used for network un-installation.
105
+ *
106
+ * @see delete_site_option()
107
+ * @see delete_option()
108
+ * @link http://codex.wordpress.org/Function_Reference/register_uninstall_hook
109
+ */
110
+ public function optionDelete($optionName, $global = false)
111
+ {
112
+ if ($global && is_multisite()) {
113
+ $db = $this->getDb();
114
+ $blogIDs = $db->get_col("SELECT blog_id FROM $db->blogs");
115
+ $originalBlogID = $this->getCurrentBlogId();
116
+ foreach ($blogIDs as $blogID) {
117
+ switch_to_blog($blogID);
118
+ delete_site_option($optionName);
119
+ }
120
+ switch_to_blog($originalBlogID);
121
+ } else {
122
+ delete_option($optionName);
123
+ }
124
+ }
125
+
126
+ /**
127
+ * @param string $optionName
128
+ * @param mixed $optionValue
129
+ * @param bool $global
130
+ *
131
+ * @see update_site_option()
132
+ * @see update_option()
133
+ * @link
134
+ */
135
+ public function optionSet($optionName, $optionValue, $global = false)
136
+ {
137
+ if ($global && is_multisite()) {
138
+ $db = $this->getDb();
139
+ $blogIDs = $db->get_col("SELECT blog_id FROM $db->blogs");
140
+ $originalBlogID = $this->getCurrentBlogId();
141
+ foreach ($blogIDs as $blogID) {
142
+ switch_to_blog($blogID);
143
+ update_site_option($optionName, $optionValue);
144
+ }
145
+ switch_to_blog($originalBlogID);
146
+ } else {
147
+ update_option($optionName, $optionValue);
148
+ }
149
+ }
150
+
151
+ /**
152
+ * @param string $option Name of option to retrieve.
153
+ * @param mixed $default Optional. Default value to return if the option does not exist.
154
+ * @param int $siteId Site ID to update. Only used in multisite installations.
155
+ * @param bool $useCache Whether to use cache. Multisite only.
156
+ *
157
+ * @return mixed Value set for the option.
158
+ *
159
+ * @see get_option()
160
+ * @link http://codex.wordpress.org/Function_Reference/get_option
161
+ */
162
+ public function optionGet($option, $default = false, $siteId = null, $useCache = true)
163
+ {
164
+ if ($siteId !== null && is_multisite()) {
165
+ return get_site_option($option, $default, $useCache);
166
+ }
167
+
168
+ return get_option($option, $default);
169
+ }
170
+
171
+ /**
172
+ * WordPress' function get_current_blog_id() is not available before version 3.1.0.
173
+ *
174
+ * @return int
175
+ *
176
+ * @see get_current_blog_id()
177
+ */
178
+ public function getCurrentBlogId()
179
+ {
180
+ return abs(intval($this->context['blog_id']));
181
+ }
182
+
183
+ /**
184
+ * @param string $constant
185
+ *
186
+ * @return bool
187
+ */
188
+ public function hasConstant($constant)
189
+ {
190
+ if (is_array($this->constants)) {
191
+ return isset($this->constants[$constant]);
192
+ }
193
+
194
+ return defined($constant);
195
+ }
196
+
197
+ /**
198
+ * @param string $constant
199
+ *
200
+ * @return int|string
201
+ * @throws Exception If the constant does not exist.
202
+ */
203
+ public function getConstant($constant)
204
+ {
205
+ if (!$this->hasConstant($constant)) {
206
+ throw new Exception(sprintf('The constant "%s" is not defined', $constant));
207
+ }
208
+
209
+ if (is_array($this->constants)) {
210
+ return $this->constants[$constant];
211
+ }
212
+
213
+ return constant($constant);
214
+ }
215
+
216
+ public function setConstant($name, $value, $throw = true)
217
+ {
218
+ if ($this->hasConstant($name)) {
219
+ if ($throw) {
220
+ throw new Exception(sprintf('The constant "%s" is already defined', $name));
221
+ }
222
+
223
+ return;
224
+ }
225
+
226
+ if (is_array($this->constants)) {
227
+ $this->constants[$name] = $value;
228
+
229
+ return;
230
+ }
231
+
232
+ define($name, $value);
233
+ }
234
+
235
+ /**
236
+ * @return string
237
+ *
238
+ * @see plugin_basename()
239
+ */
240
+ public function getPluginBasename()
241
+ {
242
+ $dirName = explode('/', plugin_basename(__FILE__), 2);
243
+ $dirName = $dirName[0];
244
+
245
+ return $dirName.'/init.php';
246
+ }
247
+
248
+ public function getPlugins()
249
+ {
250
+ if (!function_exists('get_mu_plugins')) {
251
+ require_once($this->getConstant('ABSPATH').'wp-admin/includes/plugin.php');
252
+ }
253
+
254
+ return get_plugins();
255
+ }
256
+
257
+ public function getMustUsePlugins()
258
+ {
259
+ if (!function_exists('get_mu_plugins')) {
260
+ require_once($this->getConstant('ABSPATH').'wp-admin/includes/plugin.php');
261
+ }
262
+
263
+ return get_mu_plugins();
264
+ }
265
+
266
+ public function isPluginActive($pluginBasename)
267
+ {
268
+ return is_plugin_active($pluginBasename);
269
+ }
270
+
271
+ public function isPluginActiveForNetwork($pluginBasename)
272
+ {
273
+ return is_plugin_active_for_network($pluginBasename);
274
+ }
275
+
276
+ public function getThemes()
277
+ {
278
+ // When the plugin is MU-loaded, the WordPress theme directories are not set.
279
+ if ($this->isMustUse() && empty($this->context['wp_theme_directories'])) {
280
+ // Register the default theme directory root.
281
+ register_theme_directory(get_theme_root());
282
+ }
283
+
284
+ if ($this->isVersionAtLeast('3.4')) {
285
+ return wp_get_themes();
286
+ }
287
+
288
+ return get_themes();
289
+ }
290
+
291
+ public function getStylesheetDirectory()
292
+ {
293
+ return get_stylesheet_directory();
294
+ }
295
+
296
+ /**
297
+ * @param string $key
298
+ * @param mixed $value
299
+ * @param int $expire Expiration time in seconds from now.
300
+ *
301
+ * @return bool
302
+ */
303
+ public function transientSet($key, $value, $expire = 0)
304
+ {
305
+ return set_site_transient($key, $value, $expire);
306
+ }
307
+
308
+ /**
309
+ * @param string $key
310
+ *
311
+ * @return mixed
312
+ */
313
+ public function transientGet($key)
314
+ {
315
+ return get_site_transient($key);
316
+ }
317
+
318
+ /**
319
+ * @param string $key
320
+ *
321
+ * @return bool
322
+ */
323
+ public function transientDelete($key)
324
+ {
325
+ return delete_site_transient($key);
326
+ }
327
+
328
+ private function isMustUse()
329
+ {
330
+ if (empty($this->context['mwp_is_mu'])) {
331
+ return false;
332
+ }
333
+
334
+ return true;
335
+ }
336
+
337
+ /**
338
+ * @param string $tag
339
+ * @param Callable $functionToAdd
340
+ * @param int $priority
341
+ * @param int $acceptedArgs
342
+ */
343
+ public function addFilter($tag, $functionToAdd, $priority = 10, $acceptedArgs = 1)
344
+ {
345
+ add_filter($tag, $functionToAdd, $priority, $acceptedArgs);
346
+ }
347
+
348
+ public function enqueueScript($handle, $src = false, $dependencies = array(), $ver = false, $inFooter = false)
349
+ {
350
+ wp_enqueue_script($handle, $src, $dependencies, $ver, $inFooter);
351
+ }
352
+
353
+ public function enqueueStyle($handle, $src = false, $dependencies = array(), $ver = false, $media = 'all')
354
+ {
355
+ wp_enqueue_style($handle, $src, $dependencies, $ver, $media);
356
+ }
357
+
358
+ public function addMenuPage($pageTitle, $menuTitle, $capability, $slug, $callback = '', $iconUrl = '', $position = null)
359
+ {
360
+ add_menu_page($pageTitle, $menuTitle, $capability, $slug, $callback, $iconUrl, $position);
361
+ }
362
+
363
+ public function translate($text, $domain = 'default')
364
+ {
365
+ return translate($text, $domain);
366
+ }
367
+
368
+ public function output($content)
369
+ {
370
+ print $content;
371
+ }
372
+
373
+ public function getCurrentUser()
374
+ {
375
+ $this->requirePluggable();
376
+ $this->requireCookieConstants();
377
+
378
+ return wp_get_current_user();
379
+ }
380
+
381
+ public function getHomeUrl()
382
+ {
383
+ return get_home_url();
384
+ }
385
+
386
+ public function sendMail($to, $subject, $message, $headers = '', $attachments = array())
387
+ {
388
+ $this->requirePluggable();
389
+
390
+ return wp_mail($to, $subject, $message, $headers, $attachments);
391
+ }
392
+
393
+ public function isInAdminPanel()
394
+ {
395
+ return is_admin();
396
+ }
397
+
398
+ public function isGranted($capability)
399
+ {
400
+ return current_user_can($capability);
401
+ }
402
+
403
+ /**
404
+ * @param string $name Value name.
405
+ *
406
+ * @return mixed Context (global) value. Null if one doesn't exist.
407
+ *
408
+ * @throws Exception If the context value does not exist.
409
+ */
410
+ public function &getContextValue($name)
411
+ {
412
+ if (!$this->hasContextValue($name)) {
413
+ throw new Exception(sprintf('Context value "%s" does not exist', $name));
414
+ }
415
+
416
+ return $this->context[$name];
417
+ }
418
+
419
+ /**
420
+ * @param string $name Value name.
421
+ *
422
+ * @return bool
423
+ */
424
+ public function hasContextValue($name)
425
+ {
426
+ return array_key_exists($name, $this->context);
427
+ }
428
+
429
+ public function getDropInPlugins()
430
+ {
431
+ if (!function_exists('get_dropins')) {
432
+ require_once ABSPATH.'wp-admin/includes/plugin.php';
433
+ }
434
+
435
+ return get_dropins();
436
+ }
437
+
438
+ public function requirePluggable()
439
+ {
440
+ require_once $this->getConstant('ABSPATH').$this->getConstant('WPINC').'/pluggable.php';
441
+ }
442
+
443
+ public function requireCookieConstants()
444
+ {
445
+ wp_cookie_constants();
446
+ }
447
+
448
+ public function requireAdminUserLibrary()
449
+ {
450
+ require_once $this->getConstant('ABSPATH').'wp-admin/includes/user.php';
451
+ }
452
+
453
+ public function getUserRoles()
454
+ {
455
+ $this->requireAdminUserLibrary();
456
+
457
+ return get_editable_roles();
458
+ }
459
+
460
+ /**
461
+ * @param string $username
462
+ *
463
+ * @return WP_User|null
464
+ */
465
+ public function getUserByUsername($username)
466
+ {
467
+ $this->requirePluggable();
468
+
469
+ $user = get_user_by('login', $username);
470
+
471
+ if (!$user) {
472
+ return null;
473
+ }
474
+
475
+ return $user;
476
+ }
477
+
478
+ /**
479
+ * @param $criteria
480
+ *
481
+ * @return WP_User[]
482
+ *
483
+ * @link http://codex.wordpress.org/Function_Reference/get_users
484
+ *
485
+ * Defaults:
486
+ * 'blog_id' => $GLOBALS['blog_id']
487
+ * 'role' => ''
488
+ * 'meta_key' => ''
489
+ * 'meta_value' => ''
490
+ * 'meta_compare' => ''
491
+ * 'meta_query' => array()
492
+ * 'include' => array()
493
+ * 'exclude' => array()
494
+ * 'orderby' => 'login'
495
+ * 'order' => 'ASC'
496
+ * 'offset' => ''
497
+ * 'search' => ''
498
+ * 'number' => ''
499
+ * 'count_total' => false
500
+ * 'fields' => 'all'
501
+ * 'who' => ''
502
+ */
503
+ public function getUsers($criteria)
504
+ {
505
+ return get_users($criteria);
506
+ }
507
+
508
+ public function isPluginEnabled($pluginBasename)
509
+ {
510
+ $plugins = (array) $this->optionGet('active_plugins', array());
511
+
512
+ return in_array($pluginBasename, $plugins);
513
+ }
514
+
515
+ public function setCurrentUser(WP_User $user)
516
+ {
517
+ $this->requirePluggable();
518
+
519
+ if ($this->isPluginEnabled('all-in-one-wp-security-and-firewall/wp-security.php')) {
520
+ update_user_meta($user->ID, 'last_login_time', gmdate('Y-m-d H:i:s'));
521
+ }
522
+
523
+ wp_set_current_user($user->ID);
524
+ }
525
+
526
+ public function setAuthCookie(WP_User $user, $remember = false, $secure = '')
527
+ {
528
+ $this->requireCookieConstants();
529
+
530
+ wp_set_auth_cookie($user->ID, $remember, $secure);
531
+ }
532
+
533
+ public function wpDie($message = '', $title = '', $args = array())
534
+ {
535
+ wp_die($message, $title, $args);
536
+ // This is just a stub, the script will have exit()-ed just before this point.
537
+ exit();
538
+ }
539
+
540
+ /**
541
+ * Returns current site's URL.
542
+ *
543
+ * @return string|void
544
+ */
545
+ public function getSiteUrl()
546
+ {
547
+ return get_bloginfo('wpurl');
548
+ }
549
+
550
+ public function requireWpRewrite()
551
+ {
552
+ if (isset($this->context['wp_rewrite']) && $this->context['wp_rewrite'] instanceof WP_Rewrite) {
553
+ return;
554
+ }
555
+
556
+ $this->context['wp_rewrite'] = new WP_Rewrite();
557
+ }
558
+
559
+ public function requireTaxonomies()
560
+ {
561
+ if (!empty($this->context['wp_taxonomies'])) {
562
+ return;
563
+ }
564
+
565
+ create_initial_taxonomies();
566
+ }
567
+
568
+ public function requirePostTypes()
569
+ {
570
+ if (!empty($this->context['wp_post_types'])) {
571
+ return;
572
+ }
573
+
574
+ create_initial_post_types();
575
+ }
576
+
577
+ public function requireTheme()
578
+ {
579
+ if (!empty($this->context['wp_theme_directories'])) {
580
+ return;
581
+ }
582
+
583
+ register_theme_directory(get_theme_root());
584
+ }
585
+
586
+ public function getLocale()
587
+ {
588
+ return get_locale();
589
+ }
590
+
591
+ public function tryDeserialize($content)
592
+ {
593
+ return maybe_unserialize($content);
594
+ }
595
+
596
+ public function getSiteTitle()
597
+ {
598
+ return get_bloginfo('name');
599
+ }
600
+
601
+ public function getSiteDescription()
602
+ {
603
+ return get_bloginfo('description');
604
+ }
605
+
606
+ /**
607
+ * Always returns main site's url (in multisite installations).
608
+ *
609
+ * @see getSiteUrl
610
+ *
611
+ * @return string|void
612
+ */
613
+ public function getMasterSiteUrl()
614
+ {
615
+ return site_url();
616
+ }
617
+
618
+ public function isMultisite()
619
+ {
620
+ return is_multisite();
621
+ }
622
+
623
+ public function getSiteId()
624
+ {
625
+ return get_current_blog_id();
626
+ }
627
+
628
+ public function getDbName()
629
+ {
630
+ return $this->getConstant('DB_NAME');
631
+ }
632
+
633
+ /**
634
+ * @param int $attachmentId
635
+ * @param string $style
636
+ *
637
+ * @return null
638
+ */
639
+ public function getImageInfo($attachmentId, $style)
640
+ {
641
+ $info = wp_get_attachment_image_src($attachmentId, $style);
642
+
643
+ if (!$info) {
644
+ return null;
645
+ }
646
+
647
+ return array(
648
+ 'url' => $info[0],
649
+ 'width' => $info[1],
650
+ 'height' => $info[2],
651
+ 'original' => !$info[3],
652
+ );
653
+ }
654
+
655
+ public function addImageStyle($name, $width = 0, $height = 0, $crop = false)
656
+ {
657
+ add_image_size($name, $width, $height);
658
+ }
659
+
660
+ public function setCookie($name, $value, $expire = 0)
661
+ {
662
+ setcookie($name, $value, $expire, $this->getConstant('SITECOOKIEPATH'), $this->getConstant('COOKIE_DOMAIN'), $this->isSsl(), true);
663
+ }
664
+
665
+ public function isSsl()
666
+ {
667
+ return is_ssl();
668
+ }
669
+
670
+ public function removeAction($tag, $function, $priority = 10)
671
+ {
672
+ remove_action($tag, $function, $priority);
673
+ }
674
+ }
src/MWP/WordPress/HookProxy.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ /**
12
+ * This component makes it possible to delay calling a specific function with custom arguments.
13
+ * WordPress' add_action will execute the function with its own arguments, and we can't use
14
+ * PHP 5.3's lambda functions; so this is a workaround for it.
15
+ *
16
+ * It's also possible to call a proxy function with the result of the first callback. This is
17
+ * so we can delay calling a function until WordPress is further bootstrapped, but at the same
18
+ * time use its result in another context. Neat.
19
+ */
20
+ class MWP_WordPress_HookProxy
21
+ {
22
+
23
+ private $callback;
24
+
25
+ private $args;
26
+
27
+ /**
28
+ * @param callable $callback Hook callback; function to execute.
29
+ * @param mixed ...$args Arguments that will be passed to $callback
30
+ */
31
+ public function __construct($callback, $args = null)
32
+ {
33
+ $this->callback = $callback;
34
+ $this->args = func_get_args();
35
+ array_shift($this->args);
36
+ }
37
+
38
+ public function hook()
39
+ {
40
+ call_user_func_array($this->callback, $this->args);
41
+ }
42
+
43
+ public function getCallable()
44
+ {
45
+ return array($this, 'hook');
46
+ }
47
+ }
src/MWP/WordPress/Provider/Interface.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ interface MWP_WordPress_Provider_Interface
12
+ {
13
+ public function fetch();
14
+ }
src/MWP/WordPress/Provider/Plugin.php ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_WordPress_Provider_Plugin implements MWP_WordPress_Provider_Interface
12
+ {
13
+
14
+ const STATUS_ACTIVE_NETWORK = 'active-network';
15
+
16
+ const STATUS_ACTIVE = 'active';
17
+
18
+ const STATUS_MUST_USE = 'must-use';
19
+
20
+ const STATUS_INACTIVE = 'inactive';
21
+
22
+ const STATUS_DROP_IN = 'drop-in';
23
+
24
+ private $context;
25
+
26
+ public function __construct(MWP_WordPress_Context $context)
27
+ {
28
+ $this->context = $context;
29
+ }
30
+
31
+ public function fetch()
32
+ {
33
+ $regularPlugins = $this->context->getPlugins();
34
+ $mustUsePlugins = $this->context->getMustUsePlugins();
35
+ $dropInPlugins = $this->context->getDropInPlugins();
36
+ $plugins = array();
37
+
38
+ $pluginInfo = array(
39
+ 'name' => 'Name',
40
+ 'pluginUri' => 'PluginURI',
41
+ 'version' => 'Version',
42
+ 'description' => 'Description',
43
+ 'author' => 'Author',
44
+ 'authorUri' => 'AuthorURI',
45
+ );
46
+
47
+ foreach ($regularPlugins as $basename => $details) {
48
+ $plugin = array(
49
+ // This is the plugin identifier; ie. "worker/init.php".
50
+ 'basename' => $basename,
51
+ // Plugin's own directory name (if it exists), or filename minus ".php" extension Ie. "worker".
52
+ 'slug' => $this->getSlugFromBasename($basename),
53
+ // 'Network' property can have a valid value or 'false' and is always present.
54
+ // It signifies whether the plugin can only be activated network wide.
55
+ 'networkOnly' => $details['Network'],
56
+ );
57
+
58
+ foreach ($pluginInfo as $property => $info) {
59
+ $plugin[$property] = !empty($details[$info]) ? $details[$info] : null;
60
+ }
61
+
62
+ $plugin['status'] = $this->getPluginStatus($basename);
63
+
64
+ $plugins[] = $plugin;
65
+ }
66
+
67
+ foreach ($mustUsePlugins as $basename => $details) {
68
+ $plugin = array(
69
+ 'basename' => $basename,
70
+ 'slug' => $this->getSlugFromBasename($basename),
71
+ );
72
+
73
+ foreach ($pluginInfo as $property => $info) {
74
+ $plugin[$property] = !empty($details[$info]) ? $details[$info] : null;
75
+ }
76
+
77
+ $plugin['status'] = self::STATUS_MUST_USE;
78
+ $plugins[] = $plugin;
79
+ }
80
+
81
+ foreach ($dropInPlugins as $basename => $details) {
82
+ $plugin = array(
83
+ 'basename' => $basename,
84
+ 'type' => self::STATUS_DROP_IN,
85
+ );
86
+
87
+ foreach ($pluginInfo as $property => $info) {
88
+ $plugin[$property] = !empty($details[$info]) ? $details[$info] : null;
89
+ }
90
+
91
+ $plugins[] = $plugin;
92
+ }
93
+
94
+ return $plugins;
95
+ }
96
+
97
+ private function getSlugFromBasename($file)
98
+ {
99
+ if (false === strpos($file, '/')) {
100
+ $slug = basename($file, '.php');
101
+ } else {
102
+ $slug = dirname($file);
103
+ }
104
+
105
+ return $slug;
106
+ }
107
+
108
+ private function getPluginStatus($file)
109
+ {
110
+ if ($this->context->isPluginActiveForNetwork($file)) {
111
+ return self::STATUS_ACTIVE_NETWORK;
112
+ } elseif ($this->context->isPluginActive($file)) {
113
+ return self::STATUS_ACTIVE;
114
+ }
115
+
116
+ return self::STATUS_INACTIVE;
117
+ }
118
+ }
src/MWP/WordPress/Provider/Theme.php ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_WordPress_Provider_Theme implements MWP_WordPress_Provider_Interface
12
+ {
13
+ const STATUS_ACTIVE = 'active';
14
+
15
+ const STATUS_INACTIVE = 'inactive';
16
+
17
+ const STATUS_INHERITED = 'inherited';
18
+
19
+ private $context;
20
+
21
+ public function __construct(MWP_WordPress_Context $context)
22
+ {
23
+ $this->context = $context;
24
+ }
25
+
26
+ public function fetch()
27
+ {
28
+ $rawThemes = $this->context->getThemes();
29
+ $themeMap = array();
30
+ $themes = array();
31
+
32
+ $themeInfo = array(
33
+ 'name' => 'Name',
34
+ // Absolute path to theme directory.
35
+ 'root' => 'Theme Root',
36
+ // Absolute URL to theme directory.
37
+ 'rootUri' => 'Theme Root URI',
38
+
39
+ 'version' => 'Version',
40
+ 'description' => 'Description',
41
+ 'author' => 'Author',
42
+ 'authorUri' => 'Author URI',
43
+ 'status' => 'Status',
44
+ 'parent' => 'Parent Theme',
45
+ );
46
+
47
+ foreach ($rawThemes as $rawTheme) {
48
+ $theme = array(
49
+ // Theme directory, followed by slash and slug, to keep it consistent with plugin info; ie. "twentytwelve/twentytwelve".
50
+ 'basename' => $rawTheme['Template'].'/'.$rawTheme['Stylesheet'],
51
+ // A.k.a. "stylesheet", for some reason. This is the theme identifier; ie. "twentytwelve".
52
+ 'slug' => $rawTheme['Stylesheet'],
53
+ );
54
+
55
+ foreach ($themeInfo as $property => $info) {
56
+ $theme[$property] = !empty($rawTheme[$info]) ? $rawTheme[$info] : null;
57
+ }
58
+
59
+ $themes[] = $theme;
60
+ $themeMap[$theme['name']] = $theme;
61
+ }
62
+
63
+ // Link parents and children.
64
+ foreach ($themes as $theme) {
65
+ if ($theme['parent'] !== null) {
66
+ $theme['parent'] = $themeMap[$theme['parent']];
67
+ $theme['parent']['children'][] = $theme['basename'];
68
+ }
69
+ }
70
+
71
+ $this->markInheritedThemes($themes);
72
+
73
+ return $themes;
74
+ }
75
+
76
+ /**
77
+ * Marks inherited themes as such.
78
+ *
79
+ * @param $themes array[]
80
+ */
81
+ private function markInheritedThemes(&$themes)
82
+ {
83
+ foreach ($themes as $theme) {
84
+ if ($theme['status'] !== self::STATUS_ACTIVE) {
85
+ continue;
86
+ }
87
+ while ($parent = $theme['parent']) {
88
+ $parent->status = self::STATUS_INHERITED;
89
+ }
90
+ }
91
+ }
92
+ }
src/MWP/WordPress/Query/Abstract.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ abstract class MWP_WordPress_Query_Abstract implements MWP_WordPress_Query_Interface
12
+ {
13
+
14
+ protected $context;
15
+
16
+ public function __construct(MWP_WordPress_Context $context)
17
+ {
18
+ $this->context = $context;
19
+ }
20
+
21
+ protected function deserialize(array &$results, array $deserialize = array(), array $tryDeserialize = array())
22
+ {
23
+ if (count($results) == 0 || (count($deserialize) === 0 && count($tryDeserialize) === 0)) {
24
+ return;
25
+ }
26
+
27
+ foreach ($results as &$result) {
28
+ foreach ($deserialize as $field) {
29
+ $result[$field] = unserialize($result[$field]);
30
+ }
31
+ foreach ($tryDeserialize as $tryField) {
32
+ $result[$tryField] = $this->context->tryDeserialize($result[$tryField]);
33
+ }
34
+ }
35
+ }
36
+
37
+ protected function getDb()
38
+ {
39
+ return $this->context->getDb();
40
+ }
41
+ }
src/MWP/WordPress/Query/Comment.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_WordPress_Query_Comment extends MWP_WordPress_Query_Abstract
12
+ {
13
+ public function query(array $options = array())
14
+ {
15
+ $options += array(
16
+ 'query' => null,
17
+ 'prefixName' => '{{prefix}}',
18
+ 'deserialize' => array(),
19
+ 'tryDeserialize' => array(),
20
+ );
21
+
22
+ $query = str_replace($options['prefixName'], $this->getDb()->prefix, $options['query']);
23
+ $comments = $this->getDb()->get_results($query, ARRAY_A);
24
+ $this->deserialize($comments, $options['deserialize'], $options['tryDeserialize']);
25
+
26
+ return $comments;
27
+ }
28
+ }
src/MWP/WordPress/Query/Interface.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ interface MWP_WordPress_Query_Interface
12
+ {
13
+ /**
14
+ * @param array $options
15
+ *
16
+ * @return array Array of results.
17
+ */
18
+ public function query(array $options = array());
19
+ }
src/MWP/WordPress/Query/Post.php ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_WordPress_Query_Post extends MWP_WordPress_Query_Abstract
12
+ {
13
+
14
+ public function query(array $options = array())
15
+ {
16
+ $options += array(
17
+ 'query' => null,
18
+ 'prefixName' => '{{prefix}}',
19
+ 'deserialize' => array(),
20
+ 'tryDeserialize' => array(),
21
+ 'featuredImage' => 'thumbnail',
22
+ 'featuredImageHeight' => null,
23
+ 'featuredImageWidth' => null,
24
+ 'featuredImageCrop' => false,
25
+ );
26
+
27
+ $query = str_replace($options['prefixName'], $this->getDb()->prefix, $options['query']);
28
+ $posts = $this->getDb()->get_results($query, ARRAY_A);
29
+ $this->deserialize($posts, $options['deserialize'], $options['tryDeserialize']);
30
+ $this->fillFeaturedImages($posts, $options['featuredImage'], $options['featuredImageHeight'], $options['featuredImageWidth'], $options['featuredImageCrop']);
31
+
32
+ return $posts;
33
+ }
34
+
35
+ private function fillFeaturedImages(&$posts, $imageStyle, $imageHeight, $imageWidth, $crop)
36
+ {
37
+ if (count($posts) === 0 || !$imageStyle) {
38
+ return;
39
+ }
40
+
41
+ if ($imageHeight || $imageWidth) {
42
+ $this->context->addImageStyle($imageStyle, $imageWidth, $imageHeight, $crop);
43
+ }
44
+
45
+ foreach ($posts as &$post) {
46
+ if (empty($post['featuredImageId'])) {
47
+ continue;
48
+ }
49
+ $info = $this->context->getImageInfo($post['featuredImageId'], $imageStyle);
50
+ if ($info === null) {
51
+ continue;
52
+ }
53
+ $post['featuredImage'] = $info['url'];
54
+ $post['featuredImageHeight'] = $info['height'];
55
+ $post['featuredImageWidth'] = $info['width'];
56
+ $post['featuredImageOriginal'] = $info['original'];
57
+ }
58
+ }
59
+ }
src/MWP/WordPress/Query/User.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_WordPress_Query_User extends MWP_WordPress_Query_Abstract
12
+ {
13
+ public function query(array $options = array())
14
+ {
15
+ $options += array(
16
+ 'query' => null,
17
+ 'prefixName' => '{{prefix}}',
18
+ 'deserialize' => array(),
19
+ 'tryDeserialize' => array(),
20
+ );
21
+
22
+ $query = str_replace($options['prefixName'], $this->getDb()->prefix, $options['query']);
23
+ $users = $this->getDb()->get_results($query, ARRAY_A);
24
+ $this->deserialize($users, $options['deserialize'], $options['tryDeserialize']);
25
+
26
+ return $users;
27
+ }
28
+ }
src/MWP/Worker/ActionResponse.php ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ /**
12
+ * @deprecated This is a hack used for legacy action calls.
13
+ */
14
+ class MWP_Worker_ActionResponse extends Exception
15
+ {
16
+
17
+ private $data;
18
+
19
+ public function __construct($data)
20
+ {
21
+ $this->data = $data;
22
+ }
23
+
24
+ public function getData()
25
+ {
26
+ return $this->data;
27
+ }
28
+ }
src/MWP/Worker/Brand.php ADDED
@@ -0,0 +1,210 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Worker_Brand
12
+ {
13
+
14
+ const OPTION_NAME = 'mwp_worker_brand';
15
+
16
+ private $context;
17
+
18
+ /**
19
+ * @var bool
20
+ */
21
+ private $active;
22
+
23
+ /**
24
+ * @var string|null
25
+ */
26
+ private $name;
27
+
28
+ /**
29
+ * @var string|null
30
+ */
31
+ private $description;
32
+
33
+ /**
34
+ * @var string|null
35
+ */
36
+ private $author;
37
+
38
+ /**
39
+ * @var string|null
40
+ */
41
+ private $authorUrl;
42
+
43
+ /**
44
+ * Hide the plugin from the plugin list.
45
+ *
46
+ * @var bool
47
+ */
48
+ private $hide = false;
49
+
50
+ /**
51
+ * Prevent the user from updating/installing plugins and themes within the site. Also disable the plugin and theme code editor.
52
+ *
53
+ * @var bool
54
+ */
55
+ private $disallowEdit = false;
56
+
57
+ /**
58
+ * One of the CONTACT_TYPE_* constants.
59
+ *
60
+ * @var int
61
+ */
62
+ private $contactType = 0;
63
+
64
+ /**
65
+ * Disable "Contact Support" modal.
66
+ */
67
+ const CONTACT_TYPE_NONE = 0;
68
+
69
+ /**
70
+ * Show both text ('textForClient') and the form that subits to the brand owner email address ('adminEmail').
71
+ */
72
+ const CONTACT_TYPE_TEXT_PLUS_FORM = 1;
73
+
74
+ /**
75
+ * Show only text ('textForClient').
76
+ */
77
+ const CONTACT_TYPE_TEXT = 2;
78
+
79
+ /**
80
+ * Text shown in the "Contact Support" dialog.
81
+ *
82
+ * @var string|null
83
+ */
84
+ private $textForClient;
85
+
86
+ /**
87
+ * Email address of the brand owner.
88
+ *
89
+ * @var string|null
90
+ */
91
+ private $adminEmail;
92
+
93
+ public function __construct(MWP_WordPress_Context $context)
94
+ {
95
+ $this->context = $context;
96
+ $brand = $context->optionGet(self::OPTION_NAME);
97
+
98
+ if (!is_array($brand)) {
99
+ return;
100
+ }
101
+
102
+ $this->name = empty($brand['name']) ? null : $brand['name'];
103
+ $this->description = empty($brand['desc']) ? null : $brand['desc'];
104
+ $this->author = empty($brand['author']) ? null : $brand['author'];
105
+ $this->authorUrl = empty($brand['author_url']) ? null : $brand['author_url'];
106
+ $this->hide = isset($brand['hide']) ? $brand['hide'] : $this->hide;
107
+ // "Dissalow" [sic] edit .
108
+ $this->disallowEdit = isset($brand['dissalow_edit']) ? $brand['dissalow_edit'] : $this->disallowEdit;
109
+ $this->textForClient = empty($brand['text_for_client']) ? null : $brand['text_for_client'];
110
+ $this->contactType = isset($brand['email_or_link']) ? (int) $brand['email_or_link'] : self::CONTACT_TYPE_NONE;
111
+ $this->adminEmail = empty($brand['admin_email']) ? null : $brand['admin_email'];
112
+
113
+ $this->active = isset($brand['active']) ? $brand['active'] : (bool) ($this->name || $this->description || $this->author || $this->authorUrl || $this->hide || $this->disallowEdit || $this->contactType);
114
+ }
115
+
116
+ public function isActive()
117
+ {
118
+ return $this->active;
119
+ }
120
+
121
+ /**
122
+ * @return null|string
123
+ */
124
+ public function getName()
125
+ {
126
+ return $this->name;
127
+ }
128
+
129
+ /**
130
+ * @return null|string
131
+ */
132
+ public function getDescription()
133
+ {
134
+ return $this->description;
135
+ }
136
+
137
+ /**
138
+ * @return null|string
139
+ */
140
+ public function getAuthor()
141
+ {
142
+ return $this->author;
143
+ }
144
+
145
+ /**
146
+ * @return null|string
147
+ */
148
+ public function getAuthorUrl()
149
+ {
150
+ return $this->authorUrl;
151
+ }
152
+
153
+ /**
154
+ * @return boolean
155
+ */
156
+ public function isHide()
157
+ {
158
+ return $this->hide;
159
+ }
160
+
161
+ /**
162
+ * @return boolean
163
+ */
164
+ public function isDisallowEdit()
165
+ {
166
+ return $this->disallowEdit;
167
+ }
168
+
169
+ /**
170
+ * @return int
171
+ */
172
+ public function getContactType()
173
+ {
174
+ return $this->contactType;
175
+ }
176
+
177
+ /**
178
+ * @return null|string
179
+ */
180
+ public function getTextForClient()
181
+ {
182
+ return $this->textForClient;
183
+ }
184
+
185
+ /**
186
+ * @return null|string
187
+ */
188
+ public function getAdminEmail()
189
+ {
190
+ return $this->adminEmail;
191
+ }
192
+
193
+ /**
194
+ * Active-record-style delete.
195
+ */
196
+ public function delete()
197
+ {
198
+ $this->context->optionDelete(self::OPTION_NAME);
199
+ }
200
+
201
+ /**
202
+ * Active-record-style update.
203
+ *
204
+ * @param array $brand
205
+ */
206
+ public function update(array $brand)
207
+ {
208
+ $this->context->optionSet(self::OPTION_NAME, $brand);
209
+ }
210
+ }
src/MWP/Worker/Configuration.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Worker_Configuration
12
+ {
13
+
14
+ private $context;
15
+
16
+ public function __construct(MWP_WordPress_Context $context)
17
+ {
18
+ $this->context = $context;
19
+ }
20
+
21
+ public function getPublicKey()
22
+ {
23
+ return base64_decode($this->context->optionGet('_worker_public_key'));
24
+ }
25
+
26
+ public function setPublicKey($publicKey)
27
+ {
28
+ $this->context->optionSet('_worker_public_key', base64_encode($publicKey));
29
+ }
30
+
31
+ public function deletePublicKey()
32
+ {
33
+ $this->context->optionDelete('_worker_public_key');
34
+ }
35
+
36
+ /**
37
+ * @return string
38
+ *
39
+ * @deprecated Use public key instead.
40
+ */
41
+ public function getSecureKey()
42
+ {
43
+ return base64_decode($this->context->optionGet('_worker_nossl_key'));
44
+ }
45
+
46
+ /**
47
+ * @param $secureKey
48
+ *
49
+ * @deprecated Use public key instead.
50
+ */
51
+ public function setSecureKey($secureKey)
52
+ {
53
+ $this->context->optionSet('_worker_nossl_key', base64_encode($secureKey));
54
+ }
55
+
56
+ public function deleteSecureKey()
57
+ {
58
+ $this->context->optionDelete('_worker_nossl_key');
59
+ }
60
+ }
src/MWP/Worker/Exception.php ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Worker_Exception extends Exception
12
+ {
13
+ const CONNECTION_PUBLIC_KEY_EXISTS = 10001;
14
+ const CONNECTION_PUBLIC_KEY_NOT_FOUND = 10010;
15
+ const CONNECTION_SIGNATURE_NOT_VALID = 10011;
16
+ const CONNECTION_SIGNATURE_EMPTY = 10018;
17
+ const OPENSSL_ENCRYPT_ERROR = 10002;
18
+ const OPENSSL_DECRYPT_ERROR = 10003;
19
+ const OPENSSL_VERIFY_ERROR = 10005;
20
+ const PHPSECLIB_ENCRYPT_ERROR = 10006;
21
+ const PHPSECLIB_DECRYPT_ERROR = 10007;
22
+ const PHPSECLIB_VERIFY_ERROR = 10009;
23
+ const NONCE_FORMAT_INVALID = 10012;
24
+ const NONCE_EXPIRED = 10013;
25
+ const NONCE_ALREADY_USED = 10014;
26
+ const AUTHENTICATION_NO_ADMIN_USER = 10015;
27
+ const AUTHENTICATION_MESSAGE_ID_EMPTY = 10016;
28
+ const AUTHENTICATION_PUBLIC_KEY_EMPTY = 10017;
29
+ const AUTHENTICATION_INVALID_SIGNATURE = 10019;
30
+ const ACTION_NOT_REGISTERED = 10020;
31
+ const CONNECTION_PUBLIC_KEY_NOT_PROVIDED = 10021;
32
+ const CONNECTION_VERIFICATION_TEST_FAILED = 10022;
33
+ const PHP_EVAL_ERROR = 10023;
34
+ const LEGACY_AUTHENTICATION_INVALID_SIGNATURE = 1024;
35
+ const LEGACY_AUTHENTICATION_KEY_EXISTS = 1025;
36
+ const AUTO_LOGIN_USERNAME_REQUIRED = 1026;
37
+
38
+ const GENERAL_ERROR = 10000;
39
+
40
+ static $codes = array();
41
+
42
+ protected $errorName;
43
+
44
+ protected $context;
45
+
46
+ public function __construct($code, $message = null, array $context = array())
47
+ {
48
+ $this->errorName = $this->getErrorNameForCode($code);
49
+ $this->context = $context;
50
+
51
+ if ($message === null) {
52
+ $message = sprintf('Error [%d]: %s', $code, $this->errorName);
53
+ }
54
+
55
+ parent::__construct($message, $code);
56
+ }
57
+
58
+ private function getErrorNameForCode($code)
59
+ {
60
+ if (count(self::$codes) === 0) {
61
+ $reflectionClass = new ReflectionClass(__CLASS__);
62
+ self::$codes = array_flip($reflectionClass->getConstants());
63
+ }
64
+
65
+ if (array_key_exists($code, self::$codes)) {
66
+ return self::$codes[$code];
67
+ }
68
+
69
+ return self::GENERAL_ERROR;
70
+ }
71
+
72
+ /**
73
+ * @return string
74
+ */
75
+ public function getErrorName()
76
+ {
77
+ return $this->errorName;
78
+ }
79
+
80
+ /**
81
+ * @return array
82
+ */
83
+ public function getContext()
84
+ {
85
+ return $this->context;
86
+ }
87
+ }
src/MWP/Worker/Installer.php ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Worker_Installer
12
+ {
13
+ private $context;
14
+
15
+ private $loaderName;
16
+
17
+ private $initPath;
18
+
19
+ function __construct(MWP_Context_WordPress $context, $loaderName)
20
+ {
21
+ $this->context = $context;
22
+ $this->loaderName = $loaderName;
23
+ }
24
+
25
+ /**
26
+ * Executed when the plugin is activated.
27
+ *
28
+ * @param boolean $networkWide
29
+ *
30
+ * @hook
31
+ * @link http://codex.wordpress.org/Function_Reference/register_activation_hook
32
+ */
33
+ public function activate($networkWide = false)
34
+ {
35
+ try {
36
+ $this->registerMustUse();
37
+ $this->context->optionSet('mwp_loader', true);
38
+ } catch (MWP_Worker_Exception $e) {
39
+ $this->context->optionSet('mwp_loader_error', $e->getMessage());
40
+ }
41
+ }
42
+
43
+ /**
44
+ * Executed when the plugin is deactivated.
45
+ *
46
+ * @hook
47
+ * @link http://codex.wordpress.org/Function_Reference/register_deactivation_hook
48
+ */
49
+ public function deactivate()
50
+ {
51
+ $this->context->optionDelete('mwp_signer');
52
+ $this->context->optionDelete('mwp_algorithm');
53
+ $this->context->optionDelete('mwp_key');
54
+ $this->context->optionDelete('mwp_loader');
55
+ $this->context->optionDelete('mwp_loader_error');
56
+ $this->unregisterMustUse();
57
+ }
58
+
59
+ /**
60
+ * Executed when the plugin is being uninstalled.
61
+ *
62
+ * @hook
63
+ * @link http://codex.wordpress.org/Function_Reference/register_uninstall_hook
64
+ */
65
+ public function uninstall()
66
+ {
67
+
68
+ }
69
+
70
+ /**
71
+ * Try to register as a "must use" plugin.
72
+ *
73
+ * @throws MWP_Worker_Exception
74
+ * @link http://codex.wordpress.org/Must_Use_Plugins
75
+ */
76
+ public function registerMustUse()
77
+ {
78
+ $mustUsePluginDir = $this->context->getConstant('WPMU_PLUGIN_DIR');
79
+ $loaderPath = $mustUsePluginDir.'/'.$this->loaderName;
80
+ $pluginBasename = $this->context->getPluginBasename();
81
+
82
+ $loader = <<<EOF
83
+ <?php
84
+
85
+ /**
86
+ * This file is automatically generated by the MWP worker plugin and should be automatically deleted
87
+ * upon disabling or uninstalling it. It should require no modifications.
88
+ *
89
+ * Read about WordPress "must-use" plugins here http://codex.wordpress.org/Must_Use_Plugins
90
+ */
91
+
92
+ if (file_exists(untrailingslashit(WP_PLUGIN_DIR).'/$pluginBasename')) {
93
+ \$mwp_wpmu = true;
94
+ include_once untrailingslashit(WP_PLUGIN_DIR).'/$pluginBasename';
95
+ }
96
+
97
+ EOF;
98
+
99
+ if (!is_dir($mustUsePluginDir)) {
100
+ $dirMade = @mkdir($mustUsePluginDir);
101
+
102
+ if (!$dirMade) {
103
+ $error = error_get_last();
104
+ throw new MWP_Worker_Exception(sprintf('Unable to create MWP loader directory: %s', $error['message']));
105
+ }
106
+ }
107
+
108
+ $loaderWritten = @file_put_contents($loaderPath, $loader);
109
+
110
+ if (!$loaderWritten) {
111
+ $error = error_get_last();
112
+ throw new MWP_Worker_Exception(sprintf('Unable to write MWP loader: %s', $error['message']));
113
+ }
114
+ }
115
+
116
+ public function unregisterMustUse()
117
+ {
118
+ $loaderFile = $this->context->getConstant('WPMU_PLUGIN_DIR').'/'.$this->loaderName;
119
+
120
+ if (file_exists($loaderFile)) {
121
+ unlink($loaderFile);
122
+ }
123
+ }
124
+
125
+ /**
126
+ * @return mixed
127
+ */
128
+ public function getInitPath()
129
+ {
130
+ return $this->initPath;
131
+ }
132
+
133
+ /**
134
+ * @param mixed $initFile
135
+ */
136
+ public function setInitPath($initFile)
137
+ {
138
+ $this->initPath = $initFile;
139
+ }
140
+ }
src/MWP/Worker/Kernel.php ADDED
@@ -0,0 +1,203 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ /**
12
+ * Class MWP_Worker_Kernel
13
+ */
14
+ class MWP_Worker_Kernel
15
+ {
16
+
17
+ /**
18
+ * @var MWP_ServiceContainer_Interface
19
+ */
20
+ private $container;
21
+
22
+ /**
23
+ * @var Symfony_EventDispatcher_EventDispatcherInterface
24
+ */
25
+ private $dispatcher;
26
+
27
+ /**
28
+ * @var MWP_Worker_RequestStack|null
29
+ */
30
+ private $requestStack;
31
+
32
+ public function __construct(MWP_ServiceContainer_Interface $container)
33
+ {
34
+ $this->container = $container;
35
+ $this->dispatcher = $container->getEventDispatcher();
36
+ $this->requestStack = $container->getRequestStack();
37
+ // We will need master response callback for fatal error handling.
38
+ $this->responseCallback = $container->getResponseCallback();
39
+ }
40
+
41
+ /**
42
+ * @param MWP_Worker_Request $request
43
+ * @param callable $deferredCallback
44
+ * @param bool $catch
45
+ *
46
+ * @throws Exception
47
+ * @throws MWP_Worker_Exception
48
+ */
49
+ public function handleRequest(MWP_Worker_Request $request, $deferredCallback, $catch = true)
50
+ {
51
+ $request->initialize();
52
+ $this->requestStack->push($request);
53
+ $this->responseCallback->set($deferredCallback);
54
+ $container = $this->getContainer();
55
+ $actionName = $request->getAction();
56
+ $params = $request->getParams();
57
+ $context = $container->getWordPressContext();
58
+
59
+ if (!$request->isMasterRequest()) {
60
+ // This is a public request. Allow the plugin to hook onto WordPress.
61
+ $publicRequestEvent = new MWP_Event_PublicRequest($request);
62
+ $this->dispatcher->dispatch(MWP_Event_Events::PUBLIC_REQUEST, $publicRequestEvent);
63
+ if ($publicRequestEvent->hasResponse()) {
64
+ call_user_func($deferredCallback, null, $publicRequestEvent->getResponse());
65
+ }
66
+
67
+ return;
68
+ }
69
+
70
+ try {
71
+ // This is a master request. Allow early hooks to verify and do everything required with the request.
72
+ $masterRequestEvent = new MWP_Event_MasterRequest($request, $params);
73
+ $this->dispatcher->dispatch(MWP_Event_Events::MASTER_REQUEST, $masterRequestEvent);
74
+ if ($masterRequestEvent->hasResponse()) {
75
+ call_user_func($deferredCallback, null, $masterRequestEvent->getResponse());
76
+
77
+ return;
78
+ }
79
+ $params = $masterRequestEvent->getParams();
80
+
81
+ // Get action info.
82
+ $actionRegistry = $container->getActionRegistry();
83
+ $actionDefinition = $actionRegistry->getDefinition($actionName);
84
+
85
+ $callback = $actionDefinition->getCallback();
86
+
87
+ // If the callback is an array with two members (['ClassName, 'methodName']) and implements ContainerAware,
88
+ // inject the container before executing it.
89
+ if (is_array($callback) && is_string($callback[0])) {
90
+ $callback[0] = new $callback[0];
91
+ }
92
+ if (is_array($callback) && $callback[0] instanceof MWP_ServiceContainer_ContainerAwareInterface) {
93
+ $callbackObject = $callback[0];
94
+ /** @var MWP_ServiceContainer_ContainerAwareInterface $callbackObject */
95
+ $callbackObject->setContainer($container);
96
+ }
97
+
98
+ // Allow listeners to modify action parameters.
99
+ $actionRequestEvent = new MWP_Event_ActionRequest($request, $params);
100
+ $this->dispatcher->dispatch(MWP_Event_Events::ACTION_REQUEST, $actionRequestEvent);
101
+ $params = $actionRequestEvent->getParams();
102
+
103
+ // Check if the action call should be deferred.
104
+ $hookName = $actionDefinition->getOption('hook_name');
105
+ if ($hookName !== null && $deferredCallback !== null) {
106
+ $proxy = new MWP_WordPress_HookProxy(array($this, 'hookResponse'), $request, $callback, $params, $deferredCallback);
107
+ $context->addAction($hookName, $proxy->getCallable(), $actionDefinition->getOption('hook_priority'));
108
+
109
+ return;
110
+ }
111
+
112
+ try {
113
+ $data = call_user_func($callback, $params, $request);
114
+ } catch (MWP_Worker_ActionResponse $actionResponse) {
115
+ $data = $actionResponse->getData();
116
+ }
117
+ $response = $this->handleResponse($request, $params, $data);
118
+ call_user_func($deferredCallback, null, $response);
119
+ } catch (Exception $e) {
120
+ if (!$catch) {
121
+ throw $e;
122
+ }
123
+
124
+ $response = $this->handleException($request, $e);
125
+ call_user_func($deferredCallback, $e, $response);
126
+ }
127
+ }
128
+
129
+ /**
130
+ * @param MWP_Worker_Request $request
131
+ * @param array $params
132
+ * @param mixed $data
133
+ *
134
+ * @return MWP_Http_ResponseInterface
135
+ *
136
+ * @throws RuntimeException If the action response doesn't get converted to an HTTP response.
137
+ */
138
+ private function handleResponse(MWP_Worker_Request $request, array $params, $data)
139
+ {
140
+ $actionResponseEvent = new MWP_Event_ActionResponse($request, $params, $data);
141
+ $this->dispatcher->dispatch(MWP_Event_Events::ACTION_RESPONSE, $actionResponseEvent);
142
+
143
+ if ($actionResponseEvent->getResponse() === null) {
144
+ throw new RuntimeException('Action response did not get converted to an HTTP response.');
145
+ }
146
+
147
+ return $actionResponseEvent->getResponse();
148
+ }
149
+
150
+ /**
151
+ * @param MWP_Worker_Request $request
152
+ * @param Exception $e
153
+ *
154
+ * @return MWP_Http_ResponseInterface|null
155
+ */
156
+ private function handleException(MWP_Worker_Request $request, Exception $e)
157
+ {
158
+ $errorEvent = new MWP_Event_ActionException($request, $e);
159
+ $this->dispatcher->dispatch(MWP_Event_Events::ACTION_EXCEPTION, $errorEvent);
160
+
161
+ return $errorEvent->getResponse();
162
+ }
163
+
164
+ /**
165
+ * Callback for deferred actions. Used when the action is not executed immediately, but after a WordPress action hook.
166
+ *
167
+ * @param MWP_Worker_Request $request
168
+ * @param callable $callback
169
+ * @param array $params
170
+ * @param callable $deferredCallback
171
+ */
172
+ public function hookResponse(MWP_Worker_Request $request, $callback, array $params, $deferredCallback)
173
+ {
174
+ try {
175
+ try {
176
+ $data = call_user_func($callback, $params, $request);
177
+ } catch (MWP_Worker_ActionResponse $actionResponse) {
178
+ $data = $actionResponse->getData();
179
+ }
180
+ $response = $this->handleResponse($request, $params, $data);
181
+ call_user_func($deferredCallback, null, $response);
182
+ } catch (Exception $e) {
183
+ $response = $this->handleException($request, $e);
184
+ call_user_func($deferredCallback, $e, $response);
185
+
186
+ return;
187
+ }
188
+ }
189
+
190
+ /**
191
+ * Returns the service container.
192
+ *
193
+ * @return MWP_ServiceContainer_Interface
194
+ */
195
+ public function getContainer()
196
+ {
197
+ if ($this->container === null) {
198
+ throw new RuntimeException('Kernel is not booted');
199
+ }
200
+
201
+ return $this->container;
202
+ }
203
+ }
src/MWP/Worker/Request.php ADDED
@@ -0,0 +1,332 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ /**
12
+ * Class MWP_Worker_Request
13
+ */
14
+ class MWP_Worker_Request
15
+ {
16
+
17
+ /**
18
+ * Header that contains the name of the action to execute.
19
+ * Must be compliant with {@link http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html RFC 2616}
20
+ *
21
+ * @var string
22
+ */
23
+ protected $actionHeaderName = 'MWP-Action';
24
+
25
+ /**
26
+ * Header that contains the ID of the action to execute.
27
+ * Must be compliant with {@link http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html RFC 2616}
28
+ *
29
+ * @var string
30
+ */
31
+ protected $messageIdHeaderName = 'MWP-Message-ID';
32
+
33
+ /**
34
+ * Header that contains message signature.
35
+ * Must be compliant with {@link http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html RFC 2616}
36
+ *
37
+ * @var string
38
+ */
39
+ protected $signatureHeaderName = 'MWP-Signature';
40
+
41
+ protected $protocolVersionHeaderName = 'MWP-Protocol';
42
+
43
+ /**
44
+ * @var bool
45
+ */
46
+ private $initialized = false;
47
+
48
+ /**
49
+ * The GET parameters.
50
+ *
51
+ * @var array
52
+ */
53
+ public $query;
54
+
55
+ /**
56
+ * The POST parameters.
57
+ *
58
+ * @var array
59
+ */
60
+ public $request;
61
+
62
+ /**
63
+ * The request attributes.
64
+ *
65
+ * @var array
66
+ */
67
+ public $attributes;
68
+
69
+ /**
70
+ * The COOKIE parameters.
71
+ *
72
+ * @var array
73
+ */
74
+ public $cookies;
75
+
76
+ /**
77
+ * The FILES parameters.
78
+ *
79
+ * @var array
80
+ */
81
+ public $files;
82
+
83
+ /**
84
+ * The SERVER parameters.
85
+ *
86
+ * @var array
87
+ */
88
+ public $server;
89
+
90
+ /**
91
+ * The raw request body data.
92
+ *
93
+ * @var string
94
+ */
95
+ private $content;
96
+
97
+ private $method;
98
+
99
+ /**
100
+ * @param array $query The GET parameters.
101
+ * @param array $request The POST parameters.
102
+ * @param array $attributes The request attributes.
103
+ * @param array $cookies The COOKIE parameters.
104
+ * @param array $files The FILES parameters.
105
+ * @param array $server The SERVER parameters.
106
+ * @param null|string $content The raw request body data. If null, it will be lazy-loaded.
107
+ */
108
+ public function __construct($query = array(), $request = array(), $attributes = array(), $cookies = array(), $files = array(), $server = array(), $content = null)
109
+ {
110
+ $this->query = $query;
111
+ $this->request = $request;
112
+ $this->attributes = $attributes;
113
+ $this->cookies = $cookies;
114
+ $this->files = $files;
115
+ $this->server = $server;
116
+ $this->content = $content;
117
+ }
118
+
119
+ /**
120
+ * Gets the request method.
121
+ *
122
+ * The method is always an uppercased string.
123
+ *
124
+ * @return string The request method
125
+ */
126
+ public function getMethod()
127
+ {
128
+ if (null === $this->method) {
129
+ $this->method = isset($this->server['REQUEST_METHOD']) ? strtoupper($this->server['REQUEST_METHOD']) : 'GET';
130
+ }
131
+
132
+ return $this->method;
133
+ }
134
+
135
+ /**
136
+ * Sets the request method.
137
+ *
138
+ * @param string $method
139
+ */
140
+ public function setMethod($method)
141
+ {
142
+ $this->method = null;
143
+ $this->server['REQUEST_METHOD'] = $method;
144
+ }
145
+
146
+ /**
147
+ * MWP_Worker factory.
148
+ *
149
+ * @return MWP_Worker_Request
150
+ */
151
+ public static function createFromGlobals()
152
+ {
153
+ $request = new self($_GET, $_POST, array(), $_COOKIE, $_FILES, $_SERVER);
154
+
155
+ return $request;
156
+ }
157
+
158
+ /**
159
+ * @throws RuntimeException If the request is already initialized.
160
+ */
161
+ public function initialize()
162
+ {
163
+ if ($this->initialized) {
164
+ throw new RuntimeException('Request is already initialized.');
165
+ }
166
+ $this->initialized = true;
167
+
168
+ $this->attributes['action'] = $this->getHeader($this->actionHeaderName);
169
+ $this->attributes['id'] = $this->getHeader($this->messageIdHeaderName);
170
+ $this->attributes['signature'] = base64_decode($this->getHeader($this->signatureHeaderName));
171
+ $this->attributes['data'] = null;
172
+ $this->attributes['params'] = null;
173
+ $this->attributes['setting'] = null;
174
+ $this->attributes['user'] = null;
175
+ $this->attributes['authenticated'] = false;
176
+ $this->attributes['protocol'] = (int) $this->getHeader($this->protocolVersionHeaderName);
177
+
178
+ // Do we have {"params":{...}} inside of body?
179
+ if ($this->isMasterRequest() && is_array($data = json_decode($this->getContent(), true)) && array_key_exists('params', $data)) {
180
+ $this->attributes['data'] = $data;
181
+ $this->attributes['params'] = $data['params'];
182
+ $this->attributes['setting'] = array_key_exists('setting', $data) ? $data['setting'] : null;
183
+ $this->attributes['user'] = (array_key_exists('username', $data) && is_scalar($data['username'])) ? $data['username'] : null;
184
+ }
185
+ }
186
+
187
+ /**
188
+ * @return bool
189
+ */
190
+ public function isInitialized()
191
+ {
192
+ return $this->initialized;
193
+ }
194
+
195
+ /**
196
+ * @param string $actionHeaderName
197
+ */
198
+ public function setActionHeaderName($actionHeaderName)
199
+ {
200
+ $this->actionHeaderName = $actionHeaderName;
201
+ }
202
+
203
+ /**
204
+ * @param string $signatureHeaderName
205
+ */
206
+ public function setSignatureHeaderName($signatureHeaderName)
207
+ {
208
+ $this->signatureHeaderName = $signatureHeaderName;
209
+ }
210
+
211
+ /**
212
+ * @param bool $asResource If true, a resource will be returned
213
+ *
214
+ * @return resource|string The request body content or a resource to read the body stream.
215
+ * @throws RuntimeException If attempting to call the method again after getting it as a resource previously.
216
+ */
217
+ public function getContent($asResource = false)
218
+ {
219
+ if (false === $this->content || (true === $asResource && null !== $this->content)) {
220
+ throw new RuntimeException('getContent() can only be called once when using the resource return type.');
221
+ }
222
+
223
+ if (true === $asResource) {
224
+ $this->content = false;
225
+
226
+ return fopen('php://input', 'rb');
227
+ }
228
+
229
+ if (null === $this->content) {
230
+ $this->content = file_get_contents('php://input');
231
+ }
232
+
233
+ return $this->content;
234
+ }
235
+
236
+ /**
237
+ * @return bool Whether the current request is sent by the master script.
238
+ */
239
+ public function isMasterRequest()
240
+ {
241
+ if ($this->getMethod() !== 'POST') {
242
+ return false;
243
+ }
244
+
245
+ $masterHeader = $this->getHeader($this->actionHeaderName);
246
+ if ($masterHeader === null) {
247
+ return false;
248
+ }
249
+
250
+ return true;
251
+ }
252
+
253
+ /**
254
+ * @return null|string
255
+ */
256
+ public function getAction()
257
+ {
258
+ return $this->attributes['action'];
259
+ }
260
+
261
+ /**
262
+ * @return null|string
263
+ */
264
+ public function getSignature()
265
+ {
266
+ return $this->attributes['signature'];
267
+ }
268
+
269
+ /**
270
+ * @return null|string
271
+ */
272
+ public function getUsername()
273
+ {
274
+ return $this->attributes['user'];
275
+ }
276
+
277
+ public function getNonce()
278
+ {
279
+ return $this->attributes['id'];
280
+ }
281
+
282
+ public function getParams()
283
+ {
284
+ return $this->attributes['params'];
285
+ }
286
+
287
+ public function getData()
288
+ {
289
+ return $this->attributes['data'];
290
+ }
291
+
292
+ public function getSetting()
293
+ {
294
+ return $this->attributes['setting'];
295
+ }
296
+
297
+ /**
298
+ * @param string $header Header name.
299
+ *
300
+ * @return string|null Header content, or null if it doesn't exist.
301
+ */
302
+ public function getHeader($header)
303
+ {
304
+ $header = 'HTTP_'.strtoupper(str_replace('-', '_', $header));
305
+ if (isset($this->server[$header])) {
306
+ return $this->server[$header];
307
+ }
308
+
309
+ return null;
310
+ }
311
+
312
+ /**
313
+ * @return bool
314
+ */
315
+ public function isAuthenticated()
316
+ {
317
+ return $this->attributes['authenticated'];
318
+ }
319
+
320
+ public function setAuthenticated($isAuthenticated)
321
+ {
322
+ $this->attributes['authenticated'] = $isAuthenticated;
323
+ }
324
+
325
+ /**
326
+ * @return int
327
+ */
328
+ public function getProtocol()
329
+ {
330
+ return $this->attributes['protocol'];
331
+ }
332
+ }
src/MWP/Worker/RequestStack.php ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ class MWP_Worker_RequestStack
12
+ {
13
+ /**
14
+ * @var MWP_Worker_Request[]
15
+ */
16
+ private $requests = array();
17
+
18
+ /**
19
+ * Pushes a Request on the stack.
20
+ *
21
+ * This method should generally not be called directly as the stack
22
+ * management should be taken care of by the application itself.
23
+ */
24
+ public function push(MWP_Worker_Request $request)
25
+ {
26
+ $this->requests[] = $request;
27
+ }
28
+
29
+ /**
30
+ * Pops the current request from the stack.
31
+ *
32
+ * This operation lets the current request go out of scope.
33
+ *
34
+ * This method should generally not be called directly as the stack
35
+ * management should be taken care of by the application itself.
36
+ *
37
+ * @return MWP_Worker_Request|null
38
+ */
39
+ public function pop()
40
+ {
41
+ if (!$this->requests) {
42
+ return null;
43
+ }
44
+
45
+ return array_pop($this->requests);
46
+ }
47
+
48
+ /**
49
+ * @return MWP_Worker_Request|null
50
+ */
51
+ public function getCurrentRequest()
52
+ {
53
+ $lastRequest = end($this->requests);
54
+
55
+ return $lastRequest ? $lastRequest : null;
56
+ }
57
+
58
+ /**
59
+ * Gets the master Request.
60
+ *
61
+ * @return MWP_Worker_Request|null
62
+ */
63
+ public function getMasterRequest()
64
+ {
65
+ if (!$this->requests) {
66
+ return null;
67
+ }
68
+
69
+ return $this->requests[0];
70
+ }
71
+
72
+ /**
73
+ * Returns the parent request of the current.
74
+ *
75
+ * If current Request is the master request, it returns null.
76
+ *
77
+ * @return MWP_Worker_Request|null
78
+ */
79
+ public function getParentRequest()
80
+ {
81
+ $pos = count($this->requests) - 2;
82
+
83
+ if (!isset($this->requests[$pos])) {
84
+ return null;
85
+ }
86
+
87
+ return $this->requests[$pos];
88
+ }
89
+ }
src/MWP/Worker/ResponseCallback.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * This file is part of the ManageWP Worker plugin.
4
+ *
5
+ * (c) ManageWP LLC <contact@managewp.com>
6
+ *
7
+ * For the full copyright and license information, please view the LICENSE
8
+ * file that was distributed with this source code.
9
+ */
10
+
11
+ /**
12
+ * Wrapper for master response callback. We need it to be able to invoke it from the fatal error handler.
13
+ */
14
+ class MWP_Worker_ResponseCallback
15
+ {
16
+
17
+ private $callback;
18
+
19
+ /**
20
+ * @return callable|null
21
+ */
22
+ public function get()
23
+ {
24
+ return $this->callback;
25
+ }
26
+
27
+ /**
28
+ * @param callable|null $callback
29
+ */
30
+ public function set($callback = null)
31
+ {
32
+ $this->callback = $callback;
33
+ }
34
+ }
src/Monolog/ErrorHandler.php CHANGED
@@ -169,10 +169,8 @@ class Monolog_ErrorHandler
169
  if (!(error_reporting() & $code)) {
170
  return;
171
  }
172
-
173
  $level = isset($this->errorLevelMap[$code]) ? $this->errorLevelMap[$code] : Monolog_Psr_LogLevel::CRITICAL;
174
- $this->logger->log($level, self::codeToString($code).': '.$message, array('file' => $file, 'line' => $line));
175
-
176
  if ($this->previousErrorHandler === true) {
177
  return false;
178
  } elseif ($this->previousErrorHandler) {
@@ -187,12 +185,12 @@ class Monolog_ErrorHandler
187
  {
188
  $this->reservedMemory = null;
189
 
190
- $lastError = error_get_last();
191
  if ($lastError && in_array($lastError['type'], self::$fatalErrors)) {
192
  $this->logger->log(
193
  $this->fatalLevel === null ? Monolog_Psr_LogLevel::ALERT : $this->fatalLevel,
194
  'Fatal Error ('.self::codeToString($lastError['type']).'): '.$lastError['message'],
195
- array('file' => $lastError['file'], 'line' => $lastError['line'])
196
  );
197
  }
198
  }
169
  if (!(error_reporting() & $code)) {
170
  return;
171
  }
 
172
  $level = isset($this->errorLevelMap[$code]) ? $this->errorLevelMap[$code] : Monolog_Psr_LogLevel::CRITICAL;
173
+ $this->logger->log($level, self::codeToString($code).': '.$message, array('code' => $code, 'message' => $message, 'file' => $file, 'line' => $line));
 
174
  if ($this->previousErrorHandler === true) {
175
  return false;
176
  } elseif ($this->previousErrorHandler) {
185
  {
186
  $this->reservedMemory = null;
187
 
188
+ $lastError = error_get_last();
189
  if ($lastError && in_array($lastError['type'], self::$fatalErrors)) {
190
  $this->logger->log(
191
  $this->fatalLevel === null ? Monolog_Psr_LogLevel::ALERT : $this->fatalLevel,
192
  'Fatal Error ('.self::codeToString($lastError['type']).'): '.$lastError['message'],
193
+ array('code' => $lastError['type'], 'message' => $lastError['message'], 'file' => $lastError['file'], 'line' => $lastError['line'])
194
  );
195
  }
196
  }
src/PHPSecLib/openssl.cnf CHANGED
@@ -1,6 +1,6 @@
1
- # minimalist openssl.cnf file for use with phpseclib
2
-
3
- HOME = .
4
- RANDFILE = $ENV::HOME/.rnd
5
-
6
- [ v3_ca ]
1
+ # minimalist openssl.cnf file for use with phpseclib
2
+
3
+ HOME = .
4
+ RANDFILE = $ENV::HOME/.rnd
5
+
6
+ [ v3_ca ]
src/Symfony/EventDispatcher/Event.php ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ /**
13
+ * Event is the base class for classes containing event data.
14
+ *
15
+ * This class contains no event data. It is used by events that do not pass
16
+ * state information to an event handler when an event is raised.
17
+ *
18
+ * You can call the method stopPropagation() to abort the execution of
19
+ * further listeners in your event listener.
20
+ *
21
+ * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
22
+ * @author Jonathan Wage <jonwage@gmail.com>
23
+ * @author Roman Borschel <roman@code-factory.org>
24
+ * @author Bernhard Schussek <bschussek@gmail.com>
25
+ *
26
+ * @api
27
+ */
28
+ class Symfony_EventDispatcher_Event
29
+ {
30
+
31
+ /**
32
+ * @var bool Whether no further event listeners should be triggered
33
+ */
34
+ private $propagationStopped = false;
35
+
36
+ /**
37
+ * Returns whether further event listeners should be triggered.
38
+ *
39
+ * @see Symfony_EventDispatcher_Event::stopPropagation
40
+ * @return bool Whether propagation was already stopped for this event.
41
+ *
42
+ * @api
43
+ */
44
+ public function isPropagationStopped()
45
+ {
46
+ return $this->propagationStopped;
47
+ }
48
+
49
+ /**
50
+ * Stops the propagation of the event to further event listeners.
51
+ *
52
+ * If multiple event listeners are connected to the same event, no
53
+ * further event listener will be triggered once any trigger calls
54
+ * stopPropagation().
55
+ *
56
+ * @api
57
+ */
58
+ public function stopPropagation()
59
+ {
60
+ $this->propagationStopped = true;
61
+ }
62
+ }
src/Symfony/EventDispatcher/EventDispatcher.php ADDED
@@ -0,0 +1,177 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ /**
13
+ * The EventDispatcherInterface is the central point of Symfony's event listener system.
14
+ *
15
+ * Listeners are registered on the manager and events are dispatched through the
16
+ * manager.
17
+ *
18
+ * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
19
+ * @author Jonathan Wage <jonwage@gmail.com>
20
+ * @author Roman Borschel <roman@code-factory.org>
21
+ * @author Bernhard Schussek <bschussek@gmail.com>
22
+ * @author Fabien Potencier <fabien@symfony.com>
23
+ * @author Jordi Boggiano <j.boggiano@seld.be>
24
+ * @author Jordan Alliot <jordan.alliot@gmail.com>
25
+ *
26
+ * @api
27
+ */
28
+ class Symfony_EventDispatcher_EventDispatcher implements Symfony_EventDispatcher_EventDispatcherInterface
29
+ {
30
+
31
+ private $listeners = array();
32
+
33
+ private $sorted = array();
34
+
35
+ /**
36
+ * @see EventDispatcherInterface::dispatch
37
+ *
38
+ * @api
39
+ */
40
+ public function dispatch($eventName, Symfony_EventDispatcher_Event $event = null)
41
+ {
42
+ if (null === $event) {
43
+ $event = new Symfony_EventDispatcher_Event();
44
+ }
45
+ if (!isset($this->listeners[$eventName])) {
46
+ return $event;
47
+ }
48
+ $this->doDispatch($this->getListeners($eventName), $eventName, $event);
49
+
50
+ return $event;
51
+ }
52
+
53
+ /**
54
+ * @see EventDispatcherInterface::getListeners
55
+ */
56
+ public function getListeners($eventName = null)
57
+ {
58
+ if (null !== $eventName) {
59
+ if (!isset($this->sorted[$eventName])) {
60
+ $this->sortListeners($eventName);
61
+ }
62
+
63
+ return $this->sorted[$eventName];
64
+ }
65
+ foreach (array_keys($this->listeners) as $eventName) {
66
+ if (!isset($this->sorted[$eventName])) {
67
+ $this->sortListeners($eventName);
68
+ }
69
+ }
70
+
71
+ return array_filter($this->sorted);
72
+ }
73
+
74
+ /**
75
+ * @see EventDispatcherInterface::hasListeners
76
+ */
77
+ public function hasListeners($eventName = null)
78
+ {
79
+ return (bool) count($this->getListeners($eventName));
80
+ }
81
+
82
+ /**
83
+ * @see EventDispatcherInterface::addListener
84
+ *
85
+ * @api
86
+ */
87
+ public function addListener($eventName, $listener, $priority = 0)
88
+ {
89
+ $this->listeners[$eventName][$priority][] = $listener;
90
+ unset($this->sorted[$eventName]);
91
+ }
92
+
93
+ /**
94
+ * @see EventDispatcherInterface::removeListener
95
+ */
96
+ public function removeListener($eventName, $listener)
97
+ {
98
+ if (!isset($this->listeners[$eventName])) {
99
+ return;
100
+ }
101
+ foreach ($this->listeners[$eventName] as $priority => $listeners) {
102
+ if (false !== ($key = array_search($listener, $listeners, true))) {
103
+ unset($this->listeners[$eventName][$priority][$key], $this->sorted[$eventName]);
104
+ }
105
+ }
106
+ }
107
+
108
+ /**
109
+ * @see Symfony_EventDispatcher_EventSubscriberInterface::addSubscriber
110
+ *
111
+ * @api
112
+ */
113
+ public function addSubscriber(Symfony_EventDispatcher_EventSubscriberInterface $subscriber)
114
+ {
115
+ foreach ($subscriber->getSubscribedEvents() as $eventName => $params) {
116
+ if (is_string($params)) {
117
+ $this->addListener($eventName, array($subscriber, $params));
118
+ } elseif (is_string($params[0])) {
119
+ $this->addListener($eventName, array($subscriber, $params[0]), isset($params[1]) ? $params[1] : 0);
120
+ } else {
121
+ foreach ($params as $listener) {
122
+ $this->addListener($eventName, array($subscriber, $listener[0]), isset($listener[1]) ? $listener[1] : 0);
123
+ }
124
+ }
125
+ }
126
+ }
127
+
128
+ /**
129
+ * @see Symfony_EventDispatcher_EventSubscriberInterface::removeSubscriber
130
+ */
131
+ public function removeSubscriber(Symfony_EventDispatcher_EventSubscriberInterface $subscriber)
132
+ {
133
+ foreach ($subscriber->getSubscribedEvents() as $eventName => $params) {
134
+ if (is_array($params) && is_array($params[0])) {
135
+ foreach ($params as $listener) {
136
+ $this->removeListener($eventName, array($subscriber, $listener[0]));
137
+ }
138
+ } else {
139
+ $this->removeListener($eventName, array($subscriber, is_string($params) ? $params : $params[0]));
140
+ }
141
+ }
142
+ }
143
+
144
+ /**
145
+ * Triggers the listeners of an event.
146
+ *
147
+ * This method can be overridden to add functionality that is executed
148
+ * for each listener.
149
+ *
150
+ * @param callable[] $listeners The event listeners.
151
+ * @param string $eventName The name of the event to dispatch.
152
+ * @param Symfony_EventDispatcher_Event $event The event object to pass to the event handlers/listeners.
153
+ */
154
+ protected function doDispatch($listeners, $eventName, Symfony_EventDispatcher_Event $event)
155
+ {
156
+ foreach ($listeners as $listener) {
157
+ call_user_func($listener, $event, $eventName, $this);
158
+ if ($event->isPropagationStopped()) {
159
+ break;
160
+ }
161
+ }
162
+ }
163
+
164
+ /**
165
+ * Sorts the internal list of listeners for the given event by priority.
166
+ *
167
+ * @param string $eventName The name of the event.
168
+ */
169
+ private function sortListeners($eventName)
170
+ {
171
+ $this->sorted[$eventName] = array();
172
+ if (isset($this->listeners[$eventName])) {
173
+ krsort($this->listeners[$eventName]);
174
+ $this->sorted[$eventName] = call_user_func_array('array_merge', $this->listeners[$eventName]);
175
+ }
176
+ }
177
+ }
src/Symfony/EventDispatcher/EventDispatcherInterface.php ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ /**
13
+ * The EventDispatcherInterface is the central point of Symfony's event listener system.
14
+ * Listeners are registered on the manager and events are dispatched through the
15
+ * manager.
16
+ *
17
+ * @author Bernhard Schussek <bschussek@gmail.com>
18
+ *
19
+ * @api
20
+ */
21
+ interface Symfony_EventDispatcher_EventDispatcherInterface
22
+ {
23
+ /**
24
+ * Dispatches an event to all registered listeners.
25
+ *
26
+ * @param string $eventName The name of the event to dispatch. The name of
27
+ * the event is the name of the method that is
28
+ * invoked on listeners.
29
+ * @param Symfony_EventDispatcher_Event $event The event to pass to the event handlers/listeners.
30
+ * If not supplied, an empty Event instance is created.
31
+ *
32
+ * @return Symfony_EventDispatcher_Event
33
+ *
34
+ * @api
35
+ */
36
+ public function dispatch($eventName, Symfony_EventDispatcher_Event $event = null);
37
+
38
+ /**
39
+ * Adds an event listener that listens on the specified events.
40
+ *
41
+ * @param string $eventName The event to listen on
42
+ * @param callable $listener The listener
43
+ * @param int $priority The higher this value, the earlier an event
44
+ * listener will be triggered in the chain (defaults to 0)
45
+ *
46
+ * @api
47
+ */
48
+ public function addListener($eventName, $listener, $priority = 0);
49
+
50
+ /**
51
+ * Adds an event subscriber.
52
+ *
53
+ * The subscriber is asked for all the events he is
54
+ * interested in and added as a listener for these events.
55
+ *
56
+ * @param Symfony_EventDispatcher_EventSubscriberInterface $subscriber The subscriber.
57
+ *
58
+ * @api
59
+ */
60
+ public function addSubscriber(Symfony_EventDispatcher_EventSubscriberInterface $subscriber);
61
+
62
+ /**
63
+ * Removes an event listener from the specified events.
64
+ *
65
+ * @param string $eventName The event to remove a listener from
66
+ * @param callable $listener The listener to remove
67
+ */
68
+ public function removeListener($eventName, $listener);
69
+
70
+ /**
71
+ * Removes an event subscriber.
72
+ *
73
+ * @param Symfony_EventDispatcher_EventSubscriberInterface $subscriber The subscriber
74
+ */
75
+ public function removeSubscriber(Symfony_EventDispatcher_EventSubscriberInterface $subscriber);
76
+
77
+ /**
78
+ * Gets the listeners of a specific event or all listeners.
79
+ *
80
+ * @param string $eventName The name of the event
81
+ *
82
+ * @return array The event listeners for the specified event, or all event listeners by event name
83
+ */
84
+ public function getListeners($eventName = null);
85
+
86
+ /**
87
+ * Checks whether an event has any registered listeners.
88
+ *
89
+ * @param string $eventName The name of the event
90
+ *
91
+ * @return bool true if the specified event has any listeners, false otherwise
92
+ */
93
+ public function hasListeners($eventName = null);
94
+ }
src/Symfony/EventDispatcher/EventSubscriberInterface.php ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ * This file is part of the Symfony package.
5
+ *
6
+ * (c) Fabien Potencier <fabien@symfony.com>
7
+ *
8
+ * For the full copyright and license information, please view the LICENSE
9
+ * file that was distributed with this source code.
10
+ */
11
+
12
+ /**
13
+ * An EventSubscriber knows himself what events he is interested in.
14
+ * If an EventSubscriber is added to an EventDispatcherInterface, the manager invokes
15
+ * {@link getSubscribedEvents} and registers the subscriber as a listener for all
16
+ * returned events.
17
+ *
18
+ * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
19
+ * @author Jonathan Wage <jonwage@gmail.com>
20
+ * @author Roman Borschel <roman@code-factory.org>
21
+ * @author Bernhard Schussek <bschussek@gmail.com>
22
+ *
23
+ * @api
24
+ */
25
+ interface Symfony_EventDispatcher_EventSubscriberInterface
26
+ {
27
+ /**
28
+ * Returns an array of event names this subscriber wants to listen to.
29
+ *
30
+ * The array keys are event names and the value can be:
31
+ *
32
+ * * The method name to call (priority defaults to 0)
33
+ * * An array composed of the method name to call and the priority
34
+ * * An array of arrays composed of the method names to call and respective
35
+ * priorities, or 0 if unset
36
+ *
37
+ * For instance:
38
+ *
39
+ * * array('eventName' => 'methodName')
40
+ * * array('eventName' => array('methodName', $priority))
41
+ * * array('eventName' => array(array('methodName1', $priority), array('methodName2'))
42
+ *
43
+ * @return array The event names to listen to
44
+ *
45
+ * @api
46
+ */
47
+ public static function getSubscribedEvents();
48
+ }
version CHANGED
@@ -1,2 +1,2 @@
1
- 3.9.30
2
- 2014-11-24 00:00:00
1
+ 4.0.1
2
+ 2015-01-18 00:00:00