PageRenderTime 55ms CodeModel.GetById 24ms RepoModel.GetById 1ms app.codeStats 0ms

/content/plugins/w3-total-cache/ConfigCompiler.php

https://gitlab.com/karlen/ayo_wp
PHP | 396 lines | 270 code | 78 blank | 48 comment | 58 complexity | 730dbcd941098310127d5e0df4b2c0d9 MD5 | raw file
  1. <?php
  2. namespace W3TC;
  3. class ConfigCompiler {
  4. private $_blog_id;
  5. private $_preview;
  6. private $_data;
  7. private $_keys;
  8. /**
  9. * Returns true is key is not modifiable anymore
  10. * Placed here to limit class loading
  11. *
  12. * @return bool
  13. */
  14. static public function child_key_sealed( $key, $master_data, $child_data ) {
  15. if ( isset( $master_data['common.force_master'] ) &&
  16. (boolean)$master_data['common.force_master'] )
  17. return true;
  18. // affects rules which are global, not possible to overload
  19. if ( $key == 'pgcache.engine' &&
  20. ( $master_data['pgcache.engine'] == 'file_generic' ) )
  21. return true;
  22. if ( in_array( $key, array(
  23. 'minify.rewrite',
  24. 'browsercache.rewrite',
  25. 'version' ) ) )
  26. return true;
  27. include W3TC_DIR . '/ConfigKeys.php';
  28. // key which marks overloads is always editable
  29. $overloads_postfix = '.configuration_overloaded';
  30. // extension settings sealing
  31. // e.g. array('newrelic' , '...') is controlled
  32. // by 'newrelic.configuration_overloaded']
  33. $block_key = ( is_array( $key ) ? $key[0] : $key );
  34. if ( isset( $child_data[$block_key] ) &&
  35. isset( $child_data[$block_key . $overloads_postfix] ) &&
  36. (boolean)$child_data[$block_key . $overloads_postfix] )
  37. return false;
  38. if ( !is_array( $key ) ) {
  39. if ( substr( $key, strlen( $key ) - strlen( $overloads_postfix ),
  40. strlen( $overloads_postfix ) ) == $overloads_postfix )
  41. return false;
  42. // default sealing
  43. foreach ( $overloading_keys_scope as $i ) {
  44. $overloading_key = $i['key'];
  45. // check if this key is allowed by overloading-mark key
  46. if ( substr( $key, 0, strlen( $i['prefix'] ) ) == $i['prefix'] ) {
  47. if ( !isset( $child_data[$overloading_key] ) )
  48. return true;
  49. if ( (boolean)$child_data[$overloading_key] )
  50. return false;
  51. }
  52. }
  53. }
  54. return true;
  55. }
  56. /**
  57. * Reads config from file and returns it's content as array (or null)
  58. * Stored in this class to limit class loading
  59. */
  60. static private function util_array_from_file_legacy( $filename ) {
  61. if ( file_exists( $filename ) && is_readable( $filename ) ) {
  62. // including file directly instead of read+eval causes constant
  63. // problems with APC, ZendCache, and WSOD in a case of
  64. // broken config file
  65. $content = @file_get_contents( $filename );
  66. $config = @eval( substr( $content, 5 ) );
  67. if ( is_array( $config ) )
  68. return $config;
  69. }
  70. return null;
  71. }
  72. public function __construct( $blog_id, $preview ) {
  73. $this->_blog_id = $blog_id;
  74. $this->_preview = $preview;
  75. include W3TC_DIR . '/ConfigKeys.php';
  76. $this->_keys = $keys;
  77. // move _date to initial state
  78. foreach ( $this->_keys as $key => $value )
  79. $this->_data[$key] = $value['default'];
  80. $this->_data['version'] = W3TC_VERSION;
  81. }
  82. public function load() {
  83. // apply data from master config
  84. $master_filename = Config::util_config_filename( 0, $this->_preview );
  85. $data = Config::util_array_from_file( $master_filename );
  86. if ( is_null( $data ) && $this->_preview ) {
  87. // try to read production data when preview not available
  88. $master_filename = Config::util_config_filename( 0, false );
  89. $data = Config::util_array_from_file( $master_filename );
  90. }
  91. // try to get legacy data
  92. if ( is_null( $data ) ) {
  93. $master_filename = Config::util_config_filename_legacy( 0,
  94. $this->_preview );
  95. $data = self::util_array_from_file_legacy( $master_filename );
  96. }
  97. if ( is_array( $data ) ) {
  98. $data = $this->upgrade( $data );
  99. foreach ( $data as $key => $value )
  100. $this->_data[$key] = $value;
  101. }
  102. if ( $this->is_master() )
  103. return;
  104. // apply child config
  105. $child_filename = Config::util_config_filename( $this->_blog_id,
  106. $this->_preview );
  107. $data = Config::util_array_from_file( $child_filename );
  108. if ( is_null( $data ) && $this->_preview ) {
  109. // try to read production data when preview not available
  110. $child_filename = Config::util_config_filename( $this->_blog_id,
  111. false );
  112. $data = Config::util_array_from_file( $child_filename );
  113. }
  114. // try to get legacy data
  115. if ( is_null( $data ) ) {
  116. $child_filename = Config::util_config_filename_legacy(
  117. $this->_blog_id, $this->_preview );
  118. $data = self::util_array_from_file_legacy( $child_filename );
  119. }
  120. if ( is_array( $data ) ) {
  121. $data = $this->upgrade( $data );
  122. foreach ( $data as $key => $value ) {
  123. if ( !ConfigCompiler::child_key_sealed( $key, $this->_data, $data ) )
  124. $this->_data[$key] = $value;
  125. }
  126. }
  127. }
  128. public function apply_data( $data ) {
  129. foreach ( $data as $key => $value )
  130. $this->_data[$key] = $value;
  131. }
  132. public function get_data() {
  133. return $this->_data;
  134. }
  135. public function save() {
  136. $data = array(
  137. 'version' => $this->_data['version']
  138. );
  139. if ( $this->is_master() ) {
  140. foreach ( $this->_data as $key => $value )
  141. $data[$key] = $this->_data[$key];
  142. } else {
  143. // write only overwrited keys
  144. $master = new ConfigCompiler( 0, $this->_preview );
  145. $master->load();
  146. foreach ( $this->_data as $key => $value ) {
  147. if ( !ConfigCompiler::child_key_sealed( $key, $master->_data,
  148. $this->_data ) )
  149. $data[$key] = $this->_data[$key];
  150. }
  151. }
  152. $filename = Config::util_config_filename( $this->_blog_id,
  153. $this->_preview );
  154. if ( defined( 'JSON_PRETTY_PRINT' ) )
  155. $config = json_encode( $data, JSON_PRETTY_PRINT );
  156. else // for older php versions
  157. $config = json_encode( $data );
  158. Util_File::file_put_contents_atomic( $filename, $config );
  159. }
  160. /**
  161. * Returns true if we edit master config
  162. *
  163. * @return boolean
  164. */
  165. private function is_master() {
  166. return $this->_blog_id <= 0;
  167. }
  168. /**
  169. * Apply new default values when version changes
  170. */
  171. private function upgrade( $file_data ) {
  172. if ( !isset( $file_data['version'] ) )
  173. $file_data['version'] = '0.0.0';
  174. if ( !function_exists( 'bb2_start' ) ) {
  175. $file_data['pgcache.bad_behavior_path'] = '';
  176. } else {
  177. if ( file_exists( WP_PLUGIN_DIR . '/bad-behavior/bad-behavior-generic.php' ) ) {
  178. $bb_file = WP_PLUGIN_DIR . '/bad-behavior/bad-behavior-generic.php';
  179. } elseif ( file_exists( WP_PLUGIN_DIR . '/Bad-Behavior/bad-behavior-generic.php' ) ) {
  180. $bb_file = WP_PLUGIN_DIR . '/Bad-Behavior/bad-behavior-generic.php';
  181. } else {
  182. $bb_file = false;
  183. }
  184. if ( $bb_file ) {
  185. $file_data['pgcache.bad_behavior_path'] = $bb_file;
  186. }
  187. }
  188. //
  189. // changes in 0.9.5
  190. //
  191. if ( !isset( $file_data['extensions.active_frontend'] ) ||
  192. !is_array( $file_data['extensions.active_frontend'] ) )
  193. $file_data['extensions.active_frontend'] = array();
  194. if ( version_compare( $file_data['version'], '0.9.5', '<' ) ) {
  195. // dont show minify tips if already enabled
  196. if ( isset( $file_data['minify.enabled'] ) &&
  197. $file_data['minify.enabled'] == 'true' &&
  198. function_exists( 'get_option' ) ) {
  199. $cs = Dispatcher::config_state();
  200. $cs->set( 'minify.hide_minify_help', true );
  201. $cs->save();
  202. }
  203. $file_data['pgcache.mirrors.enabled'] = true;
  204. // map regions in rackspace
  205. if ( isset( $file_data['cdn.rscf.location'] ) ) {
  206. if ( $file_data['cdn.rscf.location'] == 'uk' )
  207. $file_data['cdn.rscf.location'] = 'LON';
  208. if ( $file_data['cdn.rscf.location'] == 'us' )
  209. $file_data['cdn.rscf.location'] = 'ORD';
  210. }
  211. // change filenames
  212. $active = array();
  213. if ( isset( $file_data['extensions.active'] ) &&
  214. is_array( $file_data['extensions.active'] ) ) {
  215. if ( isset( $file_data['extensions.active']['cloudflare'] ) )
  216. $active['cloudflare'] = 'w3-total-cache/Extension_CloudFlare_Plugin.php';
  217. if ( isset( $file_data['extensions.active']['feedburner'] ) )
  218. $active['feedburner'] = 'w3-total-cache/Extension_FeedBurner_Plugin.php';
  219. if ( isset( $file_data['extensions.active']['genesis.theme'] ) )
  220. $active['genesis.theme'] = 'w3-total-cache/Extension_Genesis_Plugin.php';
  221. if ( isset( $file_data['extensions.active']['wordpress-seo'] ) )
  222. $active['wordpress-seo'] = 'w3-total-cache/Extension_WordPressSeo_Plugin.php';
  223. }
  224. $file_data['extensions.active'] = $active;
  225. $active_frontend = array();
  226. foreach ( $active as $key => $value )
  227. $active_frontend[$key] = '*';
  228. $file_data['extensions.active_frontend'] = $active_frontend;
  229. // keep those active by default
  230. $file_data['extensions.active']['newrelic'] =
  231. 'w3-total-cache/Extension_NewRelic_Plugin.php';
  232. $file_data['extensions.active']['fragmentcache'] =
  233. 'w3-total-cache/Extension_FragmentCache_Plugin.php';
  234. }
  235. // newrelic settings - migrate to extension
  236. if ( isset( $file_data['newrelic.enabled'] ) &&
  237. $file_data['newrelic.enabled'] ) {
  238. // make new relic extension enabled
  239. if ( !isset( $file_data['extensions.active_frontend']['newrelic'] ) )
  240. $file_data['extensions.active_frontend']['newrelic'] ='*';
  241. }
  242. if ( !isset( $file_data['newrelic'] ) ||
  243. !is_array( $file_data['newrelic'] ) )
  244. $file_data['newrelic'] = array(
  245. 'monitoring_type' => 'apm'
  246. );
  247. $this->_set_if_exists( $file_data, 'newrelic.api_key',
  248. 'newrelic', 'api_key' );
  249. $this->_set_if_exists( $file_data, 'newrelic.appname',
  250. 'newrelic', 'apm.application_name' );
  251. $this->_set_if_exists( $file_data, 'newrelic.accept.logged_roles',
  252. 'newrelic', 'accept.logged_roles' );
  253. $this->_set_if_exists( $file_data, 'newrelic.accept.roles',
  254. 'newrelic', 'accept.roles' );
  255. $this->_set_if_exists( $file_data, 'newrelic.use_php_function',
  256. 'newrelic', 'use_php_function' );
  257. $this->_set_if_exists( $file_data, 'newrelic.cache_time',
  258. 'newrelic', 'cache_time' );
  259. $this->_set_if_exists( $file_data, 'newrelic.enable_xmit',
  260. 'newrelic', 'enable_xmit' );
  261. $this->_set_if_exists( $file_data, 'newrelic.include_rum',
  262. 'newrelic', 'include_rum' );
  263. // extensions - kept in separate key now
  264. $this->_set_if_exists_extension( $file_data, 'cloudflare' );
  265. $this->_set_if_exists_extension( $file_data, 'genesis.theme' );
  266. $this->_set_if_exists_extension( $file_data, 'feedburner' );
  267. // fragmentcache to extension
  268. if ( isset( $file_data['fragmentcache.enabled'] ) &&
  269. $file_data['fragmentcache.enabled'] ) {
  270. // make new relic extension enabled
  271. if ( !isset( $file_data['extensions.active_frontend']['fragmentcache'] ) )
  272. $file_data['extensions.active_frontend']['fragmentcache'] = '*';
  273. }
  274. $this->_set_if_exists( $file_data, 'fragmentcache.debug',
  275. 'fragmentcache', 'debug' );
  276. $this->_set_if_exists( $file_data, 'fragmentcache.engine',
  277. 'fragmentcache', 'engine' );
  278. $this->_set_if_exists( $file_data, 'fragmentcache.file.gc',
  279. 'fragmentcache', 'file.gc' );
  280. $this->_set_if_exists( $file_data, 'fragmentcache.file.locking',
  281. 'fragmentcache', 'file.locking' );
  282. $this->_set_if_exists( $file_data, 'fragmentcache.memcached.servers',
  283. 'fragmentcache', 'memcached.servers' );
  284. $this->_set_if_exists( $file_data, 'fragmentcache.memcached.persistent',
  285. 'fragmentcache', 'memcached.persistent' );
  286. $this->_set_if_exists( $file_data, 'fragmentcache.memcached.aws_autodiscovery',
  287. 'fragmentcache', 'memcached.aws_autodiscovery' );
  288. $this->_set_if_exists( $file_data, 'fragmentcache.memcached.username',
  289. 'fragmentcache', 'memcached.username' );
  290. $this->_set_if_exists( $file_data, 'fragmentcache.memcached.password',
  291. 'fragmentcache', 'memcached.password' );
  292. $this->_set_if_exists( $file_data, 'fragmentcache.redis.persistent',
  293. 'fragmentcache', 'redis.persistent' );
  294. $this->_set_if_exists( $file_data, 'fragmentcache.redis.servers',
  295. 'fragmentcache', 'redis.servers' );
  296. $this->_set_if_exists( $file_data, 'fragmentcache.redis.password',
  297. 'fragmentcache', 'redis.password' );
  298. $this->_set_if_exists( $file_data, 'fragmentcache.redis.dbid',
  299. 'fragmentcache', 'redis.dbid' );
  300. $this->_set_if_exists( $file_data, 'fragmentcache.lifetime',
  301. 'fragmentcache', 'lifetime' );
  302. $file_data['version'] = W3TC_VERSION;
  303. return $file_data;
  304. }
  305. private function _set_if_exists_extension( &$a, $extension ) {
  306. if ( isset( $a['extensions.settings'] ) &&
  307. isset( $a['extensions.settings'][$extension] ) ) {
  308. $a[$extension] = $a['extensions.settings'][$extension];
  309. unset( $a['extensions.settings'][$extension] );
  310. }
  311. }
  312. private function _set_if_exists( &$a, $old_key, $new_key0, $new_key1 ) {
  313. if ( isset( $a[$old_key] ) ) {
  314. $a[$new_key0][$new_key1] = $a[$old_key];
  315. unset( $a[$old_key] );
  316. }
  317. }
  318. }