From fb55c027bd530cf18b1e4ae902bdeb8e5729f72f Mon Sep 17 00:00:00 2001 From: Brian Kelleher Date: Thu, 24 Mar 2016 20:55:50 -0400 Subject: [PATCH] github updater, wp-sync-db and sync-media, search-replace plugins --- .../plugins/better-search-replace/LICENSE.txt | 674 +++++ .../plugins/better-search-replace/README.md | 137 + .../plugins/better-search-replace/README.txt | 175 ++ .../assets/css/better-search-replace.css | 22 + .../ui-bg_diagonals-thick_18_b81900_40x40.png | Bin 0 -> 418 bytes .../ui-bg_diagonals-thick_20_666666_40x40.png | Bin 0 -> 312 bytes .../images/ui-bg_flat_10_000000_40x100.png | Bin 0 -> 205 bytes .../images/ui-bg_glass_100_f6f6f6_1x400.png | Bin 0 -> 262 bytes .../images/ui-bg_glass_100_fdf5ce_1x400.png | Bin 0 -> 348 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 207 bytes .../ui-bg_gloss-wave_35_f6a828_500x100.png | Bin 0 -> 5815 bytes .../ui-bg_highlight-soft_100_eeeeee_1x100.png | Bin 0 -> 278 bytes .../ui-bg_highlight-soft_75_ffe45c_1x100.png | Bin 0 -> 328 bytes .../css/images/ui-icons_222222_256x240.png | Bin 0 -> 6922 bytes .../css/images/ui-icons_228ef1_256x240.png | Bin 0 -> 4549 bytes .../css/images/ui-icons_ef8c08_256x240.png | Bin 0 -> 4549 bytes .../css/images/ui-icons_ffd27a_256x240.png | Bin 0 -> 4549 bytes .../css/images/ui-icons_ffffff_256x240.png | Bin 0 -> 6299 bytes .../assets/css/jquery-ui.min.css | 7 + .../assets/img/sidebar-upgrade.png | Bin 0 -> 26890 bytes .../better-search-replace/assets/index.php | 1 + .../assets/js/better-search-replace.js | 132 + .../assets/js/better-search-replace.min.js | 1 + .../better-search-replace.php | 84 + .../includes/class-bsr-admin.php | 295 ++ .../includes/class-bsr-ajax.php | 244 ++ .../includes/class-bsr-compatibility.php | 98 + .../includes/class-bsr-db.php | 406 +++ .../includes/class-bsr-i18n.php | 55 + .../includes/class-bsr-loader.php | 132 + .../includes/class-bsr-main.php | 164 ++ .../better-search-replace/includes/index.php | 1 + .../plugins/better-search-replace/index.php | 1 + .../languages/better-search-replace-de_DE.mo | Bin 0 -> 7400 bytes .../languages/better-search-replace-de_DE.po | 204 ++ .../languages/better-search-replace-es_ES.mo | Bin 0 -> 4456 bytes .../languages/better-search-replace-es_ES.po | 136 + .../languages/better-search-replace-fr_FR.mo | Bin 0 -> 4658 bytes .../languages/better-search-replace-fr_FR.po | 145 + .../languages/better-search-replace.pot | 252 ++ .../templates/bsr-dashboard.php | 94 + .../templates/bsr-help.php | 30 + .../templates/bsr-search-replace.php | 81 + .../templates/bsr-settings.php | 40 + .../plugins/github-updater/CHANGES.md | 519 ++++ www/wp-content/plugins/github-updater/LICENSE | 339 +++ .../plugins/github-updater/README.md | 370 +++ .../assets/GitHub_Updater_logo.png | Bin 0 -> 11171 bytes .../assets/GitHub_Updater_logo_small.png | Bin 0 -> 5237 bytes .../github-updater/assets/screenshot-1.png | Bin 0 -> 39255 bytes .../github-updater/assets/screenshot-2.png | Bin 0 -> 74131 bytes .../github-updater/assets/screenshot-3.png | Bin 0 -> 16421 bytes .../plugins/github-updater/github-updater.php | 67 + .../plugins/github-updater/js/ghu_install.js | 32 + .../languages/github-updater-ar.mo | Bin 0 -> 4545 bytes .../languages/github-updater-ar.po | 429 +++ .../languages/github-updater-bg_BG.mo | Bin 0 -> 9424 bytes .../languages/github-updater-bg_BG.po | 372 +++ .../languages/github-updater-de_AT.mo | Bin 0 -> 7369 bytes .../languages/github-updater-de_AT.po | 417 +++ .../languages/github-updater-de_CH.mo | Bin 0 -> 7369 bytes .../languages/github-updater-de_CH.po | 417 +++ .../languages/github-updater-de_DE.mo | Bin 0 -> 7369 bytes .../languages/github-updater-de_DE.po | 417 +++ .../languages/github-updater-es_ES.mo | Bin 0 -> 4266 bytes .../languages/github-updater-es_ES.po | 408 +++ .../languages/github-updater-fr_FR.mo | Bin 0 -> 4415 bytes .../languages/github-updater-fr_FR.po | 448 +++ .../languages/github-updater-it.mo | Bin 0 -> 4125 bytes .../languages/github-updater-it.po | 461 +++ .../languages/github-updater-ja.mo | Bin 0 -> 6253 bytes .../languages/github-updater-ja.po | 400 +++ .../languages/github-updater-pt_BR.mo | Bin 0 -> 2975 bytes .../languages/github-updater-pt_BR.po | 430 +++ .../languages/github-updater-pt_PT.mo | Bin 0 -> 8116 bytes .../languages/github-updater-pt_PT.po | 367 +++ .../languages/github-updater-ro_RO.mo | Bin 0 -> 7826 bytes .../languages/github-updater-ro_RO.po | 399 +++ .../languages/github-updater-ru_RU.mo | Bin 0 -> 3992 bytes .../languages/github-updater-ru_RU.po | 377 +++ .../languages/github-updater-sv_SE.mo | Bin 0 -> 3255 bytes .../languages/github-updater-sv_SE.po | 419 +++ .../languages/github-updater-uk.mo | Bin 0 -> 3574 bytes .../languages/github-updater-uk.po | 421 +++ .../languages/github-updater.pot | 342 +++ .../plugins/github-updater/mu/ghu-loader.php | 83 + .../plugins/github-updater/readme.txt | 85 + .../github-updater/src/GitHub_Updater/API.php | 262 ++ .../src/GitHub_Updater/Additions.php | 127 + .../src/GitHub_Updater/Autoloader.php | 84 + .../src/GitHub_Updater/Base.php | 930 ++++++ .../src/GitHub_Updater/Bitbucket_API.php | 425 +++ .../src/GitHub_Updater/GitHub_API.php | 412 +++ .../src/GitHub_Updater/GitLab_API.php | 463 +++ .../src/GitHub_Updater/Install.php | 459 +++ .../src/GitHub_Updater/Messages.php | 144 + .../src/GitHub_Updater/Plugin.php | 502 ++++ .../src/GitHub_Updater/Readme_Parser.php | 83 + .../src/GitHub_Updater/Settings.php | 702 +++++ .../src/GitHub_Updater/Theme.php | 686 +++++ .../plugins/github-updater/uninstall.php | 35 + .../github-updater/vendor/parse-readme.php | 339 +++ .../vendor/parsedown/LICENSE.txt | 20 + .../vendor/parsedown/Parsedown.php | 1528 ++++++++++ .../github-updater/vendor/parsedown/README.md | 57 + .../vendor/wp-update-php/LICENSE | 339 +++ .../vendor/wp-update-php/README.md | 61 + .../vendor/wp-update-php/src/WPUpdatePhp.php | 148 + .../wp-sync-db-media-files/.editorconfig | 12 + .../plugins/wp-sync-db-media-files/.gitignore | 13 + .../plugins/wp-sync-db-media-files/LICENSE | 339 +++ .../plugins/wp-sync-db-media-files/README.md | 4 + .../wp-sync-db-media-files/asset/js/script.js | 302 ++ .../class/wpsdb-media-files.php | 677 +++++ .../wp-sync-db-media-files/composer.json | 11 + .../wp-migrate-db-pro-media-files-en.pot | 85 + .../template/migrate.php | 23 + .../wp-sync-db-media-files/version.php | 2 + .../wp-sync-db-media-files.php | 32 + .../plugins/wp-sync-db/.editorconfig | 12 + www/wp-content/plugins/wp-sync-db/.gitignore | 1 + www/wp-content/plugins/wp-sync-db/LICENSE | 339 +++ www/wp-content/plugins/wp-sync-db/README.md | 75 + .../plugins/wp-sync-db/asset/css/styles.css | 1272 +++++++++ .../plugins/wp-sync-db/asset/js/common.js | 39 + .../plugins/wp-sync-db/asset/js/hook.js | 68 + .../plugins/wp-sync-db/asset/js/script.js | 2317 +++++++++++++++ .../plugins/wp-sync-db/class/wpsdb-addon.php | 63 + .../plugins/wp-sync-db/class/wpsdb-base.php | 399 +++ .../plugins/wp-sync-db/class/wpsdb.php | 2521 +++++++++++++++++ .../wp-sync-db-compatibility.php | 50 + .../wp-sync-db/languages/wp-sync-db-en.pot | 1085 +++++++ .../plugins/wp-sync-db/template/help.php | 48 + .../wp-sync-db/template/migrate-progress.php | 23 + .../plugins/wp-sync-db/template/migrate.php | 471 +++ .../plugins/wp-sync-db/template/profile.php | 9 + .../plugins/wp-sync-db/template/settings.php | 96 + .../plugins/wp-sync-db/wp-sync-db.php | 46 + 138 files changed, 29870 insertions(+) create mode 100755 www/wp-content/plugins/better-search-replace/LICENSE.txt create mode 100644 www/wp-content/plugins/better-search-replace/README.md create mode 100755 www/wp-content/plugins/better-search-replace/README.txt create mode 100755 www/wp-content/plugins/better-search-replace/assets/css/better-search-replace.css create mode 100755 www/wp-content/plugins/better-search-replace/assets/css/images/ui-bg_diagonals-thick_18_b81900_40x40.png create mode 100755 www/wp-content/plugins/better-search-replace/assets/css/images/ui-bg_diagonals-thick_20_666666_40x40.png create mode 100755 www/wp-content/plugins/better-search-replace/assets/css/images/ui-bg_flat_10_000000_40x100.png create mode 100755 www/wp-content/plugins/better-search-replace/assets/css/images/ui-bg_glass_100_f6f6f6_1x400.png create mode 100755 www/wp-content/plugins/better-search-replace/assets/css/images/ui-bg_glass_100_fdf5ce_1x400.png create mode 100755 www/wp-content/plugins/better-search-replace/assets/css/images/ui-bg_glass_65_ffffff_1x400.png create mode 100755 www/wp-content/plugins/better-search-replace/assets/css/images/ui-bg_gloss-wave_35_f6a828_500x100.png create mode 100755 www/wp-content/plugins/better-search-replace/assets/css/images/ui-bg_highlight-soft_100_eeeeee_1x100.png create mode 100755 www/wp-content/plugins/better-search-replace/assets/css/images/ui-bg_highlight-soft_75_ffe45c_1x100.png create mode 100755 www/wp-content/plugins/better-search-replace/assets/css/images/ui-icons_222222_256x240.png create mode 100755 www/wp-content/plugins/better-search-replace/assets/css/images/ui-icons_228ef1_256x240.png create mode 100755 www/wp-content/plugins/better-search-replace/assets/css/images/ui-icons_ef8c08_256x240.png create mode 100755 www/wp-content/plugins/better-search-replace/assets/css/images/ui-icons_ffd27a_256x240.png create mode 100755 www/wp-content/plugins/better-search-replace/assets/css/images/ui-icons_ffffff_256x240.png create mode 100755 www/wp-content/plugins/better-search-replace/assets/css/jquery-ui.min.css create mode 100644 www/wp-content/plugins/better-search-replace/assets/img/sidebar-upgrade.png create mode 100755 www/wp-content/plugins/better-search-replace/assets/index.php create mode 100644 www/wp-content/plugins/better-search-replace/assets/js/better-search-replace.js create mode 100644 www/wp-content/plugins/better-search-replace/assets/js/better-search-replace.min.js create mode 100755 www/wp-content/plugins/better-search-replace/better-search-replace.php create mode 100755 www/wp-content/plugins/better-search-replace/includes/class-bsr-admin.php create mode 100644 www/wp-content/plugins/better-search-replace/includes/class-bsr-ajax.php create mode 100644 www/wp-content/plugins/better-search-replace/includes/class-bsr-compatibility.php create mode 100644 www/wp-content/plugins/better-search-replace/includes/class-bsr-db.php create mode 100755 www/wp-content/plugins/better-search-replace/includes/class-bsr-i18n.php create mode 100755 www/wp-content/plugins/better-search-replace/includes/class-bsr-loader.php create mode 100755 www/wp-content/plugins/better-search-replace/includes/class-bsr-main.php create mode 100755 www/wp-content/plugins/better-search-replace/includes/index.php create mode 100755 www/wp-content/plugins/better-search-replace/index.php create mode 100644 www/wp-content/plugins/better-search-replace/languages/better-search-replace-de_DE.mo create mode 100644 www/wp-content/plugins/better-search-replace/languages/better-search-replace-de_DE.po create mode 100755 www/wp-content/plugins/better-search-replace/languages/better-search-replace-es_ES.mo create mode 100755 www/wp-content/plugins/better-search-replace/languages/better-search-replace-es_ES.po create mode 100755 www/wp-content/plugins/better-search-replace/languages/better-search-replace-fr_FR.mo create mode 100755 www/wp-content/plugins/better-search-replace/languages/better-search-replace-fr_FR.po create mode 100755 www/wp-content/plugins/better-search-replace/languages/better-search-replace.pot create mode 100644 www/wp-content/plugins/better-search-replace/templates/bsr-dashboard.php create mode 100644 www/wp-content/plugins/better-search-replace/templates/bsr-help.php create mode 100644 www/wp-content/plugins/better-search-replace/templates/bsr-search-replace.php create mode 100644 www/wp-content/plugins/better-search-replace/templates/bsr-settings.php create mode 100755 www/wp-content/plugins/github-updater/CHANGES.md create mode 100755 www/wp-content/plugins/github-updater/LICENSE create mode 100755 www/wp-content/plugins/github-updater/README.md create mode 100755 www/wp-content/plugins/github-updater/assets/GitHub_Updater_logo.png create mode 100755 www/wp-content/plugins/github-updater/assets/GitHub_Updater_logo_small.png create mode 100755 www/wp-content/plugins/github-updater/assets/screenshot-1.png create mode 100755 www/wp-content/plugins/github-updater/assets/screenshot-2.png create mode 100755 www/wp-content/plugins/github-updater/assets/screenshot-3.png create mode 100755 www/wp-content/plugins/github-updater/github-updater.php create mode 100755 www/wp-content/plugins/github-updater/js/ghu_install.js create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-ar.mo create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-ar.po create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-bg_BG.mo create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-bg_BG.po create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-de_AT.mo create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-de_AT.po create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-de_CH.mo create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-de_CH.po create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-de_DE.mo create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-de_DE.po create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-es_ES.mo create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-es_ES.po create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-fr_FR.mo create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-fr_FR.po create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-it.mo create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-it.po create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-ja.mo create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-ja.po create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-pt_BR.mo create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-pt_BR.po create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-pt_PT.mo create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-pt_PT.po create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-ro_RO.mo create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-ro_RO.po create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-ru_RU.mo create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-ru_RU.po create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-sv_SE.mo create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-sv_SE.po create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-uk.mo create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater-uk.po create mode 100755 www/wp-content/plugins/github-updater/languages/github-updater.pot create mode 100755 www/wp-content/plugins/github-updater/mu/ghu-loader.php create mode 100755 www/wp-content/plugins/github-updater/readme.txt create mode 100755 www/wp-content/plugins/github-updater/src/GitHub_Updater/API.php create mode 100755 www/wp-content/plugins/github-updater/src/GitHub_Updater/Additions.php create mode 100755 www/wp-content/plugins/github-updater/src/GitHub_Updater/Autoloader.php create mode 100755 www/wp-content/plugins/github-updater/src/GitHub_Updater/Base.php create mode 100755 www/wp-content/plugins/github-updater/src/GitHub_Updater/Bitbucket_API.php create mode 100755 www/wp-content/plugins/github-updater/src/GitHub_Updater/GitHub_API.php create mode 100755 www/wp-content/plugins/github-updater/src/GitHub_Updater/GitLab_API.php create mode 100755 www/wp-content/plugins/github-updater/src/GitHub_Updater/Install.php create mode 100755 www/wp-content/plugins/github-updater/src/GitHub_Updater/Messages.php create mode 100755 www/wp-content/plugins/github-updater/src/GitHub_Updater/Plugin.php create mode 100755 www/wp-content/plugins/github-updater/src/GitHub_Updater/Readme_Parser.php create mode 100755 www/wp-content/plugins/github-updater/src/GitHub_Updater/Settings.php create mode 100755 www/wp-content/plugins/github-updater/src/GitHub_Updater/Theme.php create mode 100755 www/wp-content/plugins/github-updater/uninstall.php create mode 100755 www/wp-content/plugins/github-updater/vendor/parse-readme.php create mode 100755 www/wp-content/plugins/github-updater/vendor/parsedown/LICENSE.txt create mode 100755 www/wp-content/plugins/github-updater/vendor/parsedown/Parsedown.php create mode 100755 www/wp-content/plugins/github-updater/vendor/parsedown/README.md create mode 100755 www/wp-content/plugins/github-updater/vendor/wp-update-php/LICENSE create mode 100755 www/wp-content/plugins/github-updater/vendor/wp-update-php/README.md create mode 100755 www/wp-content/plugins/github-updater/vendor/wp-update-php/src/WPUpdatePhp.php create mode 100755 www/wp-content/plugins/wp-sync-db-media-files/.editorconfig create mode 100755 www/wp-content/plugins/wp-sync-db-media-files/.gitignore create mode 100755 www/wp-content/plugins/wp-sync-db-media-files/LICENSE create mode 100755 www/wp-content/plugins/wp-sync-db-media-files/README.md create mode 100755 www/wp-content/plugins/wp-sync-db-media-files/asset/js/script.js create mode 100755 www/wp-content/plugins/wp-sync-db-media-files/class/wpsdb-media-files.php create mode 100755 www/wp-content/plugins/wp-sync-db-media-files/composer.json create mode 100755 www/wp-content/plugins/wp-sync-db-media-files/languages/wp-migrate-db-pro-media-files-en.pot create mode 100755 www/wp-content/plugins/wp-sync-db-media-files/template/migrate.php create mode 100755 www/wp-content/plugins/wp-sync-db-media-files/version.php create mode 100755 www/wp-content/plugins/wp-sync-db-media-files/wp-sync-db-media-files.php create mode 100755 www/wp-content/plugins/wp-sync-db/.editorconfig create mode 100755 www/wp-content/plugins/wp-sync-db/.gitignore create mode 100755 www/wp-content/plugins/wp-sync-db/LICENSE create mode 100755 www/wp-content/plugins/wp-sync-db/README.md create mode 100755 www/wp-content/plugins/wp-sync-db/asset/css/styles.css create mode 100755 www/wp-content/plugins/wp-sync-db/asset/js/common.js create mode 100755 www/wp-content/plugins/wp-sync-db/asset/js/hook.js create mode 100755 www/wp-content/plugins/wp-sync-db/asset/js/script.js create mode 100755 www/wp-content/plugins/wp-sync-db/class/wpsdb-addon.php create mode 100755 www/wp-content/plugins/wp-sync-db/class/wpsdb-base.php create mode 100755 www/wp-content/plugins/wp-sync-db/class/wpsdb.php create mode 100755 www/wp-content/plugins/wp-sync-db/compatibility/wp-sync-db-compatibility.php create mode 100755 www/wp-content/plugins/wp-sync-db/languages/wp-sync-db-en.pot create mode 100755 www/wp-content/plugins/wp-sync-db/template/help.php create mode 100755 www/wp-content/plugins/wp-sync-db/template/migrate-progress.php create mode 100755 www/wp-content/plugins/wp-sync-db/template/migrate.php create mode 100755 www/wp-content/plugins/wp-sync-db/template/profile.php create mode 100755 www/wp-content/plugins/wp-sync-db/template/settings.php create mode 100755 www/wp-content/plugins/wp-sync-db/wp-sync-db.php diff --git a/www/wp-content/plugins/better-search-replace/LICENSE.txt b/www/wp-content/plugins/better-search-replace/LICENSE.txt new file mode 100755 index 0000000..20d40b6 --- /dev/null +++ b/www/wp-content/plugins/better-search-replace/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program 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. + + This program 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. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/www/wp-content/plugins/better-search-replace/README.md b/www/wp-content/plugins/better-search-replace/README.md new file mode 100644 index 0000000..3643d60 --- /dev/null +++ b/www/wp-content/plugins/better-search-replace/README.md @@ -0,0 +1,137 @@ +# Better Search Replace # +**Contributors:** ExpandedFronts + +**Tags:** search replace, update urls, database, search replace database, update database urls, update live url + +**Requires at least:** 3.0.1 + +**Tested up to:** 4.4 + +**Stable tag:** trunk + +**License:** GPLv3 or later + +**License URI:** http://www.gnu.org/licenses/gpl-3.0.html + + +A simple plugin for updating URLs or other text in a database. + +## Description ## + +When moving your WordPress site to a new domain or server, you will likely run into a need to run a search/replace on the database for everything to work correctly. Fortunately, there are several plugins available for this task, however, all have a different approach to a few key features. This plugin is an attempt to consolidate the best features from these plugins, incorporating the following features in one simple plugin: + +* Serialization support for all tables +* The ability to select specific tables +* The ability to run a "dry run" to see how many fields will be updated +* No server requirements aside from a running installation of WordPress +* WordPress Multisite support + +**Premium features available in the Pro version:** + +* View exactly what changed during a search/replace +* Backup and import the database while running a search/replace +* Priority email support from the developer of the plugin +* Save or load custom profiles for quickly repeating a search/replace in the future +* Support and updates for 1 year + +**[Learn more about Better Search Replace Pro](https://expandedfronts.com/products/better-search-replace-pro/)** + + +The search/replace functionality is heavily based on interconnect/it's great and open-source Search Replace DB script, modified to use WordPress native database functions to ensure compatibility. + +## Installation ## + +Install Better Search Replace like you would install any other WordPress plugin. + +Dashboard Method: + +1. Login to your WordPress admin and go to Plugins -> Add New +2. Type "Better Search Replace" in the search bar and select this plugin +3. Click "Install", and then "Activate Plugin" + + +Upload Method: + +1. Upload 'better-search-replace.php' to the '/wp-content/plugins/' directory +2. Activate the plugin through the 'Plugins' menu in WordPress + +## Changelog ## + +### 1.2.9 - December 8, 2015 ### +* Fix: Bug with case-insensitive searches in serialized objects +* Fix: Bug with early skip due to lack of primary key + +### 1.2.8 - November 25, 2015 ### +* Fix: Bug with report details + +### 1.2.7 - November 24, 2015 ### +* Fix: Untranslateable string +* Tweak: Check BSR_PATH instead of ABSPATH to be consistent +* Tested with 4.4 + +### 1.2.6 ### +* Removed unused code/small cleanup + +### 1.2.5 ### +* Improved progress bar info and styles +* Small cleanup + +### 1.2.4 ### +* Added "Settings saved" notice when saving settings +* Fixed bug with wp_magic_quotes interfering with some search strings + +### 1.2.3 ### +* Fixed bug with searching for backslashes +* Fixed potential bug with getting tables in large multisites +* Fixed potential notice in append_report +* Improved handling of missing primary keys + +### 1.2.2 ### +* Fixed AJAX conflict with WooCommerce +* Fixed a few issues with translations +* Tweaked "System Info" to use get_locale() instead of WP_LANG constant +* Updated German translation (props @Linus Ziegenhagen) + +### 1.2.1 ### +* Fixed minor issue with display of progress bar +* Updated translation file + +### 1.2 ### +* Switched to AJAX bulk processing for search/replaces +* Decreased minimum "Max Page Size" to 1000 +* Added "Help" tab with system info for easier troubleshooting + +### 1.1.1 ### +* Added ability to change max page size +* Decreased default page size to prevent white screen issue on some environments + +### 1.1 ### +* Added ability to change capability required to use plugin +* Small bugfixes and translation fixes + +### 1.0.6 ### +* Added table sizes to the database table listing +* Added French translation (props @Jean Philippe) + +### 1.0.5 ### +* Added support for case-insensitive searches +* Added German translation (props @Linus Ziegenhagen) + +### 1.0.4 ### +* Potential security fixes + +### 1.0.3 ### +* Fixed issue with searching for special characters like '\' +* Fixed bug with replacing some objects + +### 1.0.2 ### +* Fixed untranslateable strings on submit button and submenu page. + +### 1.0.1 ### +* Fixed issue with loading translations and added Spanish translation (props Eduardo Larequi) +* Fixed bug with reporting timing +* Updated to use "Dry Run" as default +* Added support for WordPress Multisite (see FAQs for more info) + +### 1.0 ### +* Initial release diff --git a/www/wp-content/plugins/better-search-replace/README.txt b/www/wp-content/plugins/better-search-replace/README.txt new file mode 100755 index 0000000..2e66698 --- /dev/null +++ b/www/wp-content/plugins/better-search-replace/README.txt @@ -0,0 +1,175 @@ +=== Better Search Replace === +Contributors: ExpandedFronts, mattshaw +Tags: search replace, search and replace, update urls, database, search replace database, update database urls, update live url, better search replace, search&replace +Requires at least: 3.0.1 +Tested up to: 4.4 +Stable tag: trunk +License: GPLv3 or later +License URI: http://www.gnu.org/licenses/gpl-3.0.html + +A simple plugin to update URLs or other text in a database. + +== Description == + +When moving your WordPress site to a new domain or server, you will likely run into a need to run a search/replace on the database for everything to work correctly. Fortunately, there are several plugins available for this task, however, all have a different approach to a few key features. This plugin consolidates the best features from these plugins, incorporating the following features in one simple plugin: + +* Serialization support for all tables +* The ability to select specific tables +* The ability to run a "dry run" to see how many fields will be updated +* No server requirements aside from a running installation of WordPress +* WordPress Multisite support + +> **Time-saving features available in the Pro version:** +> +> * View exactly what changed during a search/replace +> * Backup and import the database while running a search/replace +> * Priority email support from the developer of the plugin +> * Save or load custom profiles for quickly repeating a search/replace in the future +> * Support and updates for 1 year +> +> **[Learn more about Better Search Replace Pro](https://expandedfronts.com/products/better-search-replace-pro/)** + +The search and replace functionality is heavily based on interconnect/it's great and open-source Search Replace DB script, modified to use WordPress native database functions to ensure compatibility. + +**Supported Languages** + +* English +* French +* German +* Spanish + +**Want to contribute?** + +Feel free to open an issue or submit a pull request on [GitHub](https://github.com/ExpandedFronts/Better-Search-Replace). + +== Installation == + +Install Better Search Replace like you would install any other WordPress plugin. + +Dashboard Method: + +1. Login to your WordPress admin and go to Plugins -> Add New +2. Type "Better Search Replace" in the search bar and select this plugin +3. Click "Install", and then "Activate Plugin" + + +Upload Method: + +1. Unzip the plugin and upload the "better-search-replace" folder to your 'wp-content/plugins' directory +2. Activate the plugin through the Plugins menu in WordPress + +== Frequently Asked Questions == + += Using Better Search Replace = + +Once activated, Better Search Replace will add a page under the "Tools" menu page in your WordPress admin. + += Is my host supported? = + +Yes! This plugin should be compatible with any host. + += Can I damage my site with this plugin? = + +Yes! Entering a wrong search or replace string could damage your database. Because of this, it is always adviseable to have a backup of your database before using this plugin. + += How does this work on WordPress Multisite? = + +When running this plugin on a WordPress Multisite installation, it will only be loaded and visible for Network admins. Network admins can go to the dashboard of any subsite to run a search/replace on just the tables for that subsite, or go to the dashboard of the main/base site to run a search/replace on all tables. + += How can I use this plugin when changing URLs? = + +If you're moving your site from one server to another and changing the URL of your WordPress installation, the approach below allows you to do so easily without affecting the old site: + +1. Backup the database on your current site +2. Install the database on your new host +3. On the new host, define the new site URL in the `wp-config.php` file, as shown [here](http://codex.wordpress.org/Changing_The_Site_URL#Edit_wp-config.php) +4. Log in at your new admin URL and run Better Search Replace on the old site URL for the new site URL +5. Delete the site_url constant you added to `wp-config.php`. You may also need to regenerate your .htaccess by going to Settings -> Permalinks and saving the settings. + +More information on moving WordPress can be found [here](http://codex.wordpress.org/Moving_WordPress). + +== Screenshots == + +1. The Better Search Replace page added to the "Tools" menu +2. After running a search/replace dry-run. + +== Changelog == + += 1.2.9 - December 8, 2015 = +* Fix: Bug with case-insensitive searches in serialized objects +* Fix: Bug with early skip due to lack of primary key + += 1.2.8 - November 25, 2015 = +* Fix: Bug with report details + += 1.2.7 - November 24, 2015 = +* Fix: Untranslateable string +* Tweak: Check BSR_PATH instead of ABSPATH to be consistent +* Tested with 4.4 + += 1.2.6 = +* Removed unused code/small cleanup + += 1.2.5 = +* Improved progress bar info and styles +* Small cleanup + += 1.2.4 = +* Added "Settings saved" notice when saving settings +* Fixed bug with wp_magic_quotes interfering with some search strings + += 1.2.3 = +* Fixed bug with searching for backslashes +* Fixed potential bug with getting tables in large multisites +* Fixed potential notice in append_report +* Improved handling of missing primary keys + += 1.2.2 = +* Fixed AJAX conflict with WooCommerce +* Fixed a few issues with translations +* Tweaked "System Info" to use get_locale() instead of WP_LANG constant +* Updated German translation (props @Linus Ziegenhagen) + += 1.2.1 = +* Fixed minor issue with display of progress bar +* Updated translation file + += 1.2 = +* Switched to AJAX bulk processing for search/replaces +* Decreased minimum "Max Page Size" to 1000 +* Added "Help" tab with system info for easier troubleshooting + += 1.1.1 = +* Added ability to change max page size +* Decreased default page size to prevent white screen issue on some environments + += 1.1 = +* Added ability to change capability required to use plugin +* Small bugfixes and translation fixes + += 1.0.6 = +* Added table sizes to the database table listing +* Added French translation (props @Jean Philippe) + += 1.0.5 = +* Added support for case-insensitive searches +* Added German translation (props @Linus Ziegenhagen) + += 1.0.4 = +* Potential security fixes + += 1.0.3 = +* Fixed issue with searching for special characters like '\' +* Fixed bug with replacing some objects + += 1.0.2 = +* Fixed untranslateable strings on submit button and submenu page. + += 1.0.1 = +* Fixed issue with loading translations and added Spanish translation (props Eduardo Larequi) +* Fixed bug with reporting timing +* Updated to use "Dry Run" as default +* Added support for WordPress Multisite (see FAQs for more info) + += 1.0 = +* Initial release diff --git a/www/wp-content/plugins/better-search-replace/assets/css/better-search-replace.css b/www/wp-content/plugins/better-search-replace/assets/css/better-search-replace.css new file mode 100755 index 0000000..392c1c6 --- /dev/null +++ b/www/wp-content/plugins/better-search-replace/assets/css/better-search-replace.css @@ -0,0 +1,22 @@ +/** + * better-search-replace.css + * + * Custom CSS for the Better Search Replace administration page. + */ + +#bsr-results-table th { font-weight: bold; } +#bsr-results-table tbody tr:nth-child(odd) { background-color: #F9F9F9; } +.bsr-second, .bsr-third, .bsr-fourth { text-align: center !important; } +#bsr-details-view { table-layout: fixed; } +.bsr-old-val { background-color: #fdd; } +.bsr-new-val { background-color: #cfc; } +.bsr-change { width: 400px !important; } +.bsr-slider { width: 23em; } +.bsr-progress-wrap { width: 95%; height: 12px; background-color: #ddd; } +.bsr-progress { width: 0%; height: 100%; background-color: #0073aa; } +#bsr-search-replace-wrap { margin-top: 10px; } +.bsr-description { display: block; margin-top: 6px !important; color: #444 !important; } +#bsr-nav-tab-wrapper { margin-top: 0 !important; padding: 0 0 0 10px !important; font-size: 23px !important; } +#bsr-help-heading { font-size: 1.3em !important; padding: 0 !important; } +.bsr-processing-wrap { background: #f4f4f4; padding: 16px 16px 32px; overflow: auto; border-top: 1px solid #eae9e9; margin: 20px -12px -12px -12px; } +.bsr-spinner { margin: -3px 0 0 0; } diff --git a/www/wp-content/plugins/better-search-replace/assets/css/images/ui-bg_diagonals-thick_18_b81900_40x40.png b/www/wp-content/plugins/better-search-replace/assets/css/images/ui-bg_diagonals-thick_18_b81900_40x40.png new file mode 100755 index 0000000000000000000000000000000000000000..ed793737cc1d1383f3478faa1b9519c9f3318268 GIT binary patch literal 418 zcmeAS@N?(olHy`uVBq!ia0vp^8Xzpd1SErbK34)Mwj^(Nm;YeE8S(uNP=vFJ#Am<$En9-cLebC{re^wgoll|t(`&s7)9J{YxO^N-aI z$5L3jD^ISzl+wQbw$Cm(|Mhq4jH=@2wI8o7+Gd%b|IIx5*Zn&?>lgCSXrXO^WskXw=UX3LH%8!s;k z#x%*aEGp*Jjm(QM&8zq~)!)n5QqVsS=vUPe*NBpo#FA922>S z4={E+nQaGTRC&5MhIkx*d-b$ng949h;3{8svn*F5o}?c;Kir+G=xvlfb9Ucnx!LzV zKYw1UzcGecb6t~6xWlB=3a51)dX2qx%p0t(H?ll;Xvl-Ua7M6%M)vm*~w}RD4lnZuhbmcl2i$G2U9fNc+T-xj%reP%UwdC`m~y zNwrEYN(E93Mh1qax(3F&hK3;q7FH&fR>nZCxs`!|)jXb!C>nC}Q!>*kacl5CyoDF2 Ofx*+&&t;ucLK6U;g=tU# literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/better-search-replace/assets/css/images/ui-bg_flat_10_000000_40x100.png b/www/wp-content/plugins/better-search-replace/assets/css/images/ui-bg_flat_10_000000_40x100.png new file mode 100755 index 0000000000000000000000000000000000000000..2fd24e203646d56fa3df07b5df3bf8f364f492b2 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F2qYNp$opRhQcOwS?k)_Bce{j_0C}7R9+AaB z+5?Q;PG;Ky8T_6ujv*T7lM^IZ7dQL@YKdTAEH!H@2TG}yxJHzuB$lLFB^RXvDF!10 zLsMM?V_ieT5CaP<6H6;&AlKZ=z`$xA&qfptx%nxXX_dG&cpu)v3)H~i>FVdQ&MBb@ E0QKuIYybcN literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/better-search-replace/assets/css/images/ui-bg_glass_100_f6f6f6_1x400.png b/www/wp-content/plugins/better-search-replace/assets/css/images/ui-bg_glass_100_f6f6f6_1x400.png new file mode 100755 index 0000000000000000000000000000000000000000..0fccfbcf3243850c80947e1002f035601fc2228b GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&0LWmFTHNUZq?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)z#PD=+46!(!{KIr+qDZgOs>S*DCH8q6)|^lLQ8(vdyV&7=Rv!DK5_Nv5 zKU5EWSl#{5ocZwkn6~@klK(Ue|8%DOm~7JJCTPgP@M)6!J>`Xd0YEcVOI#yLQW8s2 zt&)pUffR$0fuX6cfw8WkVTgf+m5HU5v5BsMxs`#zoR{pZC>nC}Q!>*kacg+HW&ci~ O1_n=8KbLh*2~7ZcZBZNm literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/better-search-replace/assets/css/images/ui-bg_glass_100_fdf5ce_1x400.png b/www/wp-content/plugins/better-search-replace/assets/css/images/ui-bg_glass_100_fdf5ce_1x400.png new file mode 100755 index 0000000000000000000000000000000000000000..d7899969c45c69c8cd8bce58571c13e43d352c3d GIT binary patch literal 348 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 ae=7j-pBLECU+rDeT(h#jiofiA_rCyKji%WE literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/better-search-replace/assets/css/images/ui-bg_highlight-soft_100_eeeeee_1x100.png b/www/wp-content/plugins/better-search-replace/assets/css/images/ui-bg_highlight-soft_100_eeeeee_1x100.png new file mode 100755 index 0000000000000000000000000000000000000000..256154537205de6fed50fafb52e41cfbc5282d03 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^j6j?s03;ZUuHXC*q?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)z$cXTCaSV~TeDu&>UIzz;hKv1@CM62OC7#SFv>KYj98XATeSXh}@S{a+@8kk!d7|eOe g&WfTTH$NpatrE9}w_En_1ZrULboFyt=akR{0E|FY@c;k- literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/better-search-replace/assets/css/images/ui-bg_highlight-soft_75_ffe45c_1x100.png b/www/wp-content/plugins/better-search-replace/assets/css/images/ui-bg_highlight-soft_75_ffe45c_1x100.png new file mode 100755 index 0000000000000000000000000000000000000000..367be20d6d6359689a715e9d10ef0bbc251a97b3 GIT binary patch literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^j6j?szyu^`+!HJTQfx`y?k@kqfHUIz9iRwjfk$L9 zkoEv$x0Bg+Kt`LVi(`n!`KJ>Mxef&gxX1@bahq-QJ@-iVjABv8k}dz1cpvckAS5Q| zCa~sgnvR`g{(^+B71o<|biO4QZ((@QU$9to$Nb3+c9+^q0~7AA&s1G7ldW;K1nZSx z%@1{}Sk7(ZdA*`2jO&K2|NFg5Zyr%7kiMO>_`pxASP`akpQ9dh^WXn}$^S9yv#0i* zg_~-mfG$!kag8WRNi0dVN-jzTQVd20hNij(#=3@vAqEy!CYDylK(4u!fq~ULo{cCP ca`RI%(<*Um@IJhS7pQ^3)78&qol`;+0DZV~UH||9 literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/better-search-replace/assets/css/images/ui-icons_222222_256x240.png b/www/wp-content/plugins/better-search-replace/assets/css/images/ui-icons_222222_256x240.png new file mode 100755 index 0000000000000000000000000000000000000000..82fad68f5f7131d7d06c0f8999c511e6d65d67fb GIT binary patch literal 6922 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 literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/better-search-replace/assets/css/images/ui-icons_228ef1_256x240.png b/www/wp-content/plugins/better-search-replace/assets/css/images/ui-icons_228ef1_256x240.png new file mode 100755 index 0000000000000000000000000000000000000000..0c554acbc625ea41123a7faea547a5696171fd29 GIT binary patch literal 4549 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 MCBVn0PxHO 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 MNJH&PP0W-304*4($N&HU literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/better-search-replace/assets/css/images/ui-icons_ffffff_256x240.png b/www/wp-content/plugins/better-search-replace/assets/css/images/ui-icons_ffffff_256x240.png new file mode 100755 index 0000000000000000000000000000000000000000..cd6c26561dcce4ed91d3f9d6f98b6bf9feb03847 GIT binary patch literal 6299 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 literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/better-search-replace/assets/css/jquery-ui.min.css b/www/wp-content/plugins/better-search-replace/assets/css/jquery-ui.min.css new file mode 100755 index 0000000..efccc47 --- /dev/null +++ b/www/wp-content/plugins/better-search-replace/assets/css/jquery-ui.min.css @@ -0,0 +1,7 @@ +/*! jQuery UI - v1.11.4 - 2015-03-11 +* http://jqueryui.com +* Includes: core.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, draggable.css, menu.css, progressbar.css, resizable.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px +* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */ + +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,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");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:0.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:0.4em 2.1em 0.4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#eee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #ccc;background:#f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_228ef1_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ffd27a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;opacity:.5;filter:Alpha(Opacity=50)}.ui-widget-shadow{margin:-5px 0 0 -5px;padding:5px;background:#000 url("images/ui-bg_flat_10_000000_40x100.png") 50% 50% repeat-x;opacity:.2;filter:Alpha(Opacity=20);border-radius:5px} \ No newline at end of file diff --git a/www/wp-content/plugins/better-search-replace/assets/img/sidebar-upgrade.png b/www/wp-content/plugins/better-search-replace/assets/img/sidebar-upgrade.png new file mode 100644 index 0000000000000000000000000000000000000000..dbce7ff821364550d3b56a66e12cd5091e243f06 GIT binary patch literal 26890 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' + response.message + '

' ); + } + + if ( 'done' == response.step ) { + + bsr_update_progress_bar( '100%' ); + + // Maybe run another action. + if ( typeof response.next_action != 'undefined' ) { + bsr_update_progress_bar( '0%', 0 ); + bsr_process_step( response.next_action, 0, 0, response.bsr_data ); + } else { + $('.bsr-processing-wrap').remove(); + $('.bsr-disabled').removeClass('bsr-disabled button-disabled' ); + window.location = response.url; + } + + } else { + bsr_update_progress_bar( response.percentage ); + bsr_process_step( action, response.step, response.page, response.bsr_data ); + } + + } + }).fail(function (response) { + $('.bsr-processing-wrap').remove(); + $('.bsr-disabled').removeClass('bsr-disabled button-disabled' ); + $('#bsr-error-wrap').html( '

' + bsr_object_vars.unknown + '

' ); + if ( window.console && window.console.log ) { + console.log(response); + } + }); + + } + + /** + * Initializes a search/replace. + */ + function bsr_search_replace() { + + var search_replace_submit = $( '#bsr-submit' ); + var bsr_error_wrap = $( '#bsr-error-wrap' ); + search_replace_submit.click( function( e ) { + + e.preventDefault(); + + if ( ! search_replace_submit.hasClass( 'button-disabled' ) ) { + + if ( ! $( '#search_for' ).val() ) { + bsr_error_wrap.html( '

' + bsr_object_vars.no_search + '

' ); + } else if ( ! $( '#select_tables' ).val() ) { + bsr_error_wrap.html( '

' + bsr_object_vars.no_tables + '

' ); + } else { + var str = $( '.bsr-action-form' ).serialize(); + var data = str.replace(/%5C/g, "#BSR_BACKSLASH#" ); + + bsr_error_wrap.html(''); + search_replace_submit.addClass( 'bsr-disabled button-disabled' ); + $( '#bsr-submit-wrap' ).append('
'); + $('.bsr-progress-wrap').append( '

' + bsr_object_vars.processing + '

' ); + bsr_process_step( 'process_search_replace', 0, 0, data ); + } + + } + + }); + + } + + /** + * Updates the progress bar for AJAX bulk actions. + */ + function bsr_update_progress_bar( percentage, speed ) { + if ( typeof speed == 'undefined' ) { + speed = 150; + } + $( '.bsr-progress' ).animate({ + width: percentage + }, speed ); + } + + /** + * Updates the "Max Page Size" slider. + */ + function bsr_update_sliders( percentage ) { + $('#bsr-page-size-slider').slider({ + value: bsr_object_vars.page_size, + range: "min", + min: 1000, + max: 50000, + step: 1000, + slide: function( event, ui ) { + $('#bsr-page-size-value').text( ui.value ); + $('#bsr_page_size').val( ui.value ); + } + }); + } + + bsr_init(); + +})( jQuery ); diff --git a/www/wp-content/plugins/better-search-replace/assets/js/better-search-replace.min.js b/www/wp-content/plugins/better-search-replace/assets/js/better-search-replace.min.js new file mode 100644 index 0000000..debb83c --- /dev/null +++ b/www/wp-content/plugins/better-search-replace/assets/js/better-search-replace.min.js @@ -0,0 +1 @@ +!function(s){"use strict";function e(){a(),n()}function r(e,a,n,o){s.ajax({type:"POST",url:bsr_object_vars.endpoint+e,data:{bsr_ajax_nonce:bsr_object_vars.ajax_nonce,action:e,bsr_step:a,bsr_page:n,bsr_data:o},dataType:"json",success:function(a){"undefined"!=typeof a.message&&(s(".bsr-description").remove(),s(".bsr-progress-wrap").append('

'+a.message+"

")),"done"==a.step?(i("100%"),"undefined"!=typeof a.next_action?(i("0%",0),r(a.next_action,0,0,a.bsr_data)):(s(".bsr-processing-wrap").remove(),s(".bsr-disabled").removeClass("bsr-disabled button-disabled"),window.location=a.url)):(i(a.percentage),r(e,a.step,a.page,a.bsr_data))}}).fail(function(e){s(".bsr-processing-wrap").remove(),s(".bsr-disabled").removeClass("bsr-disabled button-disabled"),s("#bsr-error-wrap").html('

'+bsr_object_vars.unknown+"

"),window.console&&window.console.log&&console.log(e)})}function a(){var e=s("#bsr-submit"),a=s("#bsr-error-wrap");e.click(function(i){if(i.preventDefault(),!e.hasClass("button-disabled"))if(s("#search_for").val())if(s("#select_tables").val()){var n=s(".bsr-action-form").serialize(),o=n.replace(/%5C/g,"#BSR_BACKSLASH#");a.html(""),e.addClass("bsr-disabled button-disabled"),s("#bsr-submit-wrap").append('
'),s(".bsr-progress-wrap").append('

'+bsr_object_vars.processing+"

"),r("process_search_replace",0,0,o)}else a.html('

'+bsr_object_vars.no_tables+"

");else a.html('

'+bsr_object_vars.no_search+"

")})}function i(e,r){"undefined"==typeof r&&(r=150),s(".bsr-progress").animate({width:e},r)}function n(e){s("#bsr-page-size-slider").slider({value:bsr_object_vars.page_size,range:"min",min:1e3,max:5e4,step:1e3,slide:function(e,r){s("#bsr-page-size-value").text(r.value),s("#bsr_page_size").val(r.value)}})}e()}(jQuery); \ No newline at end of file diff --git a/www/wp-content/plugins/better-search-replace/better-search-replace.php b/www/wp-content/plugins/better-search-replace/better-search-replace.php new file mode 100755 index 0000000..d1e98e0 --- /dev/null +++ b/www/wp-content/plugins/better-search-replace/better-search-replace.php @@ -0,0 +1,84 @@ +. + */ + +// If this file was called directly, abort. +if ( ! defined( 'WPINC' ) ) { + die; +} + +/** + * Begins execution of the plugin. + * + * Since everything within the plugin is registered via hooks, + * then kicking off the plugin from this point in the file does + * not affect the page life cycle. + * + * @since 1.0.0 + */ +function run_better_search_replace() { + + // Allows for overriding the capability required to run the plugin. + $cap = apply_filters( 'bsr_capability', 'install_plugins' ); + + // Only load for admins. + if ( current_user_can( $cap ) ) { + + // Defines the path to the main plugin file. + define( 'BSR_FILE', __FILE__ ); + + // Defines the path to be used for includes. + define( 'BSR_PATH', plugin_dir_path( BSR_FILE ) ); + + // Defines the URL to the plugin. + define( 'BSR_URL', plugin_dir_url( BSR_FILE ) ); + + // Defines the current version of the plugin. + define( 'BSR_VERSION', '1.2.9' ); + + /** + * The core plugin class that is used to define internationalization, + * dashboard-specific hooks, and public-facing site hooks. + */ + require BSR_PATH . 'includes/class-bsr-main.php'; + $plugin = new Better_Search_Replace(); + $plugin->run(); + + } + +} +add_action( 'after_setup_theme', 'run_better_search_replace' ); diff --git a/www/wp-content/plugins/better-search-replace/includes/class-bsr-admin.php b/www/wp-content/plugins/better-search-replace/includes/class-bsr-admin.php new file mode 100755 index 0000000..a2b5fec --- /dev/null +++ b/www/wp-content/plugins/better-search-replace/includes/class-bsr-admin.php @@ -0,0 +1,295 @@ +better_search_replace = $better_search_replace; + $this->version = $version; + } + + /** + * Register any CSS and JS used by the plugin. + * @since 1.0.0 + * @access public + * @param string $hook Used for determining which page(s) to load our scripts. + */ + public function enqueue_scripts( $hook ) { + if ( 'tools_page_better-search-replace' === $hook ) { + wp_enqueue_style( 'better-search-replace', BSR_URL . 'assets/css/better-search-replace.css', array(), $this->version, 'all' ); + wp_enqueue_style( 'jquery-style', BSR_URL . 'assets/css/jquery-ui.min.css', array(), $this->version, 'all' ); + wp_enqueue_script( 'jquery-ui-slider' ); + wp_enqueue_script( 'better-search-replace', BSR_URL . 'assets/js/better-search-replace.min.js', array( 'jquery' ), $this->version, true ); + wp_enqueue_style( 'thickbox' ); + wp_enqueue_script( 'thickbox' ); + + wp_localize_script( 'better-search-replace', 'bsr_object_vars', array( + 'page_size' => get_option( 'bsr_page_size' ) ? absint( get_option( 'bsr_page_size' ) ) : 20000, + 'endpoint' => BSR_AJAX::get_endpoint(), + 'ajax_nonce' => wp_create_nonce( 'bsr_ajax_nonce' ), + 'no_search' => __( 'No search string was defined, please enter a URL or string to search for.', 'better-search-replace' ), + 'no_tables' => __( 'Please select the tables that you want to update.', 'better-search-replace' ), + 'unknown' => __( 'An error occurred processing your request. Try decreasing the "Max Page Size", or contact support.', 'better-search-replace' ), + 'processing' => __( 'Processing...', 'better-search-replace' ) + ) ); + } + } + + /** + * Register any menu pages used by the plugin. + * @since 1.0.0 + * @access public + */ + public function bsr_menu_pages() { + $cap = apply_filters( 'bsr_capability', 'install_plugins' ); + add_submenu_page( 'tools.php', __( 'Better Search Replace', 'better-search-replace' ), __( 'Better Search Replace', 'better-search-replace' ), $cap, 'better-search-replace', array( $this, 'bsr_menu_pages_callback' ) ); + } + + /** + * The callback for creating a new submenu page under the "Tools" menu. + * @access public + */ + public function bsr_menu_pages_callback() { + require_once BSR_PATH . 'templates/bsr-dashboard.php'; + } + + /** + * Renders the result or error onto the better-search-replace admin page. + * @access public + */ + public static function render_result() { + + if ( isset( $_GET['result'] ) && $result = get_transient( 'bsr_results' ) ) { + + if ( isset( $result['dry_run'] ) && $result['dry_run'] === 'on' ) { + $msg = sprintf( __( '

DRY RUN: %d tables were searched, %d cells were found that need to be updated, and %d changes were made.

Click here for more details, or use the form below to run the search/replace.

', 'better-search-replace' ), + $result['tables'], + $result['change'], + $result['updates'], + get_admin_url() . 'admin-post.php?action=bsr_view_details&TB_iframe=true&width=800&height=500' + ); + } else { + $msg = sprintf( __( '

During the search/replace, %d tables were searched, with %d cells changed in %d updates.

Click here for more details.

', 'better-search-replace' ), + $result['tables'], + $result['change'], + $result['updates'], + get_admin_url() . 'admin-post.php?action=bsr_view_details&TB_iframe=true&width=800&height=500' + ); + } + + echo '
' . $msg . '
'; + + } + + } + + /** + * Prefills the given value on the search/replace page (dry run, live run, from profile). + * @access public + * @param string $value The value to check for. + * @param string $type The type of the value we're filling. + */ + public static function prefill_value( $value, $type = 'text' ) { + + // Grab the correct data to prefill. + if ( isset( $_GET['result'] ) && get_transient( 'bsr_results' ) ) { + $values = get_transient( 'bsr_results' ); + } else { + $values = array(); + } + + // Prefill the value. + if ( isset( $values[$value] ) ) { + + if ( 'checkbox' === $type && 'on' === $values[$value] ) { + echo 'checked'; + } else { + echo str_replace( '#BSR_BACKSLASH#', '\\', esc_attr( $values[$value] ) ); + } + + } + + } + + /** + * Loads the tables available to run a search replace, prefilling if already + * selected the tables. + * @access public + */ + public static function load_tables() { + + // Get the tables and their sizes. + $tables = BSR_DB::get_tables(); + $sizes = BSR_DB::get_sizes(); + + echo ''; + + } + + /** + * Loads the result details (via Thickbox). + * @access public + */ + public function load_details() { + + if ( get_transient( 'bsr_results' ) ) { + + $results = get_transient( 'bsr_results' ); + $styles_url = get_admin_url() . "load-styles.php?c=0&dir=ltr&load=dashicons,admin-bar,wp-admin,buttons,wp-auth-check"; + $bsr_styles = BSR_URL . 'assets/css/better-search-replace.css?v=' . BSR_VERSION; + + ?> + + + +
+ + + + + + + $report ) { + $time = $report['end'] - $report['start']; + + if ( $report['change'] !== 0 ) { + $report['change'] = '' . $report['change'] . ''; + } + + if ( $report['updates'] !== 0 ) { + $report['updates'] = '' . $report['updates'] . ''; + } + + printf( + '', + $table_name, + $report['change'], + $report['updates'], + round( $time, 3 ), + __( 'seconds', 'better-search-replace' ) + ); + + } + ?> + +
%s%s%s%s %s
+ +


+

+ +
+ ' . __( 'Upgrade to Pro', 'better-search-replace' ) . '' ) + ); + } + + return $links; + } + +} diff --git a/www/wp-content/plugins/better-search-replace/includes/class-bsr-ajax.php b/www/wp-content/plugins/better-search-replace/includes/class-bsr-ajax.php new file mode 100644 index 0000000..db17d40 --- /dev/null +++ b/www/wp-content/plugins/better-search-replace/includes/class-bsr-ajax.php @@ -0,0 +1,244 @@ +add_ajax_actions(); + } + + /** + * Gets our custom endpoint. + * @access public + * @return string + */ + public static function get_endpoint() { + return esc_url_raw( get_admin_url() . 'tools.php?page=better-search-replace&bsr-ajax=' ); + } + + /** + * Set BSR AJAX constant and headers. + * @access public + */ + public function define_ajax() { + + if ( isset( $_GET['bsr-ajax'] ) && ! empty( $_GET['bsr-ajax'] ) ) { + + // Define the WordPress "DOING_AJAX" constant. + if ( ! defined( 'DOING_AJAX' ) ) { + define( 'DOING_AJAX', true ); + } + + // Prevent notices from breaking AJAX functionality. + if ( ! WP_DEBUG || ( WP_DEBUG && ! WP_DEBUG_DISPLAY ) ) { + @ini_set( 'display_errors', 0 ); + } + + // Send the headers. + send_origin_headers(); + @header( 'Content-Type: text/html; charset=' . get_option( 'blog_charset' ) ); + @header( 'X-Robots-Tag: noindex' ); + send_nosniff_header(); + nocache_headers(); + + } + + } + + /** + * Check if we're doing AJAX and fire the related action. + * @access public + */ + public function do_bsr_ajax() { + global $wp_query; + + if ( isset( $_GET['bsr-ajax'] ) && ! empty( $_GET['bsr-ajax'] ) ) { + $wp_query->set( 'bsr-ajax', sanitize_text_field( $_GET['bsr-ajax'] ) ); + } + + if ( $action = $wp_query->get( 'bsr-ajax' ) ) { + do_action( 'bsr_ajax_' . sanitize_text_field( $action ) ); + die(); + } + } + + /** + * Adds any AJAX-related actions. + * @access public + */ + public function add_ajax_actions() { + $actions = array( + 'process_search_replace', + ); + + foreach ( $actions as $action ) { + add_action( 'bsr_ajax_' . $action, array( $this, $action ) ); + } + } + + /** + * Processes the search/replace form submitted by the user. + * @access public + */ + public function process_search_replace() { + + // Bail if not authorized. + if ( ! check_admin_referer( 'bsr_ajax_nonce', 'bsr_ajax_nonce' ) ) { + return; + } + + $args = array(); + + if ( isset( $_POST['bsr_data'] ) ) { + parse_str( $_POST['bsr_data'], $args ); + } + + + // Initialize the DB class. + $db = new BSR_DB(); + $step = isset( $_POST['bsr_step' ] ) ? absint( $_POST['bsr_step'] ) : 0; + $page = isset( $_POST['bsr_page'] ) ? absint( $_POST['bsr_page'] ) : 0; + + // Build the arguements for this run. + $args = array( + 'select_tables' => isset( $args['select_tables'] ) ? $args['select_tables'] : array(), + 'case_insensitive' => isset( $args['case_insensitive'] ) ? $args['case_insensitive'] : 'off', + 'replace_guids' => isset( $args['replace_guids'] ) ? $args['replace_guids'] : 'off', + 'dry_run' => isset( $args['dry_run'] ) ? $args['dry_run'] : 'off', + 'search_for' => isset( $args['search_for'] ) ? stripslashes( $args['search_for'] ) : '', + 'replace_with' => isset( $args['replace_with'] ) ? stripslashes( $args['replace_with'] ) : '', + 'completed_pages' => isset( $args['completed_pages'] ) ? absint( $args['completed_pages'] ) : 0, + ); + + $args['total_pages'] = isset( $args['total_pages'] ) ? absint( $args['total_pages'] ) : $db->get_total_pages( $args['select_tables'] ); + + // Any operations that should only be performed at the beginning. + if ( $step === 0 && $page === 0 ) { + // Clear the results of the last run. + delete_transient( 'bsr_results' ); + } + + // Start processing data. + if ( isset( $args['select_tables'][$step] ) ) { + + $result = $db->srdb( $args['select_tables'][$step], $page, $args ); + $this->append_report( $args['select_tables'][$step], $result['table_report'], $args ); + + if ( false === $result['table_complete'] ) { + $page++; + } else { + $step++; + $page = 0; + } + + // Check if isset() again as the step may have changed since last check. + if ( isset( $args['select_tables'][$step] ) ) { + $message = sprintf( + __( 'Processing table %d of %d: %s', 'better-search-replace' ), + $step + 1, + count( $args['select_tables'] ), + esc_html( $args['select_tables'][$step] ) + ); + } + + $args['completed_pages']++; + $percentage = $args['completed_pages'] / $args['total_pages'] * 100 . '%'; + + } else { + $db->maybe_update_site_url(); + $step = 'done'; + $percentage = '100%'; + } + + // Store results in an array. + $result = array( + 'step' => $step, + 'page' => $page, + 'percentage' => $percentage, + 'url' => get_admin_url() . 'tools.php?page=better-search-replace&tab=bsr_search_replace&result=true', + 'bsr_data' => http_build_query( $args ) + ); + + if ( isset( $message ) ) { + $result['message'] = $message; + } + + // Send output as JSON for processing via AJAX. + echo json_encode( $result ); + exit; + + } + + /** + * Helper function for assembling the BSR Results. + * @access public + * @param string $table The name of the table to append to. + * @param array $report The report for that table. + * @param array $args An array of arguements used for this run. + * @return boolean + */ + public function append_report( $table, $report, $args ) { + + // Bail if not authorized. + if ( ! check_admin_referer( 'bsr_ajax_nonce', 'bsr_ajax_nonce' ) ) { + return; + } + + // Retrieve the existing transient. + $results = get_transient( 'bsr_results' ) ? get_transient( 'bsr_results') : array(); + + // Grab any values from the run args. + $results['search_for'] = isset( $args['search_for'] ) ? $args['search_for'] : ''; + $results['replace_with'] = isset( $args['replace_with'] ) ? $args['replace_with'] : ''; + $results['dry_run'] = isset( $args['dry_run'] ) ? $args['dry_run'] : 'off'; + $results['case_insensitive'] = isset( $args['case_insensitive'] ) ? $args['case_insensitive'] : 'off'; + $results['replace_guids'] = isset( $args['replace_guids'] ) ? $args['replace_guids'] : 'off'; + + // Sum the values of the new and existing reports. + $results['change'] = isset( $results['change'] ) ? $results['change'] + $report['change'] : $report['change']; + $results['updates'] = isset( $results['updates'] ) ? $results['updates'] + $report['updates'] : $report['updates']; + + // Append the table report, or create a new one if necessary. + if ( isset( $results['table_reports'] ) && isset( $results['table_reports'][$table] ) ) { + $results['table_reports'][$table]['change'] = $results['table_reports'][$table]['change'] + $report['change']; + $results['table_reports'][$table]['updates'] = $results['table_reports'][$table]['updates'] + $report['updates']; + $results['table_reports'][$table]['end'] = $report['end']; + } else { + $results['table_reports'][$table] = $report; + } + + // Count the number of tables. + $results['tables'] = count( $results['table_reports'] ); + + // Update the transient. + if ( ! set_transient( 'bsr_results', $results, DAY_IN_SECONDS ) ) { + return false; + } + + return true; + + } + +} + +$bsr_ajax = new BSR_AJAX; +$bsr_ajax->init(); diff --git a/www/wp-content/plugins/better-search-replace/includes/class-bsr-compatibility.php b/www/wp-content/plugins/better-search-replace/includes/class-bsr-compatibility.php new file mode 100644 index 0000000..f10198a --- /dev/null +++ b/www/wp-content/plugins/better-search-replace/includes/class-bsr-compatibility.php @@ -0,0 +1,98 @@ +prefix ) . "\n"; + $return .= 'WP_DEBUG: ' . ( defined( 'WP_DEBUG' ) ? WP_DEBUG ? 'Enabled' : 'Disabled' : 'Not set' ) . "\n"; + $return .= 'Memory Limit: ' . WP_MEMORY_LIMIT . "\n"; + + // Plugin Configuration + $return .= "\n" . '-- Better Search Replace Configuration' . "\n\n"; + $return .= 'Plugin Version: ' . BSR_VERSION . "\n"; + $page_size = get_option( 'bsr_page_size' ) ? get_option( 'bsr_page_size' ) : '50000'; + $return .= 'Max Page Size: ' . $page_size . "\n"; + + // Server Configuration + $return .= "\n" . '-- Server Configuration' . "\n\n"; + $return .= 'Operating System: ' . php_uname( 's' ) . "\n"; + $return .= 'PHP Version: ' . PHP_VERSION . "\n"; + $return .= 'MySQL Version: ' . $wpdb->db_version() . "\n"; + + $return .= 'Server Software: ' . $_SERVER['SERVER_SOFTWARE'] . "\n"; + + // PHP configs... now we're getting to the important stuff + $return .= "\n" . '-- PHP Configuration' . "\n\n"; + $return .= 'Safe Mode: ' . ( ini_get( 'safe_mode' ) ? 'Enabled' : 'Disabled' . "\n" ); + $return .= 'Memory Limit: ' . ini_get( 'memory_limit' ) . "\n"; + $return .= 'Post Max Size: ' . ini_get( 'post_max_size' ) . "\n"; + $return .= 'Upload Max Filesize: ' . ini_get( 'upload_max_filesize' ) . "\n"; + $return .= 'Time Limit: ' . ini_get( 'max_execution_time' ) . "\n"; + $return .= 'Max Input Vars: ' . ini_get( 'max_input_vars' ) . "\n"; + $return .= 'Display Errors: ' . ( ini_get( 'display_errors' ) ? 'On (' . ini_get( 'display_errors' ) . ')' : 'N/A' ) . "\n"; + + // WordPress active plugins + $return .= "\n" . '-- WordPress Active Plugins' . "\n\n"; + $plugins = get_plugins(); + $active_plugins = get_option( 'active_plugins', array() ); + foreach( $plugins as $plugin_path => $plugin ) { + if( !in_array( $plugin_path, $active_plugins ) ) + continue; + $return .= $plugin['Name'] . ': ' . $plugin['Version'] . "\n"; + } + + // WordPress inactive plugins + $return .= "\n" . '-- WordPress Inactive Plugins' . "\n\n"; + foreach( $plugins as $plugin_path => $plugin ) { + if( in_array( $plugin_path, $active_plugins ) ) + continue; + $return .= $plugin['Name'] . ': ' . $plugin['Version'] . "\n"; + } + + if( is_multisite() ) { + // WordPress Multisite active plugins + $return .= "\n" . '-- Network Active Plugins' . "\n\n"; + $plugins = wp_get_active_network_plugins(); + $active_plugins = get_site_option( 'active_sitewide_plugins', array() ); + foreach( $plugins as $plugin_path ) { + $plugin_base = plugin_basename( $plugin_path ); + if( !array_key_exists( $plugin_base, $active_plugins ) ) + continue; + $plugin = get_plugin_data( $plugin_path ); + $return .= $plugin['Name'] . ': ' . $plugin['Version'] . "\n"; + } + } + + $return .= "\n" . '### End System Info ###'; + return $return; + } + +} diff --git a/www/wp-content/plugins/better-search-replace/includes/class-bsr-db.php b/www/wp-content/plugins/better-search-replace/includes/class-bsr-db.php new file mode 100644 index 0000000..77a9e8e --- /dev/null +++ b/www/wp-content/plugins/better-search-replace/includes/class-bsr-db.php @@ -0,0 +1,406 @@ +wpdb = $wpdb; + + $this->page_size = $this->get_page_size(); + } + + /** + * Returns an array of tables in the database. + * @access public + * @return array + */ + public static function get_tables() { + global $wpdb; + + if ( function_exists( 'is_multisite' ) && is_multisite() ) { + + if ( is_main_site() ) { + $tables = $wpdb->get_col( 'SHOW TABLES' ); + } else { + $blog_id = get_current_blog_id(); + $tables = $wpdb->get_col( "SHOW TABLES LIKE '" . $wpdb->base_prefix . absint( $blog_id ) . "\_%'" ); + } + + } else { + $tables = $wpdb->get_col( 'SHOW TABLES' ); + } + + return $tables; + } + + /** + * Returns an array containing the size of each database table. + * @access public + * @return array + */ + public static function get_sizes() { + global $wpdb; + + $sizes = array(); + $tables = $wpdb->get_results( 'SHOW TABLE STATUS', ARRAY_A ); + + if ( is_array( $tables ) && ! empty( $tables ) ) { + + foreach ( $tables as $table ) { + $size = round( $table['Data_length'] / 1024 / 1024, 2 ); + $sizes[$table['Name']] = sprintf( __( '(%s MB)', 'better-search-replace' ), $size ); + } + + } + + return $sizes; + } + + /** + * Returns the current page size. + * @access public + * @return int + */ + public function get_page_size() { + $page_size = get_option( 'bsr_page_size' ) ? get_option( 'bsr_page_size' ) : 20000; + return absint( $page_size ); + } + + /** + * Returns the number of pages in a table. + * @access public + * @return int + */ + public function get_pages_in_table( $table ) { + $table = esc_sql( $table ); + $rows = $this->wpdb->get_var( "SELECT COUNT(*) FROM $table" ); + $pages = ceil( $rows / $this->page_size ); + return absint( $pages ); + } + + /** + * Gets the total number of pages in the DB. + * @access public + * @return int + */ + public function get_total_pages( $tables ) { + $total_pages = 0; + + foreach ( $tables as $table ) { + + // Get the number of rows & pages in the table. + $pages = $this->get_pages_in_table( $table ); + + // Always include 1 page in case we have to create schemas, etc. + if ( $pages == 0 ) { + $pages = 1; + } + + $total_pages += $pages; + } + + return absint( $total_pages ); + } + + /** + * Gets the columns in a table. + * @access public + * @param string $table The table to check. + * @return array + */ + public function get_columns( $table ) { + $primary_key = null; + $columns = array(); + $fields = $this->wpdb->get_results( 'DESCRIBE ' . $table ); + + if ( is_array( $fields ) ) { + foreach ( $fields as $column ) { + $columns[] = $column->Field; + if ( $column->Key == 'PRI' ) { + $primary_key = $column->Field; + } + } + } + + return array( $primary_key, $columns ); + } + + /** + * Adapated from interconnect/it's search/replace script. + * + * Modified to use WordPress wpdb functions instead of PHP's native mysql/pdo functions, + * and to be compatible with batch processing via AJAX. + * + * @link https://interconnectit.com/products/search-and-replace-for-wordpress-databases/ + * + * @access public + * @param string $table The table to run the replacement on. + * @param int $page The page/block to begin the query on. + * @param array $args An associative array containing arguements for this run. + * @return array + */ + public function srdb( $table, $page, $args ) { + + // Load up the default settings for this chunk. + $table = esc_sql( $table ); + $current_page = absint( $page ); + $pages = $this->get_pages_in_table( $table ); + $done = false; + + $args['search_for'] = str_replace( '#BSR_BACKSLASH#', '\\', $args['search_for'] ); + $args['replace_with'] = str_replace( '#BSR_BACKSLASH#', '\\', $args['replace_with'] ); + + $table_report = array( + 'change' => 0, + 'updates' => 0, + 'start' => microtime( true ), + 'end' => microtime( true ), + 'errors' => array(), + 'skipped' => false + ); + + // Get a list of columns in this table. + list( $primary_key, $columns ) = $this->get_columns( $table ); + + // Bail out early if there isn't a primary key. + if ( null === $primary_key ) { + $table_report['skipped'] = true; + return array( 'table_complete' => true, 'table_report' => $table_report ); + } + + $current_row = 0; + $start = $page * $this->page_size; + $end = $this->page_size; + + // Grab the content of the table. + $data = $this->wpdb->get_results( "SELECT * FROM $table LIMIT $start, $end", ARRAY_A ); + + // Loop through the data. + foreach ( $data as $row ) { + $current_row++; + $update_sql = array(); + $where_sql = array(); + $upd = false; + + foreach( $columns as $column ) { + + $data_to_fix = $row[ $column ]; + + if ( $column == $primary_key ) { + $where_sql[] = $column . ' = "' . $this->mysql_escape_mimic( $data_to_fix ) . '"'; + continue; + } + + // Skip GUIDs by default. + if ( 'on' !== $args['replace_guids'] && 'guid' == $column ) { + continue; + } + + if ( $this->wpdb->options === $table ) { + + // Skip any BSR options as they may contain the search field. + if ( isset( $should_skip ) && true === $should_skip ) { + $should_skip = false; + continue; + } + + // If the Site URL needs to be updated, let's do that last. + if ( isset( $update_later ) && true === $update_later ) { + $update_later = false; + $edited_data = $this->recursive_unserialize_replace( $args['search_for'], $args['replace_with'], $data_to_fix, false, $args['case_insensitive'] ); + + if ( $edited_data != $data_to_fix ) { + $table_report['change']++; + $table_report['updates']++; + update_option( 'bsr_update_site_url', $edited_data ); + continue; + } + } + + if ( '_transient_bsr_results' === $data_to_fix || 'bsr_profiles' === $data_to_fix || 'bsr_update_site_url' === $data_to_fix ) { + $should_skip = true; + } + + if ( 'siteurl' === $data_to_fix && $args['dry_run'] !== 'on' ) { + $update_later = true; + } + + } + + // Run a search replace on the data that'll respect the serialisation. + $edited_data = $this->recursive_unserialize_replace( $args['search_for'], $args['replace_with'], $data_to_fix, false, $args['case_insensitive'] ); + + // Something was changed + if ( $edited_data != $data_to_fix ) { + $update_sql[] = $column . ' = "' . $this->mysql_escape_mimic( $edited_data ) . '"'; + $upd = true; + $table_report['change']++; + } + + } + + // Determine what to do with updates. + if ( $args['dry_run'] === 'on' ) { + // Don't do anything if a dry run + } elseif ( $upd && ! empty( $where_sql ) ) { + // If there are changes to make, run the query. + $sql = 'UPDATE ' . $table . ' SET ' . implode( ', ', $update_sql ) . ' WHERE ' . implode( ' AND ', array_filter( $where_sql ) ); + $result = $this->wpdb->query( $sql ); + + if ( ! $result ) { + $table_report['errors'][] = sprintf( __( 'Error updating row: %d.', 'better-search-replace' ), $current_row ); + } else { + $table_report['updates']++; + } + + } + + } // end row loop + + if ( $current_page >= $pages - 1 ) { + $done = true; + } + + // Flush the results and return the report. + $table_report['end'] = microtime( true ); + $this->wpdb->flush(); + return array( 'table_complete' => $done, 'table_report' => $table_report ); + } + + /** + * Adapated from interconnect/it's search/replace script. + * + * @link https://interconnectit.com/products/search-and-replace-for-wordpress-databases/ + * + * Take a serialised array and unserialise it replacing elements as needed and + * unserialising any subordinate arrays and performing the replace on those too. + * + * @access private + * @param string $from String we're looking to replace. + * @param string $to What we want it to be replaced with + * @param array $data Used to pass any subordinate arrays back to in. + * @param boolean $serialised Does the array passed via $data need serialising. + * @param sting|boolean $case_insensitive Set to 'on' if we should ignore case, false otherwise. + * + * @return string|array The original array with all elements replaced as needed. + */ + public function recursive_unserialize_replace( $from = '', $to = '', $data = '', $serialised = false, $case_insensitive = false ) { + try { + + if ( is_string( $data ) && ( $unserialized = @unserialize( $data ) ) !== false ) { + $data = $this->recursive_unserialize_replace( $from, $to, $unserialized, true, $case_insensitive ); + } + + elseif ( is_array( $data ) ) { + $_tmp = array( ); + foreach ( $data as $key => $value ) { + $_tmp[ $key ] = $this->recursive_unserialize_replace( $from, $to, $value, false, $case_insensitive ); + } + + $data = $_tmp; + unset( $_tmp ); + } + + // Submitted by Tina Matter + elseif ( is_object( $data ) ) { + $_tmp = $data; + $props = get_object_vars( $data ); + foreach ( $props as $key => $value ) { + $_tmp->$key = $this->recursive_unserialize_replace( $from, $to, $value, false, $case_insensitive ); + } + + $data = $_tmp; + unset( $_tmp ); + } + + else { + if ( is_string( $data ) ) { + if ( 'on' === $case_insensitive ) { + $data = str_ireplace( $from, $to, $data ); + } else { + $data = str_replace( $from, $to, $data ); + } + } + } + + if ( $serialised ) { + return serialize( $data ); + } + + } catch( Exception $error ) { + + } + + return $data; + } + + /** + * Updates the Site URL if necessary. + * @access public + * @return boolean + */ + public function maybe_update_site_url() { + $option = get_option( 'bsr_update_site_url' ); + + if ( $option ) { + update_option( 'siteurl', $option ); + delete_option( 'bsr_update_site_url' ); + return true; + } + + return false; + } + + /** + * Mimics the mysql_real_escape_string function. Adapted from a post by 'feedr' on php.net. + * @link http://php.net/manual/en/function.mysql-real-escape-string.php#101248 + * @access public + * @param string $input The string to escape. + * @return string + */ + public function mysql_escape_mimic( $input ) { + if ( is_array( $input ) ) { + return array_map( __METHOD__, $input ); + } + if ( ! empty( $input ) && is_string( $input ) ) { + return str_replace( array( '\\', "\0", "\n", "\r", "'", '"', "\x1a" ), array( '\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z' ), $input ); + } + + return $input; + } + +} diff --git a/www/wp-content/plugins/better-search-replace/includes/class-bsr-i18n.php b/www/wp-content/plugins/better-search-replace/includes/class-bsr-i18n.php new file mode 100755 index 0000000..1bfce81 --- /dev/null +++ b/www/wp-content/plugins/better-search-replace/includes/class-bsr-i18n.php @@ -0,0 +1,55 @@ + + */ + +// Prevent direct access. +if ( ! defined( 'BSR_PATH' ) ) exit; + +class BSR_i18n { + + /** + * The domain specified for this plugin. + * + * @since 1.0.0 + * @access private + * @var string $domain The domain identifier for this plugin. + */ + private $domain; + + /** + * Load the plugin text domain for translation. + * + * @since 1.0.0 + */ + public function load_plugin_textdomain() { + + load_plugin_textdomain( + $this->domain, + false, + dirname( dirname( plugin_basename( __FILE__ ) ) ) . '/languages/' + ); + + } + + /** + * Set the domain equal to that of the specified domain. + * + * @since 1.0.0 + * @param string $domain The domain that represents the locale of this plugin. + */ + public function set_domain( $domain ) { + $this->domain = $domain; + $this->load_plugin_textdomain(); + } + +} diff --git a/www/wp-content/plugins/better-search-replace/includes/class-bsr-loader.php b/www/wp-content/plugins/better-search-replace/includes/class-bsr-loader.php new file mode 100755 index 0000000..20ab4ad --- /dev/null +++ b/www/wp-content/plugins/better-search-replace/includes/class-bsr-loader.php @@ -0,0 +1,132 @@ + + */ +class BSR_Loader { + + /** + * The array of actions registered with WordPress. + * + * @since 1.0.0 + * @access protected + * @var array $actions The actions registered with WordPress to fire when the plugin loads. + */ + protected $actions; + + /** + * The array of filters registered with WordPress. + * + * @since 1.0.0 + * @access protected + * @var array $filters The filters registered with WordPress to fire when the plugin loads. + */ + protected $filters; + + /** + * Initialize the collections used to maintain the actions and filters. + * + * @since 1.0.0 + */ + public function __construct() { + + $this->actions = array(); + $this->filters = array(); + + } + + /** + * Add a new action to the collection to be registered with WordPress. + * + * @since 1.0.0 + * @var string $hook The name of the WordPress action that is being registered. + * @var object $component A reference to the instance of the object on which the action is defined. + * @var string $callback The name of the function definition on the $component. + * @var int Optional $priority The priority at which the function should be fired. + * @var int Optional $accepted_args The number of arguments that should be passed to the $callback. + */ + public function add_action( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) { + $this->actions = $this->add( $this->actions, $hook, $component, $callback, $priority, $accepted_args ); + } + + /** + * Add a new filter to the collection to be registered with WordPress. + * + * @since 1.0.0 + * @var string $hook The name of the WordPress filter that is being registered. + * @var object $component A reference to the instance of the object on which the filter is defined. + * @var string $callback The name of the function definition on the $component. + * @var int Optional $priority The priority at which the function should be fired. + * @var int Optional $accepted_args The number of arguments that should be passed to the $callback. + */ + public function add_filter( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) { + $this->filters = $this->add( $this->filters, $hook, $component, $callback, $priority, $accepted_args ); + } + + /** + * A utility function that is used to register the actions and hooks into a single + * collection. + * + * @since 1.0.0 + * @access private + * @var array $hooks The collection of hooks that is being registered (that is, actions or filters). + * @var string $hook The name of the WordPress filter that is being registered. + * @var object $component A reference to the instance of the object on which the filter is defined. + * @var string $callback The name of the function definition on the $component. + * @var int Optional $priority The priority at which the function should be fired. + * @var int Optional $accepted_args The number of arguments that should be passed to the $callback. + * @return type The collection of actions and filters registered with WordPress. + */ + private function add( $hooks, $hook, $component, $callback, $priority, $accepted_args ) { + + $hooks[] = array( + 'hook' => $hook, + 'component' => $component, + 'callback' => $callback, + 'priority' => $priority, + 'accepted_args' => $accepted_args + ); + + return $hooks; + + } + + /** + * Register the filters and actions with WordPress. + * + * @since 1.0.0 + */ + public function run() { + + foreach ( $this->filters as $hook ) { + add_filter( $hook['hook'], array( $hook['component'], $hook['callback'] ), $hook['priority'], $hook['accepted_args'] ); + } + + foreach ( $this->actions as $hook ) { + add_action( $hook['hook'], array( $hook['component'], $hook['callback'] ), $hook['priority'], $hook['accepted_args'] ); + } + + } + +} diff --git a/www/wp-content/plugins/better-search-replace/includes/class-bsr-main.php b/www/wp-content/plugins/better-search-replace/includes/class-bsr-main.php new file mode 100755 index 0000000..54c08a3 --- /dev/null +++ b/www/wp-content/plugins/better-search-replace/includes/class-bsr-main.php @@ -0,0 +1,164 @@ + + */ + +// Prevent direct access. +if ( ! defined( 'BSR_PATH' ) ) exit; + +class Better_Search_Replace { + + /** + * The loader that's responsible for maintaining and registering all hooks that power + * the plugin. + * + * @since 1.0 + * @access protected + * @var BSR_Loader $loader Maintains and registers all hooks for the plugin. + */ + protected $loader; + + /** + * The unique identifier of this plugin. + * + * @since 1.0 + * @access protected + * @var string $plugin_name The string used to uniquely identify this plugin. + */ + protected $plugin_name; + + /** + * The current version of the plugin. + * + * @since 1.0 + * @access protected + * @var string $version The current version of the plugin. + */ + protected $version; + + /** + * Define the core functionality of the plugin. + * + * Set the plugin name and the plugin version that can be used throughout the plugin. + * Load the dependencies, define the locale, and set the hooks for the Dashboard and + * the public-facing side of the site. + * + * @since 1.0 + */ + public function __construct() { + $this->plugin_name = 'better-search-replace'; + $this->version = BSR_VERSION; + $this->load_dependencies(); + $this->set_locale(); + $this->define_admin_hooks(); + } + + /** + * Load the required dependencies for this plugin. + * + * Create an instance of the loader which will be used to register the hooks + * with WordPress. + * + * @since 1.0 + * @access private + */ + private function load_dependencies() { + require_once BSR_PATH . 'includes/class-bsr-loader.php'; + require_once BSR_PATH . 'includes/class-bsr-i18n.php'; + require_once BSR_PATH . 'includes/class-bsr-admin.php'; + require_once BSR_PATH . 'includes/class-bsr-ajax.php'; + require_once BSR_PATH . 'includes/class-bsr-db.php'; + require_once BSR_PATH . 'includes/class-bsr-compatibility.php'; + $this->loader = new BSR_Loader(); + } + + /** + * Define the locale for this plugin for internationalization. + * + * Uses the BSR_i18n class in order to set the domain and to register the hook + * with WordPress. + * + * @since 1.0 + * @access private + */ + private function set_locale() { + $plugin_i18n = new BSR_i18n(); + $plugin_i18n->set_domain( $this->get_plugin_name() ); + } + + /** + * Register all of the hooks related to the dashboard functionality + * of the plugin. + * + * @since 1.0 + * @access private + */ + private function define_admin_hooks() { + + // Initialize the admin class. + $plugin_admin = new BSR_Admin( $this->get_plugin_name(), $this->get_version() ); + + /// Register the admin pages and scripts. + $this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_scripts' ); + $this->loader->add_action( 'admin_menu', $plugin_admin, 'bsr_menu_pages' ); + + // Other admin actions. + $this->loader->add_action( 'admin_init', $plugin_admin, 'register_option' ); + $this->loader->add_action( 'admin_post_bsr_view_details', $plugin_admin, 'load_details' ); + $this->loader->add_action( 'admin_post_bsr_download_sysinfo', $plugin_admin, 'download_sysinfo' ); + $this->loader->add_action( 'plugin_row_meta', $plugin_admin, 'meta_upgrade_link', 10, 2 ); + } + + /** + * Run the loader to execute all of the hooks with WordPress. + * + * @since 1.0 + */ + public function run() { + $this->loader->run(); + } + + /** + * The name of the plugin used to uniquely identify it within the context of + * WordPress and to define internationalization functionality. + * + * @since 1.0 + * @return string The name of the plugin. + */ + public function get_plugin_name() { + return $this->plugin_name; + } + + /** + * The reference to the class that orchestrates the hooks with the plugin. + * + * @since 1.0 + * @return Better_Search_Replace_Loader Orchestrates the hooks of the plugin. + */ + public function get_loader() { + return $this->loader; + } + + /** + * Retrieve the version number of the plugin. + * + * @since 1.0 + * @return string The version number of the plugin. + */ + public function get_version() { + return $this->version; + } + +} diff --git a/www/wp-content/plugins/better-search-replace/includes/index.php b/www/wp-content/plugins/better-search-replace/includes/index.php new file mode 100755 index 0000000..e71af0e --- /dev/null +++ b/www/wp-content/plugins/better-search-replace/includes/index.php @@ -0,0 +1 @@ +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

+8e%UE|h zBff7p_UUz67X|s^zHCyVNUTeep$3>7VpRvURZ4M6*@C95t~WAa;-2Q`lksz5k1!vNux<);aPujN1u=~h{c1+aWB%hq|Cj)?y$NgwF2Crfk}tu1R3E$y6{MQY=4 z6lD@{lQ3-K|7_CN1^Hagnnc9-d4~w1cL=NBFvC$dC(Ngiv$RnGYwVzH#2v zo6Sm_bZZb(O(urIzX*SF0wYlBZn?8~E=gt^WUHAN|9^VL(2v&XltdId$4X@I9ZYMf zkU6UM(L-E_&;we?@w0+}%*M~rT-KBr9hMIH;-An}k~MUtZZ;Dpu@|Zfb=hZCmt@r> zZfGmR;jP65t;@r!+}a4|!R6c<0uCW_$VlFj&|z|$L`8zxKe(P^UgglE3dQl`P=o) zmYh_RoQ@9bA!=XFMTsDihcv0Pgs|YGoIiVAMU*7$;5BI)#UvuODtm6!?P{p&jNYg^ zRvG^pI@SUEt!uq-o;W{#&iRUhS=XywqJexS-9VW|{Ci}Uk>>4!9kFBK5iKQTQ$MXD zA&9?DX;XH@RkQr~;;?v!vqXso$6ph_qC=Y#KcVKFBir$Nk6N*hkc0n3&l0j-j{@jz5sAgqlgA+|UWvDqXGeds\n" +"Language-Team: PNTE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.6.3\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_ex:1,2c;esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-SearchPath-0: .\n" + +#: includes/class-bsr-admin.php:71 +msgid "No search string was defined, please enter a URL or string to search for." +msgstr "Bitte gib ein, wonach die Datenbank durchsucht werden soll (z. B. eine URL)." + +#: includes/class-bsr-admin.php:72 +msgid "Please select the tables that you want to update." +msgstr "Bitte wähle die Tabellen aus, die durchsucht werden sollen." + +#: includes/class-bsr-admin.php:73 +msgid "An error occurred processing your request. Try decreasing the \"Max Page Size\", or contact support." +msgstr "Ein Fehler ist aufgetreten. Versuche entweder die \"Max. Seiten-Anzahl\" zu verringern, oder wende dich an unseren Support." + +#. #-#-#-#-# plugin.pot (Better Search Replace 1.2.2) #-#-#-#-# +#. Plugin Name of the plugin/theme +#: includes/class-bsr-admin.php:85 +#: templates/bsr-dashboard.php:29 +msgid "Better Search Replace" +msgstr "Better Search Replace " + +#: includes/class-bsr-admin.php:105 +msgid "

DRY RUN: %d tables were searched, %d cells were found that need to be updated, and %d changes were made.

Click here for more details, or use the form below to run the search/replace.

" +msgstr "

TESTLAUF: %d Tabellen wurden durchsucht, %d Tabellenzellen wurden gefunden, die aktualisiert werden sollen. %d Änderungen wurden vorgenommen.

Für mehr Details zum Testlauf hier klicken.

" + +#: includes/class-bsr-admin.php:112 +msgid "

During the search/replace, %d tables were searched, with %d cells changed in %d updates.

Click here for more details.

" +msgstr "

Beim Suchen/Ersetzen wurden %d Tabellen mit insgesamt %d Zellen durchsucht. %d Aktualisierungen wurden vorgenommen.

Für mehr Details zur Aktualisierung hier klicken.

" + +#: includes/class-bsr-admin.php:212 +msgid "Table" +msgstr "Tabelle" + +#: includes/class-bsr-admin.php:212 +msgid "Changes Found" +msgstr "Änderungen gefunden" + +#: includes/class-bsr-admin.php:212 +msgid "Rows Updated" +msgstr "Zeilen aktualisiert" + +#: includes/class-bsr-admin.php:212 +msgid "Time" +msgstr "Zeit" + +#: includes/class-bsr-admin.php:233 +msgid "Want even more details, easy database migrations, and saved search/replace profiles?" +msgstr "Du möchtest noch mehr Einstellungsmöglichkeiten, eine einfache Datenbank-Migration und die Möglichkeit Suchen/Ersetzen-Profile anzulegen?" + +#: includes/class-bsr-admin.php:234 +msgid "Learn more about the pro version" +msgstr "Lerne die Pro-Version kennen" + +#: includes/class-bsr-admin.php:279 +msgid "Upgrade to Pro" +msgstr "Upgrade auf die Pro-Version" + +#: includes/class-bsr-db.php:81 +msgid "(%s MB)" +msgstr "(%s MB)" + +#: includes/class-bsr-db.php:251 +msgid "Error updating row: %d." +msgstr "Fehler beim Aktualisieren in Zeile: %d." + +#: includes/class-bsr-db.php:257 +msgid "Row %d has no primary key, manual change needed." +msgstr "Zeile %d hat keinen Primärschlüssel. Du musst sie manuell ändern." + +#: templates/bsr-dashboard.php:36 +msgid "Search/Replace" +msgstr "Suchen/Ersetzen" + +#: templates/bsr-dashboard.php:37 +msgid "Settings" +msgstr "Einstellungen" + +#: templates/bsr-dashboard.php:38 +msgid "Help" +msgstr "Hilfe" + +#: templates/bsr-help.php:17 +msgid "Help & Troubleshooting" +msgstr "Hilfe & Fehlerbehebung" + +#: templates/bsr-help.php:19 +msgid "Free support is available on the plugin support forums." +msgstr "Kostenlosen Support gibt es im Plugin Support-Forum." + +#: templates/bsr-help.php:21 +msgid "For premium features and priority email support, upgrade to pro." +msgstr "Weitere Premium-Features und schneller Support per E-Mail: Upgrade auf die Pro-Version." + +#: templates/bsr-help.php:23 +msgid "Found a bug or have a feature request? Please submit an issue on GitHub!" +msgstr "Du hast einen Fehler gefunden? Du wünschst dir eine neue Funktion? Schreib uns auf GitHub!" + +#: templates/bsr-help.php:29 +msgid "Download System Info" +msgstr "System-Info herunterladen" + +#: templates/bsr-search-replace.php:21 +msgid "This tool allows you to search and replace text in your database (supports serialized arrays and objects)." +msgstr "Mit diesem Tool kannst du Zeichenketten in der Datenbank suchen und durch andere ersetzen (serialisierte Arrays und Objekte werden unterstützt)." + +#: templates/bsr-search-replace.php:22 +msgid "To get started, use the form below to enter the text to be replaced and select the tables to update." +msgstr "Gib im Formular an, welche Zeichenkette gesucht und ersetzt werden soll. Wähle aus, welche Tabellen der Datenbank durchsucht werden sollen." + +#: templates/bsr-search-replace.php:23 +msgid "WARNING: Make sure you backup your database before using this plugin!" +msgstr "Achtung: Mach' bitte ein Backup von deiner Datenbank bevor du dieses Plugin benutzt!" + +#: templates/bsr-search-replace.php:28 +msgid "Search for" +msgstr "Suchen nach:" + +#: templates/bsr-search-replace.php:33 +msgid "Replace with" +msgstr "Ersetzen durch:" + +#: templates/bsr-search-replace.php:38 +msgid "Select tables" +msgstr "Tabellen auswählen:" + +#: templates/bsr-search-replace.php:41 +msgid "Select multiple tables with Ctrl-Click for Windows or Cmd-Click for Mac." +msgstr "Steurungs-/Befehlstaste (Win/Mac) oder SHIFT gedrückt halten, um mehrere Tabellen auszuwählen." + +#: templates/bsr-search-replace.php:46 +msgid "Case-Insensitive?" +msgstr "Groß -und Kleinschreibung ignorieren?" + +#: templates/bsr-search-replace.php:49 +msgid "Searches are case-sensitive by default." +msgstr "Groß- und Kleinschreibung wird bei der Suche standardmäßig beachtet" + +#: templates/bsr-search-replace.php:54 +msgid "Replace GUIDs?" +msgstr "Auch GUIDs ersetzen?" + +#: templates/bsr-search-replace.php:57 +msgid "If left unchecked, all database columns titled 'guid' will be skipped." +msgstr "Lasse das Feld frei, um alle Datenbank-Spalten mit dem Titel 'guid' beim Suchen/Ersetzen zu überspringen (empfohlen)." + +#: templates/bsr-search-replace.php:62 +msgid "Run as dry run?" +msgstr "Testlauf?" + +#: templates/bsr-search-replace.php:65 +msgid "If checked, no changes will be made to the database, allowing you to check the results beforehand." +msgstr "Beim Testlauf wird die Datenbank nicht verändert. So kannst du vorher prüfen, welche Ersetzungen vorgenommen werden." + +#: templates/bsr-search-replace.php:76 +msgid "Run Search/Replace" +msgstr "Suchen/Ersetzen starten" + +#: templates/bsr-settings.php:27 +msgid "Max Page Size" +msgstr "Max. Seiten-Anzahl" + +#: templates/bsr-settings.php:31 +msgid "Current Setting: " +msgstr "Aktuelle Einstellung: " + +#: templates/bsr-settings.php:33 +msgid "If you're noticing timeouts or getting a white screen while running a search replace, try decreasing this value." +msgstr "Verringere diesen Wert, wenn dein Datenbank-Server ein Timeout zurückmeldet oder du nur einen weißen Screen siehst, während das Suchen/Ersetzen läuft. " + +#. Plugin URI of the plugin/theme +msgid "http://expandedfronts.com/better-search-replace" +msgstr "http://expandedfronts.com/better-search-replace" + +#. Description of the plugin/theme +msgid "A small plugin for running a search/replace on your WordPress database." +msgstr "Ein Plugin mit dem Zeichenketten in deiner WordPress-Datenbank gesucht und ersetzt werden können." + +#. Author of the plugin/theme +msgid "Expanded Fronts" +msgstr "Expanded Fronts" + +#. Author URI of the plugin/theme +msgid "http://expandedfronts.com" +msgstr "http://expandedfronts.com" + diff --git a/www/wp-content/plugins/better-search-replace/languages/better-search-replace-es_ES.mo b/www/wp-content/plugins/better-search-replace/languages/better-search-replace-es_ES.mo new file mode 100755 index 0000000000000000000000000000000000000000..f2bf1df5fe0869d57718f38adabb4c7b38830501 GIT binary patch literal 4456 zcmcInO>87b6)qtBnV&!e;sR3bK$Kl&x@|AnXfyuVWXH3+Cbr|);{+}lYP!oa6?a$l zR#p3Fj~o!35eE(&B5_54xUCRKj5r}Ua6sY$7w((@i38$$RXsCaG|RF`j68n*^Xk?6 z`QEE<{`lN8-(~oG8sE?3`vZJGhj06R_=nH8Ab0TnHokwu{qNt;*jtdl`2b^|h5XVp zj13_>kar-z54jEbXUJ8^^n;Auhx|I^$02_Q`7Gq0AeSKj0(lSeACRAb?0$%`cOl<| z%prdU`5EkW<-?5q96r2^MYkaT`Z2~X@csrCksm*T{3hhDAT!9FPcrrna`8~+rLSozS`3U|~EO^9Vp25A@ z=cCOP*+i-s(hxofFXWhRXn%?wTQP*e5E^6a)#keM*67jZ*1^~K!O>o4eYttSr*EFm z=g+(t7Si!EX(e}3*laBG_Cn1}7Dc0YY-*izKNg;ADRE`^Q1ZIUg{Rd5FBk2VjfEaf zH!DRh)AeQei$B4~RvvG(o_8&t6~eiVmLIF^WN6M?+$&$mjnm2`+pit$ zZSUQ^1fX4ULWx9(yN0@b4p$PK&=7J`nIt}eW5+<>t>r7a41 z?0KzcJHf!r9M4Qqm)b>~<@|+Ft@0Q6S>u5_QB@^jX3sPY!qHE(`I&IQ+Og8)dsRpZ zUuud`@S}qrf?uNv7h`V`NK>{Sb)76^=7ZY}ZbC;w38S7ztK!yf;#!Ix9up{X= zT7zLB^hs;;7Io8XN5U?nwxeLtf#{c8tf?V_!DR@dMAj8@0Bdoc5ahew7D?<3N=$xYiY1gCAtbwQr1Io;J#tCkba+$tM++Xi z%q^d(9ML4F%Bi6$l)p&4DrMqmuGfXMOZ#v1ldhG*!-r%G1G~eoudLokR#uahSNQ7n z&P%VnxU#yk0>$J&lAXus-Dvc7g!4(?3hfHvjqUJWUJIKWz9X!>Un{;Yi+J_wsKn$> zGgEFZ?Es&(7|EnBMcLu|d;K0?9~NfhUWKEX$gpjy#VM66m2SSEgY+!zZtwQyiCj%r zmbwO=r{Ty&g@~v|%b4U!uhB@c4gf#u-$`!H^~m94X_KBt|DaPk{N_;krTwC|qDbzb z_^!h>(u!NRaea;E7%n%iYJO#duU=bQ`f74lYH4H8`$pzCURKkW(=X#qyiIOnCRDiGKMZWA5?1h2_*qWg zqovUXI1d7DlxdRS5H+4`wR-wg3EK)$dIjKO4&vz3Ug;X$MmoV}*dMcye3>Ph;;$Wu zSoEyn34tErGzoq`PIp#>dFE!SPpsc8?In8jSY=PB;A7A*Dlb;BfJMS%|%W(p2!%mj!TdvLnoY% zfT}$Xfd{CjbTAbUiS#j4>`)Qt)hV?VPD5_00E@uOV7#fHoxI02=H=v}=2?I{;gs@n z*@HGOK+DiT7{$Dj7Svl3Ttg9oE%+Fz8Y&u)Pac;-8xR3SL~yYuaKpfqf)k+ahPoEN z78(YJ3nYN<$(3*uvq88m1Sv;u*Kj$c6$`-M6y^ej6cP-=i9Ey545b+Tpe)DY)YvvM zlUYSScAykU9+D7N(DWGAE)zuX=K6sZ5bi|qjOY#gAY~kl`00XLO$QAY{_+?9XL9#u zvuV@KDwZP9N*;;dVeE6f!Ek^>(-pJ1(3*~=TkLj-mjwgt ZM(Ceu_JKQ^aA4325dyT&!2!gl>|YYI!&?9V literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/better-search-replace/languages/better-search-replace-es_ES.po b/www/wp-content/plugins/better-search-replace/languages/better-search-replace-es_ES.po new file mode 100755 index 0000000..17d8ca9 --- /dev/null +++ b/www/wp-content/plugins/better-search-replace/languages/better-search-replace-es_ES.po @@ -0,0 +1,136 @@ +# Copyright (C) 2014 +# This file is distributed under the same license as the plugin package. +msgid "" +msgstr "" +"Project-Id-Version: Better Search Replace en español\n" +"Report-Msgid-Bugs-To: http://wordpress.org/plugins/better-search-replace\n" +"POT-Creation-Date: 2015-01-09 12:49+0100\n" +"PO-Revision-Date: 2015-01-09 12:59+0100\n" +"Last-Translator: Eduardo Larequi \n" +"Language-Team: PNTE \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 1.6.3\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;" +"_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_ex:1,2c;" +"esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-SearchPath-0: .\n" + +#: includes/class-better-search-replace-admin.php:141 +msgid "" +"No search string was defined, please enter a URL or string to search for." +msgstr "" +"No se ha definido ninguna cadena de búsqueda; por favor, escribe una URL o " +"cadena que buscar." + +#: includes/class-better-search-replace-admin.php:144 +msgid "Please select the tables that you want to update." +msgstr "Por favor, selecciona las tablas que quieres actualizar." + +#: includes/class-better-search-replace-admin.php:153 +#, php-format +msgid "" +"

DRY RUN: %d tables were searched, " +"%d cells were found that need to be updated, and " +"%d changes were made.

Click here for more details, or click the submit " +"button below to run the search/replace.

" +msgstr "" +"

EJECUCIÓN EN SECO: se hn realizado búsquedas en " +"%d tablas, se han encontrado %d celdas que deben " +"ser actualizadas, y se han realizado %d cambios.

Haz clic aquí para ver más detalles, o haz clic en el botón \"Enviar" +"\" que tienes a continuación para ejecutar la búsqueda y sustitución.

" + +#: includes/class-better-search-replace-admin.php:160 +#, php-format +msgid "" +"

During the search/replace, %d tables were searched, with " +"%d cells changed in %d updates.

Click here for more details.

" +msgstr "" +"

Durante la búsqueda y sustitución, se han realizado búsquedas en " +"%d tablas, y se han modificado %d celdas en " +"%d actualizaciones.

Haz clic aquí para " +"ver más detalles.

" + +#: templates/bsr-dashboard.php:17 +msgid "Better Search Replace" +msgstr "Better Search Replace" + +#: templates/bsr-dashboard.php:19 +msgid "" +"This tool allows you to search and replace text in your database (supports " +"serialized arrays and objects)." +msgstr "" +"Esta herramienta permite buscar y sustituir texto en la base de datos; " +"soporta matrices y objetos serializados." + +#: templates/bsr-dashboard.php:20 +msgid "" +"To get started, use the form below to enter the text to be replaced and " +"select the tables to update." +msgstr "" +"Para comenzar, utiliza el formulario que tienes a continuación para escribir " +"el texto que será sustituido y selecciona las tablas que se actualizarán." + +#: templates/bsr-dashboard.php:21 +msgid "" +"WARNING: Make sure you backup your database before using " +"this plugin!" +msgstr "" +"ATENCIÓN: asegúrate de hacer una copia de seguridad de tu " +"base de datos antes de utilizar este plugin." + +#: templates/bsr-dashboard.php:28 +msgid "Search for" +msgstr "Buscar" + +#: templates/bsr-dashboard.php:33 +msgid "Replace with" +msgstr "Sustituir con" + +#: templates/bsr-dashboard.php:38 +msgid "Select tables" +msgstr "Seleccionar tablas" + +#: templates/bsr-dashboard.php:41 +msgid "" +"Select multiple tables with Ctrl-Click for Windows or Cmd-Click for Mac." +msgstr "" +"Selecciona múltiples tablas con Ctrl+Clic (en Windows) o Cmd+Clic (en Mac)." + +#: templates/bsr-dashboard.php:46 +msgid "" +"Replace GUIDs?" +msgstr "" +"¿Quieres " +"sustituir los GUIDs ?" + +#: templates/bsr-dashboard.php:49 +msgid "If left unchecked, all database columns titled 'guid' will be skipped." +msgstr "" +"Si no activas esta opción, se omitirán todas las columnas de las bases de " +"datos tituladas 'guid'." + +#: templates/bsr-dashboard.php:54 +msgid "Run as dry run?" +msgstr "¿Quieres ejecutar \"en seco\"?" + +#: templates/bsr-dashboard.php:57 +msgid "" +"If checked, no changes will be made to the database, allowing you to check " +"the results beforehand." +msgstr "" +"Si activas esta opción, no se realizará ningún cambio en la base de datos, " +"lo cual te permite verificar los resultados de antemano." diff --git a/www/wp-content/plugins/better-search-replace/languages/better-search-replace-fr_FR.mo b/www/wp-content/plugins/better-search-replace/languages/better-search-replace-fr_FR.mo new file mode 100755 index 0000000000000000000000000000000000000000..3c416bd366a7216d67f7ad9d4d6914f4938ddbb6 GIT binary patch literal 4658 zcmcIn&2J<}6)%$T<%Ev}f)oj)ic#<`anFoRoL!AS7VmhyIM~LF$LoL)Lrr(hOs#vm zdaJ7a1s5bFjvziHxN(by0|zeToVkF+-v9?LZ~`t|xbS<`-Qy2>LpBnlo&EK6SJ!** z_kQoy^PgUL=I0Eb&*1x6eE*2==kWdB2k;+0{{XJz`%irTh2LL#nz0AKFFwQAec<jNz#j1Lz)fKLgN$tfe+gUw{ss65_~M5cdk*+R;0wT?0qOm>fHT0~0lxx# z2lz4Ivma*cA@C(&1pEQ;CE(wHb>Pz%cMao4|hqmw^x9)K7sw0pb?>!Y3K~G;j$>`@8`pf4>9V1|9(^ zj<zI-`@p+D7{uynV3ST&Wi~c=_a&=;EFey;xd) zB8}u$3KI@xG+((glyO`v?CUIvxEl(`6De_}c~9~zjfA7O1s+z}3Wp*Yl*UFPlC_mO z{KY@Pheq~SXJ4_iJdB04tFvyX!lRx(o#jrsSgy`)m^0qa622jwP_dm|YsFZ>hwyx* zF4lNo8$QwqBgz-dbKJ7GdrUgF73UQOTfUMKv+i z6rLzItY*RUm~#%SedWG_4e-8?)^)u*%3!zDg&`+ zI^#VN9%U(A8jf^}o&du=34S2}o71K&PvdN$l9$;!w<8h9#c!V@ke|>xagBbilYHAl zZK6FRt(_XEvAfbaX?PwYFG6JZPE%+N0^Ee+on>2n4*iBlB*H}Fy3m_~2M{Ppj?z!5 zFMWqvW2k~0qVVw4@8H+Khb(rs2oIY@H8K&)zT;UkwM6li+woAx*(kBOXd^y1$W%1P zPYMt0kxEmEZFY4LJx6hp@e_e?WnU%adm2lkRVEa(;0Nt((sHp9F6O!=HfwAzUu$J7 zL+9Nt^ytfzVmc8C9_XSzYpfK={e!IyJ1xDTb7`|)4|OC@YbQuSN-3ymGpM(SM>yH- z3}ts;IoX9rpWhm#+BodprH#6~+DX)^FazmUXS=;vBuBGrcc?U{7O5r})$moR`dbt~ zDje##!-_N`K3w{^Mo5GLEijPxE2^%RGjWi20W9T*Dv9)oC8}DZ=+c875!T9$^7mP1 z2$4Fi<2?PgOn$*Ebud%Zk&~y6%Jiz_Z`drQ_$`uQl!(9Tk+-^X5=( ze`fD%ouFl;aIhR~;6Q2e#m2%?&{zx_OT6(~b7`^p+O1a`jb@`Uv$M5x@4`(uG}A&O z0GC1MEXA9|CCmwxEK@fy7TP@MYzDV4))|r5zBIwT1k#7doBVc9Ik*wD<*}mpuXwQ( zEG+T`7{3j7;K5#;84(AYIA3g&CkPEc?dsw(wLDy|-bnZwU%0tEvn?##B6G2D+BA9R zaFeg7q_4k>w2!0>rfda$EDMFQl)*K;nG7;9kU>X^(ffF>$@^yJ&EURFq{&V1X&EVp z4Bo1}jwkugU>{9Al&E&%smXJqrcb{r&&WZ$tt=jPyUSg9@#Bd&O+e7Xutph3Lj(eupFq~>m0SOFvo<$$rx$OLY&t=RXGi?g%eNkQt(tb zkj(Wc=L=4VCk#uxr!WwBhfP`dq)%%Vo#zY|!B}b3Y3S8L*9cF?;0+hWBt^~Qzpar= zq(U`FlqLf;woZ3U&hF_KN-_d zf}=;D*6bt zJ2hU6XSq+9HBq#1vFH&7e@hfk*c+L3XfwXUAe~5$<99ACy+#T(EG08DrN*}dWDcpt z?!47$Z@(Ji4>)RMt(}eh+KV028rvW>6G6qe)#BO}koUyn-+urik^IX5 literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/better-search-replace/languages/better-search-replace-fr_FR.po b/www/wp-content/plugins/better-search-replace/languages/better-search-replace-fr_FR.po new file mode 100755 index 0000000..ded234a --- /dev/null +++ b/www/wp-content/plugins/better-search-replace/languages/better-search-replace-fr_FR.po @@ -0,0 +1,145 @@ +# Copyright (C) 2015 Better Search Replace +# This file is distributed under the same license as the Better Search Replace package. +msgid "" +msgstr "" +"Project-Id-Version: Better Search Replace 1.0.2\n" +"Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/better-search-replace\n" +"POT-Creation-Date: 2015-02-05 04:52:47+00:00\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"PO-Revision-Date: 2015-05-12 10:08-0500\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Last-Translator: TWF \n" +"Language-Team: TWF \n" +"Language: fr\n" +"X-Generator: Poedit 1.7.6\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e\n" +"X-Poedit-Basepath: .\n" +"X-Poedit-SearchPath-0: ..\n" + +#. Plugin Name of the plugin/theme +#: includes/class-better-search-replace-admin.php:69 templates/bsr-dashboard.php:17 +msgid "Better Search Replace" +msgstr "Better Search Replace" + +#: includes/class-better-search-replace-admin.php:138 +msgid "No search string was defined, please enter a URL or string to search for." +msgstr "" +"Aucune chaîne de recherche a été définie, entrez une URL ou une chaîne à rechercher." + +#: includes/class-better-search-replace-admin.php:141 +msgid "Please select the tables that you want to update." +msgstr "Sélectionnez les tables que vous souhaitez mettre à jour." + +#: includes/class-better-search-replace-admin.php:150 +msgid "" +"

DRY RUN: %d tables were searched, %d cells were found that need to be updated, and %d changes " +"were made.

Click " +"here for more details, or use the form below to run the search/replace.

" +msgstr "" +"

Résultat de l'essai : %d tables ont été " +"parcourues, %d chaînes trouvées qui peuvent être mises à jour et " +"%d modifications auraient pu être apportées.

Cliquez ici pour plus de détails, " +"ou utilisez le formulaire ci-dessous pour exécuter la recherche/remplace.

" + +#: includes/class-better-search-replace-admin.php:157 +msgid "" +"

During the search/replace, %d tables were searched, with " +"%d cells changed in %d updates.

Click here for more details.

" +msgstr "" +"

Pendant la recherche/remplace, %d tables ont été fouillés, avec " +"%d cellules changées dans %d mises à jour.

Cliquez ici " +"pour plus de détails.

" + +#: templates/bsr-dashboard.php:19 +msgid "" +"This tool allows you to search and replace text in your database (supports " +"serialized arrays and objects)." +msgstr "" +"Cet outil vous permet de rechercher et remplacer du texte dans votre base de données " +"(prend en charge la sérialisation des tables et objets)." + +#: templates/bsr-dashboard.php:20 +msgid "" +"To get started, use the form below to enter the text to be replaced and select the " +"tables to update." +msgstr "" +"Pour commencer, utiliser le formulaire ci-dessous pour entrer dans le texte pour le " +"remplacement et sélectionnez les tables à mettre à jour." + +#: templates/bsr-dashboard.php:21 +msgid "" +"WARNING: Make sure you backup your database before using this " +"plugin!" +msgstr "" +"Avertissement : Assurez-vous que vous avez sauvegardé votre base de " +"données avant d'utiliser ce plugin !" + +#: templates/bsr-dashboard.php:28 +msgid "Search for" +msgstr "Rechercher" + +#: templates/bsr-dashboard.php:33 +msgid "Replace with" +msgstr "Remplacer avec" + +#: templates/bsr-dashboard.php:38 +msgid "Select tables" +msgstr "Dans les tables" + +#: templates/bsr-dashboard.php:41 +msgid "Select multiple tables with Ctrl-Click for Windows or Cmd-Click for Mac." +msgstr "Sélectionnez plusieurs tables avec la touche CTRL+clic ou CMD+clic pour Mac" + +#: templates/bsr-dashboard.php:46 +msgid "" +"Replace GUIDs?" +msgstr "" +"Remplacez les GUID ? En savoir plus sur " +"les GUID" + +#: templates/bsr-dashboard.php:49 +msgid "If left unchecked, all database columns titled 'guid' will be skipped." +msgstr "Si décoché, toutes les colonnes 'guid' de la base de données seront igniorés." + +#: templates/bsr-dashboard.php:54 +msgid "Run as dry run?" +msgstr "Juste faire un test ?" + +#: templates/bsr-dashboard.php:57 +msgid "" +"If checked, no changes will be made to the database, allowing you to check the " +"results beforehand." +msgstr "" +"Si coché, aucun changement ne sera apporté à la base de données, vous aurez un bilan " +"des résultats possibles" + +#: templates/bsr-dashboard.php:66 +msgid "Run Search/Replace" +msgstr "Rechercher/Remplacer" + +#. Plugin URI of the plugin/theme +msgid "http://expandedfronts.com/better-search-replace" +msgstr "http://expandedfronts.com/better-search-replace" + +#. Description of the plugin/theme +msgid "A small plugin for running a search/replace on your WordPress database." +msgstr "" +"Un petit plugin pour rechercher et remplacer des cabine dans votre base de données " +"WordPress." + +#. Author of the plugin/theme +msgid "Expanded Fronts" +msgstr "Expanded Fronts" + +#. Author URI of the plugin/theme +msgid "http://expandedfronts.com" +msgstr "http://expandedfronts.com" diff --git a/www/wp-content/plugins/better-search-replace/languages/better-search-replace.pot b/www/wp-content/plugins/better-search-replace/languages/better-search-replace.pot new file mode 100755 index 0000000..8f66926 --- /dev/null +++ b/www/wp-content/plugins/better-search-replace/languages/better-search-replace.pot @@ -0,0 +1,252 @@ +# Copyright (C) 2015 Better Search Replace +# This file is distributed under the same license as the Better Search Replace package. +msgid "" +msgstr "" +"Project-Id-Version: Better Search Replace 1.2.7\n" +"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/better-search-" +"replace\n" +"POT-Creation-Date: 2015-11-25 00:09:59+00:00\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"PO-Revision-Date: 2015-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" + +#: includes/class-bsr-admin.php:71 +msgid "" +"No search string was defined, please enter a URL or string to search for." +msgstr "" + +#: includes/class-bsr-admin.php:72 +msgid "Please select the tables that you want to update." +msgstr "" + +#: includes/class-bsr-admin.php:73 +msgid "" +"An error occurred processing your request. Try decreasing the \"Max Page Size" +"\", or contact support." +msgstr "" + +#: includes/class-bsr-admin.php:74 +msgid "Processing..." +msgstr "" + +#. #-#-#-#-# plugin.pot (Better Search Replace 1.2.7) #-#-#-#-# +#. Plugin Name of the plugin/theme +#: includes/class-bsr-admin.php:86 templates/bsr-dashboard.php:34 +msgid "Better Search Replace" +msgstr "" + +#: includes/class-bsr-admin.php:106 +msgid "" +"

DRY RUN: %d tables were searched, " +"%d cells were found that need to be updated, and " +"%d changes were made.

Click here for more details, or use the form below " +"to run the search/replace.

" +msgstr "" + +#: includes/class-bsr-admin.php:113 +msgid "" +"

During the search/replace, %d tables were searched, with " +"%d cells changed in %d updates.

Click here for more details.

" +msgstr "" + +#: includes/class-bsr-admin.php:213 +msgid "Table" +msgstr "" + +#: includes/class-bsr-admin.php:213 +msgid "Changes Found" +msgstr "" + +#: includes/class-bsr-admin.php:213 +msgid "Rows Updated" +msgstr "" + +#: includes/class-bsr-admin.php:213 +msgid "Time" +msgstr "" + +#: includes/class-bsr-admin.php:234 +msgid "seconds" +msgstr "" + +#: includes/class-bsr-admin.php:242 +msgid "" +"Want even more details, easy database migrations, and saved search/replace " +"profiles?" +msgstr "" + +#: includes/class-bsr-admin.php:243 +msgid "Learn more about the pro version" +msgstr "" + +#: includes/class-bsr-admin.php:288 +msgid "Upgrade to Pro" +msgstr "" + +#: includes/class-bsr-ajax.php:156 +msgid "Processing table %d of %d: %s" +msgstr "" + +#: includes/class-bsr-db.php:85 +msgid "(%s MB)" +msgstr "" + +#: includes/class-bsr-db.php:285 +msgid "Error updating row: %d." +msgstr "" + +#: templates/bsr-dashboard.php:48 +msgid "Search/Replace" +msgstr "" + +#: templates/bsr-dashboard.php:49 +msgid "Settings" +msgstr "" + +#: templates/bsr-dashboard.php:50 +msgid "Help" +msgstr "" + +#: templates/bsr-dashboard.php:72 +msgid "Like this plugin?" +msgstr "" + +#: templates/bsr-dashboard.php:75 +msgid "Rate it on WordPress.org" +msgstr "" + +#: templates/bsr-dashboard.php:76 +msgid "Follow us on Twitter" +msgstr "" + +#: templates/bsr-dashboard.php:77 +msgid "Get the pro version" +msgstr "" + +#: templates/bsr-help.php:17 +msgid "Help & Troubleshooting" +msgstr "" + +#: templates/bsr-help.php:19 +msgid "" +"Free support is available on the plugin support forums." +msgstr "" + +#: templates/bsr-help.php:21 +msgid "" +"For premium features and priority email support, upgrade to pro." +msgstr "" + +#: templates/bsr-help.php:23 +msgid "" +"Found a bug or have a feature request? Please submit an issue on GitHub!" +msgstr "" + +#: templates/bsr-help.php:29 +msgid "Download System Info" +msgstr "" + +#: templates/bsr-search-replace.php:21 +msgid "" +"This tool allows you to search and replace text in your database (supports " +"serialized arrays and objects)." +msgstr "" + +#: templates/bsr-search-replace.php:22 +msgid "" +"To get started, use the form below to enter the text to be replaced and " +"select the tables to update." +msgstr "" + +#: templates/bsr-search-replace.php:23 +msgid "" +"WARNING: Make sure you backup your database before using " +"this plugin!" +msgstr "" + +#: templates/bsr-search-replace.php:28 +msgid "Search for" +msgstr "" + +#: templates/bsr-search-replace.php:33 +msgid "Replace with" +msgstr "" + +#: templates/bsr-search-replace.php:38 +msgid "Select tables" +msgstr "" + +#: templates/bsr-search-replace.php:41 +msgid "" +"Select multiple tables with Ctrl-Click for Windows or Cmd-Click for Mac." +msgstr "" + +#: templates/bsr-search-replace.php:46 +msgid "Case-Insensitive?" +msgstr "" + +#: templates/bsr-search-replace.php:49 +msgid "Searches are case-sensitive by default." +msgstr "" + +#: templates/bsr-search-replace.php:54 +msgid "" +"Replace GUIDs?" +msgstr "" + +#: templates/bsr-search-replace.php:57 +msgid "If left unchecked, all database columns titled 'guid' will be skipped." +msgstr "" + +#: templates/bsr-search-replace.php:62 +msgid "Run as dry run?" +msgstr "" + +#: templates/bsr-search-replace.php:65 +msgid "" +"If checked, no changes will be made to the database, allowing you to check " +"the results beforehand." +msgstr "" + +#: templates/bsr-search-replace.php:76 +msgid "Run Search/Replace" +msgstr "" + +#: templates/bsr-settings.php:27 +msgid "Max Page Size" +msgstr "" + +#: templates/bsr-settings.php:31 +msgid "Current Setting: " +msgstr "" + +#: templates/bsr-settings.php:33 +msgid "" +"If you're noticing timeouts or getting a white screen while running a search " +"replace, try decreasing this value." +msgstr "" + +#. Plugin URI of the plugin/theme +msgid "http://expandedfronts.com/better-search-replace" +msgstr "" + +#. Description of the plugin/theme +msgid "A small plugin for running a search/replace on your WordPress database." +msgstr "" + +#. Author of the plugin/theme +msgid "Expanded Fronts" +msgstr "" + +#. Author URI of the plugin/theme +msgid "http://expandedfronts.com" +msgstr "" diff --git a/www/wp-content/plugins/better-search-replace/templates/bsr-dashboard.php b/www/wp-content/plugins/better-search-replace/templates/bsr-dashboard.php new file mode 100644 index 0000000..2899289 --- /dev/null +++ b/www/wp-content/plugins/better-search-replace/templates/bsr-dashboard.php @@ -0,0 +1,94 @@ + Better Search Replace. + * + * @link http://expandedfronts.com/better-search-replace/ + * @since 1.0.0 + * + * @package Better_Search_Replace + * @subpackage Better_Search_Replace/templates + */ + +// Prevent direct access. +if ( ! defined( 'BSR_PATH' ) ) exit; + +// Determines which tab to display. +$active_tab = isset( $_GET['tab'] ) ? $_GET['tab'] : 'bsr_search_replace'; + +switch( $active_tab ) { + case 'bsr_settings': + $action = 'action="' . get_admin_url() . 'options.php' . '"'; + break; + case 'bsr_help': + $action = 'action="' . get_admin_url() . 'admin-post.php' . '"'; + break; + default: + $action = ''; +} + +?> + +
+ +

+ + +
+ + + +
+ +
+ +
+ + + +
method="POST"> + + + +
+ +
+ +
+ +
+

+
+
    +
  • +
  • +
  • +
+
+
+ +
+
+ +
+
+ +
+ +
+ +
+ +
diff --git a/www/wp-content/plugins/better-search-replace/templates/bsr-help.php b/www/wp-content/plugins/better-search-replace/templates/bsr-help.php new file mode 100644 index 0000000..564cb0c --- /dev/null +++ b/www/wp-content/plugins/better-search-replace/templates/bsr-help.php @@ -0,0 +1,30 @@ + + +

+ +

plugin support forums.', 'better-search-replace' ), 'https://wordpress.org/support/plugin/better-search-replace' ); ?>

+ +

upgrade to pro.', 'better-search-replace' ), 'https://expandedfronts.com/products/better-search-replace-pro/' ); ?>

+ +

GitHub!', 'better-search-replace' ), 'https://github.com/expandedfronts/better-search-replace' ); ?>

+ + + +

+ + +

diff --git a/www/wp-content/plugins/better-search-replace/templates/bsr-search-replace.php b/www/wp-content/plugins/better-search-replace/templates/bsr-search-replace.php new file mode 100644 index 0000000..4cee0d0 --- /dev/null +++ b/www/wp-content/plugins/better-search-replace/templates/bsr-search-replace.php @@ -0,0 +1,81 @@ + + +
+ +
+ +

+

+

WARNING: Make sure you backup your database before using this plugin!', 'better-search-replace' ); ?>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

+
+ /> + +
+ /> + +
+ + +
+ +
+ +
+ + + +
+ +
+ +
diff --git a/www/wp-content/plugins/better-search-replace/templates/bsr-settings.php b/www/wp-content/plugins/better-search-replace/templates/bsr-settings.php new file mode 100644 index 0000000..fff1a8a --- /dev/null +++ b/www/wp-content/plugins/better-search-replace/templates/bsr-settings.php @@ -0,0 +1,40 @@ + + + + + + + + + + + + + +
+ + +
+
+ +

+ +
+ diff --git a/www/wp-content/plugins/github-updater/CHANGES.md b/www/wp-content/plugins/github-updater/CHANGES.md new file mode 100755 index 0000000..df43c5b --- /dev/null +++ b/www/wp-content/plugins/github-updater/CHANGES.md @@ -0,0 +1,519 @@ +#### 5.4.0 +* fix deprecated PHP4 constructor in vendor class. +* add `class Additions` to process JSON config from hook to add repositories to GitHub Updater, uses [GitHub Updater Additions](https://github.com/afragen/github-updater-additions) to add +* add necessary code in `class Plugin` and `class Theme` for above +* skip many remote API calls if no update available and use local files, huge performance boost :-) +* remove check for GitHub asset, this eliminates an API call for a rarely used feature +* added additional header `Release Asset: true` to add back ability to set download link to release asset. +* added function to remove _Basic Authentication_ header when downloading private Bitbucket release assets as they are stored on AmazonS3 and use [Query String Request Authentication Alternative](http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#RESTAuthenticationQueryStringAuth) +* consolidate error messages to show only once per error +* add _Other Notes_ section to View details +* update readme.txt with _Other Notes_ information + +#### 5.3.4 +* reset 'new_version' in update transient to avoid _up to date_ failure with branch switching. +* fix display of branch switching themes on single install. +* fix bug in getting Bitbucket branch names. +* fix to hide checkbox when active as mu-plugin. +* work better with shiny updates. + +#### 5.3.3 +* remove added filters, below as they didn't add functionality to this plugin. +* try to use references to `&$this` +* added PHPUnit testing setup, I could use help writing tests. A great way to contribute. :-) + +#### 5.3.2 +* code simplification for `upgrader_source_selection` +* fix for plugin branch switching to override _up-to-date_ message (most of the time) +* added filters for developers, well I wanted them anyway ;-) + * `github_updater_plugin_transient_update` + * `github_updater_theme_transient_update` + * `github_updater_plugin_row_meta` + * `github_updater_theme_row_meta` + * `github_updater_append_theme_action` +* fix for renaming of updating plugins that were never initially renamed when first installed. Strange bug. + +#### 5.3.1 +* fix PHP notice during remote installation +* fix remote install [#325](https://github.com/afragen/github-updater/issues/325) + +#### 5.3.0 +* fix parsing of `readme.txt` for donate link +* refactor transient storage resulting in significantly few database calls, more performant. +* move `{get|set}_transient` functions to `abstract class API` +* fix settings page saving errors. +* fix for shiny updates [#321](https://github.com/afragen/github-updater/issues/321) +* overhaul of renaming code back to using `upgrader_source_selection` and for WordPress 4.4 adding `$args['hook_extra'] to `upgrader_source_selection` filter. Thanks @dd32! + +#### 5.2.0 +* fix [#309](https://github.com/afragen/github-updater/issues/309) for proper GitHub Enterprise endpoints +* add setting for GitHub Enterprise personal access token +* new `function _add_access_token()` for `class GitHub_API` +* update `erusev/parsedown` to current release + +#### 5.1.2 +* add `upgrader_source_selection` filter back for correct updating of current, active theme. +* fix [#293](https://github.com/afragen/github-updater/issues/293) and [#297](https://github.com/afragen/github-updater/issues/297) +* remove `pre_http_request` filter blocking +* fix javascript for theme rollback - @scarstens +* play nice with current master branch of wp-update-php + +#### 5.1.1 +* hotfix to comment out `pre_http_request` filter. Updating of plugin doesn't work. I need to re-think this one. + +#### 5.1.0 +* refactor of Plugin and Theme constructors moving code calling APIs getting remote data to separate functions +* fix [#281](https://github.com/afragen/github-updater/issues/281), removed 'Activate Plugin/Theme' buttons post-install +* fix [#284](https://github.com/afragen/github-updater/issues/284) for GitLab CE/Enterprise install and update +* fix to re-activate plugins after update, doesn't work with branch switching :person_frowning: +* fix to correctly rename plugin/theme on update if installed from upload. +* add filter to `pre_http_response` to bypass certain plugins check using `wp_remote_get` with each page load in GitHub Updater. Bypass is only for 12 hours. +* cosmetic fix to display GitHub Updater as active when activated as mu-plugin +* fix to `theme_api` 'View version details' CSS; better scrolling for changelog info +* fix annoying PHP notice in `vendor/parse-readme.php` when _Upgrade Notice_ malformed +* fix `API::return_repo_type` to add 'type' to array; allows easier instance creation of API classes +* update POT file + +#### 5.0.1 +* updated to current `erusev/parsedown` release, fixes PHP7 issue +* updated to current `WPupdatePHP/wp-update-php/release-1-1-0` branch + +#### 5.0.0 +* fix rollback for GitLab themes +* add branch switcher for themes +* escape all printed strings +* changed from using `upgrader_source_selection` hook to `upgrader_post_install`, this greatly simplifies renaming +* removed `class Remote_Update` as it's no longer needed when using `upgrader_post_install` hook +* added **Remote Management** settings tab more cleanly support those services that currently integrate with GitHub Updater +* modified the process loading so faster for admin level users. Much thanks @khromov +* added hooks for devs to set GitHub Access Tokens and hide the Settings page. Please be sure your client will never need access to the Settings page. Thanks @oncecoupled +* fixed [#267](https://github.com/afragen/github-updater/issues/267) thanks @stevehenty and @rocketgenius + +#### 4.6.2 +* refactor remote update services to new `class Remote_Update` +* general security fixes, don't call files directly... +* fix/test for remote updating via InfiniteWP. Child themes are not identified by IWP as needing updates, otherwise it seems to work as expected. + +#### 4.6.1 +* fix for remote updating via iThemes Sync +* fix for renaming when AJAX updating of plugins + +#### 4.6.0 +* newer, much more precise method for renaming based upon selected repos from the dashboard. Yes, I tested on staging server. :-) +* added feature to use extended naming of plugin directories to avoid potential conflict with WP.org slugs. Props @reinink for the idea. +* strip `.git` from the end of the plugin or theme URI for those who haven't gotten to the README yet. +* added javascript show/hide options on the Install page. +* fixed boolean logic to _not_ display GitLab Private Token input on Install if it's already set. +* updated screenshots in README +* switched a number of methods to be non-static, anticipation of testing. +* [broken: renaming during updates from upgrade services](https://github.com/afragen/github-updater/issues/262) + +#### 4.5.7 +* hotfix GitLab private updating/installing +* fix some PHP notices + +#### 4.5.6 +* bugfix for renaming code to properly strip `-` +* most of Russian translation by [Anatoly Yumashev](https://github.com/yumashev) + +#### 4.5.5 +* back to simplifying the renaming code, always remember to test renaming on live server. +* strip `-` and `-` from beginning and end of update for more precise renaming +* I think this is the end of renaming for a while. :P + +#### 4.5.4 +* hotfix for renaming, I reverted back a bunch with more extensive testing on server. It's amazing how different renaming is locally vs on server. + +#### 4.5.3 +* updated language files -- oops + +#### 4.5.2 +* cleanup and refactor of renaming code. +* added Romanian translation by [Corneliu Cirlan](https://github.com/corneliucirlan) +* added Japanese translation by [ishihara](https://github.com/1shiharat) + +#### 4.5.1 +* fix bug so updates display without having to randomly refresh. + +#### 4.5.0 +* fix some PHP notices +* add update by GitHub release asset in lieu of update by tag when asset is present +* install asset via remote install if asset URI used +* refactor to simplify class structure, created `abstract class API` and `class Messages` +* add GitLab support!! +* refactor to set all git servers and extra headers to static arrays in `Base` +* remove checkbox when loaded as mu-plugin, props @pbearne + +#### 4.4.0 +* only add custom user agent once :P +* add support of GitHub Enterprise via new `GitHub Enterprise` header +* sanitize filter input +* add support for parsing `readme.txt` for _View details_ information using `WordPress_Plugin_Readme_Parser` by @markjaquith +* fixed _View details_ link to show for all cases when plugin using GitHub Updater +* refactor creation of header parts and URIs + +#### 4.3.1 +* Spanish translation by [Jose Miguel Bejarano](https://github.com/xDae) +* German translation by [Linus Metzler](https://github.com/limenet) +* squish PHP notices +* add custom user agent to `wp_remote_get` and tweak error message at request of GitHub ;-) +* fixed edge case renaming bug + +#### 4.3.0 +* use @WPUpdatePhp `class WPUpdatePhp` for PHP version checking +* use https://api.wordpress.org not http +* Arabic translation by [Hyyan Abo FAkher](https://github.com/hyyan) +* make strings better for translation - thanks @pedro-mendonca and @fxbenard +* additional Portuguese translation by [Pedro Mendonça](https://github.com/pedro-mendonca) +* refactor for getting local plugin and theme meta, now simpler for additional APIs (I'm thinking about you GitLab) +* fix link in README to GitHub Link +* correctly pass array as last argument in `add_settings_field` +* add focus to URI input field +* add Setting for personal GitHub Access Token to avoid API rate limit - thanks @mlteal +* add Setting for branch switching from the Plugins page +* add 'View details' link in Plugins page + +#### 4.2.2 +* fix POT and some updated languages, thanks @fxbenard +* fix PHP notice for `$options` settings on initial install - thanks @benosman + +#### 4.2.1 +* add PHP version check for graceful exit +* add to error message for 401 error. +* save settings when remote installing a private repo + +#### 4.2.0 +* added minutes until reset of GitHub API's rate limit to error message +* added `placeholder = "master"` to remote install branch text input +* I should have made the last version 4.2.0 as I added a new feature. I'll try to be better with semantic versioning in the future. ;-) + +#### 4.1.4 +* add message to certain admin pages when API returns HTTP error code +* update POT to remove HTML entity codes from strings and generally try to make i18n better +* Swedish translation by [Andréas Lundgren](https://github.com/Adevade) +* added logo to README and Settings page + +#### 4.1.3 +* use `strtolower` comparison of plugin directory and repo name. This might is an issue related to the manual installation of a plugin before any update might occur. This allows the **View details** screen to display in these instances where the case of the directory and repo aren't identical. This doesn't work for themes. + +#### 4.1.2 +* hide star ratings from **View details** screen for private repos + +#### 4.1.1 +* add `plugin` to `$response` in `Plugin::pre_set_site_transient_update_plugins` to fix PHP Notice +* rename `classes` to `src` to follow more conventional naming +* refactor renaming code to function under all circumstances, I hope ;-) + +#### 4.1.0 +* added remote installation of plugins or themes, both public and private +* remote installation using either full URI or short `` format +* created new tabbed interface for settings +* added another screenshot to readme +* I'd like to apologize to all my translators for adding new strings often, you guys are great, thanks! + +#### 4.0.1 +* hotfix to force an array type when sanitizing settings, it gave me a fatal I wasn't expecting. + +#### 4.0.0 +* changed `is_a()` to `instanceof` per https://core.trac.wordpress.org/changeset/31188 +* requires PHP 5.3 or greater as autoloader class requires namespacing
 +* updated all classes for namespacing +* renamed directory and class names to allow for PSR 4 style loading
 +* clean up a number of foreach loops where I was only using either key or value, not both +* Special thanks for all my translators, especially @grappler for adding translation key for description +* bugfix to correctly pick CHANGES.MD or CHANGELOG.MD regardless of case +* removed reading/saving `GitHub Access Token` header into settings. Must use Settings Page. + +#### 3.2.3 - 3.2.6 +* added French translation by @daniel-menard +* added Italian translation by @overclokk +* added Portuguese translation by @valeriosouza +* added Ukrainian translation by @andriiryzhkov (our first translation!!) + +#### 3.2.2 +* remove scraping of user/pass from Bitbucket URI as it's no longer needed +* use `Requires WP` header to fill view options detail +* rename private methods to begin with underscore +* add screenshot to README for Settings Page (only 70 kB) +* stop re-creating transient of transients if it already exists + +#### 3.2.1 +* refactored adding extra headers to `class GitHub_Updater` to ensure they're added before they're needed, resolves issue with WooThemes Updater plugin +* update .pot file + +#### 3.2.0 +* changed settings page and how Bitbucket Private repos authenticate with your username/password +* update .pot + +#### 3.1.1 +* minor transient cleanup +* update .pot file +* fix to get all themes under both single and multisite installs + +#### 3.1.0 +* woot!! - updating from Bitbucket private repos now works!! +* fix to only add HTTP Authentication header under correct circumstances. This obviates need to fix for other APIs that might also use HTTP Authentication. +* fix to correctly add GitHub Access Token from `$options` to `$download_link` - oops +* changes `$options` to `private static $options` to save a few database calls +* Settings page **only** shows private repos, except for initial setup +* simpler test for checking branch as download endpoint +* correctly use `parent::` instead of `self::` +* many updates for translation +* fix to ensure theme rollback and updating works in both single install and multisite +* fix to save settings from single site installations + +#### 3.0.7 +* more efficient solution to HTTP Authentication issues +* more efficient options cleanup +* remove some unnecessary code resulting in few database calls +* change default option setting to use `add_site_option` so not autoloading options + +#### 3.0.6 +* fix for other APIs that use HTTP Authentication, like JetPack - thanks @tsquez + +#### 3.0.5 +* fix more PHP Notices +* correctly set defaults for Settings page :P +* remove options for plugins/themes that are no longer present + +#### 3.0.4 +* Who would've thought `file_exists` was case-sensitive +* when checking meta, use `empty()` instead of `! isset()` for `null array` +* set defaults for Settings page +* fix a number of PHP Notices + +#### 3.0.3 +* Bugfix to properly authenticate on JetPack Stats page + +#### 3.0.2 +* simplify check and exit on Settings if no Bitbucket plugins/themes + +#### 3.0.1 +* Remove Bitbucket settings from page if no appropriate plugins or themes exist. + +#### 3.0.0 +* Settings Page for your GitHub Access Tokens +* added POT file and some more i18n fixes - thanks @grappler +* added `Requires WP` and `Requires PHP` headers to set minimum version requirements - for @GaryJ +* move update check to function to also check WP and PHP version requirements. +* unset any HTTP Authorization headers for GitHub API calls as this gives a 401 error. Rare potential bug if you have private Bitbucket repos. + +#### 2.9.0 +* move instantiation of `class GitHub_Plugin_Updater` and `class GitHub_Theme_Updater` into `GitHub_Updater::init()` and restrict to `current_user_can( 'update_plugins' )` and `current_user_can( 'update_themes' )` so that non-privileged users don't incur load time. +* now loading classes via `spl_autoload_register` +* switched to `erusev/parsedown` for rendering changelogs, faster and more light-weight. +* now parses remote file info to save only file headers to transient. Hopefully speeds up database retrieval of transient. +* added README link to GitHub Link plugin by @szepeviktor +* added mu-plugin option and instructions. +* above revisions mostly due to @szepeviktor prodding me. ;-) +* accept `CHANGES.md` or `CHANGELOG.md` for processing, for @GaryJ +* composer support added, thanks @hyyan + +#### 2.8.1 +* fix for WP Coding Guidelines +* added check for upgrade process instead of `$_GET['action']` (props @SLv99) +* launch classes from `GitHub_Updater::init()` so can load in `add_action( 'init', ...` from `__construct()`. Hopefully this will solve issues with remote upgraders like iThemes Sync, ManageWP, InfiniteWP, and MainWP. Thanks @jazzsequence for testing. Thanks @SLv99 for bringing this to my attention. + +#### 2.8.0 +* refactor API classes and `class GitHub_Updater` to add extra headers from API class. This should allow for better abstraction. Just need to call `GitHub_Updater_{repo}_API::add_headers()` in `class GitHub_Plugin_Updater` and `class GitHub_ Theme_Updater`. +* remove @since tags +* move `maybe_authenticate_http` to `class GitHub_Updater_Bitbucket_API` as it's not used elsewhere +* use non-strict check for http response code (thanks @echav) + +#### 2.7.1 +* added early exit if no local `CHANGES.md` file exists. This should save an API call. +* pull update from WP.org if plugin hosted in WP.org and branch is `master`. + +#### 2.7.0 +* created functions for getting and setting transients +* added deletion of all transients if _force-check_ is used +* removed `GitHub Timeout` and `Bitbucket Timeout` headers +* fix for `wp_remote_retrieve_response_code` check +* give Seth Carstens proper credit in README.md +* move `function make_rating` to `class GitHub_Updater` +* fix for plugin name in update detail view +* fix for Bitbucket repo with no branch tag +* set default timeout to 12 hours, same as WP.org +* fix for 3.9 setting theme update details to `display:none;` +* fix for error when installing themes from WP.org repo +* fix for incorrect plugin upgrade link in detail popup + +#### 2.6.3 +* quick error checking fix for `wp_remote_get` error to wordpress.org API - thanks @deckerweb + +#### 2.6.1 +* fixed CHANGES.md for GFM strike-through + +#### 2.6.0 +* added transient to `plugins_api` call +* better zeroing of variables in getting local theme data +* add error checking to loading of classes +* set default transient timeout to 4 hours +* added new header `GitHub Timeout` or `Bitbucket Timeout` to set individual plugin/theme transient timeout +* ~~fixed for Bitbucket private repos~~ +* abide by WP Coding Guidelines, esp. for braces +* more error checking for correct variable fetch +* added graceful exit if repo does not exist + +#### 2.5.0 +* added `class GitHub_Updater_Bitbucket_API` for Bitbucket hosted plugins and themes. +* improvements to efficiency by not loading when `DOING_AJAX` +* improvements to efficiency in use of transients + +#### 2.4.5 +* set PHP MarkdownExtra posts and comments markup to false props @MikeHansonMe +* remove WP plugin header from `markdown.php` + +#### 2.4.4 +* forgot to include markdown.php - damn + +#### 2.4.2 +* removed PHP Markdown Lib as it required PHP >= 5.3 and that's higher than required by WordPress core. + +#### 2.4.1 +* switched from PHP Markdown Classic to the new PHP Markdown Lib to prevent collisions with other plugins, like Markdown On Save/Improved that also load PHP Markdown or PHP MarkdownExtra. + +#### 2.4.0 +* fixed transient assignment for tags returning empty array. +* added transient for `CHANGES.md` to themes, should further cut down on API 403 errors. +* new feature: theme rollback to previous version thanks @scarstens +* changed update methodology to use most recent tag first. If not tagged update from default branch. + +#### 2.3.3 +* fixed download link to have correct base URI for Repository Contents API. Oops. + +#### 2.3.2 +* rewrite of `GitHub_Update_GitHub_API::construct_download_link` to download zipball and provide appropriate endpoint. + +#### 2.3.1 +* now saving transient and adding early return if API returns 404, this should speed up plugin when repo doesn't have `CHANGES.md` file and provide for early return in no tags have been created. If no tags have been created the API is still hit. + +#### 2.3.0 +* moved action hook to remove `after_theme_row_$stylesheet` to `class GitHub_Theme_Updater` +* added feature: if branch other than `master` is specified then tagged version will be ignored. This should make it much easier for beta testing to groups. See [README.md](https://github.com/afragen/github-updater/blob/develop/README.md) +* converted `class GitHub_Update_GitHub_API` to extension of `class GitHub_Updater` +* combined `description` and `changelog` to show in theme detail view. Rough formatting. Multisite only. +* greatly simplified bug fix from 2.2.2, now using Themes API. + +#### 2.2.2 +* bug fix for removing update notice for WP.org repo themes. Oops. + +#### 2.2.1 +* minor code simplifications +* many thanks to @grappler for solving how to remove default `after_theme_row_$stylesheet` + +#### 2.2.0 +* moved check and load for `markdown.php` into only function that uses it. +* minor README updates +* added abort if this plugin called directly +* added additional data to update available screen in both plugins and themes - issue #8 +* removed requirement for tags in theme updating +* removed extra line endings from `remote_version` +* added ratings function for creating star ratings based upon GitHub repo data. +* bring parts of `class GitHub_Theme_Updater` code on par with `class GitHub_Plugin_Updater` +* added 'ghu-' prefix to transients +* ripped out theme rollback code. Moved to it's own branch on GitHub. +* add custom `after_theme_update_{$stylesheet}` detail. + +#### 2.1.1 +* bug fix to return early from call to `plugins_api` if not getting plugin information. Fixes issue with Plugin Search. + +#### 2.1.0 +* simplify check for `class Markdown_Parser` +* refactor to pass `class GitHub_Update_GitHub_API` as class object. This should enable the creation of other class objects for Bitbucket, etc. +* fix for setting branch when API not responding +* fix for setting download link when API not responding +* redesigned filter for setting transient timeout, but still not working (pull requests welcome) + +#### 2.0.1 +* bug fix to not load `markdown.php` twice. Just in case it's loaded by some other plugin. + +#### 2.0.0 +* rearranged where I put `GitHub Plugin URI` header, etc. in README and in this plugin. +* minor spelling fixes +* renamed some functions for their hooks +* refactored `class GitHub_Plugin_Updater` and `class GitHub_Theme_Updater` to use stdClass objects +* further refactored base class `GitHub_Updater` to contain renaming code and create stdClass objects for data. +* added some ability to see changelog for GitHub hosted plugins. +* trying to follow WordPress Plugin Boilerplate, so renamed `classes` to `includes` +* refactored putting all remote api calls in new `class GitHub_Plugin_Updater_API`. +* Theme updating should now be able to have a specified branch. +* works on WordPress 3.8 +* included Michel Fortin's [PHP-Markdown](http://michelf.ca/projects/php-markdown/) for rendering `CHANGES.md` + +#### 1.8.1 +* added some variable declarations +* added early return in no GitHub sourced plugins or themes are identified + +#### 1.8.0 +* refactored to use base class `GitHub_Updater` and extending classes `GitHub_Plugin_Updater` and `GitHub_Theme_Updater`. + +#### 1.7.4 +* changed method of not overwriting extra headers to pass array. + +#### 1.7.3 +* change `'...'` to `…` in renaming notification +* fix to not overwrite extra headers of other plugins. + +#### 1.7.2 +* removed sorting option from `scandir`. Doesn't work with older versions of PHP < 5.4.0 +* removed extraneous data from array in `multisite_get_themes` + +#### 1.7.1 +* updated the transient for themes +* replaced `readdir` with `scandir` for creating WP\_Theme object in multisite + +#### 1.7.0 +* updated class-theme-updater.php to utilize WP\_Theme class +* added method `get_remote_tag` to update plugins using tags or branch, depending upon which has greater version number. +* `get_remote_tag` uses transient to limit calls to API +* fix for `wp_get_themes` not working under plugin network activation on multisite installation. I recreated `wp_get_themes` by reading in the theme directory and adding the WP\_Theme object of `wp_get_theme( 'dir_in_themes_dir' )` to an array. + +#### 1.6.1 +* bug fix for undeclared variable $github_plugins + +#### 1.6.0 +* Added separate method to parse plugin repo info from header +* Shortened GitHub Plugin URI to only use owner/repo +* Shortened GitHub Theme URI to only use owner/repo + +#### 1.5.0 +* Lots of documentation and some bug fixes. Thanks @GaryJones +* Made version checking regex more compatible. Thanks @GaryJones +* Added ability to define branch to update. +* Refactored plugin/theme renaming code. +* Added `GitHub Branch` feature - Thanks @GaryJones +* Trying to comply with WP Coding Standards. +* Major thanks to @GaryJones for all the pull requests and generally improving this project. + +#### 1.4.3 +* Fixed a couple of non-fatal PHP errors. Thanks @jazzsequence + +#### 1.4.2 +* Cleaned up readme's markdown. + +#### 1.4.1 +* Fixed the README to more accurately reflect support for both plugins and themes. + +#### 1.4 +* Fix for rename functions to be more precise, otherwise might rename wp.org repo themes. + +#### 1.3 +* Simplify a couple of if statements. + +#### 1.2 +* Fix to ignore renaming for wp.org plugins + +#### 1.1 +* Sanity check for theme api uri + +#### 1.0 +* Serialized WP\_Theme object to search for added GitHub header, lots of help from Seth. No more `file_get_contents`. +* Converted plugin class and added it to make joint plugin/theme updater. + +#### 0.2 +* Code cleanup. +* Limit `file_get_contents` to 2000 bytes. + +#### 0.1 +* Initial commit diff --git a/www/wp-content/plugins/github-updater/LICENSE b/www/wp-content/plugins/github-updater/LICENSE new file mode 100755 index 0000000..d7f1051 --- /dev/null +++ b/www/wp-content/plugins/github-updater/LICENSE @@ -0,0 +1,339 @@ +GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This program 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 2 of the License, or + (at your option) any later version. + + This program 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. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/www/wp-content/plugins/github-updater/README.md b/www/wp-content/plugins/github-updater/README.md new file mode 100755 index 0000000..986c218 --- /dev/null +++ b/www/wp-content/plugins/github-updater/README.md @@ -0,0 +1,370 @@ +![GitHub Updater](./assets/GitHub_Updater_logo.png) + +[![Build Status](https://travis-ci.org/afragen/github-updater.svg?branch=develop)](https://travis-ci.org/afragen/github-updater) + +# GitHub Updater +* Contributors: [Andy Fragen](https://github.com/afragen), [Gary Jones](https://github.com/GaryJones), [Seth Carstens](https://github.com/scarstens), [contributors](https://github.com/afragen/github-updater/graphs/contributors) +* Tags: plugin, theme, update, updater, github, bitbucket, gitlab, remote install +* Requires at least: 3.8 +* Requires PHP: 5.3 +* Tested up to: 4.5 +* Stable tag: master +* Donate link: http://thefragens.com/github-updater-donate +* License: GPLv2 or later +* License URI: http://www.gnu.org/licenses/gpl-2.0.html + + +A simple plugin to enable automatic updates to your GitHub, Bitbucket, or GitLab hosted WordPress plugins and themes. It also allows for the remote installation of plugins or themes. + +This plugin is [not allowed in the wp.org repo](https://github.com/afragen/github-updater/issues/34). :frowning: + +## Description + +This plugin was designed to simply update any GitHub hosted WordPress plugin or theme. Your plugin or theme **must** contain a header in the style.css header or in the plugin's header denoting the location on GitHub. The format is as follows. + +`GitHub Plugin URI: afragen/github-updater` +`GitHub Plugin URI: https://github.com/afragen/github-updater` + +or + +`GitHub Theme URI: afragen/test-child` +`GitHub Theme URI: https://github.com/afragen/test-child` + +...where the above URI leads to the __owner/repository__ of your theme or plugin. The URI may be in the format `https://github.com//` or the short format `/`. You do not need both. Only one Plugin or Theme URI is required. You **must not** include any extensions like `.git`. + +## Installation + +### Composer + +Run the composer command: ```composer require afragen/github-updater``` + + +### Upload + +1. Download the latest [tagged archive](https://github.com/afragen/github-updater/releases) (choose the "zip" option). +2. Unzip the archive, rename the folder correctly to `github-updater`, then re-zip the file. +3. Go to the __Plugins -> Add New__ screen and click the __Upload__ tab. +4. Upload the zipped archive directly. +5. Go to the Plugins screen and click __Activate__. + +### Manual + +1. Download the latest [tagged archive](https://github.com/afragen/github-updater/releases) (choose the "zip" option). +2. Unzip the archive, rename the folder to `github-updater`. +3. Copy the folder to your `/wp-content/plugins/` directory. +4. Go to the Plugins screen and click __Activate__. + +Check out the Codex for more information about [installing plugins manually](http://codex.wordpress.org/Managing_Plugins#Manual_Plugin_Installation). + +### Git + +Using git, browse to your `/wp-content/plugins/` directory and clone this repository: + +`git clone https://github.com/afragen/github-updater.git` + +Then go to your Plugins screen and click __Activate__. + +### Install GitHub Updater as a Must Use Plugin (optional) + +1. Choose a method from above for installation. +1. **DO NOT** activate! +1. Symlink `wp-content/plugins/github-updater/mu/ghu-loader.php` in `wp-content/mu-plugins`. +1. You should use full filepaths when creating your symlink. + +#### in Linux +``` +cd +ln -sv wp-content/plugins/github-updater/mu/ghu-loader.php wp-content/mu-plugins +``` + +#### in Windows (Vista, 7, 8) +``` +cd /D +mklink wp-content\mu-plugins\ghu-loader.php wp-content\plugins\github-updater\mu\ghu-loader.php +``` + +This way you get automatic updates and cannot deactivate the plugin. + +## Usage + +### Plugins + +There must be a `GitHub Plugin URI`, `Bitbucket Plugin URI`, or `GitLab Plugin URI` declaration in the plugin's header. + +~~~php +/* +Plugin Name: GitHub Updater +Plugin URI: https://github.com/afragen/github-updater +Description: A plugin to automatically update GitHub, Bitbucket or GitLab hosted plugins and themes. It also allows for remote installation of plugins or themes into WordPress. +Version: 1.0.0 +Author: Andy Fragen +License: GNU General Public License v2 +License URI: http://www.gnu.org/licenses/gpl-2.0.html +Domain Path: /languages +Text Domain: github-updater +GitHub Plugin URI: https://github.com/afragen/github-updater +GitHub Branch: master +*/ +~~~ + +### Themes + +There must be a `GitHub Theme URI`, `Bitbucket Theme URI`, or `GitLab Theme URI` declaration in the `style.css` file. When initially adding a theme, the directory **must** be identical to the repo name. + +~~~css +/* +Theme Name: Test +Theme URI: http://thefragens.net/ +Version: 0.1.0 +Description: Child theme of TwentyTwelve. +Author: Andy Fragen +Template: twentytwelve +Template Version: 1.0.0 +GitHub Theme URI: https://github.com/afragen/test-child +GitHub Branch: master +*/ +~~~ + +### Optional Headers + +`GitHub Branch`, `Bitbucket Branch`, and `GitLab Branch` are available but not required. + +### Enterprise and Self-Hosted Support + +#### GitHub Enterprise Support + +Add the `GitHub Enterprise` header to the plugin or theme that is hosted on your GitHub self-hosted installation. The settings should be similar to `GitHub Enterprise: https://github.yourhost.com`. + +GitHub Enterprise **requires** authentication with either a personal access token or a repository-dependent access token. + +#### GitLab CE/Enterprise Support + +Add the `GitLab CE` or `GitLab Enterprise` header to the plugin or theme that is hosted on your GitLab self-hosted installation. The settings should be similar to `GitLab CE: https://gitlab.yourhost.com` or `GitLab Enterprise: https://gitlab.yourhost.com`. + +### Versions + +GitHub Updater reads the `Version` headers from both the local file and the remote file. For an update to show as available the remote version number **must** be greater than the local version number. It is **required** to have a `Version` header in your main plugin file or your theme's `style.css` file. It is better to use [Semantic Versioning](http://semver.org). + +If you tag releases the version number of the tag must be the same as in the file inside of the tag. Otherwise a circle of updating may ensue. You do not have to tag releases; but if you do the tagged version will be downloaded preferentially. Please refer to the sections below on branches and tags. + +When testing I find it simpler to decrease the version number in the local file rather than continually push updates with version number increments or new tags. + +## Branch Support + +To specify a branch that you would like to use for updating, just add a branch header. If you develop on `master` and are pushing tags, GitHub Updater will update to the newest tag. If there are no tags or the specified branch is not `master` GitHub Updater will use the specified branch for updating. + +The default state is either `GitHub Branch: master` or nothing at all. They are equivalent. + +If you want to update against branch of your repository other than `master` and have that branch push updates out to users make sure you specify the testing branch in a header, i.e. `GitHub Branch: develop`. When you want users to update against the release branch just have them manually change the header to `GitHub Branch: master` or remove it completely. Tags will be ignored when a branch other than `master` is specified. In this case I would suggest semantic version numbering similar to the following, `...`. + +In the GitHub Updater Settings there is a new setting to enable branch switching for plugins and themes. When checked there will be a new ability from the Plugins and Themes pages to switch between branches. Switching to the current branch will reinstall the current branch. + +## Tagging + +If the branch header, i.e. `GitHub Branch` or `Bitbucket Branch`, is not specified (or is set to `master`), then the latest tag will be used. GitHub Updater will preferentially use a tag over a branch in this instance. + +## Bitbucket Support + +Instead of the `GitHub Plugin URI` header you will need to use the `Bitbucket Plugin URI` header. + +Instead of the `GitHub Theme URI` header you will need to use the `Bitbucket Theme URI` header. + +The `Bitbucket Branch` header is supported for both plugins and themes. + +## GitLab Support + +Instead of the `GitHub Plugin URI` header you will need to use the `GitLab Plugin URI` header. + +Instead of the `GitHub Theme URI` header you will need to use the `GitLab Theme URI` header. + +The `GitLab Branch` header is supported for both plugins and themes. + +You must set a GitLab private token. Go to your GitLab profile page under Edit Account. From here you can retrieve or reset your GitLab private token. + +## Private Repositories + +Only private repositories will show up in the Settings page. + +![Settings Tab](./assets/screenshot-1.png) + +### GitHub Private Repositories + +In order to specify a private repository you will need to obtain a [personal access token](https://github.com/settings/tokens/new). Once you have this, simply add the token to the appropriate plugin or theme in the Settings tab. + +Leave this empty if the plugin or theme is in a public repository. + +### Bitbucket Private Repositories + +Add your personal Bitbucket username and password in the Settings tab. In order to authenticate with the Bitbucket API you will need to have at least `read` privileges for the Bitbucket private repository. + +In order to specify a private repository you will need to check the box next to the repository name in the Settings tab. + +Leave this unchecked if the plugin or theme is in a public repository. + +Do not include your username or password in the plugin or theme URI. + +## WordPress and PHP Requirements + +There are two **optional** headers for setting minimum requirements for both WordPress and PHP. + +Use `Requires WP:` to set the minimum required version of WordPress needed for your plugin or theme. eg. `Requires WP: 3.8` + +Use `Requires PHP:` to set the minimum required version of PHP needed for your plugin or theme. eg. `Requires PHP: 5.3.0` + +At the moment the default values are **WordPress 3.8.0** and **PHP 5.3.0** + +## Release Assets + +An **optional header** is available for use if your plugin or theme requires updating via a release asset. + +Use `Release Asset:`. eg., `Release Asset: true`. + +Your release asset filename is generated automatically and **must** have the following format or there will be an update error. + +Example, `$repo-$tag.zip` where `$repo` is the repository slug and `$tag` is the newest release tag, example `test-plugin-0.7.3.zip`. + +**You must tag your releases to use this feature.** + +## Deleting Transients + +If you use the **Check Again** button in the WordPress Updates screen then all the transients will be deleted and the API will be queried again. This may cause timeout issues against the API, especially the GitHub API which only allows 60 unauthenticated calls per hour. + +Be careful about refreshing the browser window after this as you may be continually deleting the transients and hitting the API. + +## Hosting Plugin in WP.org Repository + +If you develop your plugin on GitHub and it also resides in the WP.org repo, the plugin will preferentially pull updates from WP.org if `GitHub Branch: master`. If `GitHub Branch` is anything other than `master` then the update will pull from GitHub. Make sure that the version of your plugin uploaded to WP.org has `GitHub Branch: master`. + +The same applies for Bitbucket or GitLab hosted plugins. + +## Remote Installation of Repositories + +From the `GitHub Updater Settings Page` there is a tabbed interface for remote installation of plugins or themes. You may use either a full URI or short `/` format. The URI is case sensitive, so make sure the repo name is correctly entered. + +![Remote Install of Plugin Tab](./assets/screenshot-2.png) + +## Error Messages + +GitHub Updater now reports a small error message on certain pages in the dashboard. The error codes are HTTP status codes. Most often the code will be either 403 or 401. If you don't have an Access Token set for a private GitHub repo you will get a 404 error. + +### Personal GitHub Access Token + +There is a new setting for a personal GitHub Access Token. I **strongly** encourage everyone to create a [personal access token](https://github.com/settings/tokens/new). Create one with at least `public_repo` access and your rate limit will be increased to 5000 API hits per hour. Unauthenticated calls to the GitHub API are limited to 60 API calls per hour and in certain circumstances, like shared hosting, these limits will be more frequently hit. Thanks [mlteal](https://github.com/mlteal). + +### 403 - Unauthorized Access + +#### GitHub +* usually this means that you have reached GitHub API's rate limit of 60 hits per hour. This is informative and should go away in less than an hour. See above regarding the setting of a personal access token to eliminate this entirely. +* a private GitHub repo without an Access Token designated in the Settings. +* will tell you how long until GitHub API's rate limit will be reset. + +### 401 - Incorrect Authentication + +#### Bitbucket +* incorrect Bitbucket user/pass, no `read` access to private Bitbucket repo +* private Bitbucket repo not checked in Settings + +#### GitHub +* using an incorrect private repo GitHub Access Token for a public repo +* an incorrect Access Token for a private GitHub repo. + +### 429 - Too Many Requests + +I've seen this error code occasionally with Bitbucket. + +## Remote Management Services + +Currently, GitHub Updater works with both iThemes Sync and InfiniteWP. If you desire support for another remote management service please invite the developer of that service to engage in discussion here. I am more that amenable to supporting any service. I will need some testing and support to add support for additional services. + +Please go the Remote Management tab of the Settings page and check which remote management service you wish to use. There may be a small amount of overhead related to using any of these services which may impact performance, but only for **admin** level users in the dashboard. + +![Remote Management Tab](./assets/screenshot-3.png) + +## Extended Naming + +There's a hidden preference to use extended naming for plugin directories. Extended Naming follows the convention `--`. The normal method is to name the plugin directory ``. Unfortunately there may be a _potential_ conflict with a WP.org plugin. This preference mitigates that potential conflict. If you switch between normal and extended naming you might have to reactivate your plugins. + +To set Extended Naming add `define( 'GITHUB_UPDATER_EXTENDED_NAMING', true );` in your `wp-config.php` or your theme's `functions.php`. + +## Developer Hooks + +There are 2 added filter hooks specifically for developers wanting to distribute private themes/plugins to clients without the client having to interact with the Settings page. + +The first allows the developer to set the GitHub Access Token for a specific plugin or theme. The anonymous function must return a **single** key/value pair where the key is the plugin/theme repo slug and the value is the token. + +~~~php +add_filter( 'github_updater_token_distribution', + function () { + return array( 'my-private-theme' => 'kjasdp984298asdvhaljsg984aljhgosrpfiu' ); + } ); +~~~ + +The second hook will simply make the Settings page unavailable. + +~~~php +add_filter( 'github_updater_hide_settings', '__return_true' ); +~~~ + +## Extras + +[szepeviktor](https://github.com/szepeviktor) has created an add-on plugin to GitHub Updater that identifies all plugins with an icon in the plugin view for GitHub or Bitbucket depending upon where they get updates. It's very clever. + + +You can use the [GitHub Updater Additions](https://github.com/afragen/github-updater-additions) plugin to add plugins or themes that don't contain the proper headers via a JSON file. They can then be updated with GitHub Updater. + +### Translations + +* French by + * [Daniel Ménard](https://github.com/daniel-menard) + * [fxbenard](https://github.com/fxbenard) +* Italian by [Enea Overclokk](https://github.com/overclokk) +* Portuguese by + * [Valerio Souza](https://github.com/valeriosouza) + * [Pedro Mendonça](https://github.com/pedro-mendonca) +* Ukrainian by [Andrii Ryzhkv](https://github.com/andriiryzhkov) +* Swedish by [Andréas Lundgren](https://github.com/Adevade) +* Arabic by [Hyyan Abo FAkher](https://github.com/hyyan) +* Spanish by [Jose Miguel Bejarano](https://github.com/xDae) +* German by [Linus Metzler](https://github.com/limenet) +* Romanian by [Corneliu Cirlan](https://github.com/corneliucirlan) +* Japanese by [ishihara](https://github.com/1shiharat) +* Russian by [Anatoly Yumashev](https://github.com/yumashev) +* Bulgarian by [Adrian Dimitrov](https://github.com/dimitrov-adrian) + +## Issues + +Please log issues on the GitHub at https://github.com/afragen/github-updater/issues + +If you are using a WordPress Multisite installation, the plugin **should** be network activated. + +When first downloading and installing a plugin from GitHub you might have to do the following, otherwise the next update may not be able to cleanup after itself and re-activate the updated plugin or theme. Or you can just use the remote install feature and this will be done for you. :wink: + +1. Unzip the archive. +2. Fix the folder name to remove to extra stuff GitHub adds to the download, like _-master_. +3. Copy the folder to your plugins directory **or** re-zip folder and add from plugins page. + +W3 Total Cache object cache also clears the transient cache. Unfortunately this hampers GitHub Updater's storage of API data using the Transient API. The solution is to turn off the object cache. + +## ChangeLog + +See [CHANGES.md](CHANGES.md). In your project create a `CHANGES.md` or `CHANGELOG.md` file. + +## Credits + +This plugin's theme updater class was originally based upon [Whitelabel Framework's updater-plugin.php](https://github.com/WordPress-Phoenix/whitelabel-framework/blob/master/inc/admin/updater-plugin.php), which was based upon https://github.com/UCF/Theme-Updater. + +The plugin updater class was originally based upon [codepress/github-plugin-updater](https://github.com/codepress/github-plugin-updater). + +Includes + +* [Emanuil Rusev's](https://github.com/erusev) [Parsedown](https://github.com/erusev/parsedown) for rendering ChangeLogs. +* [Mark Jaquith's](https://github.com/markjaquith) [WordPress Plugin Readme Parser](https://github.com/markjaquith/WordPress-Plugin-Readme-Parser/tree/WordPress.org) for parsing `readme.txt`. +* [Coen Jacobs'](https://github.com/coenjacobs) [WPupdatePHP library](https://github.com/WPupdatePHP/wp-update-php) + +GitHub Updater logo by [LogoMajestic](http://www.logomajestic.com). + +## Pull Requests + +Pull requests are welcome. Please fork and submit pull requests against the `develop` branch. + +Loving crafted with [PhpStorm](https://www.jetbrains.com/phpstorm/) diff --git a/www/wp-content/plugins/github-updater/assets/GitHub_Updater_logo.png b/www/wp-content/plugins/github-updater/assets/GitHub_Updater_logo.png new file mode 100755 index 0000000000000000000000000000000000000000..680ef6506a957a724b9a82649f56f8576fdcce6c GIT binary patch literal 11171 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 literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/github-updater/assets/GitHub_Updater_logo_small.png b/www/wp-content/plugins/github-updater/assets/GitHub_Updater_logo_small.png new file mode 100755 index 0000000000000000000000000000000000000000..38eebd1d6146df30bf2412b655e9c9d57da54f5d GIT binary patch literal 5237 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 vz2d%?DPPdKeU<*YA-K+9gIj5Nrl_Ng%j0NN{)e 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 'GitHub Updater' ); +} +if ( ! $updatePhp->does_it_meet_required_php_version( PHP_VERSION ) ) { + return false; +} + +// Load textdomain +load_plugin_textdomain( 'github-updater', false, __DIR__ . '/languages' ); + +// Plugin namespace root +$root = array( 'Fragen\\GitHub_Updater' => __DIR__ . '/src/GitHub_Updater' ); + +// Add extra classes +$extra_classes = array( + 'Parsedown' => __DIR__ . '/vendor/parsedown/Parsedown.php', + 'WPUpdatePHP' => __DIR__ . '/vendor/wp-update-php/src/WPUpdatePhp.php', + 'Automattic_Readme' => __DIR__ . '/vendor/parse-readme.php', + ); + +// Load Autoloader +require_once( __DIR__ . '/src/GitHub_Updater/Autoloader.php' ); +$loader = 'Fragen\\GitHub_Updater\\Autoloader'; +new $loader( $root, $extra_classes ); + +// Instantiate class GitHub_Updater +$instantiate = 'Fragen\\GitHub_Updater\\Base'; +new $instantiate; diff --git a/www/wp-content/plugins/github-updater/js/ghu_install.js b/www/wp-content/plugins/github-updater/js/ghu_install.js new file mode 100755 index 0000000..a2e45be --- /dev/null +++ b/www/wp-content/plugins/github-updater/js/ghu_install.js @@ -0,0 +1,32 @@ +/** + * Javascript to show and hide the API specific settings + * for the remote install feature. + * + * @class Fragen\GitHub_Updater\Install + * @since 4.6.0 + * @access public + */ +jQuery( document ).ready( function( $ ) { + // Hide non-default (Bitbucket & GitLab) settings on page load + $.each( [ 'bitbucket', 'gitlab' ], function() { + $( 'input.'.concat( this, '_setting') ).parents( 'tr').hide(); + }); + + // When the api selector changes + $( 'select[ name="github_updater_api" ]' ).on( 'change', function() { + + // create difference array + var hideMe = $( [ 'github', 'bitbucket', 'gitlab' ] ).not( [ this.value ] ).get(); + + /* + * Show/hide all settings that have the selected api's class. + * this.value equals either 'github', 'bitbucket', or 'gitlab'. + */ + $.each( hideMe, function() { + $( 'input.'.concat( this, '_setting' ) ).parents( 'tr' ).hide(); + }); + + $( 'input.'.concat( this.value, '_setting' ) ).parents( 'tr' ).show(); + + }); +}); diff --git a/www/wp-content/plugins/github-updater/languages/github-updater-ar.mo b/www/wp-content/plugins/github-updater/languages/github-updater-ar.mo new file mode 100755 index 0000000000000000000000000000000000000000..c1416d8d0595cd93c27dfecdf16506cacfab9cba GIT binary patch literal 4545 zcmbW3Pi!1l9mij3%b(?6DbSPx$*(1wCT(WDYdfjCwhNAvG**&g9J{K7U^~0}>>aW@ zv&_7;y$2*5+liGPI7OT|rKug~k87e9QV<6&2#G@_E;Ah90^*1`AaMYR@9({t*;(Wg zmC^2g-k;z5z2Cq0cK-PIBi96;=kWaszRib(7zKa%5&YoUdRT~$f;Yh@z_-Cqg1-R= zz~6(9gAYF<#D4Gz@G0;Z$m7%C6j%cv1Mh&x!C!%8@E@QB79SPjB=}u$7`zUaz!3aA zn1d1f!2RH7z~kVTz*F&f1spUk;v=4fF#CM~WdFv% z&w&@fPk|C-IUoEu*acydxCDLy+=%CY0zQxan;_f&KKLZ~C>9+7_k;gLOwWKEzX|-X z9p^#rEBu@Ve+WJU{tkQ={2O=>+y`TrW8e=!8)Uox1ik|P3*Qvv)k`eWep;A>zGTm!!d{wU@R@G$zn0FQxx23hVY zB$?|V53>G~Adk<3oX78j5EbhnKH?gFc>XPr?b?mUe+!PG{|E3p;65aU^>sjw=a0dM zz~n)gL|n3Zi15qtIVZfHbN4lT`9bKkZ`|gZ;=1L%P} zj$0nzPv8qPb)5m)kFSEy;mfsxQb?ZzY0Ko3yIfx=3mq4ZJwKdVe&D9A2aykGZe~hM z)RePmD_JKypjO9fH#-ZCD<<4}mrnckf<(Kcyq2w;8g<%rh>{af$F&!2r)gK4lIA_1 zR0D&mAzQK_PB^OCsa=$crtKhD^89*s$k*G^jBI;>qdeb{!5-5Wq*9K%ke!+fr0?1- zDJC1Tc9E*yGCA|qj`jJ8zHWieNqbSk#2O32Gd8f@sW#z3Du!(f(Byf6B%5B9e&Ben znC$qzbQLX{zV@_D$|Lr>K(l_A@`3Go@YGL)@_{(zD)e7=)R|6|CTcYq1T^bil&;x2 zHZh*>H^D5e`Zla3c8_3eQ#&AAZPnEpUT@g}c6dGBsOxq1+%56Ew{TCd&6Zk88-9AO z-K1X5I&qlEcI(uR6Ic+5bJJ7L2IO-UG@X{CXvt|d5!C?Mc3cF9T8`UM9Nc6@CLGDw zbR3a1%dza7t}j0ki@P-C2Fk`Zh;+XoeSiWA8s1WXyt;BJNfUYVY+hQn1re)FNYkeD zlig;yn#C&~N=z;~UI+DUFW|=`-)lCjHfm6L1tVZ;I-6OteH;{HxU3gMtUU3&7w?(0 zaK(&lc?fK8gwA+@!fLE%acS!Nxrx zK;(K$1@Wqr31Pl;Frd0rIQc<-5N*_Ie&}Ej-wRlfA3liG_b*D96huR*c2FJ|Sa4LM zQ!UiI)_^^)Z<%<=GOBzr?R(#oHDyiJt@v=3sXzI->2JK?NyWu7VZW6}VqDzo_E4muq?EABZ#9Fu=-U)Xw zb&E{5Cr#md7~iF69Xd9&I&{{eE8*MWrk0M@G5#*T_eHddnRVU|O3~QG=q?@Z-Cain zM(=4&JK=rUvz_@P(Ocie;5#reyn*>0bawh=jD4xlW_T}JPj-Xe@Gjg~|F0b{vB;Lz zz6pVC__GPKumih*IBiCkGdf^1Y$Hg*5;{szynY+*tVUN52^PN|-bRpPKl?q>JHa`) zdQ&8;vpYwZ5rezzB!?;PXkADH4*&_L}%7bK2@Ous0G-nFz07YsBSxv;kWY>o^=M9L?}OtbYTAflizU z46IZ7BJx1nvQF-$`9np$w_C=3?RQ)u@S(3*VKkRDLVgb(Y-Os_*_Y?besiT=MZ9PscC3Xl&tANM_$C$B_lU6KA1CJJxsBfev5D?QBU z^0jdprE)dg$}|bu!)#ym\n" +"Language-Team: Hyyan Abo Fakher \n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;" +"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;" +"_nx_noop:3c,1,2;__ngettext_noop:1,2\n" +"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n" +"X-Poedit-SearchPath-0: .\n" + +#: mu/ghu-loader.php:66 +msgid "Activated as mu-plugin" +msgstr "تفعيل كإضافة تلقائية" + +#: src/GitHub_Updater/Base.php:474 +#, php-format +msgid "Rename successful using extended name to %1$s" +msgstr "" + +#: src/GitHub_Updater/Install.php:67 +msgid "A repository URI is required." +msgstr "" + +#: src/GitHub_Updater/Install.php:223 src/GitHub_Updater/Settings.php:78 +msgid "Install Plugin" +msgstr "تنصيب إضافة" + +#: src/GitHub_Updater/Install.php:226 src/GitHub_Updater/Settings.php:79 +msgid "Install Theme" +msgstr "تنصيب موضوع" + +#: src/GitHub_Updater/Install.php:244 +msgid "Plugin" +msgstr "إضافة" + +#: src/GitHub_Updater/Install.php:247 +msgid "Theme" +msgstr "موضوع" + +#: src/GitHub_Updater/Install.php:258 +#, php-format +msgid "GitHub Updater Install %s" +msgstr "تحميل %s" + +#: src/GitHub_Updater/Install.php:265 +#, php-format +msgid "%s URI" +msgstr "رابط %s" + +#: src/GitHub_Updater/Install.php:273 +msgid "Repository Branch" +msgstr "الفرع" + +#: src/GitHub_Updater/Install.php:281 +msgid "Remote Repository Host" +msgstr "مستضيف المستودعات" + +#: src/GitHub_Updater/Install.php:289 +msgid "Private Bitbucket Repository" +msgstr "مستودع Bitbucket خاص" + +#: src/GitHub_Updater/Install.php:297 +msgid "GitHub Access Token" +msgstr "رمز وصول GitHub " + +#: src/GitHub_Updater/Install.php:308 +#, fuzzy +msgid "GitLab Private Token" +msgstr "إعدادت GitHub الخاصة" + +#: src/GitHub_Updater/Install.php:325 +msgid "URI is case sensitive." +msgstr "" + +#: src/GitHub_Updater/Install.php:339 +msgid "Enter branch name or leave empty for `master`" +msgstr "إدخل اسم الفرع أو اتركه فارغاً لاستخدام `master`" + +#: src/GitHub_Updater/Install.php:370 +#, fuzzy +msgid "Check for private Bitbucket repositories." +msgstr "مستودع Bitbucket خاص" + +#: src/GitHub_Updater/Install.php:384 +msgid "Enter GitHub Access Token for private GitHub repositories." +msgstr "أدخل رمز وصول GitHub من مستوعات GitHub الخاصة" + +#: src/GitHub_Updater/Install.php:398 +#, fuzzy +msgid "Enter GitLab Private Token for private GitLab repositories." +msgstr "أدخل رمز وصول GitHub من مستوعات GitHub الخاصة" + +#: src/GitHub_Updater/Install.php:442 +msgid "Activate" +msgstr "" + +#: src/GitHub_Updater/Install.php:451 +msgctxt "This refers to a network activation in a multisite installation" +msgid "Network Enable" +msgstr "" + +#: src/GitHub_Updater/Messages.php:84 src/GitHub_Updater/Messages.php:119 +#, fuzzy +msgid "GitHub Updater Error Code:" +msgstr "‏%1$s غير موجود . رمز خطأ GitHub : %2$s" + +#: src/GitHub_Updater/Messages.php:89 +#, php-format +msgid "GitHub API's rate limit will reset in %s minutes." +msgstr "GitHub API's rate limit will reset in %1$s minutes." + +#: src/GitHub_Updater/Messages.php:94 +#, php-format +msgid "" +"It looks like you are running into GitHub API rate limits. Be sure and " +"configure a %sPersonal Access Token%s to avoid this issue." +msgstr "" + +#: src/GitHub_Updater/Messages.php:123 +#, fuzzy +msgid "" +"There is probably an access token or password error on the GitHub Updater " +"Settings page." +msgstr "هناك خطأ ما في صفحة إعدادت GitHub " + +#: src/GitHub_Updater/Messages.php:138 +msgid "" +"You must set a GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" + +#: src/GitHub_Updater/Plugin.php:320 src/GitHub_Updater/Theme.php:475 +#, fuzzy, php-format +msgid "Current branch is `%1$s`, try %2$sanother branch%3$s." +msgstr "النسخة الحالية محدثة . قم بتجربة %sanother version%s" + +#: src/GitHub_Updater/Plugin.php:372 +#, fuzzy +msgid "View details" +msgstr "تفاصيل" + +#: src/GitHub_Updater/Settings.php:77 src/GitHub_Updater/Settings.php:697 +msgid "Settings" +msgstr "الإعدادت" + +#: src/GitHub_Updater/Settings.php:80 src/GitHub_Updater/Settings.php:492 +msgid "Remote Management" +msgstr "" + +#: src/GitHub_Updater/Settings.php:91 src/GitHub_Updater/Settings.php:99 +#: src/GitHub_Updater/Settings.php:194 +msgid "GitHub Updater Settings" +msgstr "إعدادت GitHub Updater" + +#. Plugin Name of the plugin/theme +#: src/GitHub_Updater/Settings.php:92 src/GitHub_Updater/Settings.php:100 +#: src/GitHub_Updater/Settings.php:137 +msgid "GitHub Updater" +msgstr "GitHub Updater" + +#: src/GitHub_Updater/Settings.php:141 +msgid "Saved." +msgstr "تم الحفظ" + +#: src/GitHub_Updater/Settings.php:201 +msgid "Enable Branch Switching" +msgstr "" + +#: src/GitHub_Updater/Settings.php:213 +#, fuzzy +msgid "Personal GitHub Access Token" +msgstr "رمز وصول GitHub " + +#: src/GitHub_Updater/Settings.php:220 +#, fuzzy +msgid "GitHub.com Access Token" +msgstr "رمز وصول GitHub " + +#: src/GitHub_Updater/Settings.php:230 +#, fuzzy +msgid "GitHub Enterprise Access Token" +msgstr "رمز وصول GitHub " + +#: src/GitHub_Updater/Settings.php:244 +msgid "GitHub Private Settings" +msgstr "إعدادت GitHub الخاصة" + +#: src/GitHub_Updater/Settings.php:257 +#, fuzzy +msgid "GitLab Private Settings" +msgstr "إعدادت GitHub الخاصة" + +#: src/GitHub_Updater/Settings.php:266 +#, fuzzy +msgid "GitLab.com Private Token" +msgstr "إعدادت GitHub الخاصة" + +#: src/GitHub_Updater/Settings.php:277 +msgid "GitLab CE or GitLab Enterprise Private Token" +msgstr "" + +#: src/GitHub_Updater/Settings.php:290 +msgid "Bitbucket Private Settings" +msgstr "إعدادت Bitbucket الخاصة" + +#: src/GitHub_Updater/Settings.php:297 +msgid "Bitbucket Username" +msgstr "اسم المستخدم (Bitbucket )" + +#: src/GitHub_Updater/Settings.php:306 +msgid "Bitbucket Password" +msgstr "كلمة المرور (Bitbucket )" + +#: src/GitHub_Updater/Settings.php:319 +msgid "Bitbucket Private Repositories" +msgstr "مستودعات Bitbucket الخاصة" + +#: src/GitHub_Updater/Settings.php:331 +msgid "No private repositories are installed." +msgstr "لم يتم إضافة أي مستودعات خاصة" + +#: src/GitHub_Updater/Settings.php:419 +msgid "Theme:" +msgstr "الموضوع :" + +#: src/GitHub_Updater/Settings.php:541 +#, php-format +msgid "Extended Naming is %sactive%s." +msgstr "" + +#: src/GitHub_Updater/Settings.php:546 +#, php-format +msgid "Extended Naming is %snot active%s." +msgstr "" + +#: src/GitHub_Updater/Settings.php:548 +#, php-format +msgid "" +"Extended Naming renames plugin directories %s to prevent possible conflicts " +"with WP.org plugins." +msgstr "" + +#: src/GitHub_Updater/Settings.php:549 +#, php-format +msgid "Activate Extended Naming by setting %s" +msgstr "" + +#: src/GitHub_Updater/Settings.php:550 +msgid "Check to enable branch switching from the Plugins or Themes page." +msgstr "" + +#: src/GitHub_Updater/Settings.php:557 +msgid "Enter your GitHub Access Token. Leave empty for public repositories." +msgstr "أدخل رمز وصول GitHub . قم بتركه فارغاً من أجل المستودعات العامة" + +#: src/GitHub_Updater/Settings.php:564 +#, fuzzy +msgid "" +"Enter your personal GitHub.com or GitHub Enterprise Access Token to avoid " +"API access limits." +msgstr "أدخل رمز وصول GitHub . قم بتركه فارغاً من أجل المستودعات العامة" + +#: src/GitHub_Updater/Settings.php:571 +msgid "" +"Check box if private repository. Leave unchecked for public repositories." +msgstr "قم بالاختيار إذا كان المستودع خاص , قم بتركه من أجل المستودعات العامة" + +#: src/GitHub_Updater/Settings.php:578 +msgid "Enter your personal Bitbucket username and password." +msgstr "أدخل اسم المستخدم و كلمة السر لحساب Bitbucket الخاص بك" + +#: src/GitHub_Updater/Settings.php:585 +msgid "Enter your GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" + +#: src/GitHub_Updater/Settings.php:592 +msgid "" +"Use of Remote Management services may result increase some page load speeds " +"only for `admin` level users in the dashboard." +msgstr "" + +#: src/GitHub_Updater/Theme.php:376 +msgid "Theme is up-to-date!" +msgstr "الموضوع محدث" + +#: src/GitHub_Updater/Theme.php:381 +msgid "Rollback to:" +msgstr "التراجع ل :" + +#: src/GitHub_Updater/Theme.php:399 src/GitHub_Updater/Theme.php:639 +msgid "No previous tags to rollback to." +msgstr "لا يوجد أية tags لتراجع " + +#: src/GitHub_Updater/Theme.php:407 src/GitHub_Updater/Theme.php:421 +#, php-format +msgid "GitHub Updater shows a new version of %s available." +msgstr "نسخة %1$s جديدة متوافرة " + +#: src/GitHub_Updater/Theme.php:414 +#, php-format +msgid "View version %s details." +msgstr "رؤية تفاصيل نسخة %s" + +#: src/GitHub_Updater/Theme.php:418 +msgid "Automatic update is unavailable for this theme." +msgstr "التحديث التلقائي غير متوافر لهذا الموضوع" + +#: src/GitHub_Updater/Theme.php:428 src/GitHub_Updater/Theme.php:593 +#, php-format +msgid "View version %1$s details%2$s or %3$supdate now%4$s." +msgstr "رؤية نسخة %1$s وتفاصيل %2$s أو %3$s وقم بالتحديث الأن %4$s." + +#: src/GitHub_Updater/Theme.php:586 +#, php-format +msgid "There is a new version of %s available now." +msgstr "هناك نسخة جديدة من %s متوافرة الأن" + +#: src/GitHub_Updater/Theme.php:613 +#, php-format +msgid "Current version is up to date. Try %sanother version%s" +msgstr "النسخة الحالية محدثة . قم بتجربة %sanother version%s" + +#: src/GitHub_Updater/Theme.php:627 +msgid "Choose a Version" +msgstr "قم باختيار نسخة" + +#: src/GitHub_Updater/Theme.php:644 +msgid "Install" +msgstr "تنصيب" + +#. Plugin URI of the plugin/theme +msgid "https://github.com/afragen/github-updater" +msgstr "https://github.com/afragen/github-updater" + +#. Description of the plugin/theme +msgid "" +"A plugin to automatically update GitHub, Bitbucket, or GitLab hosted plugins " +"and themes. It also allows for remote installation of plugins or themes into " +"WordPress." +msgstr "" + +#. Author of the plugin/theme +msgid "Andy Fragen" +msgstr "Andy Fragen" + +#~ msgid "Renaming %1$s to %2$s" +#~ msgstr "إعادة تسمية %s إلى %s" + +#~ msgid "Rename successful" +#~ msgstr "تمت إعادة التسمية بنجاح" + +#~ msgid "Unable to rename downloaded repository." +#~ msgstr "غير قادر على إعادة تسمية المستودع الذي تم تنزيله" + +#~ msgid "this plugin" +#~ msgstr "هذه الإضافة" + +#~ msgid "Unfortunately, %1$s can not run on PHP versions older than %2$s." +#~ msgstr "للأسف , %1$s لا يمكن أن يعمل على نسخة PHP أقدم من %2$s." + +#~ msgid "Read more information about %show you can update%s." +#~ msgstr "اقرأ المزيد عن %s وكيفية التحديث %s." + +#~ msgid "%1$s recommends a PHP version greater than %2$s." +#~ msgstr "%1$s ينصح باستخدام نسخة PHP أحدث من %2$s." + +#, fuzzy +#~ msgid "" +#~ "A plugin to automatically update GitHub, Bitbucket or GitLab hosted " +#~ "plugins and themes. It also allows for remote installation of plugins or " +#~ "themes into WordPress. Plugin class based upon codepress/github-plugin-updater. Theme class based upon Whitelabel Framework modifications." +#~ msgstr "" +#~ "إضافة لتحديث التقائي للإضافات والموضوعات المستضافة على GitHub أو " +#~ "Bitbucket , الإضافة تسمح أيضاً بتنزيل الإضافات والموضوعات مباشرة " +#~ "لوردبريس , برمجة الإضافة معتمدة على codepress/github-plugin-updater. ," +#~ "ايضاً Whitelabel Framework " + +#~ msgid "" +#~ "No changelog is available via GitHub Updater. Create a file CHANGES." +#~ "md or CHANGELOG.md in your repository." +#~ msgstr "" +#~ "ملف متابعة التغيرات غير متوافر من خلال GitHub Updater. قم بإنشاء ملف " +#~ "CHANGES.md أو CHANGELOG.md في المستودع الخاص بك" + +#, fuzzy +#~ msgid "%sView version %s details%s or %supdate now%s." +#~ msgstr "" +#~ " مراجعة تفاصيل الإصدار %3$s أو حدث الأن ." + +#~ msgid "URI" +#~ msgstr "(الرابط)" + +#~ msgid "available now." +#~ msgstr "متوافر الأن" + +#~ msgid "View version" +#~ msgstr "رؤية الإصدار" + +#~ msgid "or" +#~ msgstr "أو" + +#~ msgid "update now" +#~ msgstr "حدث الأن" + +#~ msgid "another version?" +#~ msgstr "نسخة أخرى ؟" + +#~ msgid "" +#~ "GitHub Updater will not load. It requires PHP 5.3 or greater. Please ask " +#~ "your service provider to update PHP on your server" +#~ msgstr "" +#~ "لن يتم تفعيل الإضافة . إن الإضافة تحتاج PHP 5.3 أو أعلى . الرجاء طلب " +#~ "تحديث النسخة الحالية من قبل مزود الخدمة" diff --git a/www/wp-content/plugins/github-updater/languages/github-updater-bg_BG.mo b/www/wp-content/plugins/github-updater/languages/github-updater-bg_BG.mo new file mode 100755 index 0000000000000000000000000000000000000000..d4c38b93a4e505136fe1a5bf28a5d442eee44d60 GIT binary patch literal 9424 zcmbuEZHyh)S;wbo2*quA>3b>AV~ATC_TG4HCvorAZEeSKwspeRUgw3k_3XXl-5cLK zb2Bq{ZMO=6ogTvC-+RnyXzpSYQ5+9(N1qqNSNPMUed;mUxR3Sd_ z`=4{>-r2i%;{YSy{m;ue&w0-C{GXQ@|HC`({BpqY34TAp?_GBU!IR+I?&J?g?+1e5 z>)_MiPlE5cD+t~K?g2jp?gQTgw!nMA&w=j%{}B8sa1H!%@bCTo?}O7^zx4-$;3MF1 za6kC#;E#ge2JZv^61*RL3yZxM`~=tl9|xzv7r+|$9q>W$zrjP`{vSd&@Hz08z#E|S zc>lH__-Sx2cmn)Ia1y)$O8&osKMdaWR>p$w26g{la5s1uoB%)P@BaaaioqX)n)hem z+rhs9p9Q}M8gSul&Q8yRvhN>(m>~FbfBjeBk8%C)pzL@DLbR{sCg$r zwi8oD{5MeZW>M}lU>9a2R;qT&;J4H`DY-T z`1*D5A#nNwPR}ob-{bnPLFsz~<+g(#VDS%v`@s9aUj{!4ehEAV{sp)b+>SCDe-uRJ zAP05-x52x?8{l`re+0$PHH3Z~{4bDO!AFg=-xHwh)Ajfj@WWhx8~il*&!FVp$6{LN z7eMjgX;5)>9+dxo53GYPgHSy94!8&WTku2R+abIBvj_a(o3Jm)zu?86L3i*bC_Q(v zSO~@-!>mmCTYJ-?nEY9O(pl>me&SDgKpX2nXkZVmEj@H7r#!%q(6Wct*D=WtI#~YR z18QHgRe7MAjU~kw?y?8&wRXY%_PF08ZnlSfC_9fHgrPllcoZjfK(AmQKiTrl{GfaA zF@Cc3UVb{{7x_TE(4n~6&QEsJaR;0zJ=`XZn zlP4zZ=Serr+s&}kIcxg8R+vZTa65mvKR;m(wDb9X^Hh{im?YKRBjLPROtL&`c@dcj zLpn_PtvpI_|a+8&bae*znw-co;LIL5~>bP%%L-R6t__9(XiW&7tH)wlSO&1 z(;eAhSj&W&>Go^R0Kxup_vOx6q#uV%VY?H~cOtuke36@0$$Bs_h?xnq>@?a|Z>3fx zbF|dE9c5!4A9Gq&A05x4G!DB_aBwkdo-*^v8Pmo_Uf$3Sb#o*Nmm*YbY9O1HiF^I| zPP;iY7t7YYB>UKl8R|X|SQ&}&quB0wJ`E9XveWInxhV6UOp~q*U}h|9GI3$ndffEF zg-B~9Nfw#VJQk%H4h|0X(=>{6<3(Y=6FVmF&Q4629B1y>b$1rV2@+F3V#n^grLv#3 zq{hl}~PS(w=rVb|hLAdsiQ~Q8Z`&g+q_j49-R5tsYO;}}SlT%UbjOMN4pKmnD zV5;~&<42C2s{!NY`kl+EGFQjCE$a62vv&0p-H;$kPk1HICjGIRmi``29P4YRZYczn z>dmA(QO4`RL)GZDV__El+OV;DRh1qdNaC*7RjVZf*}r& zEUNX=XeolZWS*?84A4yClSEgZ8HlxL9-pZv=|Y*l>Oo1bnduLco|HSS@(k{DAO;zT z#3tF~q<*fz^fOB153+&3f81u^v>fIy&9uv(NE&^zg#eQ+Dg}ooj!v60qDZ``GDvS$ z88P_ap-O(Qc&b#=QeO*K<6*F{*DWY@bZKI6X;Vc&Y3L-$sSNv^iVR#eVH%mVAIC~D zHu(>2S+OKlLqt3hSq>rb=1?%oK z>2&5pQf{930WO7CL)t3p>z7K;V9`?FN@@xG-b=#`bMDcyD4Y$Bx{~-v7?VA_u&ul^ z9Ah4)$a34}kF0N3IN9$Ig|b#umOA?w)+)I&dQdK1E)0$ich?AxQ8>_k;5FwK``2aK zTAtLDX}1UVWAB*s%zlYNnADkdTB`sbFB( zGFdN*S`@LEen<83MA#xYPmrURB3W2lP;W%RYlYe3d=jSE?Xfm-)QWOCgUnr&K_%mt zPgL3zN-Ai+m%=+H|Y-7~7x} zHzZE^*C&!~Vo93U9?2Hkt=fV9LROni8fM$f&(GElVlMS(wFhBA!|d8Qd4Fx^?%L#D zvvY4_*JN$y13Pyzuy!|9?_vzOVv zT~o^UJlPkU?fcB+)V3#TGfC8H=e1)L?q+n*tZ6YYE6H><|vfbdyBo{s82^{)p%w{+F9N(bB)QV1v*ML z%~`8F-8B`Lr;`)ArdormT@$;f<}_(8(x0aO#0`y^i|67b>G^XW=-%95;>OF$&@&p@ zL|%Ck+mnes+>6f)22SkO_1sgLU*L>C)%_@I&V_lNTE%p+n0Gsa3;RUc4xW@3_K9D1 z@X%jFB<0p@F79{dqjav*j!!kTd)W!gO-|*aL5cLRBoOI_rH>@dq&6F-m{8|o2U^W9 z%pEv9^unqCSLyGG>^-0Ez(@1)l^=H?=u>M;*ImbfRq~fbq8!2j60>6OnH@N$nbY#Xk zznRtIrmmRCT2|Blh2EEkZ-LTwC~0~9^GLfOx%Hs9$l9yx&!QT3L0t@U{OA#HoZs|| z+Rd_!740b~zF1u2WR)2Mt;XKm!o*lqK3QeYIB)&@z$5F=vEE8?)ovdZbQ>$>uIQL)<>;g9Vyakq!sclytY~qgLG_bZFq?-i^A7~ z;`ceZq*H#cSr@KMC{V6BRuU9q<%+2&0bNIxSg9K%IW}H)QcQ8nSyQwvCCVzdu==H; zU0~VER$t9~#sz`3RCU)w8*N%zG##@EA0*I(6*1{mHX_5?jXT}Q0|dNGhEp6HS^hf1 z6#F)`y)i|zRT~&sZ42J|psA(@+1LjWCYI%O2b$^v&M_q@UcvC!*3T0^R)Q&2kkQK* zdZOW~HK*t%*27gEs}U+*Mb!D?%3z**&98{{+anw|tZW%7N<3?Q|Ee~P7o9IQtdbFi z7eol9B)?p-%uA9V?5#Lz!Jv47+{IprRkv~9B~{-eoSQ1-vRPBT)L2K4kyw3Oa$gUy z6@gZzk4waFOr*;^8#hxXbXg0_EAx0)Zs54q9ei}yw0k+uR;3GNyI3{EZ31W*lbb>h zg@~`Qfi-Hbp$e{SVY^K&F#8|YuId+s@^#A^8Cq{C+;V(OvQcPMQ=IetAhcgkmIX@@nkkhsv04t-^j+nRi$R7ha(H+si<~-MiZ(h@IpL0Iy0Y&sF0m&0#wusq2NgC|pfb-{&FS6rP>vahFZs>r(IV=JpeiqIk`UK(A%Scw}K96|&DzaQ$VR1^5kI2h(1bVHo&2e>Z$wE=#8T**| z)jB!0=6=-@hamDc*pP}h=P};4g5sNw*=V>{`MkYJJR{Y*sh4M~@|T@Kgt@wU*}9W$ zO6J&+o2sE}N=9-WQoTnY#CcqIi)-0$jodiuJ=-_CuYJXfC_u{c+}yO7ysSc4u{TLh z`LPicUtw3bEK%f$H92B5-d*=++53v4F%oeyo*e1SHU#bV!913^=y(Cu&~*^vEa*bN z(rcD{M3WcPWv>4Y7FRcE%Zu^=4YBIPYc4n#X8%tR3t8%2W#F=Rl6|M)8Q~s$%dlF*jHJK zh!X?sYnKuZWfu17MW0o%$od8Bqn3NcnvYi5XDZh+)9A~oV~5x;qAa4__;H-A+K;0$ z_XfsjjHNo#>~~WZ-~7!3)uhL=`;>Zny^uP{Iq0FS$x\n" +"Language-Team: \n" +"Language: bg\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Generator: Poedit 1.8.7\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-WPHeader: github-updater.php\n" +"X-Poedit-KeywordsList: _:1;gettext:1;dgettext:2;ngettext:1,2;dngettext:2,3;" +"__:1;_e:1;_c:1;_n:1,2;_n_noop:1,2;_nc:1,2;__ngettext:1,2;__ngettext_noop:1,2;" +"_x:1,2c;_ex:1,2c;_nx:1,2,4c;_nx_noop:1,2,3c;_n_js:1,2;_nx_js:1,2,3c;" +"esc_attr__:1;esc_html__:1;esc_attr_e:1;esc_html_e:1;esc_attr_x:1,2c;" +"esc_html_x:1,2c;comments_number_link:2,3;t:1;st:1;trans:1;transChoice:1,2\n" +"X-Loco-Target-Locale: bg_BG\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SearchPathExcluded-0: *.js\n" + +#: mu/ghu-loader.php:66 +msgid "Activated as mu-plugin" +msgstr "Активиране като мултисайт разширение" + +#: src/GitHub_Updater/Base.php:474 +#, php-format +msgid "Rename successful using extended name to %1$s" +msgstr "Преименуването е успешно, използвайки %1$s" + +#: src/GitHub_Updater/Install.php:67 +msgid "A repository URI is required." +msgstr "Изисква се URL на хранилището" + +#: src/GitHub_Updater/Install.php:223 src/GitHub_Updater/Settings.php:78 +msgid "Install Plugin" +msgstr "Инсталиране на разширение" + +#: src/GitHub_Updater/Install.php:226 src/GitHub_Updater/Settings.php:79 +msgid "Install Theme" +msgstr "Инсталиране на тема" + +#: src/GitHub_Updater/Install.php:244 +msgid "Plugin" +msgstr "Разширение" + +#: src/GitHub_Updater/Install.php:247 +msgid "Theme" +msgstr "Тема" + +#: src/GitHub_Updater/Install.php:258 +#, php-format +msgid "GitHub Updater Install %s" +msgstr "GitHub Актуализатор инсталира %s" + +#: src/GitHub_Updater/Install.php:265 +#, php-format +msgid "%s URI" +msgstr "" + +#: src/GitHub_Updater/Install.php:273 +msgid "Repository Branch" +msgstr "Клон на хранилището" + +#: src/GitHub_Updater/Install.php:281 +msgid "Remote Repository Host" +msgstr "Отдалечено хранилище" + +#: src/GitHub_Updater/Install.php:289 +msgid "Private Bitbucket Repository" +msgstr "Частно Bitbucket хранилище" + +#: src/GitHub_Updater/Install.php:297 +#, fuzzy +msgid "GitHub Access Token" +msgstr "Личен GitHub Access Token" + +#: src/GitHub_Updater/Install.php:308 +msgid "GitLab Private Token" +msgstr "" + +#: src/GitHub_Updater/Install.php:325 +msgid "URI is case sensitive." +msgstr "В URI има значение малки и главни букви." + +#: src/GitHub_Updater/Install.php:339 +msgid "Enter branch name or leave empty for `master`" +msgstr "Въведете име на клон или оставете празно за `master`" + +#: src/GitHub_Updater/Install.php:370 +msgid "Check for private Bitbucket repositories." +msgstr "Проверка за частни Bitbucket хранилища." + +#: src/GitHub_Updater/Install.php:384 +msgid "Enter GitHub Access Token for private GitHub repositories." +msgstr "Въведете GitHub Access Token за частни GitHub хранилища." + +#: src/GitHub_Updater/Install.php:398 +msgid "Enter GitLab Private Token for private GitLab repositories." +msgstr "Въведете GitLab Private Token за частни GitLab хранилища." + +#: src/GitHub_Updater/Install.php:442 +msgid "Activate" +msgstr "Активиране" + +#: src/GitHub_Updater/Install.php:451 +msgctxt "This refers to a network activation in a multisite installation" +msgid "Network Enable" +msgstr "Включване за мрежата" + +#: src/GitHub_Updater/Messages.php:84 src/GitHub_Updater/Messages.php:119 +#, fuzzy +msgid "GitHub Updater Error Code:" +msgstr "%s не беше проверен. GitHub Актуализатор номер на грешка:" + +#: src/GitHub_Updater/Messages.php:89 +#, php-format +msgid "GitHub API's rate limit will reset in %s minutes." +msgstr "GitHub API ограничението ще бъде занулено след %s минути." + +#: src/GitHub_Updater/Messages.php:94 +#, php-format +msgid "" +"It looks like you are running into GitHub API rate limits. Be sure and " +"configure a %sPersonal Access Token%s to avoid this issue." +msgstr "" +"Изглежда, че сте на границата на API ограниченията от GitHub. Обмислете " +"използването на %sPersonal Access Token%s за да подобни проблеми." + +#: src/GitHub_Updater/Messages.php:123 +#, fuzzy +msgid "" +"There is probably an access token or password error on the GitHub Updater " +"Settings page." +msgstr "Вероятно има проблем в настройките на GitHub Актуализатора" + +#: src/GitHub_Updater/Messages.php:138 +msgid "" +"You must set a GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" +"Трябва да зададете GitLab.com, GitLab CE, или GitLab Enterprise Private " +"Token." + +#: src/GitHub_Updater/Plugin.php:320 src/GitHub_Updater/Theme.php:475 +#, php-format +msgid "Current branch is `%1$s`, try %2$sanother branch%3$s." +msgstr "Текущият клон е `%1$s`, изпробвайте %2$sдруг клон%3$s." + +#: src/GitHub_Updater/Plugin.php:372 +msgid "View details" +msgstr "Преглед на детайли" + +#: src/GitHub_Updater/Settings.php:77 src/GitHub_Updater/Settings.php:697 +msgid "Settings" +msgstr "Настройки" + +#: src/GitHub_Updater/Settings.php:80 src/GitHub_Updater/Settings.php:492 +msgid "Remote Management" +msgstr "Отдалечено управление" + +#: src/GitHub_Updater/Settings.php:91 src/GitHub_Updater/Settings.php:99 +#: src/GitHub_Updater/Settings.php:194 +msgid "GitHub Updater Settings" +msgstr "Настройки на GitHub Актуализатора" + +#. Plugin Name of the plugin/theme +#: src/GitHub_Updater/Settings.php:92 src/GitHub_Updater/Settings.php:100 +#: src/GitHub_Updater/Settings.php:137 +msgid "GitHub Updater" +msgstr "GitHub Актуализатор" + +#: src/GitHub_Updater/Settings.php:141 +msgid "Saved." +msgstr "Записано." + +#: src/GitHub_Updater/Settings.php:201 +msgid "Enable Branch Switching" +msgstr "Промяна на клона" + +#: src/GitHub_Updater/Settings.php:213 +msgid "Personal GitHub Access Token" +msgstr "Личен GitHub Access Token" + +#: src/GitHub_Updater/Settings.php:220 +msgid "GitHub.com Access Token" +msgstr "" + +#: src/GitHub_Updater/Settings.php:230 +msgid "GitHub Enterprise Access Token" +msgstr "" + +#: src/GitHub_Updater/Settings.php:244 +msgid "GitHub Private Settings" +msgstr "GitHub Private настройки" + +#: src/GitHub_Updater/Settings.php:257 +msgid "GitLab Private Settings" +msgstr "GitLab Private настройки" + +#: src/GitHub_Updater/Settings.php:266 +msgid "GitLab.com Private Token" +msgstr "" + +#: src/GitHub_Updater/Settings.php:277 +msgid "GitLab CE or GitLab Enterprise Private Token" +msgstr "GitLab CE или GitLab Enterprise Private Token" + +#: src/GitHub_Updater/Settings.php:290 +msgid "Bitbucket Private Settings" +msgstr "Bitbucket настройки" + +#: src/GitHub_Updater/Settings.php:297 +msgid "Bitbucket Username" +msgstr "Bitbucket потребител" + +#: src/GitHub_Updater/Settings.php:306 +msgid "Bitbucket Password" +msgstr "Bitbucket парола" + +#: src/GitHub_Updater/Settings.php:319 +msgid "Bitbucket Private Repositories" +msgstr "Bitbucket частни хранилища" + +#: src/GitHub_Updater/Settings.php:331 +msgid "No private repositories are installed." +msgstr "Няма инстлирани частни хранилища." + +#: src/GitHub_Updater/Settings.php:419 +msgid "Theme:" +msgstr "Тема:" + +#: src/GitHub_Updater/Settings.php:541 +#, php-format +msgid "Extended Naming is %sactive%s." +msgstr "Разширеното именуване е %sактивирано%s." + +#: src/GitHub_Updater/Settings.php:546 +#, php-format +msgid "Extended Naming is %snot active%s." +msgstr "Разширеното именуване %sне е активно%s." + +#: src/GitHub_Updater/Settings.php:548 +#, php-format +msgid "" +"Extended Naming renames plugin directories %s to prevent possible conflicts " +"with WP.org plugins." +msgstr "" +"Разширено именуване, преименува директориите на разширенията към %s за да се " +"избегнат възможни конфликти с разширения от WP.org." + +#: src/GitHub_Updater/Settings.php:549 +#, php-format +msgid "Activate Extended Naming by setting %s" +msgstr "" +"Активиране на разширеното именуване чрез задаване на %s в wp-config.php" + +#: src/GitHub_Updater/Settings.php:550 +msgid "Check to enable branch switching from the Plugins or Themes page." +msgstr "" +"Отбележете за да позволите промяната на клона от страниците на разширенията " +"и темите." + +#: src/GitHub_Updater/Settings.php:557 +msgid "Enter your GitHub Access Token. Leave empty for public repositories." +msgstr "" +"Въведете вашия GitHub Access Token. Оставете празно, ако хранилището е " +"публично." + +#: src/GitHub_Updater/Settings.php:564 +msgid "" +"Enter your personal GitHub.com or GitHub Enterprise Access Token to avoid " +"API access limits." +msgstr "" +"Въведете вашия Access Token за GitHub.com или GitHub Enterprise за да " +"избегнете ограниченията на API заявките." + +#: src/GitHub_Updater/Settings.php:571 +msgid "" +"Check box if private repository. Leave unchecked for public repositories." +msgstr "" +"Отбележете, ако това е частно хранилище. Оставете празно ако е публично." + +#: src/GitHub_Updater/Settings.php:578 +msgid "Enter your personal Bitbucket username and password." +msgstr "Въведете вашите потребител и парола за Bitbucket." + +#: src/GitHub_Updater/Settings.php:585 +msgid "Enter your GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" +"Въведете вашият GitLab.com, GitLab CE, или GitLab Enterprise Private Token." + +#: src/GitHub_Updater/Settings.php:592 +msgid "" +"Use of Remote Management services may result increase some page load speeds " +"only for `admin` level users in the dashboard." +msgstr "" +"Използването на отдалеченото управление може да доведе до увеличаване на " +"времето за зареждане в контролния панел за потребителите с администраторска " +"роля." + +#: src/GitHub_Updater/Theme.php:376 +msgid "Theme is up-to-date!" +msgstr "Темата е последна версия!" + +#: src/GitHub_Updater/Theme.php:381 +msgid "Rollback to:" +msgstr "Връщане към:" + +#: src/GitHub_Updater/Theme.php:399 src/GitHub_Updater/Theme.php:639 +msgid "No previous tags to rollback to." +msgstr "Няма предишни тагове за връщане." + +#: src/GitHub_Updater/Theme.php:407 src/GitHub_Updater/Theme.php:421 +#, php-format +msgid "GitHub Updater shows a new version of %s available." +msgstr "GitHub Актуализатор показва налична версия за %s." + +#: src/GitHub_Updater/Theme.php:414 +#, php-format +msgid "View version %s details." +msgstr "Преглед на детайлите за версия %s" + +#: src/GitHub_Updater/Theme.php:418 +msgid "Automatic update is unavailable for this theme." +msgstr "Автоматичното обновяване не е налично за тази тема." + +#: src/GitHub_Updater/Theme.php:428 src/GitHub_Updater/Theme.php:593 +#, php-format +msgid "View version %1$s details%2$s or %3$supdate now%4$s." +msgstr "" +"Преглед на %1$s детайлити%2$s по версията, или %3$sобновяване сега%4$s." + +#: src/GitHub_Updater/Theme.php:586 +#, php-format +msgid "There is a new version of %s available now." +msgstr "Има налична нова версия на %s." + +#: src/GitHub_Updater/Theme.php:613 +#, php-format +msgid "Current version is up to date. Try %sanother version%s" +msgstr "Текущата ви версия е последна. Пробвайте %sнякоя друга%s" + +#: src/GitHub_Updater/Theme.php:627 +msgid "Choose a Version" +msgstr "Изберете версия" + +#: src/GitHub_Updater/Theme.php:644 +msgid "Install" +msgstr "Инсталиране" + +#. Plugin URI of the plugin/theme +msgid "https://github.com/afragen/github-updater" +msgstr "" + +#. Description of the plugin/theme +msgid "" +"A plugin to automatically update GitHub, Bitbucket, or GitLab hosted plugins " +"and themes. It also allows for remote installation of plugins or themes into " +"WordPress." +msgstr "" +"Разширение за автоматично обновяване на разширения и теми от GitHub, " +"Bitbucket или GitLab. Разширението също така добавя и възможност за " +"инсталиране на разширения и теми в WordPress инсталацията." + +#. Author of the plugin/theme +msgid "Andy Fragen" +msgstr "" diff --git a/www/wp-content/plugins/github-updater/languages/github-updater-de_AT.mo b/www/wp-content/plugins/github-updater/languages/github-updater-de_AT.mo new file mode 100755 index 0000000000000000000000000000000000000000..5837b341d147b1ef56bb9e5b31a4e99af4f3da64 GIT binary patch literal 7369 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\n" +"Language-Team: Andy Fragen \n" +"Language: de_AT\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;" +"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;" +"_nx_noop:3c,1,2;__ngettext_noop:1,2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SearchPath-0: .\n" + +#: mu/ghu-loader.php:66 +msgid "Activated as mu-plugin" +msgstr "Aktiviert als mu-Plugin" + +#: src/GitHub_Updater/Base.php:474 +#, php-format +msgid "Rename successful using extended name to %1$s" +msgstr "Umbenennen erfolgreich, der erweiterte Name %1$s wird nun verwendet" + +#: src/GitHub_Updater/Install.php:67 +msgid "A repository URI is required." +msgstr "Eine Repository-URI ist erforderlich." + +#: src/GitHub_Updater/Install.php:223 src/GitHub_Updater/Settings.php:78 +msgid "Install Plugin" +msgstr "Plugin installieren" + +#: src/GitHub_Updater/Install.php:226 src/GitHub_Updater/Settings.php:79 +msgid "Install Theme" +msgstr "Theme installieren" + +#: src/GitHub_Updater/Install.php:244 +msgid "Plugin" +msgstr "Plugin" + +#: src/GitHub_Updater/Install.php:247 +msgid "Theme" +msgstr "Theme" + +#: src/GitHub_Updater/Install.php:258 +#, php-format +msgid "GitHub Updater Install %s" +msgstr "GitHub Updater Installiert %s" + +#: src/GitHub_Updater/Install.php:265 +#, php-format +msgid "%s URI" +msgstr "%s URI" + +#: src/GitHub_Updater/Install.php:273 +msgid "Repository Branch" +msgstr "Repository-Branch" + +#: src/GitHub_Updater/Install.php:281 +msgid "Remote Repository Host" +msgstr "Remoter Repository Host" + +#: src/GitHub_Updater/Install.php:289 +msgid "Private Bitbucket Repository" +msgstr "Privates Bitbucket Repository" + +#: src/GitHub_Updater/Install.php:297 +msgid "GitHub Access Token" +msgstr "GitHub Accesstoken" + +#: src/GitHub_Updater/Install.php:308 +msgid "GitLab Private Token" +msgstr "Privates GitLab Token" + +#: src/GitHub_Updater/Install.php:325 +msgid "URI is case sensitive." +msgstr "URI unterscheidet zwischen Groß- und Kleinschreibung." + +#: src/GitHub_Updater/Install.php:339 +msgid "Enter branch name or leave empty for `master`" +msgstr "Branchnamen angeben oder leer lassen für `master`" + +#: src/GitHub_Updater/Install.php:370 +msgid "Check for private Bitbucket repositories." +msgstr "Auswählen für private Bitbucket Repositories" + +#: src/GitHub_Updater/Install.php:384 +msgid "Enter GitHub Access Token for private GitHub repositories." +msgstr "Geben Sie Ihr GitHub Accesstoken für private GitHub Repositories ein." + +#: src/GitHub_Updater/Install.php:398 +msgid "Enter GitLab Private Token for private GitLab repositories." +msgstr "Geben Sie Ihr GitLab Accesstoken für private GitLab Repositories ein." + +#: src/GitHub_Updater/Install.php:442 +msgid "Activate" +msgstr "Aktivieren" + +#: src/GitHub_Updater/Install.php:451 +msgctxt "This refers to a network activation in a multisite installation" +msgid "Network Enable" +msgstr "Netzwerk/Multisite Aktivieren" + +#: src/GitHub_Updater/Messages.php:84 src/GitHub_Updater/Messages.php:119 +#, fuzzy +msgid "GitHub Updater Error Code:" +msgstr "%s wurde nicht überprüft. GitHub Updater Fehlercode:" + +#: src/GitHub_Updater/Messages.php:89 +#, php-format +msgid "GitHub API's rate limit will reset in %s minutes." +msgstr "Github APIs Limite wird in %s Minutes zurückgesetzt." + +#: src/GitHub_Updater/Messages.php:94 +#, php-format +msgid "" +"It looks like you are running into GitHub API rate limits. Be sure and " +"configure a %sPersonal Access Token%s to avoid this issue." +msgstr "" +"Es sieht so aus, als ob Sie die GitHub API Limite erreichen. Um dieses " +"Problem zu verhindern, können Sie ein %spersönliches Zugriffstoken%s setzen." + +#: src/GitHub_Updater/Messages.php:123 +#, fuzzy +msgid "" +"There is probably an access token or password error on the GitHub Updater " +"Settings page." +msgstr "" +"Wahrscheinlich hat es einen Fehler auf der GitHub Updater Einstellungsseite." + +#: src/GitHub_Updater/Messages.php:138 +msgid "" +"You must set a GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" +"Sie müssen ein privates GitLab.com, GitLab CE oder GitLab Enterprise Token " +"eingeben." + +#: src/GitHub_Updater/Plugin.php:320 src/GitHub_Updater/Theme.php:475 +#, php-format +msgid "Current branch is `%1$s`, try %2$sanother branch%3$s." +msgstr "" +"Aktueller Branch ist `%1$s`, versuchen Sie %2$seinen anderen Branch%3$s." + +#: src/GitHub_Updater/Plugin.php:372 +msgid "View details" +msgstr "Details ansehen" + +#: src/GitHub_Updater/Settings.php:77 src/GitHub_Updater/Settings.php:697 +msgid "Settings" +msgstr "Einstellungen" + +#: src/GitHub_Updater/Settings.php:80 src/GitHub_Updater/Settings.php:492 +msgid "Remote Management" +msgstr "Fernwartung/-management" + +#: src/GitHub_Updater/Settings.php:91 src/GitHub_Updater/Settings.php:99 +#: src/GitHub_Updater/Settings.php:194 +msgid "GitHub Updater Settings" +msgstr "GitHub Updater Einstellungen" + +#. Plugin Name of the plugin/theme +#: src/GitHub_Updater/Settings.php:92 src/GitHub_Updater/Settings.php:100 +#: src/GitHub_Updater/Settings.php:137 +msgid "GitHub Updater" +msgstr "GitHub Updater" + +#: src/GitHub_Updater/Settings.php:141 +msgid "Saved." +msgstr "Gespeichert." + +#: src/GitHub_Updater/Settings.php:201 +msgid "Enable Branch Switching" +msgstr "Wechsel des Pluginbranches Aktivieren" + +#: src/GitHub_Updater/Settings.php:213 +msgid "Personal GitHub Access Token" +msgstr "Persönlicher GitHub Access Token" + +#: src/GitHub_Updater/Settings.php:220 +#, fuzzy +msgid "GitHub.com Access Token" +msgstr "GitHub Accesstoken" + +#: src/GitHub_Updater/Settings.php:230 +#, fuzzy +msgid "GitHub Enterprise Access Token" +msgstr "GitHub Accesstoken" + +#: src/GitHub_Updater/Settings.php:244 +msgid "GitHub Private Settings" +msgstr "GitHub Privat Einstellungen" + +#: src/GitHub_Updater/Settings.php:257 +msgid "GitLab Private Settings" +msgstr "GitLab Privat Einstellungen" + +#: src/GitHub_Updater/Settings.php:266 +msgid "GitLab.com Private Token" +msgstr "Privates GitLab.com Token" + +#: src/GitHub_Updater/Settings.php:277 +msgid "GitLab CE or GitLab Enterprise Private Token" +msgstr "Privates GitLab CE oder GitLab Enterprise Token" + +#: src/GitHub_Updater/Settings.php:290 +msgid "Bitbucket Private Settings" +msgstr "Bitbucket Privat Einstellungen" + +#: src/GitHub_Updater/Settings.php:297 +msgid "Bitbucket Username" +msgstr "Bitbucket Benutzername" + +#: src/GitHub_Updater/Settings.php:306 +msgid "Bitbucket Password" +msgstr "Bitbucket Passwort" + +#: src/GitHub_Updater/Settings.php:319 +msgid "Bitbucket Private Repositories" +msgstr "Bitbucket Private Repositories" + +#: src/GitHub_Updater/Settings.php:331 +msgid "No private repositories are installed." +msgstr "Keine private Repositories installiert." + +#: src/GitHub_Updater/Settings.php:419 +msgid "Theme:" +msgstr "Theme:" + +#: src/GitHub_Updater/Settings.php:541 +#, php-format +msgid "Extended Naming is %sactive%s." +msgstr "Erweitertes Benennen ist %saktiv%s." + +#: src/GitHub_Updater/Settings.php:546 +#, php-format +msgid "Extended Naming is %snot active%s." +msgstr "Erweitertes Benennen ist %snicht aktiv%s." + +#: src/GitHub_Updater/Settings.php:548 +#, php-format +msgid "" +"Extended Naming renames plugin directories %s to prevent possible conflicts " +"with WP.org plugins." +msgstr "" +"Erweitertes Benennen benennt Pluginverzeichnisse %s um, um mögliche " +"Konflikte mit WP.org Plugins zu vermeiden." + +#: src/GitHub_Updater/Settings.php:549 +#, php-format +msgid "Activate Extended Naming by setting %s" +msgstr "Erweitertes Benennen Aktivieren durch setzen von %s" + +#: src/GitHub_Updater/Settings.php:550 +msgid "Check to enable branch switching from the Plugins or Themes page." +msgstr "" +"Auswählen, um das Wechseln des Pluginbranches auf der Plugins oder Themes " +"Seite zu aktivieren." + +#: src/GitHub_Updater/Settings.php:557 +msgid "Enter your GitHub Access Token. Leave empty for public repositories." +msgstr "" +"Geben Sie Ihr GitHub Accesstoken ein. Leer lassen für öffentliche " +"Repositories." + +#: src/GitHub_Updater/Settings.php:564 +#, fuzzy +msgid "" +"Enter your personal GitHub.com or GitHub Enterprise Access Token to avoid " +"API access limits." +msgstr "" +"Geben Sie Ihr persönliches GitHub Accesstoken zu Vermeidung der API-Limite " +"ein." + +#: src/GitHub_Updater/Settings.php:571 +msgid "" +"Check box if private repository. Leave unchecked for public repositories." +msgstr "" +"Aktivieren Sie das Kästchen, falls es sich um ein privates Repository " +"handelt. Lassen Sie es deaktiviert öffentlichen Repositories." + +#: src/GitHub_Updater/Settings.php:578 +msgid "Enter your personal Bitbucket username and password." +msgstr "Geben Sie Ihren persönlichen Bitbucket Benutzernamen und Passwort ein." + +#: src/GitHub_Updater/Settings.php:585 +msgid "Enter your GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" +"Geben Sie Ihre GitLab.com, GitLab CE oder GitLab Unternehmen Privat Token." + +#: src/GitHub_Updater/Settings.php:592 +msgid "" +"Use of Remote Management services may result increase some page load speeds " +"only for `admin` level users in the dashboard." +msgstr "" +"Verwenden von Fernwartung/-managementdiensten kann eine höhere " +"Seiteladezeiten zur Folge haben für `Admin`-Level Benutzer auf dem Dashboard" + +#: src/GitHub_Updater/Theme.php:376 +msgid "Theme is up-to-date!" +msgstr "Theme ist auf dem neusten Stand!" + +#: src/GitHub_Updater/Theme.php:381 +msgid "Rollback to:" +msgstr "Rollback zu:" + +#: src/GitHub_Updater/Theme.php:399 src/GitHub_Updater/Theme.php:639 +msgid "No previous tags to rollback to." +msgstr "Keine früheren Tags für ein Rollback." + +#: src/GitHub_Updater/Theme.php:407 src/GitHub_Updater/Theme.php:421 +#, php-format +msgid "GitHub Updater shows a new version of %s available." +msgstr "GitHub Updater hat eine neue Version von %s gefunden." + +#: src/GitHub_Updater/Theme.php:414 +#, php-format +msgid "View version %s details." +msgstr "Zeige Details der Version %s" + +#: src/GitHub_Updater/Theme.php:418 +msgid "Automatic update is unavailable for this theme." +msgstr "Automatisches Update ist nicht verfügbar für dieses Theme." + +#: src/GitHub_Updater/Theme.php:428 src/GitHub_Updater/Theme.php:593 +#, php-format +msgid "View version %1$s details%2$s or %3$supdate now%4$s." +msgstr "Zeige Details der Version%1$s %2$s oder %3$saktualisiere jetzt%4$s." + +#: src/GitHub_Updater/Theme.php:586 +#, php-format +msgid "There is a new version of %s available now." +msgstr "Es ist eine neue Version von %s verfügbar." + +#: src/GitHub_Updater/Theme.php:613 +#, php-format +msgid "Current version is up to date. Try %sanother version%s" +msgstr "" +"Die aktuelle Version ist auf dem neuesten Stand. Versuchen Sie %seine andere " +"Version%s" + +#: src/GitHub_Updater/Theme.php:627 +msgid "Choose a Version" +msgstr "Wählen Sie eine Version" + +#: src/GitHub_Updater/Theme.php:644 +msgid "Install" +msgstr "Installieren" + +#. Plugin URI of the plugin/theme +msgid "https://github.com/afragen/github-updater" +msgstr "https://github.com/afragen/github-updater" + +#. Description of the plugin/theme +#, fuzzy +msgid "" +"A plugin to automatically update GitHub, Bitbucket, or GitLab hosted plugins " +"and themes. It also allows for remote installation of plugins or themes into " +"WordPress." +msgstr "" +"Ein Plugin um Plugins welche auf GitHub, Bitbucket oder GitLab gehostet sind " +"automatisch zu aktualisieren. Fernwartung/-management ist untersützt und " +"erlaubt das Installieren von Plugins oder Themes in WordPress." + +#. Author of the plugin/theme +msgid "Andy Fragen" +msgstr "Andy Fragen" + +#~ msgid "Renaming %1$s to %2$s" +#~ msgstr "Umbenennen von%1$s zu %2$s" + +#~ msgid "Rename successful" +#~ msgstr "Umbenennen erfolgreich" + +#~ msgid "Unable to rename downloaded repository." +#~ msgstr "Kann das heruntergeladene Repository nicht umbenennen." + +#~ msgid "this plugin" +#~ msgstr "dieses Plugin" + +#~ msgid "Unfortunately, %1$s can not run on PHP versions older than %2$s." +#~ msgstr "" +#~ "Leider kann %1$s nicht auf PHP-Versionen älter als %2$s ausgeführt werden." + +#~ msgid "Read more information about %show you can update%s." +#~ msgstr "Lesen Sie mehr Informationen über %swie Sie aktualisieren können%s." + +#~ msgid "%1$s recommends a PHP version greater than %2$s." +#~ msgstr "%1$s empfiehlt eine PHP-Version neuer als %2$s." + +#~ msgid "" +#~ "A plugin to automatically update GitHub, Bitbucket or GitLab hosted " +#~ "plugins and themes. It also allows for remote installation of plugins or " +#~ "themes into WordPress. Plugin class based upon codepress/github-plugin-updater. Theme class based upon Whitelabel Framework modifications." +#~ msgstr "" +#~ "Ein Plugin, das Themes und Plugins, welche auf GitHub, Bitbucket oder " +#~ "GitLab gehostet sind, automatisch aktualisiert. Es ermöglicht ebenfalls, " +#~ "Plugins oder Themes remote in WordPress zu installieren. Die Plugin-" +#~ "Klasse ist auf codepress/github-plugin-updater basiert. Die Theme-Klasse " +#~ "ist auf Modifizierungen von Whitelabel Framework basiert." + +#~ msgid "" +#~ "No changelog is available via GitHub Updater. Create a file CHANGES." +#~ "md or CHANGELOG.md in your repository." +#~ msgstr "" +#~ "Keine Änderungsprotokoll verfügbar via GitHub Updater. Erstellen Sie eine " +#~ "Datei CHANGES.md oder CHANGELOG.md in Ihrem " +#~ "Repository." diff --git a/www/wp-content/plugins/github-updater/languages/github-updater-de_CH.mo b/www/wp-content/plugins/github-updater/languages/github-updater-de_CH.mo new file mode 100755 index 0000000000000000000000000000000000000000..2ef1ecf1e796bce353eff29d64ebf667cf7c0e35 GIT binary patch literal 7369 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 literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/github-updater/languages/github-updater-de_CH.po b/www/wp-content/plugins/github-updater/languages/github-updater-de_CH.po new file mode 100755 index 0000000..5ae5c8e --- /dev/null +++ b/www/wp-content/plugins/github-updater/languages/github-updater-de_CH.po @@ -0,0 +1,417 @@ +msgid "" +msgstr "" +"Project-Id-Version: GitHub Updater\n" +"POT-Creation-Date: 2016-03-18 08:20-0700\n" +"PO-Revision-Date: 2016-03-18 08:20-0700\n" +"Last-Translator: Linus Metzler \n" +"Language-Team: Andy Fragen \n" +"Language: de_CH\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;" +"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;" +"_nx_noop:3c,1,2;__ngettext_noop:1,2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SearchPath-0: .\n" + +#: mu/ghu-loader.php:66 +msgid "Activated as mu-plugin" +msgstr "Aktiviert als mu-Plugin" + +#: src/GitHub_Updater/Base.php:474 +#, php-format +msgid "Rename successful using extended name to %1$s" +msgstr "Umbenennen erfolgreich, der erweiterte Name %1$s wird nun verwendet" + +#: src/GitHub_Updater/Install.php:67 +msgid "A repository URI is required." +msgstr "Eine Repository-URI ist erforderlich." + +#: src/GitHub_Updater/Install.php:223 src/GitHub_Updater/Settings.php:78 +msgid "Install Plugin" +msgstr "Plugin installieren" + +#: src/GitHub_Updater/Install.php:226 src/GitHub_Updater/Settings.php:79 +msgid "Install Theme" +msgstr "Theme installieren" + +#: src/GitHub_Updater/Install.php:244 +msgid "Plugin" +msgstr "Plugin" + +#: src/GitHub_Updater/Install.php:247 +msgid "Theme" +msgstr "Theme" + +#: src/GitHub_Updater/Install.php:258 +#, php-format +msgid "GitHub Updater Install %s" +msgstr "GitHub Updater Installiert %s" + +#: src/GitHub_Updater/Install.php:265 +#, php-format +msgid "%s URI" +msgstr "%s URI" + +#: src/GitHub_Updater/Install.php:273 +msgid "Repository Branch" +msgstr "Repository-Branch" + +#: src/GitHub_Updater/Install.php:281 +msgid "Remote Repository Host" +msgstr "Remoter Repository Host" + +#: src/GitHub_Updater/Install.php:289 +msgid "Private Bitbucket Repository" +msgstr "Privates Bitbucket Repository" + +#: src/GitHub_Updater/Install.php:297 +msgid "GitHub Access Token" +msgstr "GitHub Accesstoken" + +#: src/GitHub_Updater/Install.php:308 +msgid "GitLab Private Token" +msgstr "Privates GitLab Token" + +#: src/GitHub_Updater/Install.php:325 +msgid "URI is case sensitive." +msgstr "URI unterscheidet zwischen Groß- und Kleinschreibung." + +#: src/GitHub_Updater/Install.php:339 +msgid "Enter branch name or leave empty for `master`" +msgstr "Branchnamen angeben oder leer lassen für `master`" + +#: src/GitHub_Updater/Install.php:370 +msgid "Check for private Bitbucket repositories." +msgstr "Auswählen für private Bitbucket Repositories" + +#: src/GitHub_Updater/Install.php:384 +msgid "Enter GitHub Access Token for private GitHub repositories." +msgstr "Geben Sie Ihr GitHub Accesstoken für private GitHub Repositories ein." + +#: src/GitHub_Updater/Install.php:398 +msgid "Enter GitLab Private Token for private GitLab repositories." +msgstr "Geben Sie Ihr GitLab Accesstoken für private GitLab Repositories ein." + +#: src/GitHub_Updater/Install.php:442 +msgid "Activate" +msgstr "Aktivieren" + +#: src/GitHub_Updater/Install.php:451 +msgctxt "This refers to a network activation in a multisite installation" +msgid "Network Enable" +msgstr "Netzwerk/Multisite Aktivieren" + +#: src/GitHub_Updater/Messages.php:84 src/GitHub_Updater/Messages.php:119 +#, fuzzy +msgid "GitHub Updater Error Code:" +msgstr "%s wurde nicht überprüft. GitHub Updater Fehlercode:" + +#: src/GitHub_Updater/Messages.php:89 +#, php-format +msgid "GitHub API's rate limit will reset in %s minutes." +msgstr "Github APIs Limite wird in %s Minutes zurückgesetzt." + +#: src/GitHub_Updater/Messages.php:94 +#, php-format +msgid "" +"It looks like you are running into GitHub API rate limits. Be sure and " +"configure a %sPersonal Access Token%s to avoid this issue." +msgstr "" +"Es sieht so aus, als ob Sie die GitHub API Limite erreichen. Um dieses " +"Problem zu verhindern, können Sie ein %spersönliches Zugriffstoken%s setzen." + +#: src/GitHub_Updater/Messages.php:123 +#, fuzzy +msgid "" +"There is probably an access token or password error on the GitHub Updater " +"Settings page." +msgstr "" +"Wahrscheinlich hat es einen Fehler auf der GitHub Updater Einstellungsseite." + +#: src/GitHub_Updater/Messages.php:138 +msgid "" +"You must set a GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" +"Sie müssen ein privates GitLab.com, GitLab CE oder GitLab Enterprise Token " +"eingeben." + +#: src/GitHub_Updater/Plugin.php:320 src/GitHub_Updater/Theme.php:475 +#, php-format +msgid "Current branch is `%1$s`, try %2$sanother branch%3$s." +msgstr "" +"Aktueller Branch ist `%1$s`, versuchen Sie %2$seinen anderen Branch%3$s." + +#: src/GitHub_Updater/Plugin.php:372 +msgid "View details" +msgstr "Details ansehen" + +#: src/GitHub_Updater/Settings.php:77 src/GitHub_Updater/Settings.php:697 +msgid "Settings" +msgstr "Einstellungen" + +#: src/GitHub_Updater/Settings.php:80 src/GitHub_Updater/Settings.php:492 +msgid "Remote Management" +msgstr "Fernwartung/-management" + +#: src/GitHub_Updater/Settings.php:91 src/GitHub_Updater/Settings.php:99 +#: src/GitHub_Updater/Settings.php:194 +msgid "GitHub Updater Settings" +msgstr "GitHub Updater Einstellungen" + +#. Plugin Name of the plugin/theme +#: src/GitHub_Updater/Settings.php:92 src/GitHub_Updater/Settings.php:100 +#: src/GitHub_Updater/Settings.php:137 +msgid "GitHub Updater" +msgstr "GitHub Updater" + +#: src/GitHub_Updater/Settings.php:141 +msgid "Saved." +msgstr "Gespeichert." + +#: src/GitHub_Updater/Settings.php:201 +msgid "Enable Branch Switching" +msgstr "Wechsel des Pluginbranches Aktivieren" + +#: src/GitHub_Updater/Settings.php:213 +msgid "Personal GitHub Access Token" +msgstr "Persönlicher GitHub Access Token" + +#: src/GitHub_Updater/Settings.php:220 +#, fuzzy +msgid "GitHub.com Access Token" +msgstr "GitHub Accesstoken" + +#: src/GitHub_Updater/Settings.php:230 +#, fuzzy +msgid "GitHub Enterprise Access Token" +msgstr "GitHub Accesstoken" + +#: src/GitHub_Updater/Settings.php:244 +msgid "GitHub Private Settings" +msgstr "GitHub Privat Einstellungen" + +#: src/GitHub_Updater/Settings.php:257 +msgid "GitLab Private Settings" +msgstr "GitLab Privat Einstellungen" + +#: src/GitHub_Updater/Settings.php:266 +msgid "GitLab.com Private Token" +msgstr "Privates GitLab.com Token" + +#: src/GitHub_Updater/Settings.php:277 +msgid "GitLab CE or GitLab Enterprise Private Token" +msgstr "Privates GitLab CE oder GitLab Enterprise Token" + +#: src/GitHub_Updater/Settings.php:290 +msgid "Bitbucket Private Settings" +msgstr "Bitbucket Privat Einstellungen" + +#: src/GitHub_Updater/Settings.php:297 +msgid "Bitbucket Username" +msgstr "Bitbucket Benutzername" + +#: src/GitHub_Updater/Settings.php:306 +msgid "Bitbucket Password" +msgstr "Bitbucket Passwort" + +#: src/GitHub_Updater/Settings.php:319 +msgid "Bitbucket Private Repositories" +msgstr "Bitbucket Private Repositories" + +#: src/GitHub_Updater/Settings.php:331 +msgid "No private repositories are installed." +msgstr "Keine private Repositories installiert." + +#: src/GitHub_Updater/Settings.php:419 +msgid "Theme:" +msgstr "Theme:" + +#: src/GitHub_Updater/Settings.php:541 +#, php-format +msgid "Extended Naming is %sactive%s." +msgstr "Erweitertes Benennen ist %saktiv%s." + +#: src/GitHub_Updater/Settings.php:546 +#, php-format +msgid "Extended Naming is %snot active%s." +msgstr "Erweitertes Benennen ist %snicht aktiv%s." + +#: src/GitHub_Updater/Settings.php:548 +#, php-format +msgid "" +"Extended Naming renames plugin directories %s to prevent possible conflicts " +"with WP.org plugins." +msgstr "" +"Erweitertes Benennen benennt Pluginverzeichnisse %s um, um mögliche " +"Konflikte mit WP.org Plugins zu vermeiden." + +#: src/GitHub_Updater/Settings.php:549 +#, php-format +msgid "Activate Extended Naming by setting %s" +msgstr "Erweitertes Benennen Aktivieren durch setzen von %s" + +#: src/GitHub_Updater/Settings.php:550 +msgid "Check to enable branch switching from the Plugins or Themes page." +msgstr "" +"Auswählen, um das Wechseln des Pluginbranches auf der Plugins oder Themes " +"Seite zu aktivieren." + +#: src/GitHub_Updater/Settings.php:557 +msgid "Enter your GitHub Access Token. Leave empty for public repositories." +msgstr "" +"Geben Sie Ihr GitHub Accesstoken ein. Leer lassen für öffentliche " +"Repositories." + +#: src/GitHub_Updater/Settings.php:564 +#, fuzzy +msgid "" +"Enter your personal GitHub.com or GitHub Enterprise Access Token to avoid " +"API access limits." +msgstr "" +"Geben Sie Ihr persönliches GitHub Accesstoken zu Vermeidung der API-Limite " +"ein." + +#: src/GitHub_Updater/Settings.php:571 +msgid "" +"Check box if private repository. Leave unchecked for public repositories." +msgstr "" +"Aktivieren Sie das Kästchen, falls es sich um ein privates Repository " +"handelt. Lassen Sie es deaktiviert öffentlichen Repositories." + +#: src/GitHub_Updater/Settings.php:578 +msgid "Enter your personal Bitbucket username and password." +msgstr "Geben Sie Ihren persönlichen Bitbucket Benutzernamen und Passwort ein." + +#: src/GitHub_Updater/Settings.php:585 +msgid "Enter your GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" +"Geben Sie Ihre GitLab.com, GitLab CE oder GitLab Unternehmen Privat Token." + +#: src/GitHub_Updater/Settings.php:592 +msgid "" +"Use of Remote Management services may result increase some page load speeds " +"only for `admin` level users in the dashboard." +msgstr "" +"Verwenden von Fernwartung/-managementdiensten kann eine höhere " +"Seiteladezeiten zur Folge haben für `Admin`-Level Benutzer auf dem Dashboard" + +#: src/GitHub_Updater/Theme.php:376 +msgid "Theme is up-to-date!" +msgstr "Theme ist auf dem neusten Stand!" + +#: src/GitHub_Updater/Theme.php:381 +msgid "Rollback to:" +msgstr "Rollback zu:" + +#: src/GitHub_Updater/Theme.php:399 src/GitHub_Updater/Theme.php:639 +msgid "No previous tags to rollback to." +msgstr "Keine früheren Tags für ein Rollback." + +#: src/GitHub_Updater/Theme.php:407 src/GitHub_Updater/Theme.php:421 +#, php-format +msgid "GitHub Updater shows a new version of %s available." +msgstr "GitHub Updater hat eine neue Version von %s gefunden." + +#: src/GitHub_Updater/Theme.php:414 +#, php-format +msgid "View version %s details." +msgstr "Zeige Details der Version %s" + +#: src/GitHub_Updater/Theme.php:418 +msgid "Automatic update is unavailable for this theme." +msgstr "Automatisches Update ist nicht verfügbar für dieses Theme." + +#: src/GitHub_Updater/Theme.php:428 src/GitHub_Updater/Theme.php:593 +#, php-format +msgid "View version %1$s details%2$s or %3$supdate now%4$s." +msgstr "Zeige Details der Version%1$s %2$s oder %3$saktualisiere jetzt%4$s." + +#: src/GitHub_Updater/Theme.php:586 +#, php-format +msgid "There is a new version of %s available now." +msgstr "Es ist eine neue Version von %s verfügbar." + +#: src/GitHub_Updater/Theme.php:613 +#, php-format +msgid "Current version is up to date. Try %sanother version%s" +msgstr "" +"Die aktuelle Version ist auf dem neuesten Stand. Versuchen Sie %seine andere " +"Version%s" + +#: src/GitHub_Updater/Theme.php:627 +msgid "Choose a Version" +msgstr "Wählen Sie eine Version" + +#: src/GitHub_Updater/Theme.php:644 +msgid "Install" +msgstr "Installieren" + +#. Plugin URI of the plugin/theme +msgid "https://github.com/afragen/github-updater" +msgstr "https://github.com/afragen/github-updater" + +#. Description of the plugin/theme +#, fuzzy +msgid "" +"A plugin to automatically update GitHub, Bitbucket, or GitLab hosted plugins " +"and themes. It also allows for remote installation of plugins or themes into " +"WordPress." +msgstr "" +"Ein Plugin um Plugins welche auf GitHub, Bitbucket oder GitLab gehostet sind " +"automatisch zu aktualisieren. Fernwartung/-management ist untersützt und " +"erlaubt das Installieren von Plugins oder Themes in WordPress." + +#. Author of the plugin/theme +msgid "Andy Fragen" +msgstr "Andy Fragen" + +#~ msgid "Renaming %1$s to %2$s" +#~ msgstr "Umbenennen von%1$s zu %2$s" + +#~ msgid "Rename successful" +#~ msgstr "Umbenennen erfolgreich" + +#~ msgid "Unable to rename downloaded repository." +#~ msgstr "Kann das heruntergeladene Repository nicht umbenennen." + +#~ msgid "this plugin" +#~ msgstr "dieses Plugin" + +#~ msgid "Unfortunately, %1$s can not run on PHP versions older than %2$s." +#~ msgstr "" +#~ "Leider kann %1$s nicht auf PHP-Versionen älter als %2$s ausgeführt werden." + +#~ msgid "Read more information about %show you can update%s." +#~ msgstr "Lesen Sie mehr Informationen über %swie Sie aktualisieren können%s." + +#~ msgid "%1$s recommends a PHP version greater than %2$s." +#~ msgstr "%1$s empfiehlt eine PHP-Version neuer als %2$s." + +#~ msgid "" +#~ "A plugin to automatically update GitHub, Bitbucket or GitLab hosted " +#~ "plugins and themes. It also allows for remote installation of plugins or " +#~ "themes into WordPress. Plugin class based upon codepress/github-plugin-updater. Theme class based upon Whitelabel Framework modifications." +#~ msgstr "" +#~ "Ein Plugin, das Themes und Plugins, welche auf GitHub, Bitbucket oder " +#~ "GitLab gehostet sind, automatisch aktualisiert. Es ermöglicht ebenfalls, " +#~ "Plugins oder Themes remote in WordPress zu installieren. Die Plugin-" +#~ "Klasse ist auf codepress/github-plugin-updater basiert. Die Theme-Klasse " +#~ "ist auf Modifizierungen von Whitelabel Framework basiert." + +#~ msgid "" +#~ "No changelog is available via GitHub Updater. Create a file CHANGES." +#~ "md or CHANGELOG.md in your repository." +#~ msgstr "" +#~ "Keine Änderungsprotokoll verfügbar via GitHub Updater. Erstellen Sie eine " +#~ "Datei CHANGES.md oder CHANGELOG.md in Ihrem " +#~ "Repository." diff --git a/www/wp-content/plugins/github-updater/languages/github-updater-de_DE.mo b/www/wp-content/plugins/github-updater/languages/github-updater-de_DE.mo new file mode 100755 index 0000000000000000000000000000000000000000..7a06a3b5879477a8f450d37e7cece7c3d0af80eb GIT binary patch literal 7369 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 literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/github-updater/languages/github-updater-de_DE.po b/www/wp-content/plugins/github-updater/languages/github-updater-de_DE.po new file mode 100755 index 0000000..c355275 --- /dev/null +++ b/www/wp-content/plugins/github-updater/languages/github-updater-de_DE.po @@ -0,0 +1,417 @@ +msgid "" +msgstr "" +"Project-Id-Version: GitHub Updater\n" +"POT-Creation-Date: 2016-03-18 08:20-0700\n" +"PO-Revision-Date: 2016-03-18 08:20-0700\n" +"Last-Translator: Linus Metzler \n" +"Language-Team: Andy Fragen \n" +"Language: de_DE\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;" +"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;" +"_nx_noop:3c,1,2;__ngettext_noop:1,2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SearchPath-0: .\n" + +#: mu/ghu-loader.php:66 +msgid "Activated as mu-plugin" +msgstr "Aktiviert als mu-Plugin" + +#: src/GitHub_Updater/Base.php:474 +#, php-format +msgid "Rename successful using extended name to %1$s" +msgstr "Umbenennen erfolgreich, der erweiterte Name %1$s wird nun verwendet" + +#: src/GitHub_Updater/Install.php:67 +msgid "A repository URI is required." +msgstr "Eine Repository-URI ist erforderlich." + +#: src/GitHub_Updater/Install.php:223 src/GitHub_Updater/Settings.php:78 +msgid "Install Plugin" +msgstr "Plugin installieren" + +#: src/GitHub_Updater/Install.php:226 src/GitHub_Updater/Settings.php:79 +msgid "Install Theme" +msgstr "Theme installieren" + +#: src/GitHub_Updater/Install.php:244 +msgid "Plugin" +msgstr "Plugin" + +#: src/GitHub_Updater/Install.php:247 +msgid "Theme" +msgstr "Theme" + +#: src/GitHub_Updater/Install.php:258 +#, php-format +msgid "GitHub Updater Install %s" +msgstr "GitHub Updater Installiert %s" + +#: src/GitHub_Updater/Install.php:265 +#, php-format +msgid "%s URI" +msgstr "%s URI" + +#: src/GitHub_Updater/Install.php:273 +msgid "Repository Branch" +msgstr "Repository-Branch" + +#: src/GitHub_Updater/Install.php:281 +msgid "Remote Repository Host" +msgstr "Remoter Repository Host" + +#: src/GitHub_Updater/Install.php:289 +msgid "Private Bitbucket Repository" +msgstr "Privates Bitbucket Repository" + +#: src/GitHub_Updater/Install.php:297 +msgid "GitHub Access Token" +msgstr "GitHub Accesstoken" + +#: src/GitHub_Updater/Install.php:308 +msgid "GitLab Private Token" +msgstr "Privates GitLab Token" + +#: src/GitHub_Updater/Install.php:325 +msgid "URI is case sensitive." +msgstr "URI unterscheidet zwischen Groß- und Kleinschreibung." + +#: src/GitHub_Updater/Install.php:339 +msgid "Enter branch name or leave empty for `master`" +msgstr "Branchnamen angeben oder leer lassen für `master`" + +#: src/GitHub_Updater/Install.php:370 +msgid "Check for private Bitbucket repositories." +msgstr "Auswählen für private Bitbucket Repositories" + +#: src/GitHub_Updater/Install.php:384 +msgid "Enter GitHub Access Token for private GitHub repositories." +msgstr "Geben Sie Ihr GitHub Accesstoken für private GitHub Repositories ein." + +#: src/GitHub_Updater/Install.php:398 +msgid "Enter GitLab Private Token for private GitLab repositories." +msgstr "Geben Sie Ihr GitLab Accesstoken für private GitLab Repositories ein." + +#: src/GitHub_Updater/Install.php:442 +msgid "Activate" +msgstr "Aktivieren" + +#: src/GitHub_Updater/Install.php:451 +msgctxt "This refers to a network activation in a multisite installation" +msgid "Network Enable" +msgstr "Netzwerk/Multisite Aktivieren" + +#: src/GitHub_Updater/Messages.php:84 src/GitHub_Updater/Messages.php:119 +#, fuzzy +msgid "GitHub Updater Error Code:" +msgstr "%s wurde nicht überprüft. GitHub Updater Fehlercode:" + +#: src/GitHub_Updater/Messages.php:89 +#, php-format +msgid "GitHub API's rate limit will reset in %s minutes." +msgstr "Github APIs Limite wird in %s Minutes zurückgesetzt." + +#: src/GitHub_Updater/Messages.php:94 +#, php-format +msgid "" +"It looks like you are running into GitHub API rate limits. Be sure and " +"configure a %sPersonal Access Token%s to avoid this issue." +msgstr "" +"Es sieht so aus, als ob Sie die GitHub API Limite erreichen. Um dieses " +"Problem zu verhindern, können Sie ein %spersönliches Zugriffstoken%s setzen." + +#: src/GitHub_Updater/Messages.php:123 +#, fuzzy +msgid "" +"There is probably an access token or password error on the GitHub Updater " +"Settings page." +msgstr "" +"Wahrscheinlich hat es einen Fehler auf der GitHub Updater Einstellungsseite." + +#: src/GitHub_Updater/Messages.php:138 +msgid "" +"You must set a GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" +"Sie müssen ein privates GitLab.com, GitLab CE oder GitLab Enterprise Token " +"eingeben." + +#: src/GitHub_Updater/Plugin.php:320 src/GitHub_Updater/Theme.php:475 +#, php-format +msgid "Current branch is `%1$s`, try %2$sanother branch%3$s." +msgstr "" +"Aktueller Branch ist `%1$s`, versuchen Sie %2$seinen anderen Branch%3$s." + +#: src/GitHub_Updater/Plugin.php:372 +msgid "View details" +msgstr "Details ansehen" + +#: src/GitHub_Updater/Settings.php:77 src/GitHub_Updater/Settings.php:697 +msgid "Settings" +msgstr "Einstellungen" + +#: src/GitHub_Updater/Settings.php:80 src/GitHub_Updater/Settings.php:492 +msgid "Remote Management" +msgstr "Fernwartung/-management" + +#: src/GitHub_Updater/Settings.php:91 src/GitHub_Updater/Settings.php:99 +#: src/GitHub_Updater/Settings.php:194 +msgid "GitHub Updater Settings" +msgstr "GitHub Updater Einstellungen" + +#. Plugin Name of the plugin/theme +#: src/GitHub_Updater/Settings.php:92 src/GitHub_Updater/Settings.php:100 +#: src/GitHub_Updater/Settings.php:137 +msgid "GitHub Updater" +msgstr "GitHub Updater" + +#: src/GitHub_Updater/Settings.php:141 +msgid "Saved." +msgstr "Gespeichert." + +#: src/GitHub_Updater/Settings.php:201 +msgid "Enable Branch Switching" +msgstr "Wechsel des Pluginbranches Aktivieren" + +#: src/GitHub_Updater/Settings.php:213 +msgid "Personal GitHub Access Token" +msgstr "Persönlicher GitHub Access Token" + +#: src/GitHub_Updater/Settings.php:220 +#, fuzzy +msgid "GitHub.com Access Token" +msgstr "GitHub Accesstoken" + +#: src/GitHub_Updater/Settings.php:230 +#, fuzzy +msgid "GitHub Enterprise Access Token" +msgstr "GitHub Accesstoken" + +#: src/GitHub_Updater/Settings.php:244 +msgid "GitHub Private Settings" +msgstr "GitHub Privat Einstellungen" + +#: src/GitHub_Updater/Settings.php:257 +msgid "GitLab Private Settings" +msgstr "GitLab Privat Einstellungen" + +#: src/GitHub_Updater/Settings.php:266 +msgid "GitLab.com Private Token" +msgstr "Privates GitLab.com Token" + +#: src/GitHub_Updater/Settings.php:277 +msgid "GitLab CE or GitLab Enterprise Private Token" +msgstr "Privates GitLab CE oder GitLab Enterprise Token" + +#: src/GitHub_Updater/Settings.php:290 +msgid "Bitbucket Private Settings" +msgstr "Bitbucket Privat Einstellungen" + +#: src/GitHub_Updater/Settings.php:297 +msgid "Bitbucket Username" +msgstr "Bitbucket Benutzername" + +#: src/GitHub_Updater/Settings.php:306 +msgid "Bitbucket Password" +msgstr "Bitbucket Passwort" + +#: src/GitHub_Updater/Settings.php:319 +msgid "Bitbucket Private Repositories" +msgstr "Bitbucket Private Repositories" + +#: src/GitHub_Updater/Settings.php:331 +msgid "No private repositories are installed." +msgstr "Keine private Repositories installiert." + +#: src/GitHub_Updater/Settings.php:419 +msgid "Theme:" +msgstr "Theme:" + +#: src/GitHub_Updater/Settings.php:541 +#, php-format +msgid "Extended Naming is %sactive%s." +msgstr "Erweitertes Benennen ist %saktiv%s." + +#: src/GitHub_Updater/Settings.php:546 +#, php-format +msgid "Extended Naming is %snot active%s." +msgstr "Erweitertes Benennen ist %snicht aktiv%s." + +#: src/GitHub_Updater/Settings.php:548 +#, php-format +msgid "" +"Extended Naming renames plugin directories %s to prevent possible conflicts " +"with WP.org plugins." +msgstr "" +"Erweitertes Benennen benennt Pluginverzeichnisse %s um, um mögliche " +"Konflikte mit WP.org Plugins zu vermeiden." + +#: src/GitHub_Updater/Settings.php:549 +#, php-format +msgid "Activate Extended Naming by setting %s" +msgstr "Erweitertes Benennen Aktivieren durch setzen von %s" + +#: src/GitHub_Updater/Settings.php:550 +msgid "Check to enable branch switching from the Plugins or Themes page." +msgstr "" +"Auswählen, um das Wechseln des Pluginbranches auf der Plugins oder Themes " +"Seite zu aktivieren." + +#: src/GitHub_Updater/Settings.php:557 +msgid "Enter your GitHub Access Token. Leave empty for public repositories." +msgstr "" +"Geben Sie Ihr GitHub Accesstoken ein. Leer lassen für öffentliche " +"Repositories." + +#: src/GitHub_Updater/Settings.php:564 +#, fuzzy +msgid "" +"Enter your personal GitHub.com or GitHub Enterprise Access Token to avoid " +"API access limits." +msgstr "" +"Geben Sie Ihr persönliches GitHub Accesstoken zu Vermeidung der API-Limite " +"ein." + +#: src/GitHub_Updater/Settings.php:571 +msgid "" +"Check box if private repository. Leave unchecked for public repositories." +msgstr "" +"Aktivieren Sie das Kästchen, falls es sich um ein privates Repository " +"handelt. Lassen Sie es deaktiviert öffentlichen Repositories." + +#: src/GitHub_Updater/Settings.php:578 +msgid "Enter your personal Bitbucket username and password." +msgstr "Geben Sie Ihren persönlichen Bitbucket Benutzernamen und Passwort ein." + +#: src/GitHub_Updater/Settings.php:585 +msgid "Enter your GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" +"Geben Sie Ihre GitLab.com, GitLab CE oder GitLab Unternehmen Privat Token." + +#: src/GitHub_Updater/Settings.php:592 +msgid "" +"Use of Remote Management services may result increase some page load speeds " +"only for `admin` level users in the dashboard." +msgstr "" +"Verwenden von Fernwartung/-managementdiensten kann eine höhere " +"Seiteladezeiten zur Folge haben für `Admin`-Level Benutzer auf dem Dashboard" + +#: src/GitHub_Updater/Theme.php:376 +msgid "Theme is up-to-date!" +msgstr "Theme ist auf dem neusten Stand!" + +#: src/GitHub_Updater/Theme.php:381 +msgid "Rollback to:" +msgstr "Rollback zu:" + +#: src/GitHub_Updater/Theme.php:399 src/GitHub_Updater/Theme.php:639 +msgid "No previous tags to rollback to." +msgstr "Keine früheren Tags für ein Rollback." + +#: src/GitHub_Updater/Theme.php:407 src/GitHub_Updater/Theme.php:421 +#, php-format +msgid "GitHub Updater shows a new version of %s available." +msgstr "GitHub Updater hat eine neue Version von %s gefunden." + +#: src/GitHub_Updater/Theme.php:414 +#, php-format +msgid "View version %s details." +msgstr "Zeige Details der Version %s" + +#: src/GitHub_Updater/Theme.php:418 +msgid "Automatic update is unavailable for this theme." +msgstr "Automatisches Update ist nicht verfügbar für dieses Theme." + +#: src/GitHub_Updater/Theme.php:428 src/GitHub_Updater/Theme.php:593 +#, php-format +msgid "View version %1$s details%2$s or %3$supdate now%4$s." +msgstr "Zeige Details der Version%1$s %2$s oder %3$saktualisiere jetzt%4$s." + +#: src/GitHub_Updater/Theme.php:586 +#, php-format +msgid "There is a new version of %s available now." +msgstr "Es ist eine neue Version von %s verfügbar." + +#: src/GitHub_Updater/Theme.php:613 +#, php-format +msgid "Current version is up to date. Try %sanother version%s" +msgstr "" +"Die aktuelle Version ist auf dem neuesten Stand. Versuchen Sie %seine andere " +"Version%s" + +#: src/GitHub_Updater/Theme.php:627 +msgid "Choose a Version" +msgstr "Wählen Sie eine Version" + +#: src/GitHub_Updater/Theme.php:644 +msgid "Install" +msgstr "Installieren" + +#. Plugin URI of the plugin/theme +msgid "https://github.com/afragen/github-updater" +msgstr "https://github.com/afragen/github-updater" + +#. Description of the plugin/theme +#, fuzzy +msgid "" +"A plugin to automatically update GitHub, Bitbucket, or GitLab hosted plugins " +"and themes. It also allows for remote installation of plugins or themes into " +"WordPress." +msgstr "" +"Ein Plugin um Plugins welche auf GitHub, Bitbucket oder GitLab gehostet sind " +"automatisch zu aktualisieren. Fernwartung/-management ist untersützt und " +"erlaubt das Installieren von Plugins oder Themes in WordPress." + +#. Author of the plugin/theme +msgid "Andy Fragen" +msgstr "Andy Fragen" + +#~ msgid "Renaming %1$s to %2$s" +#~ msgstr "Umbenennen von%1$s zu %2$s" + +#~ msgid "Rename successful" +#~ msgstr "Umbenennen erfolgreich" + +#~ msgid "Unable to rename downloaded repository." +#~ msgstr "Kann das heruntergeladene Repository nicht umbenennen." + +#~ msgid "this plugin" +#~ msgstr "dieses Plugin" + +#~ msgid "Unfortunately, %1$s can not run on PHP versions older than %2$s." +#~ msgstr "" +#~ "Leider kann %1$s nicht auf PHP-Versionen älter als %2$s ausgeführt werden." + +#~ msgid "Read more information about %show you can update%s." +#~ msgstr "Lesen Sie mehr Informationen über %swie Sie aktualisieren können%s." + +#~ msgid "%1$s recommends a PHP version greater than %2$s." +#~ msgstr "%1$s empfiehlt eine PHP-Version neuer als %2$s." + +#~ msgid "" +#~ "A plugin to automatically update GitHub, Bitbucket or GitLab hosted " +#~ "plugins and themes. It also allows for remote installation of plugins or " +#~ "themes into WordPress. Plugin class based upon codepress/github-plugin-updater. Theme class based upon Whitelabel Framework modifications." +#~ msgstr "" +#~ "Ein Plugin, das Themes und Plugins, welche auf GitHub, Bitbucket oder " +#~ "GitLab gehostet sind, automatisch aktualisiert. Es ermöglicht ebenfalls, " +#~ "Plugins oder Themes remote in WordPress zu installieren. Die Plugin-" +#~ "Klasse ist auf codepress/github-plugin-updater basiert. Die Theme-Klasse " +#~ "ist auf Modifizierungen von Whitelabel Framework basiert." + +#~ msgid "" +#~ "No changelog is available via GitHub Updater. Create a file CHANGES." +#~ "md or CHANGELOG.md in your repository." +#~ msgstr "" +#~ "Keine Änderungsprotokoll verfügbar via GitHub Updater. Erstellen Sie eine " +#~ "Datei CHANGES.md oder CHANGELOG.md in Ihrem " +#~ "Repository." diff --git a/www/wp-content/plugins/github-updater/languages/github-updater-es_ES.mo b/www/wp-content/plugins/github-updater/languages/github-updater-es_ES.mo new file mode 100755 index 0000000000000000000000000000000000000000..dbb2d98a60e3920eb7866947bd2d0b68e2e75eba GIT binary patch literal 4266 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 KcB43xss90db=y1u literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/github-updater/languages/github-updater-es_ES.po b/www/wp-content/plugins/github-updater/languages/github-updater-es_ES.po new file mode 100755 index 0000000..cd30737 --- /dev/null +++ b/www/wp-content/plugins/github-updater/languages/github-updater-es_ES.po @@ -0,0 +1,408 @@ +msgid "" +msgstr "" +"Project-Id-Version: GitHub Updater\n" +"POT-Creation-Date: 2016-03-18 08:20-0700\n" +"PO-Revision-Date: 2016-03-18 08:20-0700\n" +"Last-Translator: esoj \n" +"Language-Team: Andy Fragen \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;" +"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;" +"_nx_noop:3c,1,2;__ngettext_noop:1,2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SearchPath-0: .\n" + +#: mu/ghu-loader.php:66 +msgid "Activated as mu-plugin" +msgstr "Activado como mu-plugin" + +#: src/GitHub_Updater/Base.php:474 +#, php-format +msgid "Rename successful using extended name to %1$s" +msgstr "" + +#: src/GitHub_Updater/Install.php:67 +msgid "A repository URI is required." +msgstr "Se requiere una URI del repositorio." + +#: src/GitHub_Updater/Install.php:223 src/GitHub_Updater/Settings.php:78 +msgid "Install Plugin" +msgstr "Instalar Plugin" + +#: src/GitHub_Updater/Install.php:226 src/GitHub_Updater/Settings.php:79 +msgid "Install Theme" +msgstr "Instalar tema" + +#: src/GitHub_Updater/Install.php:244 +msgid "Plugin" +msgstr "Plugin" + +#: src/GitHub_Updater/Install.php:247 +msgid "Theme" +msgstr "Tema" + +#: src/GitHub_Updater/Install.php:258 +#, php-format +msgid "GitHub Updater Install %s" +msgstr "GitHub Updater Intala %s" + +#: src/GitHub_Updater/Install.php:265 +#, php-format +msgid "%s URI" +msgstr "" + +#: src/GitHub_Updater/Install.php:273 +msgid "Repository Branch" +msgstr "Rama del repositorio" + +#: src/GitHub_Updater/Install.php:281 +msgid "Remote Repository Host" +msgstr "Host del repositorio remoto" + +#: src/GitHub_Updater/Install.php:289 +msgid "Private Bitbucket Repository" +msgstr "Repositorio privado de Bitbucket" + +#: src/GitHub_Updater/Install.php:297 +msgid "GitHub Access Token" +msgstr "GitHub Access Token" + +#: src/GitHub_Updater/Install.php:308 +#, fuzzy +msgid "GitLab Private Token" +msgstr "Opciones privadas de GitHub" + +#: src/GitHub_Updater/Install.php:325 +msgid "URI is case sensitive." +msgstr "" + +#: src/GitHub_Updater/Install.php:339 +msgid "Enter branch name or leave empty for `master`" +msgstr "Introduce la rama del repositorio o dejar en blanco para `master '" + +#: src/GitHub_Updater/Install.php:370 +#, fuzzy +msgid "Check for private Bitbucket repositories." +msgstr "Repositorio privado de Bitbucket" + +#: src/GitHub_Updater/Install.php:384 +msgid "Enter GitHub Access Token for private GitHub repositories." +msgstr "Introduzca el Token de acceso para repositorios privados de GitHub." + +#: src/GitHub_Updater/Install.php:398 +#, fuzzy +msgid "Enter GitLab Private Token for private GitLab repositories." +msgstr "Introduzca el Token de acceso para repositorios privados de GitHub." + +#: src/GitHub_Updater/Install.php:442 +msgid "Activate" +msgstr "" + +#: src/GitHub_Updater/Install.php:451 +msgctxt "This refers to a network activation in a multisite installation" +msgid "Network Enable" +msgstr "" + +#: src/GitHub_Updater/Messages.php:84 src/GitHub_Updater/Messages.php:119 +#, fuzzy +msgid "GitHub Updater Error Code:" +msgstr "%s no se pudo comprobar. Código del error de GitHub Updater:" + +#: src/GitHub_Updater/Messages.php:89 +#, php-format +msgid "GitHub API's rate limit will reset in %s minutes." +msgstr "El límite de la API de GitHub se reseteará en %s minutos." + +#: src/GitHub_Updater/Messages.php:94 +#, php-format +msgid "" +"It looks like you are running into GitHub API rate limits. Be sure and " +"configure a %sPersonal Access Token%s to avoid this issue." +msgstr "" + +#: src/GitHub_Updater/Messages.php:123 +#, fuzzy +msgid "" +"There is probably an access token or password error on the GitHub Updater " +"Settings page." +msgstr "Probablemente haya un error en la configuración" + +#: src/GitHub_Updater/Messages.php:138 +msgid "" +"You must set a GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" + +#: src/GitHub_Updater/Plugin.php:320 src/GitHub_Updater/Theme.php:475 +#, php-format +msgid "Current branch is `%1$s`, try %2$sanother branch%3$s." +msgstr "La rama actual es `%1$s`, intenta %2$sanother branch%3$s." + +#: src/GitHub_Updater/Plugin.php:372 +msgid "View details" +msgstr "Ver detalles" + +#: src/GitHub_Updater/Settings.php:77 src/GitHub_Updater/Settings.php:697 +msgid "Settings" +msgstr "Opciones" + +#: src/GitHub_Updater/Settings.php:80 src/GitHub_Updater/Settings.php:492 +msgid "Remote Management" +msgstr "" + +#: src/GitHub_Updater/Settings.php:91 src/GitHub_Updater/Settings.php:99 +#: src/GitHub_Updater/Settings.php:194 +msgid "GitHub Updater Settings" +msgstr "Opciones de GitHub Updater" + +#. Plugin Name of the plugin/theme +#: src/GitHub_Updater/Settings.php:92 src/GitHub_Updater/Settings.php:100 +#: src/GitHub_Updater/Settings.php:137 +#, fuzzy +msgid "GitHub Updater" +msgstr "%s no se pudo comprobar. Código del error de GitHub Updater:" + +#: src/GitHub_Updater/Settings.php:141 +msgid "Saved." +msgstr "Guardado." + +#: src/GitHub_Updater/Settings.php:201 +#, fuzzy +msgid "Enable Branch Switching" +msgstr "Activar el cambio de rama en los plugins" + +#: src/GitHub_Updater/Settings.php:213 +msgid "Personal GitHub Access Token" +msgstr "Token de acceso personal de GitHub" + +#: src/GitHub_Updater/Settings.php:220 +#, fuzzy +msgid "GitHub.com Access Token" +msgstr "GitHub Access Token" + +#: src/GitHub_Updater/Settings.php:230 +#, fuzzy +msgid "GitHub Enterprise Access Token" +msgstr "GitHub Access Token" + +#: src/GitHub_Updater/Settings.php:244 +msgid "GitHub Private Settings" +msgstr "Opciones privadas de GitHub" + +#: src/GitHub_Updater/Settings.php:257 +#, fuzzy +msgid "GitLab Private Settings" +msgstr "Opciones privadas de GitHub" + +#: src/GitHub_Updater/Settings.php:266 +#, fuzzy +msgid "GitLab.com Private Token" +msgstr "Opciones privadas de GitHub" + +#: src/GitHub_Updater/Settings.php:277 +msgid "GitLab CE or GitLab Enterprise Private Token" +msgstr "" + +#: src/GitHub_Updater/Settings.php:290 +msgid "Bitbucket Private Settings" +msgstr "Opciones privadas de Bitbucket" + +#: src/GitHub_Updater/Settings.php:297 +msgid "Bitbucket Username" +msgstr "Nombre de usuario de Bitbucket" + +#: src/GitHub_Updater/Settings.php:306 +msgid "Bitbucket Password" +msgstr "Contraseña de Bitbucket" + +#: src/GitHub_Updater/Settings.php:319 +msgid "Bitbucket Private Repositories" +msgstr "Repositorios privados de Bitbucket" + +#: src/GitHub_Updater/Settings.php:331 +msgid "No private repositories are installed." +msgstr "No se han instalado repositorios privados." + +#: src/GitHub_Updater/Settings.php:419 +msgid "Theme:" +msgstr "Tema:" + +#: src/GitHub_Updater/Settings.php:541 +#, php-format +msgid "Extended Naming is %sactive%s." +msgstr "" + +#: src/GitHub_Updater/Settings.php:546 +#, php-format +msgid "Extended Naming is %snot active%s." +msgstr "" + +#: src/GitHub_Updater/Settings.php:548 +#, php-format +msgid "" +"Extended Naming renames plugin directories %s to prevent possible conflicts " +"with WP.org plugins." +msgstr "" + +#: src/GitHub_Updater/Settings.php:549 +#, php-format +msgid "Activate Extended Naming by setting %s" +msgstr "" + +#: src/GitHub_Updater/Settings.php:550 +#, fuzzy +msgid "Check to enable branch switching from the Plugins or Themes page." +msgstr "" +"Activar para permitir el cambio rama desde la página de opciones del Plugin." + +#: src/GitHub_Updater/Settings.php:557 +msgid "Enter your GitHub Access Token. Leave empty for public repositories." +msgstr "" +"Escriba su Token de acceso de GitHub. Dejar en blanco para los repositorios " +"públicos." + +#: src/GitHub_Updater/Settings.php:564 +#, fuzzy +msgid "" +"Enter your personal GitHub.com or GitHub Enterprise Access Token to avoid " +"API access limits." +msgstr "" +"Escriba su Token de acceso personal de GitHub para evitar los límites de " +"acceso a la API." + +#: src/GitHub_Updater/Settings.php:571 +msgid "" +"Check box if private repository. Leave unchecked for public repositories." +msgstr "" +"Marque la casilla si es un repositorio privado. Deja sin marcar para " +"repositorios públicos." + +#: src/GitHub_Updater/Settings.php:578 +msgid "Enter your personal Bitbucket username and password." +msgstr "Introduzca su nombre de usuario y contraseña de Bitbucket." + +#: src/GitHub_Updater/Settings.php:585 +msgid "Enter your GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" + +#: src/GitHub_Updater/Settings.php:592 +msgid "" +"Use of Remote Management services may result increase some page load speeds " +"only for `admin` level users in the dashboard." +msgstr "" + +#: src/GitHub_Updater/Theme.php:376 +msgid "Theme is up-to-date!" +msgstr "El tema está actualizado!" + +#: src/GitHub_Updater/Theme.php:381 +msgid "Rollback to:" +msgstr "Retroceder a:" + +#: src/GitHub_Updater/Theme.php:399 src/GitHub_Updater/Theme.php:639 +msgid "No previous tags to rollback to." +msgstr "No hay etiquetas anteriores donde revertir." + +#: src/GitHub_Updater/Theme.php:407 src/GitHub_Updater/Theme.php:421 +#, php-format +msgid "GitHub Updater shows a new version of %s available." +msgstr "GitHub Updater muestra una nueva versión de %s disponible." + +#: src/GitHub_Updater/Theme.php:414 +#, php-format +msgid "View version %s details." +msgstr "Ver detalles de la versión de %s" + +#: src/GitHub_Updater/Theme.php:418 +msgid "Automatic update is unavailable for this theme." +msgstr "Este tema no permite actualizaciones automáticas." + +#: src/GitHub_Updater/Theme.php:428 src/GitHub_Updater/Theme.php:593 +#, php-format +msgid "View version %1$s details%2$s or %3$supdate now%4$s." +msgstr "Ver %1$s details%2$s de la versión o %3$sactualiza ahora%4$s." + +#: src/GitHub_Updater/Theme.php:586 +#, php-format +msgid "There is a new version of %s available now." +msgstr "Existe una nueva versión de %s disponible." + +#: src/GitHub_Updater/Theme.php:613 +#, php-format +msgid "Current version is up to date. Try %sanother version%s" +msgstr "La versión actual está actualizada. Intenta con %sanother version%s" + +#: src/GitHub_Updater/Theme.php:627 +msgid "Choose a Version" +msgstr "Elige una versión" + +#: src/GitHub_Updater/Theme.php:644 +msgid "Install" +msgstr "Instalar" + +#. Plugin URI of the plugin/theme +msgid "https://github.com/afragen/github-updater" +msgstr "" + +#. Description of the plugin/theme +msgid "" +"A plugin to automatically update GitHub, Bitbucket, or GitLab hosted plugins " +"and themes. It also allows for remote installation of plugins or themes into " +"WordPress." +msgstr "" + +#. Author of the plugin/theme +msgid "Andy Fragen" +msgstr "" + +#~ msgid "Renaming %1$s to %2$s" +#~ msgstr "Renombrado %1$s a %2$s" + +#~ msgid "Rename successful" +#~ msgstr "Renombrado satisfactoriamente" + +#~ msgid "Unable to rename downloaded repository." +#~ msgstr "No se ha podido renombrar el repositorio descargado." + +#~ msgid "this plugin" +#~ msgstr "este plungon" + +#~ msgid "Unfortunately, %1$s can not run on PHP versions older than %2$s." +#~ msgstr "" +#~ "Desafortunadamente, %1$s no se pueden ejecutar en versiones de PHP " +#~ "anteriores a %2$s." + +#~ msgid "Read more information about %show you can update%s." +#~ msgstr "Más información sobre %show cómo puede actualizar %s." + +#~ msgid "%1$s recommends a PHP version greater than %2$s." +#~ msgstr "%1$s recomiendo una versión de PHP mayor que %2$s." + +#, fuzzy +#~ msgid "" +#~ "A plugin to automatically update GitHub, Bitbucket or GitLab hosted " +#~ "plugins and themes. It also allows for remote installation of plugins or " +#~ "themes into WordPress. Plugin class based upon codepress/github-plugin-updater. Theme class based upon Whitelabel Framework modifications." +#~ msgstr "" +#~ "Un plugin para actualizar automáticamente plugins y temas desde GitHub o " +#~ "Bitbucket. También permite la instalación remota de plugins o temas en " +#~ "WordPress. Clase de los plugins basado en codepress/github-plugin-updater " +#~ "Clase de los temas basado en modificaciones de Whitelabel Framework" + +#~ msgid "" +#~ "No changelog is available via GitHub Updater. Create a file CHANGES." +#~ "md or CHANGELOG.md in your repository." +#~ msgstr "" +#~ "No hay registro de cambios está disponible vía GitHub Updater. Crear un " +#~ "archivo CHANGES.md o CHANGELOG.md en su " +#~ "repositorio." diff --git a/www/wp-content/plugins/github-updater/languages/github-updater-fr_FR.mo b/www/wp-content/plugins/github-updater/languages/github-updater-fr_FR.mo new file mode 100755 index 0000000000000000000000000000000000000000..a802e58b6ecdd5e04998755ed21e636a61ece4bf GIT binary patch literal 4415 zcmb7GO^h5z6)qs=X9<5X;U@%maXem|qIrn0Y44=9q<|8pMeeFkt0Gx!1KV1Kn*+%d<8fS z{1@;j@G&Uyd0-6uBybtX`)mTg2<(ObKLpO=`xn5E0Pg}>{te(KfNuf`_!jU4@No#? zRV)J8{>wnNvjhAL@Vmf=fj-kK-S~0K(_PWz>~luQ07a(82ByVWgyG-f#-m) z1J3~e2RsWr1EX1P5BMDLF7O)gC`e&@Zvbn+9{`!Bm+@df{uapg{~gHty$NLheC$)W zfmeW!0$&8Oe>9Nw_#Tkg`zes^`#q5D{{xWa{{dvV|Az605ftpd8j#ohdcYMR&$}AF zGvL?oy$gH+_;cWs!2bZ5*GHi&LU(w9E)hbw7<&Rw=8t1&5;wxHu#5LTft!7J95-K} zuF#R+nR|}oW4ICO;;XnPaP!6cRu^*siV7Rq4yaYc8=$a*IeiK@#|%PZc+v2! zH-v`(MTL*p?l0r!i+#d&i<+a&^%Zd;@#(Jgs!h^SH;;N*-buB%pxXzuY-LB`J@=+7 zeVS0-YeSS$N4b`}GR&lS3$*u1z{O0*vnfP zEEtMm+ZZbu;}l7{rmRbi7K^#HN_*NZzY9xyTlbsyV3*EVY$T&50%L@%?=2 zFXb(|kR-}E+AuejF1HRUhX03ED5tipgto-y5tPje15~%?4~iA8ccsG)*TY5!CV${= zmF1&}545`6vRI@CJB^kZjeM2|nn~(5^@0OqQ5n}W2R zIk;S_y~=}RwpsIGM8_g5TOl>eQ&H`~R-T1}4-_ zA4gOio-~{iiyiNKt}!*$N&QaViWAeFlG{ZB3PVx3lod^DZm7gZEA1$p+XfwW{si-4 zeYEB}X**iTJ1*KV4dN}Z17{>S&bipw&J;9c*{L$|-Luz3^M#FQ(JEv=qoa#pszEdL z>1U$)Y&1Pb^|{7OJ*q!juR}0eM=Wp_c}KZboaAT&zH*sF_G{4geoJX-+w>h;-d~{S zw)f9hLrlWCiB+jPITCTSp=9@c$V1d_Ew4|kt*kALh?Pf%Tpg10lUPS^+)MB|=gUa28bH1St*hOwNb-qDcTk~6LeoHr|pPrfD+Gj{G zQoZQ?#_8l~{-<2BCB3(pFnm>`*D!&9?f7mMq>9&4s(2kPyQPikm3!*_@?*B#XKPD$ zP@TZqP-X&0*vc$gHn!^;q!CN_bZ2MgseCs5&yjH))cMK`!m$WXp{89k|- z=d4cc)b)%`xqkOpDp4rkgWFuc*Nn$WE^@yb6$Wu}(C-ai^^S)Y%KFa5chGlYebDb@ z2vI)HxW@!TBTxxmF#4~XgYROXo5Z1O^LrD6yjha@}br#khiL}(29kVekosyyr`E|=_{cyjj4d|((0 zmE^u%1P1D>@C%<+o539gv{LB#py=VBbYH6hZ;!|MJ@Vq7>8Wm~eBxfp5xeZ;e7A_L zD%h|yjN?cfoy1|^p={N8AhNSbq#C7*{xl>99<9zR+Vcb+L<548G3Y0QejB+RDWMn+ zXE7X_aQ;K@fkRaF9^q`?ceKT&LBFMJhxuve)e#hBuL159yKQ^WN7I}rbR)Y;r?&9# z@L1is)euc-Wp{8J0S}Y4RUKq@Ohh{{WE7nTXCIbctxOv~h<9#rk5Y+jzIRHm8EBMY uV^C3aC*iDBjwl+JvSZ1Mj-`v_j%cmYXBUML^dk|62Ik$?gH`Xnm-#<@cq3i_ literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/github-updater/languages/github-updater-fr_FR.po b/www/wp-content/plugins/github-updater/languages/github-updater-fr_FR.po new file mode 100755 index 0000000..890ec86 --- /dev/null +++ b/www/wp-content/plugins/github-updater/languages/github-updater-fr_FR.po @@ -0,0 +1,448 @@ +msgid "" +msgstr "" +"Project-Id-Version: GitHub Updater\n" +"Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/github-updater\n" +"POT-Creation-Date: 2016-03-18 08:20-0700\n" +"PO-Revision-Date: 2016-03-18 08:20-0700\n" +"Last-Translator: fxbenard | FxB \n" +"Language-Team: fxbenard | FxB \n" +"Language: fr_FR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;" +"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;" +"_nx_noop:3c,1,2;__ngettext_noop:1,2\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Poedit-SearchPath-0: .\n" + +#: mu/ghu-loader.php:66 +msgid "Activated as mu-plugin" +msgstr "Installé en tant que plugin \"must-use\" (MU-plugin)." + +#: src/GitHub_Updater/Base.php:474 +#, php-format +msgid "Rename successful using extended name to %1$s" +msgstr "" + +#: src/GitHub_Updater/Install.php:67 +msgid "A repository URI is required." +msgstr "" + +#: src/GitHub_Updater/Install.php:223 src/GitHub_Updater/Settings.php:78 +msgid "Install Plugin" +msgstr "Installer l'extension" + +#: src/GitHub_Updater/Install.php:226 src/GitHub_Updater/Settings.php:79 +msgid "Install Theme" +msgstr "Installer le thème" + +#: src/GitHub_Updater/Install.php:244 +msgid "Plugin" +msgstr "Plugin" + +#: src/GitHub_Updater/Install.php:247 +msgid "Theme" +msgstr "Thème :" + +#: src/GitHub_Updater/Install.php:258 +#, php-format +msgid "GitHub Updater Install %s" +msgstr "GitHub Updater %s" + +#: src/GitHub_Updater/Install.php:265 +#, php-format +msgid "%s URI" +msgstr "%s URI" + +#: src/GitHub_Updater/Install.php:273 +msgid "Repository Branch" +msgstr "Branche de référence" + +#: src/GitHub_Updater/Install.php:281 +msgid "Remote Repository Host" +msgstr "Hébergeur du dépôt" + +#: src/GitHub_Updater/Install.php:289 +msgid "Private Bitbucket Repository" +msgstr "Dépôt BitBucket privé" + +#: src/GitHub_Updater/Install.php:297 +msgid "GitHub Access Token" +msgstr "Jeton d'accès à GitHub" + +#: src/GitHub_Updater/Install.php:308 +#, fuzzy +msgid "GitLab Private Token" +msgstr "Réglages des dépôts GitHub privés" + +#: src/GitHub_Updater/Install.php:325 +msgid "URI is case sensitive." +msgstr "" + +#: src/GitHub_Updater/Install.php:339 +msgid "Enter branch name or leave empty for `master`" +msgstr "Entrez le nom de la branche ou laissez vide pour « master »" + +#: src/GitHub_Updater/Install.php:370 +#, fuzzy +msgid "Check for private Bitbucket repositories." +msgstr "Dépôt BitBucket privé" + +#: src/GitHub_Updater/Install.php:384 +msgid "Enter GitHub Access Token for private GitHub repositories." +msgstr "Entrez votre jeton d'accès GitHub (GitHub Access Token)." + +#: src/GitHub_Updater/Install.php:398 +#, fuzzy +msgid "Enter GitLab Private Token for private GitLab repositories." +msgstr "Entrez votre jeton d'accès GitHub (GitHub Access Token)." + +#: src/GitHub_Updater/Install.php:442 +msgid "Activate" +msgstr "" + +#: src/GitHub_Updater/Install.php:451 +msgctxt "This refers to a network activation in a multisite installation" +msgid "Network Enable" +msgstr "" + +#: src/GitHub_Updater/Messages.php:84 src/GitHub_Updater/Messages.php:119 +msgid "GitHub Updater Error Code:" +msgstr "Code d'erreur GitHub Updater :" + +#: src/GitHub_Updater/Messages.php:89 +#, php-format +msgid "GitHub API's rate limit will reset in %s minutes." +msgstr "" +"La limite sur le nombre d'appels à l'API GitHub sera réinitialisée dans %s " +"minutes." + +#: src/GitHub_Updater/Messages.php:94 +#, php-format +msgid "" +"It looks like you are running into GitHub API rate limits. Be sure and " +"configure a %sPersonal Access Token%s to avoid this issue." +msgstr "" + +#: src/GitHub_Updater/Messages.php:123 +#, fuzzy +msgid "" +"There is probably an access token or password error on the GitHub Updater " +"Settings page." +msgstr "" +"Il y a probablement une erreur sur la page des réglages de GitHub Updater" + +#: src/GitHub_Updater/Messages.php:138 +msgid "" +"You must set a GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" + +#: src/GitHub_Updater/Plugin.php:320 src/GitHub_Updater/Theme.php:475 +#, fuzzy, php-format +msgid "Current branch is `%1$s`, try %2$sanother branch%3$s." +msgstr "La version actuelle est à jour. Essayez %sune autre version%s" + +#: src/GitHub_Updater/Plugin.php:372 +#, fuzzy +msgid "View details" +msgstr "détails" + +#: src/GitHub_Updater/Settings.php:77 src/GitHub_Updater/Settings.php:697 +msgid "Settings" +msgstr "Réglages" + +#: src/GitHub_Updater/Settings.php:80 src/GitHub_Updater/Settings.php:492 +msgid "Remote Management" +msgstr "" + +#: src/GitHub_Updater/Settings.php:91 src/GitHub_Updater/Settings.php:99 +#: src/GitHub_Updater/Settings.php:194 +msgid "GitHub Updater Settings" +msgstr "Réglages de GitHub Updater" + +#. Plugin Name of the plugin/theme +#: src/GitHub_Updater/Settings.php:92 src/GitHub_Updater/Settings.php:100 +#: src/GitHub_Updater/Settings.php:137 +msgid "GitHub Updater" +msgstr "GitHub Updater" + +#: src/GitHub_Updater/Settings.php:141 +msgid "Saved." +msgstr "Paramètres enregistrés." + +#: src/GitHub_Updater/Settings.php:201 +msgid "Enable Branch Switching" +msgstr "" + +#: src/GitHub_Updater/Settings.php:213 +#, fuzzy +msgid "Personal GitHub Access Token" +msgstr "Jeton d'accès à GitHub" + +#: src/GitHub_Updater/Settings.php:220 +#, fuzzy +msgid "GitHub.com Access Token" +msgstr "Jeton d'accès à GitHub" + +#: src/GitHub_Updater/Settings.php:230 +#, fuzzy +msgid "GitHub Enterprise Access Token" +msgstr "Jeton d'accès à GitHub" + +#: src/GitHub_Updater/Settings.php:244 +msgid "GitHub Private Settings" +msgstr "Réglages des dépôts GitHub privés" + +#: src/GitHub_Updater/Settings.php:257 +#, fuzzy +msgid "GitLab Private Settings" +msgstr "Réglages des dépôts GitHub privés" + +#: src/GitHub_Updater/Settings.php:266 +#, fuzzy +msgid "GitLab.com Private Token" +msgstr "Réglages des dépôts GitHub privés" + +#: src/GitHub_Updater/Settings.php:277 +msgid "GitLab CE or GitLab Enterprise Private Token" +msgstr "" + +#: src/GitHub_Updater/Settings.php:290 +msgid "Bitbucket Private Settings" +msgstr "Réglages des dépôts Bitbucket privés" + +#: src/GitHub_Updater/Settings.php:297 +msgid "Bitbucket Username" +msgstr "Nom d'utilisateur Bitbucket" + +#: src/GitHub_Updater/Settings.php:306 +msgid "Bitbucket Password" +msgstr "Mot de passe Bitbucket" + +#: src/GitHub_Updater/Settings.php:319 +msgid "Bitbucket Private Repositories" +msgstr "Dépôts BitBucket privés" + +#: src/GitHub_Updater/Settings.php:331 +msgid "No private repositories are installed." +msgstr "Aucun dépôt privé n'est installé." + +#: src/GitHub_Updater/Settings.php:419 +msgid "Theme:" +msgstr "Thème :" + +#: src/GitHub_Updater/Settings.php:541 +#, php-format +msgid "Extended Naming is %sactive%s." +msgstr "" + +#: src/GitHub_Updater/Settings.php:546 +#, php-format +msgid "Extended Naming is %snot active%s." +msgstr "" + +#: src/GitHub_Updater/Settings.php:548 +#, php-format +msgid "" +"Extended Naming renames plugin directories %s to prevent possible conflicts " +"with WP.org plugins." +msgstr "" + +#: src/GitHub_Updater/Settings.php:549 +#, php-format +msgid "Activate Extended Naming by setting %s" +msgstr "" + +#: src/GitHub_Updater/Settings.php:550 +msgid "Check to enable branch switching from the Plugins or Themes page." +msgstr "" + +#: src/GitHub_Updater/Settings.php:557 +msgid "Enter your GitHub Access Token. Leave empty for public repositories." +msgstr "" +"Entrez votre jeton d'accès GitHub (GitHub Access Token). Laissez vide pour " +"un dépôt public." + +#: src/GitHub_Updater/Settings.php:564 +#, fuzzy +msgid "" +"Enter your personal GitHub.com or GitHub Enterprise Access Token to avoid " +"API access limits." +msgstr "" +"Entrez votre jeton d'accès GitHub (GitHub Access Token). Laissez vide pour " +"un dépôt public." + +#: src/GitHub_Updater/Settings.php:571 +msgid "" +"Check box if private repository. Leave unchecked for public repositories." +msgstr "" +"Cochez la case s'il s'agit d'un dépôt privé. Ne pas cocher s'il s'agit d'un " +"dépôt public." + +#: src/GitHub_Updater/Settings.php:578 +msgid "Enter your personal Bitbucket username and password." +msgstr "Entrez votre nom d'utilisateur et mot de passe de Bitbucket." + +#: src/GitHub_Updater/Settings.php:585 +msgid "Enter your GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" + +#: src/GitHub_Updater/Settings.php:592 +msgid "" +"Use of Remote Management services may result increase some page load speeds " +"only for `admin` level users in the dashboard." +msgstr "" + +#: src/GitHub_Updater/Theme.php:376 +msgid "Theme is up-to-date!" +msgstr "Le thème est à jour !" + +#: src/GitHub_Updater/Theme.php:381 +msgid "Rollback to:" +msgstr "Revenir à la version :" + +#: src/GitHub_Updater/Theme.php:399 src/GitHub_Updater/Theme.php:639 +msgid "No previous tags to rollback to." +msgstr "Aucun tag précédent." + +#: src/GitHub_Updater/Theme.php:407 src/GitHub_Updater/Theme.php:421 +#, php-format +msgid "GitHub Updater shows a new version of %s available." +msgstr "GitHub Updater indique qu'une nouvelle version de %s est disponible." + +#: src/GitHub_Updater/Theme.php:414 +#, php-format +msgid "View version %s details." +msgstr "Voir les détails de la version %s." + +#: src/GitHub_Updater/Theme.php:418 +msgid "Automatic update is unavailable for this theme." +msgstr "La mise à jour automatique n'est pas disponible pour ce thème." + +#: src/GitHub_Updater/Theme.php:428 src/GitHub_Updater/Theme.php:593 +#, php-format +msgid "View version %1$s details%2$s or %3$supdate now%4$s." +msgstr "" +"Voir les détails de la version %1$s %2$s ou %3$smettre à jour maintenant%4$s." + +#: src/GitHub_Updater/Theme.php:586 +#, php-format +msgid "There is a new version of %s available now." +msgstr "Une nouvelle version de %s est disponible." + +#: src/GitHub_Updater/Theme.php:613 +#, php-format +msgid "Current version is up to date. Try %sanother version%s" +msgstr "La version actuelle est à jour. Essayez %sune autre version%s" + +#: src/GitHub_Updater/Theme.php:627 +msgid "Choose a Version" +msgstr "Choisissez une version" + +#: src/GitHub_Updater/Theme.php:644 +msgid "Install" +msgstr "Installer" + +#. Plugin URI of the plugin/theme +msgid "https://github.com/afragen/github-updater" +msgstr "https://github.com/afragen/github-updater" + +#. Description of the plugin/theme +msgid "" +"A plugin to automatically update GitHub, Bitbucket, or GitLab hosted plugins " +"and themes. It also allows for remote installation of plugins or themes into " +"WordPress." +msgstr "" + +#. Author of the plugin/theme +msgid "Andy Fragen" +msgstr "Andy Fragen" + +#, fuzzy +#~ msgid "%s was not checked. GitHub Updater Error Code:" +#~ msgstr "%s n'a pas été vérifié. Code d'erreur de GitHub Updater : %s" + +#, fuzzy +#~ msgid "Renaming %1$s to %2$s" +#~ msgstr "Renommage de %s en %s" + +#~ msgid "Rename successful" +#~ msgstr "Le renommage a réussi" + +#~ msgid "Unable to rename downloaded repository." +#~ msgstr "Impossible de renommer le dépôt téléchargé." + +#, fuzzy +#~ msgid "this plugin" +#~ msgstr "Plugin" + +#, fuzzy +#~ msgid "Unfortunately, %1$s can not run on PHP versions older than %2$s." +#~ msgstr "" +#~ "Malheureusement, %1$s ne fonctionne pas sur les versions de PHP " +#~ "antérieures à la v.%2$s. En savoir plus sur %3$sles possibilités de mise " +#~ "à jour%4$s." + +#, fuzzy +#~ msgid "" +#~ "A plugin to automatically update GitHub, Bitbucket or GitLab hosted " +#~ "plugins and themes. It also allows for remote installation of plugins or " +#~ "themes into WordPress. Plugin class based upon codepress/github-plugin-updater. Theme class based upon Whitelabel Framework modifications." +#~ msgstr "" +#~ "Une extension pour mettre à jour automatiquement des extensions et des " +#~ "thèmes WordPress hébergés sur GitHub ou Bitbucket. Elle permet également " +#~ "d'installer des extensions et des thèmes dans WordPress. La classe Plugin " +#~ "est basée sur codepress/github-plugin-updater. La classe Theme est une version " +#~ "modifiée du Whitelabel Framework." + +#~ msgid "" +#~ "No changelog is available via GitHub Updater. Create a file CHANGES." +#~ "md or CHANGELOG.md in your repository." +#~ msgstr "" +#~ "L'historique des modifications n'est pas disponible. Créez un fichier " +#~ "CHANGES.md ou CHANGELOG.md dans votre dépôt." + +#~ msgid "%sView version %s details%s or %supdate now%s." +#~ msgstr "" +#~ "%sVoir les détails de la version %s %s ou %smettre à jour maintenant%s." + +#~ msgid "URI" +#~ msgstr "URI" + +#~ msgid "available now." +#~ msgstr "est disponible." + +#~ msgid "View version" +#~ msgstr "Voir la version" + +#~ msgid "or" +#~ msgstr "ou" + +#~ msgid "update now" +#~ msgstr "mettre à jour maintenant" + +#~ msgid "another version?" +#~ msgstr "une autre version ?" + +#~ msgid "" +#~ "GitHub Updater will not load. It requires PHP 5.3 or greater. Please ask " +#~ "your service provider to update PHP on your server" +#~ msgstr "" +#~ "GitHub Updater ne se charge pas. Il nécessite PHP 5.3 ou supérieur. " +#~ "Veuillez demander à votre hébergeur de mettre à jour PHP sur votre " +#~ "serveur." + +#~ msgid "was not checked." +#~ msgstr "n'a pas été vérifié." + +#~ msgid " or " +#~ msgstr " ou " diff --git a/www/wp-content/plugins/github-updater/languages/github-updater-it.mo b/www/wp-content/plugins/github-updater/languages/github-updater-it.mo new file mode 100755 index 0000000000000000000000000000000000000000..4c18226ea73c16f3d1cc50fd560ae2dafbf4cb04 GIT binary patch literal 4125 zcmb`JO>87b6~`+ify4mBWm3~qo~gLI zYUrxAJu5Ec#2FNELP8=^5+Nj{T%#yrg(3lm6ve(WDZJmqo7^G93i$4q@Pp^AJB9c%_%`?u_y_Pl@B?rj{5$vn zc;{V0oB$sJzYG2Vuw=l0AB{rg1-e9zz@N1fiqCz zVeka_b?_Yc9dM)S?}AJCJ_Nr4{tjfhcfhZKe*_7<0iFT>4dPEc0%5lMaggnM9{eV_ z4Sp3=Aj@UoJ>VFGO5!!}+u+Zu@n3^ax@xoE?!gO_iZkJE_8~v)^Y3$G*3s@(Tbz%* zK9FAZNjggNV3gzoZNz!gAJc_Q4iwtCx2g0xrhL?gC}~Hzkq1&IvX>~@vl;mzI{i?k zDimwl_wsmOdFn{#4sF(-?#hboXiJT()81xUxtk1cEAO=#Ob_ikl^K~Tu|8DsKK1Mo z={*`%>t*$NuVS5@Y;HDW!_GG#m+l;4G= zBl4Em?vQq}G0i$@EG*4xp;;$3jK}vy?Jwm$Iv>Z%Ioh%N%9LAIDpupiRVb(SG6`*o z%_AtA6b7httiCj$Lcj<8;WY#n$#&nzus+!qghOZY?AaOV$j>L6eweQ`eaFFxG1IKsvnAK@!IlVI$lbR`^7f>fEgv;Tx7%4x4HR;qy`e8(2IO*L+Dv8y4xmiTz zZq1w@t1+i;xTU}hC zvbp+%p_8k$@Z`#r6O_#2VF%6$T5!*dsB0r?5Ne|(#HqSPaojv}YU#NZIT&bLR3`&* zSr<%;J7nnkTh!NXWR31=luP7X`bn-F1ieZnQbUzwCrNnv%9jPsP7StGN+_!V_PMP#U-KIY0lS8MuBqG4yYc|#aiNmyILMPvbuvrBcH`XeSi(~9#>M0 zj1wy!z`p`@j#XlF(k6sJE@3dXsQu$*NVwSt5~(;hrRx%(O(r45Bmb&QLlf52=k|C( z?Q2d0oIGlE4|023HQQ;*LBbg?!Fk{$`wA|QsU=HEVKT-htIUmCER$`n}EjL|= zZyH0TU@d?9V$3Hfj;&H{bBk#yLKf%D!D4a_fa+hY!m_fiOzucin`K>`C61^np;djB zw1e9tF5`c#+;C~;IvuM%(ka%Ilxf7Z!#|OjiYi@-O$B~^uMnM8nZ`|T>hx62tp%H7 znZBJFmuy?rX%49(wwmiDwi+!+a;Z)@pTNASD=gTKh>x1n!Li$7QL>A{^*N|{3*Vu< zPJ8aEcDQx=8p1?F8xPOml5)gM`Mhv=S;30}Uf)lWxcts?6-N>OA`79~fAOOJKN{7e Ah5!Hn literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/github-updater/languages/github-updater-it.po b/www/wp-content/plugins/github-updater/languages/github-updater-it.po new file mode 100755 index 0000000..f2161fe --- /dev/null +++ b/www/wp-content/plugins/github-updater/languages/github-updater-it.po @@ -0,0 +1,461 @@ +msgid "" +msgstr "" +"Project-Id-Version: GitHub Updater\n" +"POT-Creation-Date: 2016-03-18 08:20-0700\n" +"PO-Revision-Date: 2016-03-18 08:20-0700\n" +"Last-Translator: Enea Overclokk \n" +"Language-Team: Enea Overclokk\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;" +"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;" +"_nx_noop:3c,1,2;__ngettext_noop:1,2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SearchPath-0: .\n" + +#: mu/ghu-loader.php:66 +msgid "Activated as mu-plugin" +msgstr "Attivato come mu-plugin" + +#: src/GitHub_Updater/Base.php:474 +#, php-format +msgid "Rename successful using extended name to %1$s" +msgstr "" + +#: src/GitHub_Updater/Install.php:67 +msgid "A repository URI is required." +msgstr "" + +#: src/GitHub_Updater/Install.php:223 src/GitHub_Updater/Settings.php:78 +msgid "Install Plugin" +msgstr "Installare Plugin" + +#: src/GitHub_Updater/Install.php:226 src/GitHub_Updater/Settings.php:79 +msgid "Install Theme" +msgstr "Installa Tema" + +#: src/GitHub_Updater/Install.php:244 +msgid "Plugin" +msgstr "Plugin" + +#: src/GitHub_Updater/Install.php:247 +msgid "Theme" +msgstr "Tema:" + +#: src/GitHub_Updater/Install.php:258 +#, php-format +msgid "GitHub Updater Install %s" +msgstr "GitHub Updater Installa %s" + +#: src/GitHub_Updater/Install.php:265 +#, php-format +msgid "%s URI" +msgstr "%s URI" + +#: src/GitHub_Updater/Install.php:273 +msgid "Repository Branch" +msgstr "Ramo del repository" + +#: src/GitHub_Updater/Install.php:281 +msgid "Remote Repository Host" +msgstr "Repository remoto Host" + +#: src/GitHub_Updater/Install.php:289 +msgid "Private Bitbucket Repository" +msgstr "Repository privato Bitbucket" + +#: src/GitHub_Updater/Install.php:297 +msgid "GitHub Access Token" +msgstr "GitHub Access Token" + +#: src/GitHub_Updater/Install.php:308 +#, fuzzy +msgid "GitLab Private Token" +msgstr "Impostazioni private GitHub" + +#: src/GitHub_Updater/Install.php:325 +msgid "URI is case sensitive." +msgstr "" + +#: src/GitHub_Updater/Install.php:339 +msgid "Enter branch name or leave empty for `master`" +msgstr "Immettere il nome del ramo o lasciare vuoto per 'master'" + +#: src/GitHub_Updater/Install.php:370 +#, fuzzy +msgid "Check for private Bitbucket repositories." +msgstr "Repository privato Bitbucket" + +#: src/GitHub_Updater/Install.php:384 +msgid "Enter GitHub Access Token for private GitHub repositories." +msgstr "" +"Inserisci il tuo Access Token di Github. Lascia vuoto per gli archivi " +"pubblici." + +#: src/GitHub_Updater/Install.php:398 +#, fuzzy +msgid "Enter GitLab Private Token for private GitLab repositories." +msgstr "" +"Inserisci il tuo Access Token di Github. Lascia vuoto per gli archivi " +"pubblici." + +#: src/GitHub_Updater/Install.php:442 +msgid "Activate" +msgstr "" + +#: src/GitHub_Updater/Install.php:451 +msgctxt "This refers to a network activation in a multisite installation" +msgid "Network Enable" +msgstr "" + +#: src/GitHub_Updater/Messages.php:84 src/GitHub_Updater/Messages.php:119 +#, fuzzy +msgid "GitHub Updater Error Code:" +msgstr "Codice di errore GitHub Updater:" + +#: src/GitHub_Updater/Messages.php:89 +#, php-format +msgid "GitHub API's rate limit will reset in %s minutes." +msgstr "Il limite di frequenza delle GitHub API si resetterà in %s minuti." + +#: src/GitHub_Updater/Messages.php:94 +#, php-format +msgid "" +"It looks like you are running into GitHub API rate limits. Be sure and " +"configure a %sPersonal Access Token%s to avoid this issue." +msgstr "" + +#: src/GitHub_Updater/Messages.php:123 +#, fuzzy +msgid "" +"There is probably an access token or password error on the GitHub Updater " +"Settings page." +msgstr "" +"Probabilmente c'è un errore nella pagina impostazioni di GitHub Updater" + +#: src/GitHub_Updater/Messages.php:138 +msgid "" +"You must set a GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" + +#: src/GitHub_Updater/Plugin.php:320 src/GitHub_Updater/Theme.php:475 +#, fuzzy, php-format +msgid "Current branch is `%1$s`, try %2$sanother branch%3$s." +msgstr "La versione attuale è aggiornata. Prova %sun'altra versione%s" + +#: src/GitHub_Updater/Plugin.php:372 +#, fuzzy +msgid "View details" +msgstr "Visualizza i dettagli della versione %4$s" + +#: src/GitHub_Updater/Settings.php:77 src/GitHub_Updater/Settings.php:697 +msgid "Settings" +msgstr "Impostazioni" + +#: src/GitHub_Updater/Settings.php:80 src/GitHub_Updater/Settings.php:492 +msgid "Remote Management" +msgstr "" + +#: src/GitHub_Updater/Settings.php:91 src/GitHub_Updater/Settings.php:99 +#: src/GitHub_Updater/Settings.php:194 +msgid "GitHub Updater Settings" +msgstr "Impostazioni GitHub Updater" + +#. Plugin Name of the plugin/theme +#: src/GitHub_Updater/Settings.php:92 src/GitHub_Updater/Settings.php:100 +#: src/GitHub_Updater/Settings.php:137 +msgid "GitHub Updater" +msgstr "GitHub Updater" + +#: src/GitHub_Updater/Settings.php:141 +msgid "Saved." +msgstr "Salvato." + +#: src/GitHub_Updater/Settings.php:201 +msgid "Enable Branch Switching" +msgstr "" + +#: src/GitHub_Updater/Settings.php:213 +#, fuzzy +msgid "Personal GitHub Access Token" +msgstr "GitHub Access Token" + +#: src/GitHub_Updater/Settings.php:220 +#, fuzzy +msgid "GitHub.com Access Token" +msgstr "GitHub Access Token" + +#: src/GitHub_Updater/Settings.php:230 +#, fuzzy +msgid "GitHub Enterprise Access Token" +msgstr "GitHub Access Token" + +#: src/GitHub_Updater/Settings.php:244 +msgid "GitHub Private Settings" +msgstr "Impostazioni private GitHub" + +#: src/GitHub_Updater/Settings.php:257 +#, fuzzy +msgid "GitLab Private Settings" +msgstr "Impostazioni private GitHub" + +#: src/GitHub_Updater/Settings.php:266 +#, fuzzy +msgid "GitLab.com Private Token" +msgstr "Impostazioni private GitHub" + +#: src/GitHub_Updater/Settings.php:277 +msgid "GitLab CE or GitLab Enterprise Private Token" +msgstr "" + +#: src/GitHub_Updater/Settings.php:290 +msgid "Bitbucket Private Settings" +msgstr "Impostazioni private Bitbucket" + +#: src/GitHub_Updater/Settings.php:297 +msgid "Bitbucket Username" +msgstr "Username Bitbucket" + +#: src/GitHub_Updater/Settings.php:306 +msgid "Bitbucket Password" +msgstr "Password Bitbucket" + +#: src/GitHub_Updater/Settings.php:319 +msgid "Bitbucket Private Repositories" +msgstr "Repository privato Bitbucket" + +#: src/GitHub_Updater/Settings.php:331 +msgid "No private repositories are installed." +msgstr "Nessun repository privato è installato." + +#: src/GitHub_Updater/Settings.php:419 +msgid "Theme:" +msgstr "Tema:" + +#: src/GitHub_Updater/Settings.php:541 +#, php-format +msgid "Extended Naming is %sactive%s." +msgstr "" + +#: src/GitHub_Updater/Settings.php:546 +#, php-format +msgid "Extended Naming is %snot active%s." +msgstr "" + +#: src/GitHub_Updater/Settings.php:548 +#, php-format +msgid "" +"Extended Naming renames plugin directories %s to prevent possible conflicts " +"with WP.org plugins." +msgstr "" + +#: src/GitHub_Updater/Settings.php:549 +#, php-format +msgid "Activate Extended Naming by setting %s" +msgstr "" + +#: src/GitHub_Updater/Settings.php:550 +msgid "Check to enable branch switching from the Plugins or Themes page." +msgstr "" + +#: src/GitHub_Updater/Settings.php:557 +msgid "Enter your GitHub Access Token. Leave empty for public repositories." +msgstr "" +"Inserisci il tuo Access Token di Github. Lascia vuoto per gli archivi " +"pubblici." + +#: src/GitHub_Updater/Settings.php:564 +#, fuzzy +msgid "" +"Enter your personal GitHub.com or GitHub Enterprise Access Token to avoid " +"API access limits." +msgstr "" +"Inserisci il tuo Access Token di Github. Lascia vuoto per gli archivi " +"pubblici." + +#: src/GitHub_Updater/Settings.php:571 +msgid "" +"Check box if private repository. Leave unchecked for public repositories." +msgstr "" +"Seleziona se il repository è privato. Lascia deselezionato per gli archivi " +"pubblici." + +#: src/GitHub_Updater/Settings.php:578 +msgid "Enter your personal Bitbucket username and password." +msgstr "Inserisci la tua username e password di Bitbucket." + +#: src/GitHub_Updater/Settings.php:585 +msgid "Enter your GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" + +#: src/GitHub_Updater/Settings.php:592 +msgid "" +"Use of Remote Management services may result increase some page load speeds " +"only for `admin` level users in the dashboard." +msgstr "" + +#: src/GitHub_Updater/Theme.php:376 +msgid "Theme is up-to-date!" +msgstr "Il tema è aggiornato!" + +#: src/GitHub_Updater/Theme.php:381 +msgid "Rollback to:" +msgstr "Ripristina a:" + +#: src/GitHub_Updater/Theme.php:399 src/GitHub_Updater/Theme.php:639 +msgid "No previous tags to rollback to." +msgstr "Nessun tag precedente da ripristinare." + +#: src/GitHub_Updater/Theme.php:407 src/GitHub_Updater/Theme.php:421 +#, php-format +msgid "GitHub Updater shows a new version of %s available." +msgstr "GitHub Updater mostra una nuova versione di %1$s disponibile." + +#: src/GitHub_Updater/Theme.php:414 +#, php-format +msgid "View version %s details." +msgstr "Visualizza i dettagli della versione %s." + +#: src/GitHub_Updater/Theme.php:418 +msgid "Automatic update is unavailable for this theme." +msgstr "L'aggiornamento automatico non è disponibile per questo tema." + +#: src/GitHub_Updater/Theme.php:428 src/GitHub_Updater/Theme.php:593 +#, php-format +msgid "View version %1$s details%2$s or %3$supdate now%4$s." +msgstr "" +"Visualizza i dettagli della versione %1$s %2$s o %3$saggiorna adesso%4$s" + +#: src/GitHub_Updater/Theme.php:586 +#, php-format +msgid "There is a new version of %s available now." +msgstr "C'è una nuova versione di %s disponibile." + +#: src/GitHub_Updater/Theme.php:613 +#, php-format +msgid "Current version is up to date. Try %sanother version%s" +msgstr "La versione attuale è aggiornata. Prova %sun'altra versione%s" + +#: src/GitHub_Updater/Theme.php:627 +msgid "Choose a Version" +msgstr "Scegli una versione" + +#: src/GitHub_Updater/Theme.php:644 +msgid "Install" +msgstr "Installa" + +#. Plugin URI of the plugin/theme +msgid "https://github.com/afragen/github-updater" +msgstr "https://github.com/afragen/github-updater" + +#. Description of the plugin/theme +msgid "" +"A plugin to automatically update GitHub, Bitbucket, or GitLab hosted plugins " +"and themes. It also allows for remote installation of plugins or themes into " +"WordPress." +msgstr "" + +#. Author of the plugin/theme +msgid "Andy Fragen" +msgstr "Andy Fragen" + +#, fuzzy +#~ msgid "%s was not checked. GitHub Updater Error Code:" +#~ msgstr "" +#~ "%1$s non è stato verificato. Codice di errore di GitHub Updater: %2$s" + +#, fuzzy +#~ msgid "Renaming %1$s to %2$s" +#~ msgstr "Rinominato %s a %s" + +#~ msgid "Rename successful" +#~ msgstr "Rinominato con successo" + +#~ msgid "Unable to rename downloaded repository." +#~ msgstr "Impossibile rinominare il repository scaricato." + +#, fuzzy +#~ msgid "this plugin" +#~ msgstr "Plugin" + +#, fuzzy +#~ msgid "Unfortunately, %1$s can not run on PHP versions older than %2$s." +#~ msgstr "" +#~ "Purtroppo %1$s non può essere eseguito su versioni di PHP più vecchie di " +#~ "%2$s. Puoi leggere ulteriori informazioni su %3$s come è possibile " +#~ "aggiornare%4$s." + +#, fuzzy +#~ msgid "" +#~ "A plugin to automatically update GitHub, Bitbucket or GitLab hosted " +#~ "plugins and themes. It also allows for remote installation of plugins or " +#~ "themes into WordPress. Plugin class based upon codepress/github-plugin-updater. Theme class based upon Whitelabel Framework modifications." +#~ msgstr "" +#~ "Un plugin per aggiornare automaticamente un tema o plugin ospitato su " +#~ "GitHub or Bitbucket direttamente dentro WordPress. La classe per la " +#~ "gestione dei plugin è basata su codepress/github-plugin-updater.La classe per " +#~ "la gestione dei temi è basata su Whitelabel Framework modificata." + +#~ msgid "" +#~ "No changelog is available via GitHub Updater. Create a file CHANGES." +#~ "md or CHANGELOG.md in your repository." +#~ msgstr "" +#~ "Nessun changelog è disponibile con GitHub Updater. Crea un file " +#~ "CHANGES.md o CHANGELOG.md nel tuo repository." + +#~ msgid "%1$s was not checked. GitHub Updater Error Code: %2$s" +#~ msgstr "%1$s non è stata verificata. Codice di errore GitHub Updater: %2$s" + +#~ msgid "GitHub API's rate limit will reset in %1$s minutes." +#~ msgstr "Limite di frequenza su GitHub API si resetterà in minuti di %1$s." + +#~ msgid "%sRollback to:%s" +#~ msgstr "%sRipristina a:%s" + +#~ msgid "GitHub Updater shows a new version of %1$s available." +#~ msgstr "GitHub Updater mostra una nuova versione di %1$s disponibile." + +#~ msgid "View version %4$s details" +#~ msgstr "Visualizza i dettagli della versione %4$s" + +#~ msgid "View version %4$s details%5$s or %6$supdate now%7$s." +#~ msgstr "" +#~ "%4$sVisualizza i dettagli della versione %5$s o %6$saggiorna adesso%7$s" + +#~ msgid "There is a new version of %1$s available now." +#~ msgstr "E' disponibile una nuova versione di %1$s." + +#~ msgid "%sView version %s details%s or %supdate now%s." +#~ msgstr "%sVisualizza i dettagli della versione %s %s o %saggiorna adesso%s." + +#~ msgid "available now." +#~ msgstr "disponibile adesso." + +#, fuzzy +#~ msgid "View version" +#~ msgstr "Visualizza i dettagli della versione %4$s" + +#~ msgid "or" +#~ msgstr "o" + +#~ msgid "update now" +#~ msgstr "aggiorna adesso" + +#~ msgid "another version?" +#~ msgstr "un'altra versione?" + +#~ msgid "was not checked." +#~ msgstr "non è stata verificata." + +#~ msgid " or " +#~ msgstr " o " diff --git a/www/wp-content/plugins/github-updater/languages/github-updater-ja.mo b/www/wp-content/plugins/github-updater/languages/github-updater-ja.mo new file mode 100755 index 0000000000000000000000000000000000000000..1a5b62143eb96ee89cfd9c10bc6a6db3000c257c GIT binary patch literal 6253 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\n" +"Language-Team: \n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-WPHeader: github-updater.php\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;" +"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;" +"_nx_noop:3c,1,2;__ngettext_noop:1,2\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SearchPathExcluded-0: *.js\n" + +#: mu/ghu-loader.php:66 +msgid "Activated as mu-plugin" +msgstr "mu-plugin として有効化しました。" + +#: src/GitHub_Updater/Base.php:474 +#, php-format +msgid "Rename successful using extended name to %1$s" +msgstr "" + +#: src/GitHub_Updater/Install.php:67 +msgid "A repository URI is required." +msgstr "リポジトリURIが必要です。" + +#: src/GitHub_Updater/Install.php:223 src/GitHub_Updater/Settings.php:78 +msgid "Install Plugin" +msgstr "プラグインをインストール" + +#: src/GitHub_Updater/Install.php:226 src/GitHub_Updater/Settings.php:79 +msgid "Install Theme" +msgstr "テーマをインストール" + +#: src/GitHub_Updater/Install.php:244 +msgid "Plugin" +msgstr "プラグイン" + +#: src/GitHub_Updater/Install.php:247 +msgid "Theme" +msgstr "テーマ" + +#: src/GitHub_Updater/Install.php:258 +#, php-format +msgid "GitHub Updater Install %s" +msgstr "GitHub Updater インストール %s" + +#: src/GitHub_Updater/Install.php:265 +#, php-format +msgid "%s URI" +msgstr "%s URI" + +#: src/GitHub_Updater/Install.php:273 +msgid "Repository Branch" +msgstr "リポジトリのブランチ" + +#: src/GitHub_Updater/Install.php:281 +msgid "Remote Repository Host" +msgstr "リモートリポジトリホスト" + +#: src/GitHub_Updater/Install.php:289 +msgid "Private Bitbucket Repository" +msgstr "プライベートなBitbucketのリポジトリ" + +#: src/GitHub_Updater/Install.php:297 +msgid "GitHub Access Token" +msgstr "Github アクセストークン" + +#: src/GitHub_Updater/Install.php:308 +msgid "GitLab Private Token" +msgstr "GitLab プライベート トークン" + +#: src/GitHub_Updater/Install.php:325 +msgid "URI is case sensitive." +msgstr "" + +#: src/GitHub_Updater/Install.php:339 +msgid "Enter branch name or leave empty for `master`" +msgstr "" +"ブランチ名を入力、または’master’ に設定するために空のままにしてください。" + +#: src/GitHub_Updater/Install.php:370 +#, fuzzy +msgid "Check for private Bitbucket repositories." +msgstr "プライベートなBitbucketのリポジトリ" + +#: src/GitHub_Updater/Install.php:384 +msgid "Enter GitHub Access Token for private GitHub repositories." +msgstr "プライベートリポジトリ用のGitHubアクセストークンを入力します。" + +#: src/GitHub_Updater/Install.php:398 +msgid "Enter GitLab Private Token for private GitLab repositories." +msgstr "プライベートリポジトリの GitLab プライベートトークンを入力" + +#: src/GitHub_Updater/Install.php:442 +msgid "Activate" +msgstr "" + +#: src/GitHub_Updater/Install.php:451 +msgctxt "This refers to a network activation in a multisite installation" +msgid "Network Enable" +msgstr "" + +#: src/GitHub_Updater/Messages.php:84 src/GitHub_Updater/Messages.php:119 +#, fuzzy +msgid "GitHub Updater Error Code:" +msgstr "%s はチェックされていません。 GitHub Updater エラーコード:" + +#: src/GitHub_Updater/Messages.php:89 +#, php-format +msgid "GitHub API's rate limit will reset in %s minutes." +msgstr "" + +#: src/GitHub_Updater/Messages.php:94 +#, php-format +msgid "" +"It looks like you are running into GitHub API rate limits. Be sure and " +"configure a %sPersonal Access Token%s to avoid this issue." +msgstr "" +"GitHub APIの制限に達している可能性があります。この問題を回避する %sPersonal " +"Access Token%sを構成してください。" + +#: src/GitHub_Updater/Messages.php:123 +#, fuzzy +msgid "" +"There is probably an access token or password error on the GitHub Updater " +"Settings page." +msgstr "GitHubのアップデータの設定ページにエラーがある可能性があります。" + +#: src/GitHub_Updater/Messages.php:138 +msgid "" +"You must set a GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" +"あなたはGitLab.com、GitLab CE、またはGitLabエンタープライズプライベートトーク" +"ンを設定する必要があります。" + +#: src/GitHub_Updater/Plugin.php:320 src/GitHub_Updater/Theme.php:475 +#, php-format +msgid "Current branch is `%1$s`, try %2$sanother branch%3$s." +msgstr "現在のブランチは `%1$s`です。%2$sanother branch%3$s." + +#: src/GitHub_Updater/Plugin.php:372 +msgid "View details" +msgstr "詳細を見る" + +#: src/GitHub_Updater/Settings.php:77 src/GitHub_Updater/Settings.php:697 +msgid "Settings" +msgstr "設定" + +#: src/GitHub_Updater/Settings.php:80 src/GitHub_Updater/Settings.php:492 +msgid "Remote Management" +msgstr "" + +#: src/GitHub_Updater/Settings.php:91 src/GitHub_Updater/Settings.php:99 +#: src/GitHub_Updater/Settings.php:194 +msgid "GitHub Updater Settings" +msgstr "GitHub Updater 設定" + +#. Plugin Name of the plugin/theme +#: src/GitHub_Updater/Settings.php:92 src/GitHub_Updater/Settings.php:100 +#: src/GitHub_Updater/Settings.php:137 +msgid "GitHub Updater" +msgstr "GItHub Updater" + +#: src/GitHub_Updater/Settings.php:141 +msgid "Saved." +msgstr "保存しました。" + +#: src/GitHub_Updater/Settings.php:201 +#, fuzzy +msgid "Enable Branch Switching" +msgstr "プラグインがブランチを変更することを有効化" + +#: src/GitHub_Updater/Settings.php:213 +msgid "Personal GitHub Access Token" +msgstr "個人のGitHubのアクセストークン" + +#: src/GitHub_Updater/Settings.php:220 +#, fuzzy +msgid "GitHub.com Access Token" +msgstr "Github アクセストークン" + +#: src/GitHub_Updater/Settings.php:230 +#, fuzzy +msgid "GitHub Enterprise Access Token" +msgstr "Github アクセストークン" + +#: src/GitHub_Updater/Settings.php:244 +msgid "GitHub Private Settings" +msgstr "GitHub プライベート設定" + +#: src/GitHub_Updater/Settings.php:257 +msgid "GitLab Private Settings" +msgstr "GitLab プライベートリポジトリ 設定" + +#: src/GitHub_Updater/Settings.php:266 +msgid "GitLab.com Private Token" +msgstr "GitLab.com プライベート トークン" + +#: src/GitHub_Updater/Settings.php:277 +msgid "GitLab CE or GitLab Enterprise Private Token" +msgstr "GitLab CE または GitLab エンタープライズ プライベート トークン" + +#: src/GitHub_Updater/Settings.php:290 +msgid "Bitbucket Private Settings" +msgstr "Bitbucket プライベートリポジトリ 設定" + +#: src/GitHub_Updater/Settings.php:297 +msgid "Bitbucket Username" +msgstr "Bitbucket ユーザーネーム" + +#: src/GitHub_Updater/Settings.php:306 +msgid "Bitbucket Password" +msgstr "Bitbucket パスワード" + +#: src/GitHub_Updater/Settings.php:319 +msgid "Bitbucket Private Repositories" +msgstr "Bitbucket プライベート リポジトリ" + +#: src/GitHub_Updater/Settings.php:331 +msgid "No private repositories are installed." +msgstr "" +"プライベートリポジトリを持つプラグイン・テーマがインストールされていません。" + +#: src/GitHub_Updater/Settings.php:419 +msgid "Theme:" +msgstr "テーマ :" + +#: src/GitHub_Updater/Settings.php:541 +#, php-format +msgid "Extended Naming is %sactive%s." +msgstr "" + +#: src/GitHub_Updater/Settings.php:546 +#, php-format +msgid "Extended Naming is %snot active%s." +msgstr "" + +#: src/GitHub_Updater/Settings.php:548 +#, php-format +msgid "" +"Extended Naming renames plugin directories %s to prevent possible conflicts " +"with WP.org plugins." +msgstr "" + +#: src/GitHub_Updater/Settings.php:549 +#, php-format +msgid "Activate Extended Naming by setting %s" +msgstr "" + +#: src/GitHub_Updater/Settings.php:550 +#, fuzzy +msgid "Check to enable branch switching from the Plugins or Themes page." +msgstr "" +"プラグインページからブランチ切り替えを可能にするために確認してください。" + +#: src/GitHub_Updater/Settings.php:557 +msgid "Enter your GitHub Access Token. Leave empty for public repositories." +msgstr "" +"あなたのGitHub アクセストークンを入力してください。公開リポジトリの場合は空の" +"ままにしてください。" + +#: src/GitHub_Updater/Settings.php:564 +#, fuzzy +msgid "" +"Enter your personal GitHub.com or GitHub Enterprise Access Token to avoid " +"API access limits." +msgstr "" +"APIアクセス制限を回避するために、あなたのGitHubのアクセストークンを入力してく" +"ださい。" + +#: src/GitHub_Updater/Settings.php:571 +msgid "" +"Check box if private repository. Leave unchecked for public repositories." +msgstr "プライベートリポジトリ場合には、チェックしてください。" + +#: src/GitHub_Updater/Settings.php:578 +msgid "Enter your personal Bitbucket username and password." +msgstr "あなた個人のBitbucket ユーザーネーム、パスワードを入力してください" + +#: src/GitHub_Updater/Settings.php:585 +msgid "Enter your GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" +"GitLab.com、GitLab CE、またはGitLabエンタープライズプライベートトークンを入力" + +#: src/GitHub_Updater/Settings.php:592 +msgid "" +"Use of Remote Management services may result increase some page load speeds " +"only for `admin` level users in the dashboard." +msgstr "" + +#: src/GitHub_Updater/Theme.php:376 +msgid "Theme is up-to-date!" +msgstr "テーマは最新のものです。" + +#: src/GitHub_Updater/Theme.php:381 +msgid "Rollback to:" +msgstr "ロールバック : " + +#: src/GitHub_Updater/Theme.php:399 src/GitHub_Updater/Theme.php:639 +msgid "No previous tags to rollback to." +msgstr "ロールバックする以前のタグはありません。" + +#: src/GitHub_Updater/Theme.php:407 src/GitHub_Updater/Theme.php:421 +#, php-format +msgid "GitHub Updater shows a new version of %s available." +msgstr "GitHubのアップデータは、利用可能な%sの新しいバージョンを表示しています" + +#: src/GitHub_Updater/Theme.php:414 +#, php-format +msgid "View version %s details." +msgstr "バージョン %s の詳細を見る" + +#: src/GitHub_Updater/Theme.php:418 +msgid "Automatic update is unavailable for this theme." +msgstr "自動更新はこのテーマでは利用できません。" + +#: src/GitHub_Updater/Theme.php:428 src/GitHub_Updater/Theme.php:593 +#, php-format +msgid "View version %1$s details%2$s or %3$supdate now%4$s." +msgstr "バージョン%1$sの詳細を見る%2$sもしくは %3$supdate now%4$s." + +#: src/GitHub_Updater/Theme.php:586 +#, php-format +msgid "There is a new version of %s available now." +msgstr "利用可能な %s の新しいバージョンが追加されました。" + +#: src/GitHub_Updater/Theme.php:613 +#, php-format +msgid "Current version is up to date. Try %sanother version%s" +msgstr "現在のバージョンは最新です。%sanother version%s に変更する" + +#: src/GitHub_Updater/Theme.php:627 +msgid "Choose a Version" +msgstr "バージョンを選択" + +#: src/GitHub_Updater/Theme.php:644 +msgid "Install" +msgstr "インストール" + +#. Plugin URI of the plugin/theme +msgid "https://github.com/afragen/github-updater" +msgstr "https://github.com/afragen/github-updater" + +#. Description of the plugin/theme +msgid "" +"A plugin to automatically update GitHub, Bitbucket, or GitLab hosted plugins " +"and themes. It also allows for remote installation of plugins or themes into " +"WordPress." +msgstr "" + +#. Author of the plugin/theme +msgid "Andy Fragen" +msgstr "Andy Fragen" + +#~ msgid "Renaming %1$s to %2$s" +#~ msgstr "%1$s から %2$sにリネームしています。" + +#~ msgid "Rename successful" +#~ msgstr "リネームに成功しました。" + +#~ msgid "Unable to rename downloaded repository." +#~ msgstr "ダウンロードしたリポジトリの名前を変更することができません。" + +#~ msgid "this plugin" +#~ msgstr "このプラグイン" + +#~ msgid "Unfortunately, %1$s can not run on PHP versions older than %2$s." +#~ msgstr "" +#~ "残念ながら、%1$s は %2$s よりも古いバージョンの PHP で実行できません。" + +#~ msgid "Read more information about %show you can update%s." +#~ msgstr "Read more information about %show you can update%s." + +#~ msgid "%1$s recommends a PHP version greater than %2$s." +#~ msgstr "%1$s recommends a PHP version greater than %2$s." + +#~ msgid "" +#~ "A plugin to automatically update GitHub, Bitbucket or GitLab hosted " +#~ "plugins and themes. It also allows for remote installation of plugins or " +#~ "themes into WordPress. Plugin class based upon codepress/github-plugin-updater. Theme class based upon Whitelabel Framework modifications." +#~ msgstr "" +#~ "GitHub、Bitbucket または GitLab を自動的に更新するプラグインは、プラグイン" +#~ "やテーマにホストされています。また、WordPressのプラグインやテーマのリモー" +#~ "トインストールできます。プラグイン クラス codepress/github-plugin-updaterに基" +#~ "づいています。テーマ クラスは、Whitelabel Framework の変更に基づいてい" +#~ "ます。" diff --git a/www/wp-content/plugins/github-updater/languages/github-updater-pt_BR.mo b/www/wp-content/plugins/github-updater/languages/github-updater-pt_BR.mo new file mode 100755 index 0000000000000000000000000000000000000000..7ca53a3399d1545f2f8dba0e56b2ceaed920aabc GIT binary patch literal 2975 zcmb7`%WvF79LEPJuLTMOS|}7Wgy;8)-{_$@dF{tiA5{sTS(9=xYquY=2&&x4PF zAAlbCIXDmg0-glN_A&MpxCHJ8n;^+a-TD>qe$02>`)lAMn12s)@MrK9@K5kQaR0rf zy$8U@F+UE{`ZV|exBxy0u7Tud0DcVH-v`Ohm$8ZbJPn=&&w-DESHKs+Pr#SJAHiqA z-@pd=FG%_}A7pG2l;9@#8Ay8m29JP;E2W>);0u_qf*j01h+tPilJhBe0Q?#xy+47k zfq#JH&lrq+8axD&KNBFWFM(w58c6=U4U+yGbSW+JLAj%ca!&gZzCsSgnjX@P6fuOQ zcpi2{s0zPn3R8+$(U^46L%Afoo}dXH$`xEM>Wk*|P@c(G%JU)o=poz5Z#EOys4J`t zxiCD*y)4e#QOai0aEC8y(UutJRwcql0nf7#TX|%7o{FxBV$q5v-%^^}4i;@kCbG(A zBiqV@OVaXnVa$6rH8Gl(t7-oi|daB9UyaBZEu4rM7vr z#WN>Q_vP(W`HB=>2@?a_2+zpCEN{i|V6Y8ptB|CWkzDW#QkzJnY$3H$^OhDk%Sjo> z(YO#Nlg#cEqAn)FVB1Bvdq?G(FGcoT-r_SsAdTS-bxEduJB9~uX+x>95R$ajoLGC6E}as^x|<(W4RPLZf<04Kl1UCwxOD3S~7Yi5-4U z8OuiIvqeVOCi04717izoigL_6t2`>sBdlX>X8iH-c4Rwws~V_eTx=DU?3TQ;j5S-= z>Kz$aZ#nc_0r>qyx{y`Y-)wkuTB7<@>diyG&nIg2*S*>auRh6Zlm0}_tDUOVu+iH< zM5u~xyKe=x<2B%pi3O_P=NClWyQU+>H&uRF@Y7upOH9pWakib{6C($vD=Q*x=lB}E zh7`%29`bo+o3k60)#cTNp{Mm~tum)j@F@)1$>5ol+jcyQMU+nQpd+-A_RRUlqBl9* zM}}`n?JcB%3h{yZe6khU%3I!&Or4^_F+~cV}0IiPBrCJGxh7oC#IU)ga9l3LAvdq435(~X@aJ(R^z~6 zD2GFLfL?WM61!c+u-sJ)2V$G4Qdy}p-7Y65NITw z&Ea+Z+@)hr(`IwM>tWP}ZSV=Lo#+m@_T}G3X1T@nd7%db#KX1avgZrU^8}IXs-kk( z8Z6HfL46;W67Io>ZdVE&f^xS2 fWio!(@cai!%5n~OMwyS;NK9Eq|$&K(IwEJ$( literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/github-updater/languages/github-updater-pt_BR.po b/www/wp-content/plugins/github-updater/languages/github-updater-pt_BR.po new file mode 100755 index 0000000..d02434e --- /dev/null +++ b/www/wp-content/plugins/github-updater/languages/github-updater-pt_BR.po @@ -0,0 +1,430 @@ +msgid "" +msgstr "" +"Project-Id-Version: GitHub Updater\n" +"POT-Creation-Date: 2016-03-18 08:20-0700\n" +"PO-Revision-Date: 2016-03-18 08:20-0700\n" +"Last-Translator: Valério Souza \n" +"Language-Team: Valério Souza \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;" +"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;" +"_nx_noop:3c,1,2;__ngettext_noop:1,2\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Poedit-SearchPath-0: .\n" + +#: mu/ghu-loader.php:66 +msgid "Activated as mu-plugin" +msgstr "Ativado como mu-plugin" + +#: src/GitHub_Updater/Base.php:474 +#, php-format +msgid "Rename successful using extended name to %1$s" +msgstr "" + +#: src/GitHub_Updater/Install.php:67 +msgid "A repository URI is required." +msgstr "" + +#: src/GitHub_Updater/Install.php:223 src/GitHub_Updater/Settings.php:78 +msgid "Install Plugin" +msgstr "Instalar o Plugin" + +#: src/GitHub_Updater/Install.php:226 src/GitHub_Updater/Settings.php:79 +msgid "Install Theme" +msgstr "Instalar um novo tema" + +#: src/GitHub_Updater/Install.php:244 +msgid "Plugin" +msgstr "Plugin" + +#: src/GitHub_Updater/Install.php:247 +#, fuzzy +msgid "Theme" +msgstr "Tema:" + +#: src/GitHub_Updater/Install.php:258 +#, fuzzy, php-format +msgid "GitHub Updater Install %s" +msgstr "Instalar o GitHub Updater" + +#: src/GitHub_Updater/Install.php:265 +#, fuzzy, php-format +msgid "%s URI" +msgstr "%sReverter para:%s" + +#: src/GitHub_Updater/Install.php:273 +msgid "Repository Branch" +msgstr "Ramo de repositório" + +#: src/GitHub_Updater/Install.php:281 +msgid "Remote Repository Host" +msgstr "Repositório remoto Host" + +#: src/GitHub_Updater/Install.php:289 +#, fuzzy +msgid "Private Bitbucket Repository" +msgstr "Repositórios Privados do Bitbucket" + +#: src/GitHub_Updater/Install.php:297 +msgid "GitHub Access Token" +msgstr "" + +#: src/GitHub_Updater/Install.php:308 +#, fuzzy +msgid "GitLab Private Token" +msgstr "Configurações do GitHub Privado" + +#: src/GitHub_Updater/Install.php:325 +msgid "URI is case sensitive." +msgstr "" + +#: src/GitHub_Updater/Install.php:339 +msgid "Enter branch name or leave empty for `master`" +msgstr "Digite o nome de ramo ou deixe em branco para o 'mestre'" + +#: src/GitHub_Updater/Install.php:370 +#, fuzzy +msgid "Check for private Bitbucket repositories." +msgstr "Repositórios Privados do Bitbucket" + +#: src/GitHub_Updater/Install.php:384 +#, fuzzy +msgid "Enter GitHub Access Token for private GitHub repositories." +msgstr "" +"Digite seu Token de Acesso do GitHub. Deixe em branco para repositórios " +"públicos." + +#: src/GitHub_Updater/Install.php:398 +#, fuzzy +msgid "Enter GitLab Private Token for private GitLab repositories." +msgstr "" +"Digite seu Token de Acesso do GitHub. Deixe em branco para repositórios " +"públicos." + +#: src/GitHub_Updater/Install.php:442 +msgid "Activate" +msgstr "" + +#: src/GitHub_Updater/Install.php:451 +msgctxt "This refers to a network activation in a multisite installation" +msgid "Network Enable" +msgstr "" + +#: src/GitHub_Updater/Messages.php:84 src/GitHub_Updater/Messages.php:119 +msgid "GitHub Updater Error Code:" +msgstr "Código de erro de GitHub Updater:" + +#: src/GitHub_Updater/Messages.php:89 +#, fuzzy, php-format +msgid "GitHub API's rate limit will reset in %s minutes." +msgstr "Limite de taxa do GitHub API irá repor em minutos de %1$s." + +#: src/GitHub_Updater/Messages.php:94 +#, php-format +msgid "" +"It looks like you are running into GitHub API rate limits. Be sure and " +"configure a %sPersonal Access Token%s to avoid this issue." +msgstr "" + +#: src/GitHub_Updater/Messages.php:123 +msgid "" +"There is probably an access token or password error on the GitHub Updater " +"Settings page." +msgstr "" + +#: src/GitHub_Updater/Messages.php:138 +msgid "" +"You must set a GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" + +#: src/GitHub_Updater/Plugin.php:320 src/GitHub_Updater/Theme.php:475 +#, fuzzy, php-format +msgid "Current branch is `%1$s`, try %2$sanother branch%3$s." +msgstr "A versão está atualizada. Tentar" + +#: src/GitHub_Updater/Plugin.php:372 +#, fuzzy +msgid "View details" +msgstr "Ver versão %4$s detalhada" + +#: src/GitHub_Updater/Settings.php:77 src/GitHub_Updater/Settings.php:697 +msgid "Settings" +msgstr "Configurações" + +#: src/GitHub_Updater/Settings.php:80 src/GitHub_Updater/Settings.php:492 +msgid "Remote Management" +msgstr "" + +#: src/GitHub_Updater/Settings.php:91 src/GitHub_Updater/Settings.php:99 +#: src/GitHub_Updater/Settings.php:194 +msgid "GitHub Updater Settings" +msgstr "Configurações do GitHub Update" + +#. Plugin Name of the plugin/theme +#: src/GitHub_Updater/Settings.php:92 src/GitHub_Updater/Settings.php:100 +#: src/GitHub_Updater/Settings.php:137 +msgid "GitHub Updater" +msgstr "GitHub Updater" + +#: src/GitHub_Updater/Settings.php:141 +msgid "Saved." +msgstr "Salvo." + +#: src/GitHub_Updater/Settings.php:201 +msgid "Enable Branch Switching" +msgstr "" + +#: src/GitHub_Updater/Settings.php:213 +msgid "Personal GitHub Access Token" +msgstr "" + +#: src/GitHub_Updater/Settings.php:220 +#, fuzzy +msgid "GitHub.com Access Token" +msgstr "Configurações do GitHub Privado" + +#: src/GitHub_Updater/Settings.php:230 +msgid "GitHub Enterprise Access Token" +msgstr "" + +#: src/GitHub_Updater/Settings.php:244 +msgid "GitHub Private Settings" +msgstr "Configurações do GitHub Privado" + +#: src/GitHub_Updater/Settings.php:257 +#, fuzzy +msgid "GitLab Private Settings" +msgstr "Configurações do GitHub Privado" + +#: src/GitHub_Updater/Settings.php:266 +#, fuzzy +msgid "GitLab.com Private Token" +msgstr "Configurações do GitHub Privado" + +#: src/GitHub_Updater/Settings.php:277 +msgid "GitLab CE or GitLab Enterprise Private Token" +msgstr "" + +#: src/GitHub_Updater/Settings.php:290 +msgid "Bitbucket Private Settings" +msgstr "Configurações do Bitbucket Privado" + +#: src/GitHub_Updater/Settings.php:297 +msgid "Bitbucket Username" +msgstr "Bitbucket Nome de usuário:" + +#: src/GitHub_Updater/Settings.php:306 +msgid "Bitbucket Password" +msgstr "Bitbucket senha" + +#: src/GitHub_Updater/Settings.php:319 +msgid "Bitbucket Private Repositories" +msgstr "Repositórios Privados do Bitbucket" + +#: src/GitHub_Updater/Settings.php:331 +msgid "No private repositories are installed." +msgstr "Não há repositórios privados instalados." + +#: src/GitHub_Updater/Settings.php:419 +#, fuzzy +msgid "Theme:" +msgstr "Tema:" + +#: src/GitHub_Updater/Settings.php:541 +#, php-format +msgid "Extended Naming is %sactive%s." +msgstr "" + +#: src/GitHub_Updater/Settings.php:546 +#, php-format +msgid "Extended Naming is %snot active%s." +msgstr "" + +#: src/GitHub_Updater/Settings.php:548 +#, php-format +msgid "" +"Extended Naming renames plugin directories %s to prevent possible conflicts " +"with WP.org plugins." +msgstr "" + +#: src/GitHub_Updater/Settings.php:549 +#, php-format +msgid "Activate Extended Naming by setting %s" +msgstr "" + +#: src/GitHub_Updater/Settings.php:550 +msgid "Check to enable branch switching from the Plugins or Themes page." +msgstr "" + +#: src/GitHub_Updater/Settings.php:557 +msgid "Enter your GitHub Access Token. Leave empty for public repositories." +msgstr "" +"Digite seu Token de Acesso do GitHub. Deixe em branco para repositórios " +"públicos." + +#: src/GitHub_Updater/Settings.php:564 +#, fuzzy +msgid "" +"Enter your personal GitHub.com or GitHub Enterprise Access Token to avoid " +"API access limits." +msgstr "" +"Digite seu Token de Acesso do GitHub. Deixe em branco para repositórios " +"públicos." + +#: src/GitHub_Updater/Settings.php:571 +msgid "" +"Check box if private repository. Leave unchecked for public repositories." +msgstr "" +"Marque se o repositório é privado. Deixe desmarcado se o repositório for " +"publico." + +#: src/GitHub_Updater/Settings.php:578 +msgid "Enter your personal Bitbucket username and password." +msgstr "Digite seu usuário e senha do Bitbucket." + +#: src/GitHub_Updater/Settings.php:585 +msgid "Enter your GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" + +#: src/GitHub_Updater/Settings.php:592 +msgid "" +"Use of Remote Management services may result increase some page load speeds " +"only for `admin` level users in the dashboard." +msgstr "" + +#: src/GitHub_Updater/Theme.php:376 +msgid "Theme is up-to-date!" +msgstr "Tema está atualizado!" + +#: src/GitHub_Updater/Theme.php:381 +#, fuzzy +msgid "Rollback to:" +msgstr "%sReverter para:%s" + +#: src/GitHub_Updater/Theme.php:399 src/GitHub_Updater/Theme.php:639 +msgid "No previous tags to rollback to." +msgstr "Nenhuma tag anterior para reverter." + +#: src/GitHub_Updater/Theme.php:407 src/GitHub_Updater/Theme.php:421 +#, fuzzy, php-format +msgid "GitHub Updater shows a new version of %s available." +msgstr "GitHub Updater tem uma nova versão do %1$s disponível." + +#: src/GitHub_Updater/Theme.php:414 +#, fuzzy, php-format +msgid "View version %s details." +msgstr "Ver versão %4$s detalhada" + +#: src/GitHub_Updater/Theme.php:418 +msgid "Automatic update is unavailable for this theme." +msgstr "Atualização automática não está disponível para esse tema." + +#: src/GitHub_Updater/Theme.php:428 src/GitHub_Updater/Theme.php:593 +#, fuzzy, php-format +msgid "View version %1$s details%2$s or %3$supdate now%4$s." +msgstr "Ver versão %4$s detalhada%5$s ou %6$satualizar agora%7$s." + +#: src/GitHub_Updater/Theme.php:586 +#, fuzzy, php-format +msgid "There is a new version of %s available now." +msgstr "Há uma nova versão do" + +#: src/GitHub_Updater/Theme.php:613 +#, fuzzy, php-format +msgid "Current version is up to date. Try %sanother version%s" +msgstr "A versão está atualizada. Tentar" + +#: src/GitHub_Updater/Theme.php:627 +msgid "Choose a Version" +msgstr "Escolha a Versão" + +#: src/GitHub_Updater/Theme.php:644 +msgid "Install" +msgstr "Instalar" + +#. Plugin URI of the plugin/theme +msgid "https://github.com/afragen/github-updater" +msgstr "https://github.com/afragen/github-updater" + +#. Description of the plugin/theme +msgid "" +"A plugin to automatically update GitHub, Bitbucket, or GitLab hosted plugins " +"and themes. It also allows for remote installation of plugins or themes into " +"WordPress." +msgstr "" + +#. Author of the plugin/theme +msgid "Andy Fragen" +msgstr "Andy Fragen" + +#, fuzzy +#~ msgid "%s was not checked. GitHub Updater Error Code:" +#~ msgstr "%1$s não foi verificada. GitHub Updater código de erro: %2$s" + +#, fuzzy +#~ msgid "Renaming %1$s to %2$s" +#~ msgstr "Renomeando %s para %s" + +#~ msgid "Rename successful" +#~ msgstr "Renomeado com sucesso" + +#~ msgid "Unable to rename downloaded repository." +#~ msgstr "Não é possível renomear o repositório baixado." + +#, fuzzy +#~ msgid "this plugin" +#~ msgstr "Plugin" + +#, fuzzy +#~ msgid "" +#~ "A plugin to automatically update GitHub, Bitbucket or GitLab hosted " +#~ "plugins and themes. It also allows for remote installation of plugins or " +#~ "themes into WordPress. Plugin class based upon codepress/github-plugin-updater. Theme class based upon Whitelabel Framework modifications." +#~ msgstr "" +#~ "Um plugin para atualizar automaticamente o GitHub ou Bitbucket hospedado " +#~ "plugins e temas para WordPress. Plugin classe baseado codepress/github-plugin-" +#~ "atualizador. Classe de tema com base em modificações de Whitelabel " +#~ "Framework ." + +#~ msgid "" +#~ "No changelog is available via GitHub Updater. Create a file CHANGES." +#~ "md or CHANGELOG.md in your repository." +#~ msgstr "" +#~ "No changelog está disponível via GitHub Updater. Crie um arquivo " +#~ "CHANGES.md ou CHANGELOG.md em seu repositório." + +#~ msgid "%sView version %s details%s or %supdate now%s." +#~ msgstr "%sVer versão %s detalhada%s ou %satualizar agora%s." + +#~ msgid "available now." +#~ msgstr "disponível agora." + +#, fuzzy +#~ msgid "View version" +#~ msgstr "Ver versão %4$s detalhada" + +#~ msgid "or" +#~ msgstr "ou" + +#~ msgid "update now" +#~ msgstr "atualize agora" + +#~ msgid "another version?" +#~ msgstr "outra versão?" + +#~ msgid "was not checked." +#~ msgstr "não foi verificada." + +#~ msgid " or " +#~ msgstr " ou " diff --git a/www/wp-content/plugins/github-updater/languages/github-updater-pt_PT.mo b/www/wp-content/plugins/github-updater/languages/github-updater-pt_PT.mo new file mode 100755 index 0000000000000000000000000000000000000000..4d25f9050eef4c19744cba23567d492e60b13296 GIT binary patch literal 8116 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 literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/github-updater/languages/github-updater-pt_PT.po b/www/wp-content/plugins/github-updater/languages/github-updater-pt_PT.po new file mode 100755 index 0000000..9406652 --- /dev/null +++ b/www/wp-content/plugins/github-updater/languages/github-updater-pt_PT.po @@ -0,0 +1,367 @@ +msgid "" +msgstr "" +"Project-Id-Version: GitHub Updater\n" +"POT-Creation-Date: 2016-03-18 08:20-0700\n" +"PO-Revision-Date: 2016-03-18 08:20-0700\n" +"Last-Translator: Pedro Mendonça \n" +"Language-Team: Pedro Mendonça \n" +"Language: pt_PT\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;" +"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;" +"_nx_noop:3c,1,2;__ngettext_noop:1,2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SearchPath-0: .\n" + +#: mu/ghu-loader.php:66 +msgid "Activated as mu-plugin" +msgstr "Activado como um plugin obrigatório" + +#: src/GitHub_Updater/Base.php:474 +#, php-format +msgid "Rename successful using extended name to %1$s" +msgstr "Renomeado com sucesso através do nome estendido para %1$s" + +#: src/GitHub_Updater/Install.php:67 +msgid "A repository URI is required." +msgstr "É necessário um URI do repositório." + +#: src/GitHub_Updater/Install.php:223 src/GitHub_Updater/Settings.php:78 +msgid "Install Plugin" +msgstr "Instalar Plugin" + +#: src/GitHub_Updater/Install.php:226 src/GitHub_Updater/Settings.php:79 +msgid "Install Theme" +msgstr "Instalar Tema" + +#: src/GitHub_Updater/Install.php:244 +msgid "Plugin" +msgstr "Plugin" + +#: src/GitHub_Updater/Install.php:247 +msgid "Theme" +msgstr "Tema" + +#: src/GitHub_Updater/Install.php:258 +#, php-format +msgid "GitHub Updater Install %s" +msgstr "GitHub Updater instalação de %s" + +#: src/GitHub_Updater/Install.php:265 +#, php-format +msgid "%s URI" +msgstr "URI do %s" + +#: src/GitHub_Updater/Install.php:273 +msgid "Repository Branch" +msgstr "Ramo do repositório" + +#: src/GitHub_Updater/Install.php:281 +msgid "Remote Repository Host" +msgstr "Alojamento remoto do repositório" + +#: src/GitHub_Updater/Install.php:289 +msgid "Private Bitbucket Repository" +msgstr "Repositório privado do Bitbucket" + +#: src/GitHub_Updater/Install.php:297 +msgid "GitHub Access Token" +msgstr "Token de acesso do GitHub" + +#: src/GitHub_Updater/Install.php:308 +msgid "GitLab Private Token" +msgstr "Token privado do GitLab" + +#: src/GitHub_Updater/Install.php:325 +msgid "URI is case sensitive." +msgstr "O URI é sensível a maiúsculas e minúsculas." + +#: src/GitHub_Updater/Install.php:339 +msgid "Enter branch name or leave empty for `master`" +msgstr "Introduza o nome do ramo ou deixe vazio para `master`" + +#: src/GitHub_Updater/Install.php:370 +msgid "Check for private Bitbucket repositories." +msgstr "Seleccione a opção para repositórios privados do Bitbucket." + +#: src/GitHub_Updater/Install.php:384 +msgid "Enter GitHub Access Token for private GitHub repositories." +msgstr "" +"Introduza o Token de acesso do GitHub para repositórios privados do GitHub." + +#: src/GitHub_Updater/Install.php:398 +msgid "Enter GitLab Private Token for private GitLab repositories." +msgstr "" +"Introduza o Token privado do GitLab para repositórios privados do GitLab." + +#: src/GitHub_Updater/Install.php:442 +msgid "Activate" +msgstr "Activar" + +#: src/GitHub_Updater/Install.php:451 +msgctxt "This refers to a network activation in a multisite installation" +msgid "Network Enable" +msgstr "Activar na rede" + +#: src/GitHub_Updater/Messages.php:84 src/GitHub_Updater/Messages.php:119 +#, fuzzy +msgid "GitHub Updater Error Code:" +msgstr "%1$s não foi verificado. Erro do GitHub Updater com o código: %2$s" + +#: src/GitHub_Updater/Messages.php:89 +#, php-format +msgid "GitHub API's rate limit will reset in %s minutes." +msgstr "A taxa limite da API do GitHub será reposta em %s minutos." + +#: src/GitHub_Updater/Messages.php:94 +#, php-format +msgid "" +"It looks like you are running into GitHub API rate limits. Be sure and " +"configure a %sPersonal Access Token%s to avoid this issue." +msgstr "" +"Parece que se está a aproximar dos limites da API do GitHub. Configure um " +"%sToken pessoal de acesso%s para evitar que isto aconteça." + +#: src/GitHub_Updater/Messages.php:123 +#, fuzzy +msgid "" +"There is probably an access token or password error on the GitHub Updater " +"Settings page." +msgstr "" +"Provavelmente existe um erro na página de definições do GitHub Updater." + +#: src/GitHub_Updater/Messages.php:138 +msgid "" +"You must set a GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" +"Tem que definir um Token privado do GitLab.com, GitLab CE ou GitLab " +"Empresarial." + +#: src/GitHub_Updater/Plugin.php:320 src/GitHub_Updater/Theme.php:475 +#, php-format +msgid "Current branch is `%1$s`, try %2$sanother branch%3$s." +msgstr "O ramo actual é `%1$s`, experimente %2$soutro ramo%3$s." + +#: src/GitHub_Updater/Plugin.php:372 +msgid "View details" +msgstr "Ver detalhes" + +#: src/GitHub_Updater/Settings.php:77 src/GitHub_Updater/Settings.php:697 +msgid "Settings" +msgstr "Definições" + +#: src/GitHub_Updater/Settings.php:80 src/GitHub_Updater/Settings.php:492 +msgid "Remote Management" +msgstr "Gestão remota" + +#: src/GitHub_Updater/Settings.php:91 src/GitHub_Updater/Settings.php:99 +#: src/GitHub_Updater/Settings.php:194 +msgid "GitHub Updater Settings" +msgstr "Definições do GitHub Updater" + +#. Plugin Name of the plugin/theme +#: src/GitHub_Updater/Settings.php:92 src/GitHub_Updater/Settings.php:100 +#: src/GitHub_Updater/Settings.php:137 +msgid "GitHub Updater" +msgstr "GitHub Updater" + +#: src/GitHub_Updater/Settings.php:141 +msgid "Saved." +msgstr "Guardado." + +#: src/GitHub_Updater/Settings.php:201 +msgid "Enable Branch Switching" +msgstr "Permitir mudar ramo do plugin" + +#: src/GitHub_Updater/Settings.php:213 +msgid "Personal GitHub Access Token" +msgstr "Token pessoal de acesso do GitHub" + +#: src/GitHub_Updater/Settings.php:220 +msgid "GitHub.com Access Token" +msgstr "Token de acesso do GitHub.com" + +#: src/GitHub_Updater/Settings.php:230 +msgid "GitHub Enterprise Access Token" +msgstr "Token de acesso do GitHub Empresarial" + +#: src/GitHub_Updater/Settings.php:244 +msgid "GitHub Private Settings" +msgstr "Definições privadas do GitHub" + +#: src/GitHub_Updater/Settings.php:257 +msgid "GitLab Private Settings" +msgstr "Definições privadas do GitLab" + +#: src/GitHub_Updater/Settings.php:266 +msgid "GitLab.com Private Token" +msgstr "Token privado do GitLab.com" + +#: src/GitHub_Updater/Settings.php:277 +msgid "GitLab CE or GitLab Enterprise Private Token" +msgstr "Token privado do GitLab CE ou GitLab Empresarial" + +#: src/GitHub_Updater/Settings.php:290 +msgid "Bitbucket Private Settings" +msgstr "Definições privadas do Bitbucket" + +#: src/GitHub_Updater/Settings.php:297 +msgid "Bitbucket Username" +msgstr "Utilizador do Bitbucket" + +#: src/GitHub_Updater/Settings.php:306 +msgid "Bitbucket Password" +msgstr "Senha do Bitbucket" + +#: src/GitHub_Updater/Settings.php:319 +msgid "Bitbucket Private Repositories" +msgstr "Repositórios privados do Bitbucket" + +#: src/GitHub_Updater/Settings.php:331 +msgid "No private repositories are installed." +msgstr "Nenhum repositório privado instalado." + +#: src/GitHub_Updater/Settings.php:419 +msgid "Theme:" +msgstr "Tema:" + +#: src/GitHub_Updater/Settings.php:541 +#, php-format +msgid "Extended Naming is %sactive%s." +msgstr "A nomeação estendida está %sactivada%s." + +#: src/GitHub_Updater/Settings.php:546 +#, php-format +msgid "Extended Naming is %snot active%s." +msgstr "A nomeação estendida está %sdesactivada%s." + +#: src/GitHub_Updater/Settings.php:548 +#, php-format +msgid "" +"Extended Naming renames plugin directories %s to prevent possible conflicts " +"with WP.org plugins." +msgstr "" +"A nomeação estendida permite renomear a pasta do plugin %s para prevenir " +"possíveis conflitos com os plugins do WP.org." + +#: src/GitHub_Updater/Settings.php:549 +#, php-format +msgid "Activate Extended Naming by setting %s" +msgstr "Active a nomeação estendida através da definição %s" + +#: src/GitHub_Updater/Settings.php:550 +msgid "Check to enable branch switching from the Plugins or Themes page." +msgstr "" +"Seleccione a opção para permitir alternar entre ramos nas páginas de plugins " +"e de temas." + +#: src/GitHub_Updater/Settings.php:557 +msgid "Enter your GitHub Access Token. Leave empty for public repositories." +msgstr "" +"Introduza o seu Token de acesso do GitHub. Deixe vazio para repositórios " +"públicos." + +#: src/GitHub_Updater/Settings.php:564 +msgid "" +"Enter your personal GitHub.com or GitHub Enterprise Access Token to avoid " +"API access limits." +msgstr "" +"Introduza o seu Token pessoal de acesso do GitHub.com ou do GitHub " +"Empresarial para evitar o limite de acessos da API." + +#: src/GitHub_Updater/Settings.php:571 +msgid "" +"Check box if private repository. Leave unchecked for public repositories." +msgstr "" +"Seleccione a opção se for um repositório privado. Não seleccione para " +"repositórios públicos." + +#: src/GitHub_Updater/Settings.php:578 +msgid "Enter your personal Bitbucket username and password." +msgstr "Introduza o seu utilizador e senha do seu Bitbucket" + +#: src/GitHub_Updater/Settings.php:585 +msgid "Enter your GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" +"Introduza o seu Token privado do GitLab.com, GitLab CE ou GitLab Empresarial." + +#: src/GitHub_Updater/Settings.php:592 +msgid "" +"Use of Remote Management services may result increase some page load speeds " +"only for `admin` level users in the dashboard." +msgstr "" +"A utilização de serviços de gestão remota poderá aumentar o tempo de " +"carregamento de algumas páginas do painel de administração para utilizadores " +"com perfil de `administrador`." + +#: src/GitHub_Updater/Theme.php:376 +msgid "Theme is up-to-date!" +msgstr "O tema está actualizado!" + +#: src/GitHub_Updater/Theme.php:381 +msgid "Rollback to:" +msgstr "Reverter para:" + +#: src/GitHub_Updater/Theme.php:399 src/GitHub_Updater/Theme.php:639 +msgid "No previous tags to rollback to." +msgstr "Nenhuma etiqueta anterior para poder reverter." + +#: src/GitHub_Updater/Theme.php:407 src/GitHub_Updater/Theme.php:421 +#, php-format +msgid "GitHub Updater shows a new version of %s available." +msgstr "O GitHub Updater informa que está disponível uma nova versão de %s." + +#: src/GitHub_Updater/Theme.php:414 +#, php-format +msgid "View version %s details." +msgstr "Ver detalhes da versão %s." + +#: src/GitHub_Updater/Theme.php:418 +msgid "Automatic update is unavailable for this theme." +msgstr "Actualizações automáticas indisponíveis para este tema." + +#: src/GitHub_Updater/Theme.php:428 src/GitHub_Updater/Theme.php:593 +#, php-format +msgid "View version %1$s details%2$s or %3$supdate now%4$s." +msgstr "Ver detalhes da versão %1$s%2$s ou %3$sactualize agora%4$s." + +#: src/GitHub_Updater/Theme.php:586 +#, php-format +msgid "There is a new version of %s available now." +msgstr "Está disponível uma nova versão de %s." + +#: src/GitHub_Updater/Theme.php:613 +#, php-format +msgid "Current version is up to date. Try %sanother version%s" +msgstr "Esta é a versão actual. Experimente %soutra versão%s" + +#: src/GitHub_Updater/Theme.php:627 +msgid "Choose a Version" +msgstr "Escolha uma versão" + +#: src/GitHub_Updater/Theme.php:644 +msgid "Install" +msgstr "Instalar" + +#. Plugin URI of the plugin/theme +msgid "https://github.com/afragen/github-updater" +msgstr "https://github.com/afragen/github-updater" + +#. Description of the plugin/theme +msgid "" +"A plugin to automatically update GitHub, Bitbucket, or GitLab hosted plugins " +"and themes. It also allows for remote installation of plugins or themes into " +"WordPress." +msgstr "" +"Um plugin para actualizar automaticamente plugins e temas alojados no " +"GitHub, Bitbucket ou GitLab. Permite a instalação remota de plugins ou temas " +"no WordPress." + +#. Author of the plugin/theme +msgid "Andy Fragen" +msgstr "Andy Fragen" diff --git a/www/wp-content/plugins/github-updater/languages/github-updater-ro_RO.mo b/www/wp-content/plugins/github-updater/languages/github-updater-ro_RO.mo new file mode 100755 index 0000000000000000000000000000000000000000..6df0313aa9f27257f8add3aba3eb0caacf5c9571 GIT binary patch literal 7826 zcmbW5U2Gjk6~_l!ptz;)CpzQYwcs=+A_)+j*;r%VwDRqeF1}O6kI1X-x=kI|Z;`v4JR`8D?M^$ft zLhmi`1K?HsdmOwG)Zn*3k?T)E(aWnKB35sQ=YNAY@_ai)MD9(n0nUQ*J_jMKo&aUt zH$gni8+rzmeIG@bzX30SBJcay6qP6gehRz*@~58SA0k!Hf%kzw1|gx|1jXLeEq=dG zfV@&iz!TtUa3A;-cn?N0hd6b^EFV`{V3p@py=-)$`gB810R%e@BsKW z*ai12ct5_l6#irsXf*SI6~M;Be&vw2g` z723o(MB_NUnCmqbWww_>F-r1+w``OqI$f(*Gs7=t2HZTHW}W%W=6Mq)Guuz|s7SL- z;aW#IZyqh9%yt-U7tsc+)<5*@rNSm17&~ivQL?UAH+61{LVk|s^|X#Qx$cz>F90>2 zbT;+L%&gl)O;?hrq`-z{Vm3?^o7LF5(-d7^I)P64sZU$8VPUZ?6FInuyI-!xQF|adwrvJV zZa9z`@Lm%fnu#K8;?BI98OZDWVpO!dBFeQa?TG;NytANO>|)VrU-yxs?3Jdu)kdGU zS&p*ROqpdiDRdx({8mOM_v9<%xwVG?Sd^=zN;Y@e&x=6%5i-mLX>yN!kE#q@$rywHMF!uWQP)Jw(o=flih*UE(5 z)`pXdQbk;`Q=9Gei%qxtO3&a>*-Bt?Gc9-Jw9@xr;jX&&>{dizso73@dlUh{MN2vrhC9rH|%V+@06M358O#HX?l$E;Qi z8D#bD3NosOD}B`gB#>Hi0X(awg-1Q-!!Mif9JvAkop&XI8=csTx^hC|Hr&?{vEtup zcUY0Khd9H`>`>YmI#9*D^P*~U^>Ub@%Umu@b~{!JJe6=lRh`twr~1*wC`EpX)AT}) zVlG&XlW3D!os~%kb63`&nFI3rR zQ!V(se8wb%?H*=cy&25W50L43?E+U`x*gWa821-x*(%?l&LeV9OdBt>y3M(Xs4J#6sBS?WprtO%#yPBE|xt)*j z#*Qs0Npk;Cxuyue8j+kTjwhKk6m*DZ^swYrN1GE8*`n;c@9jq(2|WMMTEdLGXKzGV+ILI z-PpJv!)WP)6O;EeCJr?wkLrn|t;u^E6GtW{nAljb8z}XE%sWl8Z7fnBW509ek;!kFG|=$mbiUY+{Kz!q$9hJ5ix0 zn@5{R81avd6PQxp6y26?HV1DXo`1laj%AgXc_rXxzuOjemJGGp&CdUs>EngC7^QQWdTxuO|kIR_N+smdXG8WW7?cirvAVb}v z7l&Eyr=R71)?}BHH0}F6lS}^Lkl$x{Ia#MxMz-~w5yD(%;>O7|>*Xz-^xb2A?9h~? zWJZqdPmUd%JU-Fdzkh!+Iyo_M-{iexk3AM1jvbpA+q-vvatAmzcKl##a%^mBNLtop z?e09XZcHHU-3Deawd0bGLnhqSd?X)HM1AS6mJ;1dJ4DJpW|5I(+C^#NXv<*8Rl~&( zOr>XI95pxio-A-r>t?G{N^I)y(ulda!8!H)q@!GdH)K-`%1EgatwwQF;3GSQZFVz@<0gRw3)8kN4QvS!N+e(AGi zk4nl&KgRw>;)&!;Dv!{!>9z#mT|2N{<&>1#QXmWS{WOu|an4Gx#8!@jAPqUukV(y; zPIbx1vmMn1Zk-GjNeI#GGO$!2!7VxB5Umr@njDm94Ew|K=)0DH>fCVH#I8nbhLX|q z*S1uRzD$?ah+Z24Wq&(?nxoLDxnhqbwpl`hpVJE-4@aJOSns1+H^>(AMOF9aOQRZ~?u2$C4cJwmV{Rd@v; z-z$@lI`T>++?a3c1|*Ua&!jSRQjVO{#iHN!w07!!zHQsLeOsJ<2k*f$hE@)pVqhHG zn1@PT;03;e&u?$$hN8hxQ&n?R)`kp0+`R7{BvABr*R@4G-^qS>@0~}HHckvHNPbqj zYQ#@L6lh{d8w4NU_=p6d;2Jq;=_qc!Sbb>lHW!*W>EU)A#j2%)3**}&3m<~4C`y9E zS{jo8;e8O-2*x#6zLksW4vt=~3b~<;!y#(EBjL7;%cwdi2iy>+l~^Wa8Kiv=*Ho9= zD@D)lZ--Q*cSavCQ56Imsvi{N1Guww=vHNsMAHzycC6U`NY@~zN-2-afiG5K;S@tL z^$JIk5-=Rc_Y)!$@fn&sX9}@<8kj=Gn4j%9XZmF%Dk)_l00**eJAZ7KR|Y?QYzrcB zafIMz*iFnDeUjAVV_y_(Z-)w-dODYujl3wHP<3#I&u0kJE3tOD%Ix!D6Y_>_sPAba z%XU^`uu(fgxR$S{xDi%QOcY)S6nr{}qA-Ik1} zg6z~oeUd*L!#F%tSzeu@lGvVW!VuJ)>)=kXMn4DhAy|;AL-3>4B7r+|cb%P27(*w4 z3g1VBMr@?Di}@hydOOmpa>|i^+VQj%(b18NT71ZnBIKRgq^lX6wlhmfQyM8t8uGApAy=`7}oZ=UT&XgV-SHwj(xs#GR}MKk8~HS^L9&WGpe*G z@()$QB!gBh9b>Mg6L*swT$PhfET&!dLTfif3lW6aH$;yRyO`P4GIAD5ERzKoXRv;k V1FL1;$#?XByT|^fdgmSAe*mpZ9q#}D literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/github-updater/languages/github-updater-ro_RO.po b/www/wp-content/plugins/github-updater/languages/github-updater-ro_RO.po new file mode 100755 index 0000000..c374934 --- /dev/null +++ b/www/wp-content/plugins/github-updater/languages/github-updater-ro_RO.po @@ -0,0 +1,399 @@ +msgid "" +msgstr "" +"Project-Id-Version: GitHub Updater\n" +"POT-Creation-Date: 2016-03-18 08:19-0700\n" +"PO-Revision-Date: 2016-03-18 08:19-0700\n" +"Last-Translator: \n" +"Language-Team: Corneliu Cirlan\n" +"Language: ro_RO\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-WPHeader: github-updater.php\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;" +"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;" +"_nx_noop:3c,1,2;__ngettext_noop:1,2\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?" +"2:1));\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SearchPathExcluded-0: *.js\n" + +#: mu/ghu-loader.php:66 +msgid "Activated as mu-plugin" +msgstr "Activat ca mu-plugin" + +#: src/GitHub_Updater/Base.php:474 +#, php-format +msgid "Rename successful using extended name to %1$s" +msgstr "Redenumire reusita utilizand numele extins in %1$s" + +#: src/GitHub_Updater/Install.php:67 +msgid "A repository URI is required." +msgstr "URL pentru repozitoriu obligatoriu" + +#: src/GitHub_Updater/Install.php:223 src/GitHub_Updater/Settings.php:78 +msgid "Install Plugin" +msgstr "Instaleaza Modul" + +#: src/GitHub_Updater/Install.php:226 src/GitHub_Updater/Settings.php:79 +msgid "Install Theme" +msgstr "Instaleaza Tema" + +#: src/GitHub_Updater/Install.php:244 +msgid "Plugin" +msgstr "Modul" + +#: src/GitHub_Updater/Install.php:247 +msgid "Theme" +msgstr "Tema" + +#: src/GitHub_Updater/Install.php:258 +#, php-format +msgid "GitHub Updater Install %s" +msgstr "Instalare Github Updater %s" + +#: src/GitHub_Updater/Install.php:265 +#, php-format +msgid "%s URI" +msgstr "%s URI" + +#: src/GitHub_Updater/Install.php:273 +msgid "Repository Branch" +msgstr "Ramura repozitoriu" + +#: src/GitHub_Updater/Install.php:281 +msgid "Remote Repository Host" +msgstr "Gazda repozitoriu distant" + +#: src/GitHub_Updater/Install.php:289 +msgid "Private Bitbucket Repository" +msgstr "Repozitoriu Bitbucket Privat" + +#: src/GitHub_Updater/Install.php:297 +msgid "GitHub Access Token" +msgstr "Jeton de Acces Github" + +#: src/GitHub_Updater/Install.php:308 +msgid "GitLab Private Token" +msgstr "Jeton Privat Github" + +#: src/GitHub_Updater/Install.php:325 +msgid "URI is case sensitive." +msgstr "URL-ul face diferenta intre literele mari si cele mici" + +#: src/GitHub_Updater/Install.php:339 +msgid "Enter branch name or leave empty for `master`" +msgstr "Introdu numele ramurei sau lasa gol pentru 'master'" + +#: src/GitHub_Updater/Install.php:370 +msgid "Check for private Bitbucket repositories." +msgstr "Cauta dupa repozitoriu Bitbucket privat" + +#: src/GitHub_Updater/Install.php:384 +msgid "Enter GitHub Access Token for private GitHub repositories." +msgstr "Introdu Jeton de Acces GitHub pentru repozitoriile GitHub private." + +#: src/GitHub_Updater/Install.php:398 +msgid "Enter GitLab Private Token for private GitLab repositories." +msgstr "Introdu Jeton de Acces GitLab pentru repozitoriile GitLab private." + +#: src/GitHub_Updater/Install.php:442 +msgid "Activate" +msgstr "Activeaza" + +#: src/GitHub_Updater/Install.php:451 +msgctxt "This refers to a network activation in a multisite installation" +msgid "Network Enable" +msgstr "Activeaza reteaua" + +#: src/GitHub_Updater/Messages.php:84 src/GitHub_Updater/Messages.php:119 +#, fuzzy +msgid "GitHub Updater Error Code:" +msgstr "%s nu a fost verificat. Github Updater Cod Eroare:" + +#: src/GitHub_Updater/Messages.php:89 +#, php-format +msgid "GitHub API's rate limit will reset in %s minutes." +msgstr "Rata limitei APIului GitHub se va reseta in %s minute." + +#: src/GitHub_Updater/Messages.php:94 +#, php-format +msgid "" +"It looks like you are running into GitHub API rate limits. Be sure and " +"configure a %sPersonal Access Token%s to avoid this issue." +msgstr "" +"Se pare ca atingi limite APIului GitHub. Asigurate si configura un %sJeton " +"Personal de Access%s pentru a evita acest lucru." + +#: src/GitHub_Updater/Messages.php:123 +#, fuzzy +msgid "" +"There is probably an access token or password error on the GitHub Updater " +"Settings page." +msgstr "Probabil este o eroare pe pagina cu Setarile GitHub Updater" + +#: src/GitHub_Updater/Messages.php:138 +msgid "" +"You must set a GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" +"Trebuie sa setezi un Jeton Privat pentru GitLab.com, GitLab CE sau GitHub " +"Enterprise." + +#: src/GitHub_Updater/Plugin.php:320 src/GitHub_Updater/Theme.php:475 +#, php-format +msgid "Current branch is `%1$s`, try %2$sanother branch%3$s." +msgstr "Ramura curenta este `%1$s`, incerca %2$salta ramura%3$s." + +#: src/GitHub_Updater/Plugin.php:372 +msgid "View details" +msgstr "Vezi detalii" + +#: src/GitHub_Updater/Settings.php:77 src/GitHub_Updater/Settings.php:697 +msgid "Settings" +msgstr "Setari" + +#: src/GitHub_Updater/Settings.php:80 src/GitHub_Updater/Settings.php:492 +msgid "Remote Management" +msgstr "Operare de la distanta" + +#: src/GitHub_Updater/Settings.php:91 src/GitHub_Updater/Settings.php:99 +#: src/GitHub_Updater/Settings.php:194 +msgid "GitHub Updater Settings" +msgstr "Setari GitHub Updater" + +#. Plugin Name of the plugin/theme +#: src/GitHub_Updater/Settings.php:92 src/GitHub_Updater/Settings.php:100 +#: src/GitHub_Updater/Settings.php:137 +msgid "GitHub Updater" +msgstr "GitHub Updater" + +#: src/GitHub_Updater/Settings.php:141 +msgid "Saved." +msgstr "Salvat." + +#: src/GitHub_Updater/Settings.php:201 +msgid "Enable Branch Switching" +msgstr "Actieaza schimbarea ramurelor" + +#: src/GitHub_Updater/Settings.php:213 +msgid "Personal GitHub Access Token" +msgstr "Jeton Personal de Acces GitHub" + +#: src/GitHub_Updater/Settings.php:220 +msgid "GitHub.com Access Token" +msgstr "Jeton de Acces Github.com" + +#: src/GitHub_Updater/Settings.php:230 +msgid "GitHub Enterprise Access Token" +msgstr "Jeton de Acces Github Enterprise " + +#: src/GitHub_Updater/Settings.php:244 +msgid "GitHub Private Settings" +msgstr "Setari Private GitHub" + +#: src/GitHub_Updater/Settings.php:257 +msgid "GitLab Private Settings" +msgstr "Setari Private GitLab" + +#: src/GitHub_Updater/Settings.php:266 +msgid "GitLab.com Private Token" +msgstr "Jetor Privat GitLab.com" + +#: src/GitHub_Updater/Settings.php:277 +msgid "GitLab CE or GitLab Enterprise Private Token" +msgstr "Jeton Privat GitLab CE sau GltLab Enterprise" + +#: src/GitHub_Updater/Settings.php:290 +msgid "Bitbucket Private Settings" +msgstr "Setari Private Bitbucket" + +#: src/GitHub_Updater/Settings.php:297 +msgid "Bitbucket Username" +msgstr "Utilizator Bitbucket" + +#: src/GitHub_Updater/Settings.php:306 +msgid "Bitbucket Password" +msgstr "Parola Bitbucket" + +#: src/GitHub_Updater/Settings.php:319 +msgid "Bitbucket Private Repositories" +msgstr "Repozitorii Private Bitbucket" + +#: src/GitHub_Updater/Settings.php:331 +msgid "No private repositories are installed." +msgstr "Nici un repozitoriu privat instalat." + +#: src/GitHub_Updater/Settings.php:419 +msgid "Theme:" +msgstr "Teme:" + +#: src/GitHub_Updater/Settings.php:541 +#, php-format +msgid "Extended Naming is %sactive%s." +msgstr "Numele Extins este %sactiv%s." + +#: src/GitHub_Updater/Settings.php:546 +#, php-format +msgid "Extended Naming is %snot active%s." +msgstr "Numele Extins este %sinactiv%s." + +#: src/GitHub_Updater/Settings.php:548 +#, php-format +msgid "" +"Extended Naming renames plugin directories %s to prevent possible conflicts " +"with WP.org plugins." +msgstr "" +"Numirea Extinsa redenumeste folderul modulelor %s pentru a preveni conflicte " +"cu module WP.org" + +#: src/GitHub_Updater/Settings.php:549 +#, php-format +msgid "Activate Extended Naming by setting %s" +msgstr "Activeaza Numirea Extinsa setand %s" + +#: src/GitHub_Updater/Settings.php:550 +msgid "Check to enable branch switching from the Plugins or Themes page." +msgstr "" +" Bifeaza pentru a activa schimbarea ramurelor de pe pagina Modulelor sau a " +"Temelor." + +#: src/GitHub_Updater/Settings.php:557 +msgid "Enter your GitHub Access Token. Leave empty for public repositories." +msgstr "Introdu Jetonul de Acces GitHub. Lasa gol pentru repozitorii publice." + +#: src/GitHub_Updater/Settings.php:564 +msgid "" +"Enter your personal GitHub.com or GitHub Enterprise Access Token to avoid " +"API access limits." +msgstr "" +"Introdu Jetonul Personal de Acces GitHub.com sau GitHub Enterprise pentru a " +"evita limitele de acces API." + +#: src/GitHub_Updater/Settings.php:571 +msgid "" +"Check box if private repository. Leave unchecked for public repositories." +msgstr "Bifeaza daca repozitoriu privat. Lasa nebifat pentru cele publice." + +#: src/GitHub_Updater/Settings.php:578 +msgid "Enter your personal Bitbucket username and password." +msgstr "Introdu utilizatorul si parola pentru Bitbuchet" + +#: src/GitHub_Updater/Settings.php:585 +msgid "Enter your GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" +"Introdu Jetonul Personal pentru GitLab.com, GitLab CE sau GitLab Enterprise" + +#: src/GitHub_Updater/Settings.php:592 +msgid "" +"Use of Remote Management services may result increase some page load speeds " +"only for `admin` level users in the dashboard." +msgstr "" +"Utilizarea operarii de la distanta ar putea rezulta in cresterea timpilor de " +"incarcare doar pentru nivelul 'admin' de utilizator in panoul de control" + +#: src/GitHub_Updater/Theme.php:376 +msgid "Theme is up-to-date!" +msgstr "Tema e la zi!" + +#: src/GitHub_Updater/Theme.php:381 +msgid "Rollback to:" +msgstr "Revenire la:" + +#: src/GitHub_Updater/Theme.php:399 src/GitHub_Updater/Theme.php:639 +msgid "No previous tags to rollback to." +msgstr "Nici o eticheta la care sa revii." + +#: src/GitHub_Updater/Theme.php:407 src/GitHub_Updater/Theme.php:421 +#, php-format +msgid "GitHub Updater shows a new version of %s available." +msgstr "GitHub Updater arata o noua versiune pentru %s disponibila." + +#: src/GitHub_Updater/Theme.php:414 +#, php-format +msgid "View version %s details." +msgstr "Vezi detaliile pentru versiunea %s." + +#: src/GitHub_Updater/Theme.php:418 +msgid "Automatic update is unavailable for this theme." +msgstr "Actualizarea automata nu este disponibila pentru aceasta tema." + +#: src/GitHub_Updater/Theme.php:428 src/GitHub_Updater/Theme.php:593 +#, php-format +msgid "View version %1$s details%2$s or %3$supdate now%4$s." +msgstr "Vezi versiunea %1$s detalii%2$s sau %3$sactualizeaza acum%4$s." + +#: src/GitHub_Updater/Theme.php:586 +#, php-format +msgid "There is a new version of %s available now." +msgstr "Exista o noua versiune pentru %s disponibila." + +#: src/GitHub_Updater/Theme.php:613 +#, php-format +msgid "Current version is up to date. Try %sanother version%s" +msgstr "Versiunea curenta este la zi. Incearca %salta versiune%s" + +#: src/GitHub_Updater/Theme.php:627 +msgid "Choose a Version" +msgstr "Alege o Versiune" + +#: src/GitHub_Updater/Theme.php:644 +msgid "Install" +msgstr "Instaleaza" + +#. Plugin URI of the plugin/theme +msgid "https://github.com/afragen/github-updater" +msgstr "https://github.com/afragen/github-updater" + +#. Description of the plugin/theme +msgid "" +"A plugin to automatically update GitHub, Bitbucket, or GitLab hosted plugins " +"and themes. It also allows for remote installation of plugins or themes into " +"WordPress." +msgstr "" +"Un modul pentru actualizarea automata a temelor sau modulelor gazduite pe " +"GitHub, Bitbucket sau GitLab. De asemenea ofera posibilitatea instalarii de " +"la distanta a modulelor si temelor in WordPress" + +#. Author of the plugin/theme +msgid "Andy Fragen" +msgstr "Andy Fragen" + +#~ msgid "Renaming %1$s to %2$s" +#~ msgstr "Redenumire %1$s in %2$s" + +#~ msgid "Rename successful" +#~ msgstr "Redenumire reusita" + +#~ msgid "Unable to rename downloaded repository." +#~ msgstr "Imposibil de redenumit repozitoriul descarcat" + +#~ msgid "this plugin" +#~ msgstr "acest modul" + +#~ msgid "Unfortunately, %1$s can not run on PHP versions older than %2$s." +#~ msgstr "Din pacate, %1$s nu poate rula pe versiuni PHP mai vechi ca %2$s." + +#~ msgid "Read more information about %show you can update%s." +#~ msgstr "Citeste mai multe informatii despre %scum poti actualiza%s." + +#~ msgid "%1$s recommends a PHP version greater than %2$s." +#~ msgstr "%1$s recomanda o versiune PHP mai mare ca %2$s." + +#~ msgid "" +#~ "A plugin to automatically update GitHub, Bitbucket or GitLab hosted " +#~ "plugins and themes. It also allows for remote installation of plugins or " +#~ "themes into WordPress. Plugin class based upon codepress/github-plugin-updater. Theme class based upon Whitelabel Framework modifications." +#~ msgstr "" +#~ "Un modul pentru a actualiza automat module sau teme gazduite pe GitHub, " +#~ "Bitbucket sau GitLab. Permite, de asemenea, instalari de la distanta a " +#~ "modulelor sau temelor in WordPress. Clasa modulului bazata pe codepress/github-" +#~ "plugin-updater. Clasa temei bazata pe modificarile Whitelabel Framework." diff --git a/www/wp-content/plugins/github-updater/languages/github-updater-ru_RU.mo b/www/wp-content/plugins/github-updater/languages/github-updater-ru_RU.mo new file mode 100755 index 0000000000000000000000000000000000000000..404857e6c978f366b6b1991bae3eaac44d421310 GIT binary patch literal 3992 zcmbVOU2GiH6}~OBP#0RDrKS9|#}J3O%B*+ew3u-ma7;oh5?CBNtwh_+c=pCS$?VKB zbJwvekch1aDu<>*s)UdVDhP=;HcnQyU&Rler*9MD>%ei~Bfz7;?*UH(zX^O5 zI0XC+@IK%M@E+i&KpXgH;3)8c+l8=z)4=_}C13%#2K)~2@4)W^KL>sbc>mXg_yKSi zkm(0gJPG_R_5tt?;4+Z;SAcf|-vRChegx!rJ_EA<|48@$2D1P6fOs$Pao}CRCxOg& z1V48Ij|0IfP6FB9FM#+HFXM;#7l4Dn3rs|e9|L*W_(l@<8j$1t7m)KreL|c9?gg^k zn?TOz8t|9EKLLLQ90v0Y@GW2&_&4Ag;Bgq`Jgo!!fu907?tcOw1Ad;;`;i3xJ^^IE zWs1K}>6d_P_cHKB;AgvRdo`aS{TPy7`>T<8C!c;~m1d_4qY zJ-dJiS-c2jzL$U;ZvaGVnHm8E!Zm!H>mTC%5nj$WKU{Bq&n{AStUQa00ZeBuA7JRz&YhSaqn(virSlUUbP zSap==QoU9ND=Vl6&b;IK&a5x#bQqDUfT$|6Ds$qHr)KN!S*d6ymQmnTrI@IMVJyj^ zlQN3EFc60WB_n#)Q%CEwH14`Gj%hkPD+8mg78#$i?`{7*8Rt5p$DCOzrkp)xnW2~L zY~%!Ph1fHK@4j^ACCO?{EgI{ms!j~=PNkL>!+JzD_#Fn0Po3cEX>jBOWvV%Gd@hWT z&@86nS!Cv8} zinDM#NuFxAu9%Y55ZUZd=x7)#klW3D$kbI#g}y)QxMxX)wm5;>!g@Q-#Aows`nYDP z(BiJ{7lvqylb$?BWvS5Kv8X6ji|wJIIZsvUvpF}c4mqdISfnH?nTbdgqwtJ$l{Hzm z(k8bl4K=M+U-5-$Ya)^ur7*CbflZtCIjR!z~kq$Vy#X8!!BIlo;t0EHi{9xZPCzz{armbn|RBdYSZHnrp zshPgxlgAHtyf5VPeG?%DHGq-D8oX6#|uWutvFFE)!5AR5o@Hw$IhIVk##t5 z!!ladrjc1s_5Iv>Rt6H|z+M(ZS;j;ZawEAX@Fm$=hn!f}996L?m+Me}Ry-=5vV>Gp zf-K*;TBX+EI)NE=24Vy_B70D!`vAs_Lg)W|?rAWm|122*X-pGgwGA!-<_zDVW22Be!jy zJ`6U`2IF+%D$A(8KS&r=q1`7GHu>$ShO}xzaj};2^6y*u**dH9*mwh@g zwx5?qB7dNer&nG{M8K0DgiHZ4`vyn5(kY$DtrSrVE01#Y`fzx`_3LF>W`-Z<&cuD$ zb)(;Jy{4P`a%)*PTT89;txKdE`YID!=gEA#skii+UT-bwE$r99u?P3kpwPe5*Fap? zt02Axrd8d5ii@OI`D)TP^(ItZ0mBX5_`($h$yHXTud@WCUuSFj8YoS|&t*ukx=na? z1M(o=!15{_I1dZUPz?qGVH4i8-ZZ*42+-8mTPxjnntmG;#Kb{twk{%&)K9QNSm?J} zE3nrzkwG5L^9J6mw|twQJ8X&!m1Y9jq;|HOw$_vuw1B*j)iIw+|0U!d};GL8kLB zM^9Hag#IvT61amAf;rO)T#qX_IeH11!yuiF#*Q5Cn%TjrMf#d8^dDj60<>|dxl6Y= saod|kzt2g<8Hl#-eYD}|GA?x;!y=P{mG|H_AIZtd*woGc;UAs<0\n" +"Language-Team: \n" +"Language: ru_RU\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-WPHeader: github-updater.php\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;" +"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;" +"_nx_noop:3c,1,2;__ngettext_noop:1,2\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SearchPathExcluded-0: *.js\n" + +#: mu/ghu-loader.php:66 +msgid "Activated as mu-plugin" +msgstr "Активировать в mu-плагина" + +#: src/GitHub_Updater/Base.php:474 +#, php-format +msgid "Rename successful using extended name to %1$s" +msgstr "" + +#: src/GitHub_Updater/Install.php:67 +msgid "A repository URI is required." +msgstr "Требуется адрес репозитория (URI)" + +#: src/GitHub_Updater/Install.php:223 src/GitHub_Updater/Settings.php:78 +msgid "Install Plugin" +msgstr "Установите плагин" + +#: src/GitHub_Updater/Install.php:226 src/GitHub_Updater/Settings.php:79 +msgid "Install Theme" +msgstr "Установите тему" + +#: src/GitHub_Updater/Install.php:244 +msgid "Plugin" +msgstr "Плагин" + +#: src/GitHub_Updater/Install.php:247 +msgid "Theme" +msgstr "Тема" + +#: src/GitHub_Updater/Install.php:258 +#, php-format +msgid "GitHub Updater Install %s" +msgstr "GitHub Updater Установка%s" + +#: src/GitHub_Updater/Install.php:265 +#, php-format +msgid "%s URI" +msgstr "%s URI" + +#: src/GitHub_Updater/Install.php:273 +msgid "Repository Branch" +msgstr "Ветка репозитория" + +#: src/GitHub_Updater/Install.php:281 +msgid "Remote Repository Host" +msgstr "Хост удаленного репозитория" + +#: src/GitHub_Updater/Install.php:289 +msgid "Private Bitbucket Repository" +msgstr "Приватный Bitbucket репозиторий" + +#: src/GitHub_Updater/Install.php:297 +msgid "GitHub Access Token" +msgstr "GitHub Access Token" + +#: src/GitHub_Updater/Install.php:308 +msgid "GitLab Private Token" +msgstr "GitLab Private Token" + +#: src/GitHub_Updater/Install.php:325 +msgid "URI is case sensitive." +msgstr "" + +#: src/GitHub_Updater/Install.php:339 +msgid "Enter branch name or leave empty for `master`" +msgstr "Введите имя ветки или оставьте пустым для `master`" + +#: src/GitHub_Updater/Install.php:370 +#, fuzzy +msgid "Check for private Bitbucket repositories." +msgstr "Приватный Bitbucket репозиторий" + +#: src/GitHub_Updater/Install.php:384 +msgid "Enter GitHub Access Token for private GitHub repositories." +msgstr "Введите GitHub Access Token для приватных репозиториев GitHub." + +#: src/GitHub_Updater/Install.php:398 +msgid "Enter GitLab Private Token for private GitLab repositories." +msgstr "Введите GitLab Private Token для приватных репозиториев GitLab." + +#: src/GitHub_Updater/Install.php:442 +msgid "Activate" +msgstr "" + +#: src/GitHub_Updater/Install.php:451 +msgctxt "This refers to a network activation in a multisite installation" +msgid "Network Enable" +msgstr "" + +#: src/GitHub_Updater/Messages.php:84 src/GitHub_Updater/Messages.php:119 +#, fuzzy +msgid "GitHub Updater Error Code:" +msgstr "%s не был проверен. GitHub Updater Error Code:" + +#: src/GitHub_Updater/Messages.php:89 +#, php-format +msgid "GitHub API's rate limit will reset in %s minutes." +msgstr "Ограничение скорости GitHub API будет сброшено через: %s (минут)" + +#: src/GitHub_Updater/Messages.php:94 +#, php-format +msgid "" +"It looks like you are running into GitHub API rate limits. Be sure and " +"configure a %sPersonal Access Token%s to avoid this issue." +msgstr "" + +#: src/GitHub_Updater/Messages.php:123 +msgid "" +"There is probably an access token or password error on the GitHub Updater " +"Settings page." +msgstr "" + +#: src/GitHub_Updater/Messages.php:138 +msgid "" +"You must set a GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" + +#: src/GitHub_Updater/Plugin.php:320 src/GitHub_Updater/Theme.php:475 +#, php-format +msgid "Current branch is `%1$s`, try %2$sanother branch%3$s." +msgstr "" + +#: src/GitHub_Updater/Plugin.php:372 +msgid "View details" +msgstr "Подробнее" + +#: src/GitHub_Updater/Settings.php:77 src/GitHub_Updater/Settings.php:697 +msgid "Settings" +msgstr "Настройки" + +#: src/GitHub_Updater/Settings.php:80 src/GitHub_Updater/Settings.php:492 +msgid "Remote Management" +msgstr "" + +#: src/GitHub_Updater/Settings.php:91 src/GitHub_Updater/Settings.php:99 +#: src/GitHub_Updater/Settings.php:194 +msgid "GitHub Updater Settings" +msgstr "GitHub Updater Настройки" + +#. Plugin Name of the plugin/theme +#: src/GitHub_Updater/Settings.php:92 src/GitHub_Updater/Settings.php:100 +#: src/GitHub_Updater/Settings.php:137 +msgid "GitHub Updater" +msgstr "GitHub Updater" + +#: src/GitHub_Updater/Settings.php:141 +msgid "Saved." +msgstr "Сохранено" + +#: src/GitHub_Updater/Settings.php:201 +#, fuzzy +msgid "Enable Branch Switching" +msgstr "Включить переключатель веток для плагинов" + +#: src/GitHub_Updater/Settings.php:213 +msgid "Personal GitHub Access Token" +msgstr "Персональный GitHub Access Token" + +#: src/GitHub_Updater/Settings.php:220 +#, fuzzy +msgid "GitHub.com Access Token" +msgstr "GitHub Access Token" + +#: src/GitHub_Updater/Settings.php:230 +#, fuzzy +msgid "GitHub Enterprise Access Token" +msgstr "GitHub Access Token" + +#: src/GitHub_Updater/Settings.php:244 +msgid "GitHub Private Settings" +msgstr "GitHub Private Настройки" + +#: src/GitHub_Updater/Settings.php:257 +msgid "GitLab Private Settings" +msgstr "GitHub Private Настройки" + +#: src/GitHub_Updater/Settings.php:266 +msgid "GitLab.com Private Token" +msgstr "" + +#: src/GitHub_Updater/Settings.php:277 +msgid "GitLab CE or GitLab Enterprise Private Token" +msgstr "" + +#: src/GitHub_Updater/Settings.php:290 +msgid "Bitbucket Private Settings" +msgstr "" + +#: src/GitHub_Updater/Settings.php:297 +msgid "Bitbucket Username" +msgstr "Bitbucket Имя пользователя" + +#: src/GitHub_Updater/Settings.php:306 +msgid "Bitbucket Password" +msgstr "" + +#: src/GitHub_Updater/Settings.php:319 +msgid "Bitbucket Private Repositories" +msgstr "" + +#: src/GitHub_Updater/Settings.php:331 +msgid "No private repositories are installed." +msgstr "Никакие частные репозитории не установлены." + +#: src/GitHub_Updater/Settings.php:419 +msgid "Theme:" +msgstr "Тема:" + +#: src/GitHub_Updater/Settings.php:541 +#, php-format +msgid "Extended Naming is %sactive%s." +msgstr "" + +#: src/GitHub_Updater/Settings.php:546 +#, php-format +msgid "Extended Naming is %snot active%s." +msgstr "" + +#: src/GitHub_Updater/Settings.php:548 +#, php-format +msgid "" +"Extended Naming renames plugin directories %s to prevent possible conflicts " +"with WP.org plugins." +msgstr "" + +#: src/GitHub_Updater/Settings.php:549 +#, php-format +msgid "Activate Extended Naming by setting %s" +msgstr "" + +#: src/GitHub_Updater/Settings.php:550 +msgid "Check to enable branch switching from the Plugins or Themes page." +msgstr "" + +#: src/GitHub_Updater/Settings.php:557 +msgid "Enter your GitHub Access Token. Leave empty for public repositories." +msgstr "" + +#: src/GitHub_Updater/Settings.php:564 +msgid "" +"Enter your personal GitHub.com or GitHub Enterprise Access Token to avoid " +"API access limits." +msgstr "" + +#: src/GitHub_Updater/Settings.php:571 +msgid "" +"Check box if private repository. Leave unchecked for public repositories." +msgstr "" + +#: src/GitHub_Updater/Settings.php:578 +msgid "Enter your personal Bitbucket username and password." +msgstr "Введите ваши личные имя пользователя и пароль от Bitbucket." + +#: src/GitHub_Updater/Settings.php:585 +msgid "Enter your GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" + +#: src/GitHub_Updater/Settings.php:592 +msgid "" +"Use of Remote Management services may result increase some page load speeds " +"only for `admin` level users in the dashboard." +msgstr "" + +#: src/GitHub_Updater/Theme.php:376 +msgid "Theme is up-to-date!" +msgstr "Обновление не требуется" + +#: src/GitHub_Updater/Theme.php:381 +msgid "Rollback to:" +msgstr "Откат к:" + +#: src/GitHub_Updater/Theme.php:399 src/GitHub_Updater/Theme.php:639 +msgid "No previous tags to rollback to." +msgstr "" + +#: src/GitHub_Updater/Theme.php:407 src/GitHub_Updater/Theme.php:421 +#, php-format +msgid "GitHub Updater shows a new version of %s available." +msgstr "" + +#: src/GitHub_Updater/Theme.php:414 +#, php-format +msgid "View version %s details." +msgstr "" + +#: src/GitHub_Updater/Theme.php:418 +msgid "Automatic update is unavailable for this theme." +msgstr "Автоматическое обновление недоступно для этой темы." + +#: src/GitHub_Updater/Theme.php:428 src/GitHub_Updater/Theme.php:593 +#, php-format +msgid "View version %1$s details%2$s or %3$supdate now%4$s." +msgstr "" + +#: src/GitHub_Updater/Theme.php:586 +#, php-format +msgid "There is a new version of %s available now." +msgstr "" + +#: src/GitHub_Updater/Theme.php:613 +#, php-format +msgid "Current version is up to date. Try %sanother version%s" +msgstr "" + +#: src/GitHub_Updater/Theme.php:627 +msgid "Choose a Version" +msgstr "Выберите версию" + +#: src/GitHub_Updater/Theme.php:644 +msgid "Install" +msgstr "Установить" + +#. Plugin URI of the plugin/theme +msgid "https://github.com/afragen/github-updater" +msgstr "https://github.com/afragen/github-updater" + +#. Description of the plugin/theme +msgid "" +"A plugin to automatically update GitHub, Bitbucket, or GitLab hosted plugins " +"and themes. It also allows for remote installation of plugins or themes into " +"WordPress." +msgstr "" + +#. Author of the plugin/theme +msgid "Andy Fragen" +msgstr "Andy Fragen" + +#~ msgid "Renaming %1$s to %2$s" +#~ msgstr "Переименование %1$s в%2$s" + +#~ msgid "Rename successful" +#~ msgstr "Успешно переименовано" + +#~ msgid "Unable to rename downloaded repository." +#~ msgstr "Невозможно переименовать скачанный репозиторий." + +#~ msgid "this plugin" +#~ msgstr "этот плагин" + +#~ msgid "" +#~ "A plugin to automatically update GitHub, Bitbucket or GitLab hosted " +#~ "plugins and themes. It also allows for remote installation of plugins or " +#~ "themes into WordPress. Plugin class based upon codepress/github-plugin-updater. Theme class based upon Whitelabel Framework modifications." +#~ msgstr "" +#~ "Плагин автоматического обновления из GitHub, Bitbucket или GitLab для " +#~ "плагинов и тем. Она также позволяет установить плагин или тему в " +#~ "WordPress. Механизм обновления плагинов основан на codepress / GitHub-плагина-" +#~ "Update . Обновление тем основано Whitelabel Framework " +#~ "модификаций." diff --git a/www/wp-content/plugins/github-updater/languages/github-updater-sv_SE.mo b/www/wp-content/plugins/github-updater/languages/github-updater-sv_SE.mo new file mode 100755 index 0000000000000000000000000000000000000000..e203744b64e71b088169164687a4349178d6794a GIT binary patch literal 3255 zcmb7_O^g&p6vs;ik?{irMM2a8#Xv&O&H~EX%Nll;4mI7iJ+n|D3y!K0Cj@&Br8W_HOyVr8a(-BqvNtM}@?s^1Rm z`jVj?$Nwn)rypZ%0=)1z9%%o7hrs*b)8PIm%JHM%0emlmuYnEl2>7Y*{|a2f_jlla z@NX~#_v~UU0O!CdnTMscJ@c|tzZx?aKm82;2KU&sdOr#+xJ zk!^|_`ACgoO8bS-yGCoIJRl!v-Gheoa_x0Iu{5`L)IqW1_>=FnZ^Jel*>po#8FNwa zPB+N2ZjvfCtKuGCG$N6B?^@jvHjQ{Uk0Hv_f_IhJ5NRfwndIx*aN9zsZOM+TvboeY zyHQ(Oz9Nd^V{PK?UB;Q?*JZAY)M}H;V$ATWv^G`A_Mx>x8YMcC&9`LK=1slH({-ME zeP*DqSLMr6Y)C9IB0+dY3(ULC3?2-{V73ZPS{ITFenXlf)ru`BD-FM#+AG~ApN%3} z6uhq6Qk6QqEkC|fS2?w51k7?;Cx_L{tweTm+jAOjbwmLRx4faA?vAxKaA7oY?D9*K zPDu_2v=SK~1;6X##f6G_?suZf#yB_VTk-x4gYRY6+_sy6nE&Jp#=ymS9n0{+p`nH) zRalW_%#*K_={5MQQ^v3lG`3N0q`He75(yrf8=YlMfqk~RS_+hTvpwis7$jq9LB>_) zl@Ht)h2r`!IoNgC(MaJ@55J-di*BEeJwE5QkgXzzpmXR+xm5Rb1&{|;2UHHnnClE# z%i6pMCnl2Awz|z~q&pL0-Ib8<3d;I1Y{lr?GP1!^9Qe!&`Oa8ZRz9o;^G2fVv{43o6nvDn8^>&D2(I2A8Fhrd;WYmT_wNWOb@~9wX&vFeeI` z3)>2LwL0ouMM*_+zBCr{(%Nv&RoSESs8~)58}deDx*?|=KmQwC@sJ5ZB&P$tWv-~()+G#XYf`boH8_HCW z)J9~%qBfl(SHfa1%b<14vANTR7w~HQ zEQE%aS3=;{EVB&v3nEYJz^&>-cmcUD-z)Ei3lr{xc@0Q>JI?sfn~|0WJn;%rmFXm* za2Khec7master" + +#: src/GitHub_Updater/Install.php:370 +#, fuzzy +msgid "Check for private Bitbucket repositories." +msgstr "Privat Bitbucket repo" + +#: src/GitHub_Updater/Install.php:384 +msgid "Enter GitHub Access Token for private GitHub repositories." +msgstr "Fyll i GitHub Access Token för privata GitHub repos." + +#: src/GitHub_Updater/Install.php:398 +#, fuzzy +msgid "Enter GitLab Private Token for private GitLab repositories." +msgstr "Fyll i GitHub Access Token för privata GitHub repos." + +#: src/GitHub_Updater/Install.php:442 +msgid "Activate" +msgstr "" + +#: src/GitHub_Updater/Install.php:451 +msgctxt "This refers to a network activation in a multisite installation" +msgid "Network Enable" +msgstr "" + +#: src/GitHub_Updater/Messages.php:84 src/GitHub_Updater/Messages.php:119 +msgid "GitHub Updater Error Code:" +msgstr "GitHub Updater felkod:" + +#: src/GitHub_Updater/Messages.php:89 +#, fuzzy, php-format +msgid "GitHub API's rate limit will reset in %s minutes." +msgstr "Gränsen för GitHub API återställs %1$s minuter." + +#: src/GitHub_Updater/Messages.php:94 +#, php-format +msgid "" +"It looks like you are running into GitHub API rate limits. Be sure and " +"configure a %sPersonal Access Token%s to avoid this issue." +msgstr "" + +#: src/GitHub_Updater/Messages.php:123 +msgid "" +"There is probably an access token or password error on the GitHub Updater " +"Settings page." +msgstr "" + +#: src/GitHub_Updater/Messages.php:138 +msgid "" +"You must set a GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" + +#: src/GitHub_Updater/Plugin.php:320 src/GitHub_Updater/Theme.php:475 +#, fuzzy, php-format +msgid "Current branch is `%1$s`, try %2$sanother branch%3$s." +msgstr "Nuvarande version är aktuell. Testa" + +#: src/GitHub_Updater/Plugin.php:372 +#, fuzzy +msgid "View details" +msgstr " " + +#: src/GitHub_Updater/Settings.php:77 src/GitHub_Updater/Settings.php:697 +msgid "Settings" +msgstr "Inställningar" + +#: src/GitHub_Updater/Settings.php:80 src/GitHub_Updater/Settings.php:492 +msgid "Remote Management" +msgstr "" + +#: src/GitHub_Updater/Settings.php:91 src/GitHub_Updater/Settings.php:99 +#: src/GitHub_Updater/Settings.php:194 +msgid "GitHub Updater Settings" +msgstr "Inställningar för GitHub Updater" + +#. Plugin Name of the plugin/theme +#: src/GitHub_Updater/Settings.php:92 src/GitHub_Updater/Settings.php:100 +#: src/GitHub_Updater/Settings.php:137 +msgid "GitHub Updater" +msgstr "GitHub Updater" + +#: src/GitHub_Updater/Settings.php:141 +msgid "Saved." +msgstr "Sparat." + +#: src/GitHub_Updater/Settings.php:201 +msgid "Enable Branch Switching" +msgstr "" + +#: src/GitHub_Updater/Settings.php:213 +#, fuzzy +msgid "Personal GitHub Access Token" +msgstr "GitHub Access Token" + +#: src/GitHub_Updater/Settings.php:220 +#, fuzzy +msgid "GitHub.com Access Token" +msgstr "GitHub Access Token" + +#: src/GitHub_Updater/Settings.php:230 +#, fuzzy +msgid "GitHub Enterprise Access Token" +msgstr "GitHub Access Token" + +#: src/GitHub_Updater/Settings.php:244 +msgid "GitHub Private Settings" +msgstr "Privata inställningar för GitHub" + +#: src/GitHub_Updater/Settings.php:257 +#, fuzzy +msgid "GitLab Private Settings" +msgstr "Privata inställningar för GitHub" + +#: src/GitHub_Updater/Settings.php:266 +#, fuzzy +msgid "GitLab.com Private Token" +msgstr "Privata inställningar för GitHub" + +#: src/GitHub_Updater/Settings.php:277 +msgid "GitLab CE or GitLab Enterprise Private Token" +msgstr "" + +#: src/GitHub_Updater/Settings.php:290 +msgid "Bitbucket Private Settings" +msgstr "Inställningar för Bitbucket" + +#: src/GitHub_Updater/Settings.php:297 +msgid "Bitbucket Username" +msgstr "Användarnamn för Bitbucket" + +#: src/GitHub_Updater/Settings.php:306 +msgid "Bitbucket Password" +msgstr "Lösenord för Bitbucket" + +#: src/GitHub_Updater/Settings.php:319 +msgid "Bitbucket Private Repositories" +msgstr "Privata inställningar för Bitbucket" + +#: src/GitHub_Updater/Settings.php:331 +msgid "No private repositories are installed." +msgstr "Inga privata repos är installerade." + +#: src/GitHub_Updater/Settings.php:419 +msgid "Theme:" +msgstr "Tema:" + +#: src/GitHub_Updater/Settings.php:541 +#, php-format +msgid "Extended Naming is %sactive%s." +msgstr "" + +#: src/GitHub_Updater/Settings.php:546 +#, php-format +msgid "Extended Naming is %snot active%s." +msgstr "" + +#: src/GitHub_Updater/Settings.php:548 +#, php-format +msgid "" +"Extended Naming renames plugin directories %s to prevent possible conflicts " +"with WP.org plugins." +msgstr "" + +#: src/GitHub_Updater/Settings.php:549 +#, php-format +msgid "Activate Extended Naming by setting %s" +msgstr "" + +#: src/GitHub_Updater/Settings.php:550 +msgid "Check to enable branch switching from the Plugins or Themes page." +msgstr "" + +#: src/GitHub_Updater/Settings.php:557 +msgid "Enter your GitHub Access Token. Leave empty for public repositories." +msgstr "Fyll i ditt GitHub Access Token. Lämna tomt för publika repos." + +#: src/GitHub_Updater/Settings.php:564 +#, fuzzy +msgid "" +"Enter your personal GitHub.com or GitHub Enterprise Access Token to avoid " +"API access limits." +msgstr "Fyll i ditt GitHub Access Token. Lämna tomt för publika repos." + +#: src/GitHub_Updater/Settings.php:571 +msgid "" +"Check box if private repository. Leave unchecked for public repositories." +msgstr "Kryssa i boxen för privata repos. Lämna okryssad för publika repos." + +#: src/GitHub_Updater/Settings.php:578 +msgid "Enter your personal Bitbucket username and password." +msgstr "Fyll i inloggningsinformation för din Bitbucketanvändare." + +#: src/GitHub_Updater/Settings.php:585 +msgid "Enter your GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" + +#: src/GitHub_Updater/Settings.php:592 +msgid "" +"Use of Remote Management services may result increase some page load speeds " +"only for `admin` level users in the dashboard." +msgstr "" + +#: src/GitHub_Updater/Theme.php:376 +msgid "Theme is up-to-date!" +msgstr "Temat är aktuellt!" + +#: src/GitHub_Updater/Theme.php:381 +#, fuzzy +msgid "Rollback to:" +msgstr "%sGå tillbaka till:%s" + +#: src/GitHub_Updater/Theme.php:399 src/GitHub_Updater/Theme.php:639 +msgid "No previous tags to rollback to." +msgstr "Inga föregående taggar att gå tillbaka till." + +#: src/GitHub_Updater/Theme.php:407 src/GitHub_Updater/Theme.php:421 +#, fuzzy, php-format +msgid "GitHub Updater shows a new version of %s available." +msgstr "GitHub Updater visar att det finns en ny version av %1$s tillgänglig." + +#: src/GitHub_Updater/Theme.php:414 +#, fuzzy, php-format +msgid "View version %s details." +msgstr "Visa detaljer för version %4$s" + +#: src/GitHub_Updater/Theme.php:418 +msgid "Automatic update is unavailable for this theme." +msgstr "Automatiska uppdateringar är inte tillgängligt för detta temat." + +#: src/GitHub_Updater/Theme.php:428 src/GitHub_Updater/Theme.php:593 +#, fuzzy, php-format +msgid "View version %1$s details%2$s or %3$supdate now%4$s." +msgstr "" +"Visa detaljer för version %3$s eller uppdatera " +"nu." + +#: src/GitHub_Updater/Theme.php:586 +#, fuzzy, php-format +msgid "There is a new version of %s available now." +msgstr "Det finns en ny version av" + +#: src/GitHub_Updater/Theme.php:613 +#, fuzzy, php-format +msgid "Current version is up to date. Try %sanother version%s" +msgstr "Nuvarande version är aktuell. Testa" + +#: src/GitHub_Updater/Theme.php:627 +msgid "Choose a Version" +msgstr "Välj en version" + +#: src/GitHub_Updater/Theme.php:644 +msgid "Install" +msgstr "Installera" + +#. Plugin URI of the plugin/theme +msgid "https://github.com/afragen/github-updater" +msgstr "https://github.com/afragen/github-updater" + +#. Description of the plugin/theme +msgid "" +"A plugin to automatically update GitHub, Bitbucket, or GitLab hosted plugins " +"and themes. It also allows for remote installation of plugins or themes into " +"WordPress." +msgstr "" + +#. Author of the plugin/theme +msgid "Andy Fragen" +msgstr "Andy Fragen" + +#, fuzzy +#~ msgid "%s was not checked. GitHub Updater Error Code:" +#~ msgstr "%1$s har inte kontrollerats. GitHub Updater felkod: %2$s" + +#, fuzzy +#~ msgid "Renaming %1$s to %2$s" +#~ msgstr "Döper om %s till %s" + +#~ msgid "Rename successful" +#~ msgstr "Namnbytet lyckades" + +#~ msgid "Unable to rename downloaded repository." +#~ msgstr "Kunde inte döpa om den" + +#, fuzzy +#~ msgid "this plugin" +#~ msgstr "Tilläggs-" + +#, fuzzy +#~ msgid "" +#~ "A plugin to automatically update GitHub, Bitbucket or GitLab hosted " +#~ "plugins and themes. It also allows for remote installation of plugins or " +#~ "themes into WordPress. Plugin class based upon codepress/github-plugin-updater. Theme class based upon Whitelabel Framework modifications." +#~ msgstr "" +#~ "Ett tillägg för att automatiskt uppdatera teman och tillägg från GitHub " +#~ "eller Bitbucket direkt i WordPress. Tilläggsklassen baserad på codepress/github-" +#~ "plugin-updater. Temaklassen baserad på modifikationer av Whitelabel " +#~ "Framework." + +#~ msgid "" +#~ "No changelog is available via GitHub Updater. Create a file CHANGES." +#~ "md or CHANGELOG.md in your repository." +#~ msgstr "" +#~ "Ingen changelog finns tillgänglig via GitHub Updater. Skapa CHANGES." +#~ "md eller CHANGELOG.md i din repo." + +#~ msgid "%sView version %s details%s or %supdate now%s." +#~ msgstr "%sVisa detaljer för version %s %s eller %suppdatera nu%s." + +#~ msgid "URI" +#~ msgstr "URI" + +#~ msgid "available now." +#~ msgstr "tillgänglig." + +#~ msgid "View version" +#~ msgstr "Visa detaljer för version" + +#~ msgid "or" +#~ msgstr "eller" + +#~ msgid "update now" +#~ msgstr "uppdatera nu" + +#~ msgid "another version?" +#~ msgstr "en annan version?" + +#~ msgid "was not checked." +#~ msgstr "kunde inte kontrolleras. " diff --git a/www/wp-content/plugins/github-updater/languages/github-updater-uk.mo b/www/wp-content/plugins/github-updater/languages/github-updater-uk.mo new file mode 100755 index 0000000000000000000000000000000000000000..57e5304c6be37ff9ef634786a2f96bcb6d12b551 GIT binary patch literal 3574 zcmb7G+iw(A7(XhCRJlRc5=}B9tk`&{CkWXoX^UFfOyZr`@5uGn<*SwIw7X z4Y!0KAe0AVFoqXjWLsKX3N6tmOnf+FO!Ub|-~10G@%NpXy|hpxlg|9k<-48V_kCyk z=ZYm48J;)szJ_<@LyR>6mp_aTo)Yi{-~{jq;2mHy@HgNJ;F3oedjt3)@D<=jAgzB0 z>;Yzg&j7y%8o=AY?ZCf*8-OiKpbH!XJ_Y;?NOsOd>)!#FV*X>a|1Mv#;9tPC zz@?8e_82e*qsm>-1F^T0E} z{lF_gvVRvy@++4ywh6cuxDGfBJPo`Id=-vO=x z{tj#e-UU*8YnC&%3TOf;M;`;p-(lcR;1m#l>>qq$z-1ukZD1SlIba6(5^w~Fkk~mO z@%2?S{|VTH`7c1EUO$vC${{_k<9!-0Xx8yiF6bdnkV4HR<)31p2h{0v(-=q9HA7?K zj2_B0#Y3^t1GhS^O8wCq@d0{u9lT5ncqm7dPqr;B?O{ub47YrqFB*khanN?yHYYR6 zcX-yIz_=*gyd~{4FBUQo<+jg@jx}uAIV+VDe8Ba%%wkbyMP9^Mr!7;(^pKFe&+`3G zT`yC=tSN4Pz}3z0pqVsA9Y zdxbSD5Mr7HaWV?9P)y};f~pwY#$d^HeZejMk??%mby&9}g~wB#1zk?gI8<}moX8jC zs5W&VZ}|{A5J``^MUU^a<*s6iZ%e0z@AH0lNH~=^YKr%bA#|yY6cB~$SUFx}uoxYh zTTX@-B06I%a@Q9fzRFg#zE9`LtB6HY-tBofPM4bz=EAM2g&xP3RxZaP!(7Ljyo5FeL&ZZ4OykQnL4LV+;R^^9}NL-m9nL?*@}<9kHjMOjr#VwCT4 zeaY(PojN0IFY*etYOrB6`m2kwU`W@X5?#ggqRFyS7JRe0dC->GVk(w)^UcBYv}u+-{|rLTETUU?QmoAmUv>L5pOjTZ9Lv)CN>-K zP4PGcjXj`;O6ou5dQnJ5KhEaoEVP2j(RQ9~^F5=7vO~iSy_PdrL<<`I!pbkUY4YMw z!|tBl-LL(wwfG8F(5pn+ey0_ zw4TY^QnqZ^Z|oF~@WSx=T#>OQPsG|{o3Im3jZVuK1xsd49*fmh_o6M*qAPS}^3YpV z=RGk>7lYqx`_kmeWP4JyCml1fzNI}mLXgHvW#EjM8`A4(Px$GiC8Y<2>QK~%kpgXH zWj+^4>0v0PhgGvl$8`&#PiG{Yw1$3?NoNo@5Lm0qG@w{LD`)I*y}WO72Nxx#en)FN z4~HG=oHdDfM@NFMUCU`0U)7OF@OOEfLmcz19W9luEgc(Zs5RnS5^;X`aHs;AcoTFI z&}nIEucK2~UOL+cnvFP!ZeZ%HnhB1ovYHIW)TAoWmcHkUY)QWegFg_BM-XVD6aqR1Qw5Qth^5>T3jf6LKfDKWJ0} zxm|Apy4Mg$^_Hyr{Rqa@twxG`22sOn6gl}mp-Kn^x<9}urWE&j%^0GXn;#U|nD22q z#?>VqT$zF+x-@6EYxXp2Wp%4U5G;(T2{16O2`&f6=J|**bsnrtAj&XzAZR)`f`G?^ zGqi^(3Apb#5Uw=Yf9w(_(;S}a3qTG#BnmfaPC&>QV)vcS`7fmn~ zV+pwfrBU^P<_9XO@E3H!&*Orrt}Zo2eyEAc$i<8*n~Qr|@UyJW>kLqFQ@@odNl3-L zi{t_ApswNM=-cCw`TH@2FG?R(D3&v-9kgI2k8n zOnn2Pu$hPsloZr&a9mXP)H_3=Pf&$I<9cX%@gy@C11Z56vhyvCs62G%hD71yb(dan MdR3jm|Nr0NUy6pWjsO4v literal 0 HcmV?d00001 diff --git a/www/wp-content/plugins/github-updater/languages/github-updater-uk.po b/www/wp-content/plugins/github-updater/languages/github-updater-uk.po new file mode 100755 index 0000000..b02479e --- /dev/null +++ b/www/wp-content/plugins/github-updater/languages/github-updater-uk.po @@ -0,0 +1,421 @@ +msgid "" +msgstr "" +"Project-Id-Version: GitHub Updater\n" +"POT-Creation-Date: 2016-03-18 08:19-0700\n" +"PO-Revision-Date: 2016-03-18 08:19-0700\n" +"Last-Translator: Andrii Ryzhkv\n" +"Language-Team: Andrii Ryzhkv\n" +"Language: uk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;" +"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;" +"_nx_noop:3c,1,2;__ngettext_noop:1,2\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Poedit-SearchPath-0: .\n" + +#: mu/ghu-loader.php:66 +msgid "Activated as mu-plugin" +msgstr "Активувати як mu-plugin" + +#: src/GitHub_Updater/Base.php:474 +#, php-format +msgid "Rename successful using extended name to %1$s" +msgstr "" + +#: src/GitHub_Updater/Install.php:67 +#, fuzzy +msgid "A repository URI is required." +msgstr "Неможливо перейменувати скачане сховище." + +#: src/GitHub_Updater/Install.php:223 src/GitHub_Updater/Settings.php:78 +msgid "Install Plugin" +msgstr "Встановити плагін" + +#: src/GitHub_Updater/Install.php:226 src/GitHub_Updater/Settings.php:79 +msgid "Install Theme" +msgstr "Інсталювати тему" + +#: src/GitHub_Updater/Install.php:244 +msgid "Plugin" +msgstr "Плагін" + +#: src/GitHub_Updater/Install.php:247 +msgid "Theme" +msgstr "тему:" + +#: src/GitHub_Updater/Install.php:258 +#, fuzzy, php-format +msgid "GitHub Updater Install %s" +msgstr "GitHub Updater" + +#: src/GitHub_Updater/Install.php:265 +#, fuzzy, php-format +msgid "%s URI" +msgstr "%sВідкат до:%s" + +#: src/GitHub_Updater/Install.php:273 +msgid "Repository Branch" +msgstr "Репозиторій відділення" + +#: src/GitHub_Updater/Install.php:281 +msgid "Remote Repository Host" +msgstr "Віддаленого сховища хост" + +#: src/GitHub_Updater/Install.php:289 +#, fuzzy +msgid "Private Bitbucket Repository" +msgstr "Приватні сховища Bitbucket" + +#: src/GitHub_Updater/Install.php:297 +msgid "GitHub Access Token" +msgstr "" + +#: src/GitHub_Updater/Install.php:308 +#, fuzzy +msgid "GitLab Private Token" +msgstr "Налаштування приватного GitHub" + +#: src/GitHub_Updater/Install.php:325 +msgid "URI is case sensitive." +msgstr "" + +#: src/GitHub_Updater/Install.php:339 +msgid "Enter branch name or leave empty for `master`" +msgstr "Введіть ім'я відділення або Залиште пустим для 'майстер'" + +#: src/GitHub_Updater/Install.php:370 +#, fuzzy +msgid "Check for private Bitbucket repositories." +msgstr "Приватні сховища Bitbucket" + +#: src/GitHub_Updater/Install.php:384 +#, fuzzy +msgid "Enter GitHub Access Token for private GitHub repositories." +msgstr "Введіть маркер доступу GitHub . Залиште порожнім для публічних сховищ." + +#: src/GitHub_Updater/Install.php:398 +#, fuzzy +msgid "Enter GitLab Private Token for private GitLab repositories." +msgstr "Введіть маркер доступу GitHub. Залиште порожнім для публічних сховищ." + +#: src/GitHub_Updater/Install.php:442 +msgid "Activate" +msgstr "" + +#: src/GitHub_Updater/Install.php:451 +msgctxt "This refers to a network activation in a multisite installation" +msgid "Network Enable" +msgstr "" + +#: src/GitHub_Updater/Messages.php:84 src/GitHub_Updater/Messages.php:119 +msgid "GitHub Updater Error Code:" +msgstr "GitHub Updater код помилки:" + +#: src/GitHub_Updater/Messages.php:89 +#, fuzzy, php-format +msgid "GitHub API's rate limit will reset in %s minutes." +msgstr "Обмеження частоти GitHub API буде скинути в %1$s хвилин." + +#: src/GitHub_Updater/Messages.php:94 +#, php-format +msgid "" +"It looks like you are running into GitHub API rate limits. Be sure and " +"configure a %sPersonal Access Token%s to avoid this issue." +msgstr "" + +#: src/GitHub_Updater/Messages.php:123 +msgid "" +"There is probably an access token or password error on the GitHub Updater " +"Settings page." +msgstr "" + +#: src/GitHub_Updater/Messages.php:138 +msgid "" +"You must set a GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" + +#: src/GitHub_Updater/Plugin.php:320 src/GitHub_Updater/Theme.php:475 +#, fuzzy, php-format +msgid "Current branch is `%1$s`, try %2$sanother branch%3$s." +msgstr "Поточна версія остання. Спробуйте" + +#: src/GitHub_Updater/Plugin.php:372 +#, fuzzy +msgid "View details" +msgstr "Переглянути подробиці версії %4$s" + +#: src/GitHub_Updater/Settings.php:77 src/GitHub_Updater/Settings.php:697 +msgid "Settings" +msgstr "Налаштування" + +#: src/GitHub_Updater/Settings.php:80 src/GitHub_Updater/Settings.php:492 +msgid "Remote Management" +msgstr "" + +#: src/GitHub_Updater/Settings.php:91 src/GitHub_Updater/Settings.php:99 +#: src/GitHub_Updater/Settings.php:194 +msgid "GitHub Updater Settings" +msgstr "Налаштування GitHub Updater" + +#. Plugin Name of the plugin/theme +#: src/GitHub_Updater/Settings.php:92 src/GitHub_Updater/Settings.php:100 +#: src/GitHub_Updater/Settings.php:137 +msgid "GitHub Updater" +msgstr "GitHub Updater" + +#: src/GitHub_Updater/Settings.php:141 +msgid "Saved." +msgstr "Збережено." + +#: src/GitHub_Updater/Settings.php:201 +msgid "Enable Branch Switching" +msgstr "" + +#: src/GitHub_Updater/Settings.php:213 +msgid "Personal GitHub Access Token" +msgstr "" + +#: src/GitHub_Updater/Settings.php:220 +#, fuzzy +msgid "GitHub.com Access Token" +msgstr "Налаштування приватного GitHub" + +#: src/GitHub_Updater/Settings.php:230 +msgid "GitHub Enterprise Access Token" +msgstr "" + +#: src/GitHub_Updater/Settings.php:244 +msgid "GitHub Private Settings" +msgstr "Налаштування приватного GitHub" + +#: src/GitHub_Updater/Settings.php:257 +#, fuzzy +msgid "GitLab Private Settings" +msgstr "Налаштування приватного GitHub" + +#: src/GitHub_Updater/Settings.php:266 +#, fuzzy +msgid "GitLab.com Private Token" +msgstr "Налаштування приватного GitHub" + +#: src/GitHub_Updater/Settings.php:277 +msgid "GitLab CE or GitLab Enterprise Private Token" +msgstr "" + +#: src/GitHub_Updater/Settings.php:290 +msgid "Bitbucket Private Settings" +msgstr "Налаштування приватного Bitbucket" + +#: src/GitHub_Updater/Settings.php:297 +msgid "Bitbucket Username" +msgstr "Bitbucket ім'я користувача" + +#: src/GitHub_Updater/Settings.php:306 +msgid "Bitbucket Password" +msgstr "Bitbucket пароль" + +#: src/GitHub_Updater/Settings.php:319 +msgid "Bitbucket Private Repositories" +msgstr "Приватні сховища Bitbucket" + +#: src/GitHub_Updater/Settings.php:331 +msgid "No private repositories are installed." +msgstr "Жодне приватне сховище не встановлене." + +#: src/GitHub_Updater/Settings.php:419 +msgid "Theme:" +msgstr "тему:" + +#: src/GitHub_Updater/Settings.php:541 +#, php-format +msgid "Extended Naming is %sactive%s." +msgstr "" + +#: src/GitHub_Updater/Settings.php:546 +#, php-format +msgid "Extended Naming is %snot active%s." +msgstr "" + +#: src/GitHub_Updater/Settings.php:548 +#, php-format +msgid "" +"Extended Naming renames plugin directories %s to prevent possible conflicts " +"with WP.org plugins." +msgstr "" + +#: src/GitHub_Updater/Settings.php:549 +#, php-format +msgid "Activate Extended Naming by setting %s" +msgstr "" + +#: src/GitHub_Updater/Settings.php:550 +msgid "Check to enable branch switching from the Plugins or Themes page." +msgstr "" + +#: src/GitHub_Updater/Settings.php:557 +msgid "Enter your GitHub Access Token. Leave empty for public repositories." +msgstr "Введіть маркер доступу GitHub. Залиште порожнім для публічних сховищ." + +#: src/GitHub_Updater/Settings.php:564 +#, fuzzy +msgid "" +"Enter your personal GitHub.com or GitHub Enterprise Access Token to avoid " +"API access limits." +msgstr "Введіть маркер доступу GitHub. Залиште порожнім для публічних сховищ." + +#: src/GitHub_Updater/Settings.php:571 +msgid "" +"Check box if private repository. Leave unchecked for public repositories." +msgstr "" +"Позначте, якщо сховище приватне. Залиште не позначеним для публічних сховищ." + +#: src/GitHub_Updater/Settings.php:578 +msgid "Enter your personal Bitbucket username and password." +msgstr "Введіть ваші особисті BitBucket ім'я користувача та пароль." + +#: src/GitHub_Updater/Settings.php:585 +msgid "Enter your GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" + +#: src/GitHub_Updater/Settings.php:592 +msgid "" +"Use of Remote Management services may result increase some page load speeds " +"only for `admin` level users in the dashboard." +msgstr "" + +#: src/GitHub_Updater/Theme.php:376 +msgid "Theme is up-to-date!" +msgstr "Тема не має оновлень!" + +#: src/GitHub_Updater/Theme.php:381 +#, fuzzy +msgid "Rollback to:" +msgstr "%sВідкат до:%s" + +#: src/GitHub_Updater/Theme.php:399 src/GitHub_Updater/Theme.php:639 +msgid "No previous tags to rollback to." +msgstr "Немає теґів для відкату назад." + +#: src/GitHub_Updater/Theme.php:407 src/GitHub_Updater/Theme.php:421 +#, fuzzy, php-format +msgid "GitHub Updater shows a new version of %s available." +msgstr "GitHub Updater показує, що доступна нова версія %1$s." + +#: src/GitHub_Updater/Theme.php:414 +#, fuzzy, php-format +msgid "View version %s details." +msgstr "Переглянути подробиці версії %4$s" + +#: src/GitHub_Updater/Theme.php:418 +msgid "Automatic update is unavailable for this theme." +msgstr "Автоматичне оновлення недоступно для цієї теми." + +#: src/GitHub_Updater/Theme.php:428 src/GitHub_Updater/Theme.php:593 +#, fuzzy, php-format +msgid "View version %1$s details%2$s or %3$supdate now%4$s." +msgstr "%4$sПереглянути подробиці версії %5$s або %6$sоновити зараз%7$s ." + +#: src/GitHub_Updater/Theme.php:586 +#, fuzzy, php-format +msgid "There is a new version of %s available now." +msgstr "Нова версія" + +#: src/GitHub_Updater/Theme.php:613 +#, fuzzy, php-format +msgid "Current version is up to date. Try %sanother version%s" +msgstr "Поточна версія остання. Спробуйте" + +#: src/GitHub_Updater/Theme.php:627 +msgid "Choose a Version" +msgstr "Вибрати версію" + +#: src/GitHub_Updater/Theme.php:644 +msgid "Install" +msgstr "Встановити" + +#. Plugin URI of the plugin/theme +msgid "https://github.com/afragen/github-updater" +msgstr "https://github.com/afragen/github-updater" + +#. Description of the plugin/theme +msgid "" +"A plugin to automatically update GitHub, Bitbucket, or GitLab hosted plugins " +"and themes. It also allows for remote installation of plugins or themes into " +"WordPress." +msgstr "" + +#. Author of the plugin/theme +msgid "Andy Fragen" +msgstr "Енді Фраген" + +#, fuzzy +#~ msgid "%s was not checked. GitHub Updater Error Code:" +#~ msgstr "%1$s не перевірив. GitHub Updater код помилки: %2$s" + +#, fuzzy +#~ msgid "Renaming %1$s to %2$s" +#~ msgstr "Перейменування %s в %s" + +#~ msgid "Rename successful" +#~ msgstr "Перейменування успішне" + +#~ msgid "Unable to rename downloaded repository." +#~ msgstr "Неможливо перейменувати скачане сховище." + +#, fuzzy +#~ msgid "this plugin" +#~ msgstr "Плагін" + +#, fuzzy +#~ msgid "" +#~ "A plugin to automatically update GitHub, Bitbucket or GitLab hosted " +#~ "plugins and themes. It also allows for remote installation of plugins or " +#~ "themes into WordPress. Plugin class based upon codepress/github-plugin-updater. Theme class based upon Whitelabel Framework modifications." +#~ msgstr "" +#~ "Плаґін для автоматичного оновлення плаґінів та тем WordPress, які " +#~ "розміщуються на GitHub або BitBucket. Клас плаґіну основано на codepress / GitHub-" +#~ "Plugin-Updater . Клас теми основано на модифікаціях Whitelabel Framework." + +#~ msgid "" +#~ "No changelog is available via GitHub Updater. Create a file CHANGES." +#~ "md or CHANGELOG.md in your repository." +#~ msgstr "" +#~ "Немає доступних змін через GitHub Updater. Створіть файл CHANGES." +#~ "md або CHANGELOG.md у вашому сховищі." + +#~ msgid "%sView version %s details%s or %supdate now%s." +#~ msgstr "%sПереглянути подробиці версії %s %s або %sоновити зараз%s ." + +#~ msgid "available now." +#~ msgstr "зараз доступна." + +#, fuzzy +#~ msgid "View version" +#~ msgstr "Переглянути подробиці версії %4$s" + +#~ msgid "or" +#~ msgstr "або" + +#~ msgid "update now" +#~ msgstr "оновити зараз" + +#~ msgid "another version?" +#~ msgstr "іншу версію?" + +#~ msgid "was not checked." +#~ msgstr "не було підтверджено." + +#~ msgid " or " +#~ msgstr " або " diff --git a/www/wp-content/plugins/github-updater/languages/github-updater.pot b/www/wp-content/plugins/github-updater/languages/github-updater.pot new file mode 100755 index 0000000..00f8a5e --- /dev/null +++ b/www/wp-content/plugins/github-updater/languages/github-updater.pot @@ -0,0 +1,342 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: GitHub Updater\n" +"POT-Creation-Date: 2016-03-18 08:18-0700\n" +"PO-Revision-Date: 2015-05-20 19:10-0800\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-WPHeader: github-updater.php\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;" +"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;" +"_nx_noop:3c,1,2;__ngettext_noop:1,2\n" +"X-Poedit-SearchPath-0: .\n" +"X-Poedit-SearchPathExcluded-0: *.js\n" + +#: mu/ghu-loader.php:66 +msgid "Activated as mu-plugin" +msgstr "" + +#: src/GitHub_Updater/Base.php:474 +#, php-format +msgid "Rename successful using extended name to %1$s" +msgstr "" + +#: src/GitHub_Updater/Install.php:67 +msgid "A repository URI is required." +msgstr "" + +#: src/GitHub_Updater/Install.php:223 src/GitHub_Updater/Settings.php:78 +msgid "Install Plugin" +msgstr "" + +#: src/GitHub_Updater/Install.php:226 src/GitHub_Updater/Settings.php:79 +msgid "Install Theme" +msgstr "" + +#: src/GitHub_Updater/Install.php:244 +msgid "Plugin" +msgstr "" + +#: src/GitHub_Updater/Install.php:247 +msgid "Theme" +msgstr "" + +#: src/GitHub_Updater/Install.php:258 +#, php-format +msgid "GitHub Updater Install %s" +msgstr "" + +#: src/GitHub_Updater/Install.php:265 +#, php-format +msgid "%s URI" +msgstr "" + +#: src/GitHub_Updater/Install.php:273 +msgid "Repository Branch" +msgstr "" + +#: src/GitHub_Updater/Install.php:281 +msgid "Remote Repository Host" +msgstr "" + +#: src/GitHub_Updater/Install.php:289 +msgid "Private Bitbucket Repository" +msgstr "" + +#: src/GitHub_Updater/Install.php:297 +msgid "GitHub Access Token" +msgstr "" + +#: src/GitHub_Updater/Install.php:308 +msgid "GitLab Private Token" +msgstr "" + +#: src/GitHub_Updater/Install.php:325 +msgid "URI is case sensitive." +msgstr "" + +#: src/GitHub_Updater/Install.php:339 +msgid "Enter branch name or leave empty for `master`" +msgstr "" + +#: src/GitHub_Updater/Install.php:370 +msgid "Check for private Bitbucket repositories." +msgstr "" + +#: src/GitHub_Updater/Install.php:384 +msgid "Enter GitHub Access Token for private GitHub repositories." +msgstr "" + +#: src/GitHub_Updater/Install.php:398 +msgid "Enter GitLab Private Token for private GitLab repositories." +msgstr "" + +#: src/GitHub_Updater/Install.php:442 +msgid "Activate" +msgstr "" + +#: src/GitHub_Updater/Install.php:451 +msgctxt "This refers to a network activation in a multisite installation" +msgid "Network Enable" +msgstr "" + +#: src/GitHub_Updater/Messages.php:84 src/GitHub_Updater/Messages.php:119 +msgid "GitHub Updater Error Code:" +msgstr "" + +#: src/GitHub_Updater/Messages.php:89 +#, php-format +msgid "GitHub API's rate limit will reset in %s minutes." +msgstr "" + +#: src/GitHub_Updater/Messages.php:94 +#, php-format +msgid "" +"It looks like you are running into GitHub API rate limits. Be sure and " +"configure a %sPersonal Access Token%s to avoid this issue." +msgstr "" + +#: src/GitHub_Updater/Messages.php:123 +msgid "" +"There is probably an access token or password error on the GitHub Updater " +"Settings page." +msgstr "" + +#: src/GitHub_Updater/Messages.php:138 +msgid "" +"You must set a GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" + +#: src/GitHub_Updater/Plugin.php:320 src/GitHub_Updater/Theme.php:475 +#, php-format +msgid "Current branch is `%1$s`, try %2$sanother branch%3$s." +msgstr "" + +#: src/GitHub_Updater/Plugin.php:372 +msgid "View details" +msgstr "" + +#: src/GitHub_Updater/Settings.php:77 src/GitHub_Updater/Settings.php:697 +msgid "Settings" +msgstr "" + +#: src/GitHub_Updater/Settings.php:80 src/GitHub_Updater/Settings.php:492 +msgid "Remote Management" +msgstr "" + +#: src/GitHub_Updater/Settings.php:91 src/GitHub_Updater/Settings.php:99 +#: src/GitHub_Updater/Settings.php:194 +msgid "GitHub Updater Settings" +msgstr "" + +#. Plugin Name of the plugin/theme +#: src/GitHub_Updater/Settings.php:92 src/GitHub_Updater/Settings.php:100 +#: src/GitHub_Updater/Settings.php:137 +msgid "GitHub Updater" +msgstr "" + +#: src/GitHub_Updater/Settings.php:141 +msgid "Saved." +msgstr "" + +#: src/GitHub_Updater/Settings.php:201 +msgid "Enable Branch Switching" +msgstr "" + +#: src/GitHub_Updater/Settings.php:213 +msgid "Personal GitHub Access Token" +msgstr "" + +#: src/GitHub_Updater/Settings.php:220 +msgid "GitHub.com Access Token" +msgstr "" + +#: src/GitHub_Updater/Settings.php:230 +msgid "GitHub Enterprise Access Token" +msgstr "" + +#: src/GitHub_Updater/Settings.php:244 +msgid "GitHub Private Settings" +msgstr "" + +#: src/GitHub_Updater/Settings.php:257 +msgid "GitLab Private Settings" +msgstr "" + +#: src/GitHub_Updater/Settings.php:266 +msgid "GitLab.com Private Token" +msgstr "" + +#: src/GitHub_Updater/Settings.php:277 +msgid "GitLab CE or GitLab Enterprise Private Token" +msgstr "" + +#: src/GitHub_Updater/Settings.php:290 +msgid "Bitbucket Private Settings" +msgstr "" + +#: src/GitHub_Updater/Settings.php:297 +msgid "Bitbucket Username" +msgstr "" + +#: src/GitHub_Updater/Settings.php:306 +msgid "Bitbucket Password" +msgstr "" + +#: src/GitHub_Updater/Settings.php:319 +msgid "Bitbucket Private Repositories" +msgstr "" + +#: src/GitHub_Updater/Settings.php:331 +msgid "No private repositories are installed." +msgstr "" + +#: src/GitHub_Updater/Settings.php:419 +msgid "Theme:" +msgstr "" + +#: src/GitHub_Updater/Settings.php:541 +#, php-format +msgid "Extended Naming is %sactive%s." +msgstr "" + +#: src/GitHub_Updater/Settings.php:546 +#, php-format +msgid "Extended Naming is %snot active%s." +msgstr "" + +#: src/GitHub_Updater/Settings.php:548 +#, php-format +msgid "" +"Extended Naming renames plugin directories %s to prevent possible conflicts " +"with WP.org plugins." +msgstr "" + +#: src/GitHub_Updater/Settings.php:549 +#, php-format +msgid "Activate Extended Naming by setting %s" +msgstr "" + +#: src/GitHub_Updater/Settings.php:550 +msgid "Check to enable branch switching from the Plugins or Themes page." +msgstr "" + +#: src/GitHub_Updater/Settings.php:557 +msgid "Enter your GitHub Access Token. Leave empty for public repositories." +msgstr "" + +#: src/GitHub_Updater/Settings.php:564 +msgid "" +"Enter your personal GitHub.com or GitHub Enterprise Access Token to avoid " +"API access limits." +msgstr "" + +#: src/GitHub_Updater/Settings.php:571 +msgid "" +"Check box if private repository. Leave unchecked for public repositories." +msgstr "" + +#: src/GitHub_Updater/Settings.php:578 +msgid "Enter your personal Bitbucket username and password." +msgstr "" + +#: src/GitHub_Updater/Settings.php:585 +msgid "Enter your GitLab.com, GitLab CE, or GitLab Enterprise Private Token." +msgstr "" + +#: src/GitHub_Updater/Settings.php:592 +msgid "" +"Use of Remote Management services may result increase some page load speeds " +"only for `admin` level users in the dashboard." +msgstr "" + +#: src/GitHub_Updater/Theme.php:376 +msgid "Theme is up-to-date!" +msgstr "" + +#: src/GitHub_Updater/Theme.php:381 +msgid "Rollback to:" +msgstr "" + +#: src/GitHub_Updater/Theme.php:399 src/GitHub_Updater/Theme.php:639 +msgid "No previous tags to rollback to." +msgstr "" + +#: src/GitHub_Updater/Theme.php:407 src/GitHub_Updater/Theme.php:421 +#, php-format +msgid "GitHub Updater shows a new version of %s available." +msgstr "" + +#: src/GitHub_Updater/Theme.php:414 +#, php-format +msgid "View version %s details." +msgstr "" + +#: src/GitHub_Updater/Theme.php:418 +msgid "Automatic update is unavailable for this theme." +msgstr "" + +#: src/GitHub_Updater/Theme.php:428 src/GitHub_Updater/Theme.php:593 +#, php-format +msgid "View version %1$s details%2$s or %3$supdate now%4$s." +msgstr "" + +#: src/GitHub_Updater/Theme.php:586 +#, php-format +msgid "There is a new version of %s available now." +msgstr "" + +#: src/GitHub_Updater/Theme.php:613 +#, php-format +msgid "Current version is up to date. Try %sanother version%s" +msgstr "" + +#: src/GitHub_Updater/Theme.php:627 +msgid "Choose a Version" +msgstr "" + +#: src/GitHub_Updater/Theme.php:644 +msgid "Install" +msgstr "" + +#. Plugin URI of the plugin/theme +msgid "https://github.com/afragen/github-updater" +msgstr "" + +#. Description of the plugin/theme +msgid "" +"A plugin to automatically update GitHub, Bitbucket, or GitLab hosted plugins " +"and themes. It also allows for remote installation of plugins or themes into " +"WordPress." +msgstr "" + +#. Author of the plugin/theme +msgid "Andy Fragen" +msgstr "" diff --git a/www/wp-content/plugins/github-updater/mu/ghu-loader.php b/www/wp-content/plugins/github-updater/mu/ghu-loader.php new file mode 100755 index 0000000..5727a55 --- /dev/null +++ b/www/wp-content/plugins/github-updater/mu/ghu-loader.php @@ -0,0 +1,83 @@ + esc_html__('Activated as mu-plugin', 'github-updater' ) ), $actions ); +} + +/* + * Deactivate normal plugin as it's loaded as mu-plugin. + */ +add_action( 'activated_plugin', 'ghu_deactivate', 10, 2 ); + +/* + * Remove links and checkbox from Plugins page so user can't delete main plugin. + */ +add_filter( 'network_admin_plugin_action_links_' . $ghu_plugin_file, 'ghu_mu_plugin_active' ); +add_filter( 'plugin_action_links_' . $ghu_plugin_file, 'ghu_mu_plugin_active' ); +add_action( 'after_plugin_row_' . $ghu_plugin_file, + function() { + print(''); + print(''); + } ); diff --git a/www/wp-content/plugins/github-updater/readme.txt b/www/wp-content/plugins/github-updater/readme.txt new file mode 100755 index 0000000..f68937a --- /dev/null +++ b/www/wp-content/plugins/github-updater/readme.txt @@ -0,0 +1,85 @@ +=== GitHub Updater === +Contributors: afragen, garyj, sethmatics +Donate link: http://thefragens.com/github-updater-donate +Tags: plugin, theme, update, updater, github, bitbucket, gitlab, remote install +Requires at least: 3.8 +Tested up to: 4.5 +Stable tag: master +License: GPLv2 or later +License URI: http://www.gnu.org/licenses/gpl-2.0.html + +== Description == + +This plugin was designed to simply update any GitHub hosted WordPress plugin or theme. Currently, plugins or themes hosted on GitHub, Bitbucket, or GitLab are also supported. Additionally, self-hosted installations of GitHub or GitLab are supported. It also allows for remote installation of plugins or themes into WordPress. + +Your plugin or theme **must** contain a header in the style.css header or in the plugin's header denoting the location on GitHub. The format is as follows. + +`GitHub Plugin URI: afragen/github-updater` +`GitHub Plugin URI: https://github.com/afragen/github-updater` + +or + +`GitHub Theme URI: afragen/test-child` +`GitHub Theme URI: https://github.com/afragen/test-child` + +...where the above URI leads to the __owner/repository__ of your theme or plugin. The URI may be in the format `https://github.com//` or the short format `/`. You do not need both. Only one Plugin or Theme URI is required. You **must not** include any extensions like `.git`. + +The following headers are available for use depending upon your hosting source. + +### GitHub +* GitHub Plugin URI +* GitHub Theme URI +* GitHub Branch +* GitHub Enterprise + +###Bitbucket +* Bitbucket Plugin URI +* Bitbucket Theme URI +* Bitbucket Branch + +###GitLab +* GitLab Plugin URI +* GitLab Theme URI +* GitLab Branch +* GitLab Enterprise +* GitLab CE + +== WordPress and PHP Requirements == + +There are two **optional** headers for setting minimum requirements for both WordPress and PHP. + +Use `Requires WP:` to set the minimum required version of WordPress needed for your plugin or theme. eg. `Requires WP: 3.8` + +Use `Requires PHP:` to set the minimum required version of PHP needed for your plugin or theme. eg. `Requires PHP: 5.3.0` + +At the moment the default values are **WordPress 3.8.0** and **PHP 5.3.0** + +== Release Assets == + +An **optional header** is available for use if your plugin or theme requires updating via a release asset. + +Use `Release Asset:`. eg., `Release Asset: true`. + +Your release asset filename is generated automatically and **must** have the following format or there will be an update error. + +Example, `$repo-$tag.zip` where `$repo` is the repository slug and ``$tag` is the newest release tag, example `test-plugin-0.7.3.zip`. + +**You must tag your releases to use this feature.** + +== Developer Hooks == + +There are 2 added filter hooks specifically for developers wanting to distribute private themes/plugins to clients without the client having to interact with the Settings page. + +The first allows the developer to set the GitHub Access Token for a specific plugin or theme. The anonymous function must return a **single** key/value pair where the key is the plugin/theme repo slug and the value is the token. + +` +add_filter( 'github_updater_token_distribution', + function () { + return array( 'my-private-theme' => 'kjasdp984298asdvhaljsg984aljhgosrpfiu' ); + } ); +` + +The second hook will simply make the Settings page unavailable. + +`add_filter( 'github_updater_hide_settings', '__return_true' );` + diff --git a/www/wp-content/plugins/github-updater/src/GitHub_Updater/API.php b/www/wp-content/plugins/github-updater/src/GitHub_Updater/API.php new file mode 100755 index 0000000..faf44e1 --- /dev/null +++ b/www/wp-content/plugins/github-updater/src/GitHub_Updater/API.php @@ -0,0 +1,262 @@ +type->type ) { + case ( stristr( $this->type->type, 'github' ) ): + $arr['repo'] = 'github'; + $arr['base_uri'] = 'https://api.github.com'; + $arr['base_download'] = 'https://github.com'; + break; + case ( stristr( $this->type->type, 'bitbucket' ) ): + $arr['repo'] = 'bitbucket'; + $arr['base_uri'] = 'https://bitbucket.org/api'; + $arr['base_download'] = 'https://bitbucket.org'; + break; + case ( stristr( $this->type->type, 'gitlab' ) ): + $arr['repo'] = 'gitlab'; + $arr['base_uri'] = 'https://gitlab.com/api/v3'; + $arr['base_download'] = 'https://gitlab.com'; + break; + } + if ( false !== stristr( $this->type->type, 'plugin' ) ) { + $arr['type'] = 'plugin'; + } elseif ( false !== stristr( $this->type->type, 'theme' ) ) { + $arr['type'] = 'theme'; + } + + return $arr; + } + + /** + * Call the API and return a json decoded body. + * Create error messages. + * + * @see http://developer.github.com/v3/ + * + * @param string $url + * + * @return boolean|object + */ + protected function api( $url ) { + $type = $this->return_repo_type(); + $response = wp_remote_get( $this->_get_api_url( $url ) ); + $code = (integer) wp_remote_retrieve_response_code( $response ); + $allowed_codes = array( 200, 404 ); + + if ( is_wp_error( $response ) ) { + return false; + } + if ( ! in_array( $code, $allowed_codes, false ) ) { + self::$error_code = array_merge( + self::$error_code, + array( $this->type->repo => array( + 'repo' => $this->type->repo, + 'code' => $code, + 'name' => $this->type->name, + ) + ) ); + if ( 'github' === $type['repo'] ) { + GitHub_API::ratelimit_reset( $response, $this->type->repo ); + } + Messages::create_error_message( $type['repo'] ); + return false; + } + + return json_decode( wp_remote_retrieve_body( $response ) ); + } + + /** + * Return API url. + * + * @access private + * @param string $endpoint + * + * @return string $endpoint + */ + private function _get_api_url( $endpoint ) { + $type = $this->return_repo_type(); + $segments = array( + 'owner' => $this->type->owner, + 'repo' => $this->type->repo, + ); + + /* + * Add or filter the available segments that are used to replace placeholders. + * + * @param array $segments list of segments. + */ + $segments = apply_filters( 'github_updater_api_segments', $segments ); + + foreach ( $segments as $segment => $value ) { + $endpoint = str_replace( '/:' . sanitize_key( $segment ), '/' . sanitize_text_field( $value ), $endpoint ); + } + + switch ( $type['repo'] ) { + case 'github': + $api = new GitHub_API( $type['type'] ); + $endpoint = $api->add_endpoints( $this, $endpoint ); + if ( $this->type->enterprise_api ) { + return $endpoint; + } + break; + case 'gitlab': + $api = new GitLab_API( $type['type'] ); + $endpoint = $api->add_endpoints( $this, $endpoint ); + if ( $this->type->enterprise_api ) { + return $endpoint; + } + break; + default: + } + + return $type['base_uri'] . $endpoint; + } + + /** + * Validate wp_remote_get response. + * + * @param $response + * + * @return bool true if invalid + */ + protected function validate_response( $response ) { + if ( empty( $response ) || isset( $response->message ) ) { + return true; + } + + return false; + } + + /** + * Returns site_transient and checks/stores transient id in array. + * + * @return array + */ + protected function get_transient() { + $repo = isset( $this->type->repo ) ? $this->type->repo : 'ghu'; + $transient = 'ghu-' . md5( $repo ); + if ( ! in_array( $transient, self::$transients, true ) ) { + self::$transients[] = $transient; + } + + return get_site_transient( $transient ); + } + + /** + * Used to set_site_transient and checks/stores transient id in array. + * + * @param $id + * @param $response + * + * @return bool + */ + protected function set_transient( $id, $response ) { + $repo = isset( $this->type ) ? $this->type->repo : 'ghu'; + $transient = 'ghu-' . md5( $repo ); + $this->response[ $id ] = $response; + if ( ! in_array( $transient, self::$transients, true ) ) { + self::$transients[] = $transient; + } + set_site_transient( $transient, $this->response, ( self::$hours * HOUR_IN_SECONDS ) ); + + return true; + } + + /** + * Create release asset download link. + * Filename must be `{$slug}-{$newest_tag}.zip` + * + * @return string $download_link + */ + protected function make_release_asset_download_link() { + switch ( $this->type->type ) { + case 'github_plugin': + case 'github_theme': + $download_link = implode( '/', array( + 'https://github.com', + $this->type->owner, + $this->type->repo, + 'releases/download', + $this->type->newest_tag, + $this->type->repo . '-' . $this->type->newest_tag . '.zip', + ) ); + break; + case 'bitbucket_plugin': + case 'bitbucket_theme': + $download_link = implode( '/', array( + 'https://bitbucket.org', + $this->type->owner, + $this->type->repo, + 'downloads', + $this->type->repo . '-' . $this->type->newest_tag . '.zip', + ) ); + break; + } + return $download_link; + } + +} diff --git a/www/wp-content/plugins/github-updater/src/GitHub_Updater/Additions.php b/www/wp-content/plugins/github-updater/src/GitHub_Updater/Additions.php new file mode 100755 index 0000000..2eb4f24 --- /dev/null +++ b/www/wp-content/plugins/github-updater/src/GitHub_Updater/Additions.php @@ -0,0 +1,127 @@ +add_plugin_headers( $config, $repos ); + } + if ( 'theme' === $type ) { + $this->add_theme_headers( $config, $repos ); + } + } + + /** + * Add GitHub Updater plugin header. + * Adds extra header in Class Plugins via hook. + * + * @param $config + * @param $repos + */ + protected function add_plugin_headers( $config, $repos ) { + $this->add_to_github_updater = array(); + foreach ( $config as $repo ) { + if ( false !== strpos( $repo['type'], 'theme' ) ) { + continue; + } + $addition = $repos[ $repo['slug'] ]; + switch ( $repo['type'] ) { + case 'github_plugin': + $addition['GitHub Plugin URI'] = $repo['uri']; + break; + case 'bitbucket_plugin': + $addition['Bitbucket Plugin URI'] = $repo['uri']; + break; + case 'gitlab_plugin': + $addition['GitLab Plugin URI'] = $repo['uri']; + break; + } + $this->add_to_github_updater[ $repo['slug'] ] = $addition; + } + } + + /** + * Add GitHub Updater theme header. + * Adds header URI into Class Theme via hook. + * + * @param $config + * @param $theme + */ + public function add_theme_headers( $config, $theme ) { + $this->add_to_github_updater = array(); + foreach ( $config as $repo ) { + if ( false !== strpos( $repo['type'], 'plugin' ) ) { + continue; + } + $addition = $theme[ $repo['slug'] ]; + switch ( $repo['type'] ) { + case 'github_theme': + $addition['GitHub Theme URI'] = $repo['uri']; + break; + case + 'bitbucket_theme': + $addition['Bitbucket Theme URI'] = $repo['uri']; + break; + case 'gitlab_theme': + $addition['GitLab Theme URI'] = $repo['uri']; + break; + } + $addition['slug'] = $repo['slug']; + $this->add_to_github_updater[ $repo['slug'] ] = $addition; + } + } + +} diff --git a/www/wp-content/plugins/github-updater/src/GitHub_Updater/Autoloader.php b/www/wp-content/plugins/github-updater/src/GitHub_Updater/Autoloader.php new file mode 100755 index 0000000..25b4e04 --- /dev/null +++ b/www/wp-content/plugins/github-updater/src/GitHub_Updater/Autoloader.php @@ -0,0 +1,84 @@ + + * @author Barry Hughes + * @license GPL-2.0+ + * @link http://github.com/afragen/autoloader + * @copyright 2015 Andy Fragen + * @version 2.0.0 + */ +class Autoloader { + /** + * Roots to scan when autoloading. + * @var array + */ + protected $roots = array(); + + /** + * List of class names and locations in filesystem, for situations + * where they deviate from convention etc. + * @var array + */ + protected $map = array(); + + + /** + * Constructor + * + * @param array $roots + * @param array $static_map + */ + public function __construct( array $roots, array $static_map = null ) { + $this->roots = $roots; + if ( null !== $static_map ) { + $this->map = $static_map; + } + spl_autoload_register( array( $this, 'autoload' ) ); + } + + /** + * Load classes + * + * @param $class + */ + protected function autoload( $class ) { + // Check for a static mapping first of all + if ( isset( $this->map[ $class ] ) && file_exists( $this->map[ $class ] ) ) { + include $this->map[ $class ]; + return; + } + + // Else scan the namespace roots + foreach ( $this->roots as $namespace => $root_dir ) { + // If the class doesn't belong to this namespace, move on to the next root + if ( 0 !== strpos( $class, $namespace ) ) { + continue; + } + + // Determine the possible path to the class + $path = substr( $class, strlen( $namespace ) + 1 ); + $path = str_replace( '\\', DIRECTORY_SEPARATOR, $path ); + $path = $root_dir . DIRECTORY_SEPARATOR . $path . '.php'; + + // Test for its existence and load if present + if ( file_exists( $path ) ) { + include $path; + } + } + } +} diff --git a/www/wp-content/plugins/github-updater/src/GitHub_Updater/Base.php b/www/wp-content/plugins/github-updater/src/GitHub_Updater/Base.php new file mode 100755 index 0000000..b99ee88 --- /dev/null +++ b/www/wp-content/plugins/github-updater/src/GitHub_Updater/Base.php @@ -0,0 +1,930 @@ +type-repo => $code ) + */ + protected static $error_code = array(); + + /** + * Holds git server types. + * @var array + */ + protected static $git_servers = array( + 'github' => 'GitHub', + 'bitbucket' => 'Bitbucket', + 'gitlab' => 'GitLab', + ); + + /** + * Holds extra repo header types. + * @var array + */ + protected static $extra_repo_headers = array( + 'branch' => 'Branch', + 'enterprise' => 'Enterprise', + 'gitlab_ce' => 'CE', + ); + + /** + * Constructor. + * Loads options to private static variable. + */ + public function __construct() { + self::$options = get_site_option( 'github_updater', array() ); + self::$options_remote = get_site_option( 'github_updater_remote_management', array() ); + $this->add_headers(); + + /* + * Calls in init hook for user capabilities. + */ + add_action( 'init', array( &$this, 'init' ) ); + add_action( 'init', array( &$this, 'background_update' ) ); + add_action( 'init', array( &$this, 'token_distribution' ) ); + + add_filter( 'http_request_args', array( 'Fragen\\GitHub_Updater\\API', 'http_request_args' ), 10, 2 ); + } + + /** + * Instantiate Plugin, Theme, and Settings for proper user capabilities. + * + * @return bool + */ + public function init() { + global $pagenow; + + // Set $force_meta_update = true on appropriate admin pages. + $force_meta_update = false; + $admin_pages = array( + 'plugins.php', 'plugin-install.php', + 'themes.php', 'theme-install.php', + 'update-core.php', 'update.php', + 'options-general.php', 'settings.php', + ); + foreach ( array_keys( Settings::$remote_management ) as $key ) { + // Remote management only needs to be active for admin pages. + if ( is_admin() && ! empty( self::$options_remote[ $key ] ) ) { + $admin_pages = array_merge( $admin_pages, array( 'index.php' ) ); + } + } + + if ( in_array( $pagenow, array_unique( $admin_pages ) ) ) { + $force_meta_update = true; + } + + // Added for ajax plugin updating. + if ( 'admin-ajax.php' === $pagenow && + ( isset( $_POST['action'] ) && 'update-plugin' === $_POST['action'] ) + ) { + $force_meta_update = true; + add_filter( 'wp_ajax_update_plugin_result', array( &$this, 'wp_ajax_update_plugin_result' ), 10, 1 ); + } + + if ( current_user_can( 'update_plugins' ) ) { + Plugin::$object = Plugin::instance(); + if ( $force_meta_update ) { + Plugin::$object->get_remote_plugin_meta(); + } + } + if ( current_user_can( 'update_themes' ) ) { + Theme::$object = Theme::instance(); + if ( $force_meta_update ) { + Theme::$object->get_remote_theme_meta(); + } + } + if ( is_admin() && + ( current_user_can( 'update_plugins' ) || current_user_can( 'update_themes' ) ) && + ! apply_filters( 'github_updater_hide_settings', false ) + ) { + new Settings(); + } + + return true; + } + + /** + * Piggyback on built-in update function to get metadata. + */ + public function background_update() { + add_action( 'wp_update_plugins', array( &$this, 'forced_meta_update_plugins' ) ); + add_action( 'wp_update_themes', array( &$this, 'forced_meta_update_themes' ) ); + add_action( 'wp_ajax_nopriv_ithemes_sync_request', array( &$this, 'forced_meta_update_remote_management' ) ); + } + + /** + * Performs actual plugin metadata fetching. + */ + public function forced_meta_update_plugins() { + Plugin::$object = Plugin::instance(); + Plugin::$object->get_remote_plugin_meta(); + } + + /** + * Performs actual theme metadata fetching. + */ + public function forced_meta_update_themes() { + Theme::$object = Theme::instance(); + Theme::$object->get_remote_theme_meta(); + } + + /** + * Calls $this->forced_meta_update_plugins() and $this->forced_meta_update_themes() + * for remote management services. + */ + public function forced_meta_update_remote_management() { + $this->forced_meta_update_plugins(); + $this->forced_meta_update_themes(); + } + + /** + * Allows developers to use 'github_updater_token_distribution' hook to set GitHub Access Tokens. + * Saves results of filter hook to self::$options. + * + * Hook requires return of single element array. + * $key === repo-name and $value === token + * e.g. array( 'repo-name' => 'access_token' ); + */ + public function token_distribution() { + $config = apply_filters( 'github_updater_token_distribution', array() ); + if ( ! empty( $config ) && 1 === count( $config ) ) { + $config = Settings::sanitize( $config ); + self::$options = array_merge( get_site_option( 'github_updater' ), $config ); + update_site_option( 'github_updater', self::$options ); + } + } + + /** + * Add extra headers via filter hooks. + */ + public function add_headers() { + add_filter( 'extra_plugin_headers', array( &$this, 'add_plugin_headers' ) ); + add_filter( 'extra_theme_headers', array( &$this, 'add_theme_headers' ) ); + } + + /** + * Add extra headers to get_plugins(). + * + * @param $extra_headers + * + * @return array + */ + public function add_plugin_headers( $extra_headers ) { + $ghu_extra_headers = array( + 'Requires WP' => 'Requires WP', + 'Requires PHP' => 'Requires PHP', + 'Release Asset' => 'Release Asset', + ); + + foreach ( self::$git_servers as $server ) { + $ghu_extra_headers[ $server . ' Plugin URI' ] = $server . ' Plugin URI'; + foreach ( self::$extra_repo_headers as $header ) { + $ghu_extra_headers[ $server . ' ' . $header ] = $server . ' ' . $header; + } + } + + self::$extra_headers = array_unique( array_merge( self::$extra_headers, $ghu_extra_headers ) ); + $extra_headers = array_merge( (array) $extra_headers, (array) $ghu_extra_headers ); + + return $extra_headers; + } + + /** + * Add extra headers to wp_get_themes(). + * + * @param $extra_headers + * + * @return array + */ + public function add_theme_headers( $extra_headers ) { + $ghu_extra_headers = array( + 'Requires WP' => 'Requires WP', + 'Requires PHP' => 'Requires PHP', + 'Release Asset' => 'Release Asset', + ); + + foreach ( self::$git_servers as $server ) { + $ghu_extra_headers[ $server . ' Theme URI' ] = $server . ' Theme URI'; + foreach ( self::$extra_repo_headers as $header ) { + $ghu_extra_headers[ $server . ' ' . $header ] = $server . ' ' . $header; + } + } + + self::$extra_headers = array_unique( array_merge( self::$extra_headers, $ghu_extra_headers ) ); + $extra_headers = array_merge( (array) $extra_headers, (array) $ghu_extra_headers ); + + return $extra_headers; + } + + /** + * Set default values for plugin/theme. + * + * @param $type + */ + protected function set_defaults( $type ) { + if ( ! isset( self::$options['branch_switch'] ) ) { + self::$options['branch_switch'] = null; + } + if ( ! isset( self::$options[ $this->$type->repo ] ) ) { + self::$options[ $this->$type->repo ] = null; + add_site_option( 'github_updater', self::$options ); + } + + $this->$type->remote_version = '0.0.0'; + $this->$type->newest_tag = '0.0.0'; + $this->$type->download_link = null; + $this->$type->tags = array(); + $this->$type->rollback = array(); + $this->$type->branches = array(); + $this->$type->requires = null; + $this->$type->tested = null; + $this->$type->donate_link = null; + $this->$type->contributors = array(); + $this->$type->downloaded = 0; + $this->$type->last_updated = null; + $this->$type->rating = 0; + $this->$type->num_ratings = 0; + $this->$type->transient = array(); + $this->$type->repo_meta = array(); + $this->$type->private = true; + $this->$type->watchers = 0; + $this->$type->forks = 0; + $this->$type->open_issues = 0; + $this->$type->score = 0; + $this->$type->requires_wp_version = '3.8.0'; + $this->$type->requires_php_version = '5.3'; + $this->$type->release_asset = false; + } + + /** + * Load post-update filters. + */ + public function load_post_filters() { + add_filter( 'upgrader_source_selection', array( &$this, 'upgrader_source_selection' ), 10, 4 ); + } + + /** + * Used for renaming of sources to ensure correct directory name. + * + * @since WordPress 4.4.0 The $hook_extra parameter became available. + * + * @param $source + * @param $remote_source + * @param $upgrader + * @param $hook_extra + * + * @return string + */ + public function upgrader_source_selection( $source, $remote_source, $upgrader, $hook_extra = null ) { + global $wp_filesystem, $plugins, $themes; + $slug = null; + $repo = null; + $new_source = null; + + /* + * Exit for mismatch. + */ + if ( $upgrader instanceof \Plugin_Upgrader && $this instanceof Theme || + $upgrader instanceof \Theme_Upgrader && $this instanceof Plugin + ) { + return $source; + } + + /* + * Rename plugins. + */ + if ( $upgrader instanceof \Plugin_Upgrader && $this instanceof Plugin ) { + if ( isset( $hook_extra['plugin'] ) ) { + $slug = dirname( $hook_extra['plugin'] ); + $new_source = trailingslashit( $remote_source ) . $slug; + } + + /* + * Pre-WordPress 4.4 + */ + if ( $plugins && empty( $hook_extra ) ) { + foreach ( array_reverse( $plugins ) as $plugin ) { + $slug = dirname( $plugin ); + if ( false !== stristr( basename( $source ), dirname( $plugin ) ) ) { + $new_source = trailingslashit( $remote_source ) . dirname( $plugin ); + break; + } + } + } + if ( ! $plugins && empty( $hook_extra ) ) { + if ( isset( $upgrader->skin->plugin ) ) { + $slug = dirname( $upgrader->skin->plugin ); + } + if ( empty( $slug ) && isset( $_POST['slug'] ) ) { + $slug = sanitize_text_field( $_POST['slug'] ); + } + $new_source = trailingslashit( $remote_source ) . $slug; + } + + /* + * Plugin directory is misnamed to start. + */ + if ( ! in_array( $slug, $this->config ) ) { + foreach ( $this->config as $plugin ) { + if ( $slug === dirname( $plugin->slug ) ) { + $slug = $plugin->repo; + $new_source = trailingslashit( $remote_source ) . $slug; + break; + } + } + } + } + + /* + * Rename themes. + */ + if ( $upgrader instanceof \Theme_Upgrader && $this instanceof Theme ) { + if ( isset( $hook_extra['theme'] ) ) { + $slug = $hook_extra['theme']; + $new_source = trailingslashit( $remote_source ) . $slug; + } + + /* + * Pre-WordPress 4.4 + */ + if ( $themes && empty( $hook_extra ) ) { + foreach ( $themes as $theme ) { + $slug = $theme; + if ( false !== stristr( basename( $source ), $theme ) ) { + $new_source = trailingslashit( $remote_source ) . $theme; + break; + } + } + } + if ( ! $themes && empty( $hook_extra ) ) { + if ( isset( $upgrader->skin->theme ) ) { + $slug = $upgrader->skin->theme; + } + $new_source = trailingslashit( $remote_source ) . $slug; + } + } + + $repo = $this->get_repo_slugs( $slug ); + + /* + * Not GitHub Updater plugin/theme. + */ + if ( ! isset( $_POST['github_updater_repo'] ) && empty( $repo ) ) { + return $source; + } + + /* + * Remote install source. + */ + if ( isset( self::$options['github_updater_install_repo'] ) ) { + $repo['repo'] = self::$options['github_updater_install_repo']; + $new_source = trailingslashit( $remote_source ) . self::$options['github_updater_install_repo']; + } + + /* + * Revert extended naming if previously present. + */ + if ( $this instanceof Plugin && + ( ! defined( 'GITHUB_UPDATER_EXTENDED_NAMING' ) || ! GITHUB_UPDATER_EXTENDED_NAMING ) && + $slug !== $repo['repo'] + ) { + $new_source = trailingslashit( $remote_source ) . $repo['repo']; + } + + /* + * Extended naming. + * Only for plugins and not for 'master' === branch && .org hosted. + */ + if ( $this instanceof Plugin && + ( defined( 'GITHUB_UPDATER_EXTENDED_NAMING' ) && GITHUB_UPDATER_EXTENDED_NAMING ) && + ( ! $this->config[ $repo['repo'] ]->dot_org || + ( $this->tag && 'master' !== $this->tag ) ) + ) { + $new_source = trailingslashit( $remote_source ) . $repo['extended_repo']; + printf( esc_html__( 'Rename successful using extended name to %1$s', 'github-updater' ) . '…
', + '' . $repo['extended_repo'] . '' + ); + } + + $wp_filesystem->move( $source, $new_source ); + + return trailingslashit( $new_source ); + } + + /** + * Set array with normal and extended repo names. + * Fix name even if installed without renaming originally. + * + * @param $slug + * + * @return array + */ + protected function get_repo_slugs( $slug ) { + $arr = array(); + $rename = explode( '-', $slug ); + array_pop( $rename ); + $rename = implode( '-', $rename ); + + foreach ( $this->config as $repo ) { + if ( $slug === $repo->repo || + $slug === $repo->extended_repo || + $rename === $repo->owner . '-' . $repo->repo + ) { + $arr['repo'] = $repo->repo; + $arr['extended_repo'] = $repo->extended_repo; + break; + } + } + + return $arr; + } + + /** + * Take remote file contents as string and parse headers. + * + * @param $contents + * @param $type + * + * @return array + */ + protected function get_file_headers( $contents, $type ) { + + $default_plugin_headers = array( + 'Name' => 'Plugin Name', + 'PluginURI' => 'Plugin URI', + 'Version' => 'Version', + 'Description' => 'Description', + 'Author' => 'Author', + 'AuthorURI' => 'Author URI', + 'TextDomain' => 'Text Domain', + 'DomainPath' => 'Domain Path', + 'Network' => 'Network', + ); + + $default_theme_headers = array( + 'Name' => 'Theme Name', + 'ThemeURI' => 'Theme URI', + 'Description' => 'Description', + 'Author' => 'Author', + 'AuthorURI' => 'Author URI', + 'Version' => 'Version', + 'Template' => 'Template', + 'Status' => 'Status', + 'Tags' => 'Tags', + 'TextDomain' => 'Text Domain', + 'DomainPath' => 'Domain Path', + ); + + if ( false !== strpos( $type, 'plugin' ) ) { + $all_headers = $default_plugin_headers; + } + + if ( false !== strpos( $type, 'theme' ) ) { + $all_headers = $default_theme_headers; + } + + /* + * Make sure we catch CR-only line endings. + */ + $file_data = str_replace( "\r", "\n", $contents ); + + /* + * Merge extra headers and default headers. + */ + $all_headers = array_merge( self::$extra_headers, (array) $all_headers ); + $all_headers = array_unique( $all_headers ); + + foreach ( $all_headers as $field => $regex ) { + if ( preg_match( '/^[ \t\/*#@]*' . preg_quote( $regex, '/' ) . ':(.*)$/mi', $file_data, $match ) && $match[1] ) { + $all_headers[ $field ] = _cleanup_header_comment( $match[1] ); + } else { + $all_headers[ $field ] = ''; + } + } + + return $all_headers; + } + + /** + * Get filename of changelog and return. + * + * @param $type + * + * @return bool or variable + */ + protected function get_changelog_filename( $type ) { + $changelogs = array( 'CHANGES.md', 'CHANGELOG.md', 'changes.md', 'changelog.md' ); + $changes = null; + $local_files = null; + + if ( is_dir( $this->$type->local_path ) ) { + $local_files = scandir( $this->$type->local_path ); + } elseif ( is_dir( $this->$type->local_path_extended ) ) { + $local_files = scandir( $this->$type->local_path_extended ); + } + + $changes = array_intersect( (array) $local_files, $changelogs ); + $changes = array_pop( $changes ); + + if ( ! empty( $changes ) ) { + return $changes; + } + + return false; + } + + + /** + * Function to check if plugin or theme object is able to be updated. + * + * @param $type + * + * @return bool + */ + public function can_update( $type ) { + global $wp_version; + + $remote_is_newer = version_compare( $type->remote_version, $type->local_version, '>' ); + $wp_version_ok = version_compare( $wp_version, $type->requires_wp_version,'>=' ); + $php_version_ok = version_compare( PHP_VERSION, $type->requires_php_version, '>=' ); + + if ( ( isset( $this->tag ) && $this->tag ) && + ( isset( $_GET['plugin'] ) && $type->slug === $_GET['plugin'] ) + ) { + $remote_is_newer = true; + } + + return $remote_is_newer && $wp_version_ok && $php_version_ok; + } + + /** + * Parse URI param returning array of parts. + * + * @param $repo_header + * + * @return array + */ + protected function parse_header_uri( $repo_header ) { + $header_parts = parse_url( $repo_header ); + $header['scheme'] = isset( $header_parts['scheme'] ) ? $header_parts['scheme'] : null; + $header['host'] = isset( $header_parts['host'] ) ? $header_parts['host'] : null; + $owner_repo = trim( $header_parts['path'], '/' ); // strip surrounding slashes + $owner_repo = str_replace( '.git', '', $owner_repo ); //strip incorrect URI ending + $header['path'] = $owner_repo; + $owner_repo = explode( '/', $owner_repo ); + $header['owner'] = $owner_repo[0]; + $header['repo'] = $owner_repo[1]; + $header['owner_repo'] = isset( $header['owner'] ) ? $header['owner'] . '/' . $header['repo'] : null; + $header['base_uri'] = str_replace( $header_parts['path'], '', $repo_header ); + $header['uri'] = isset( $header['scheme'] ) ? trim( $repo_header, '/' ) : null; + + $header = Settings::sanitize( $header ); + + return $header; + } + + /** + * Create repo parts. + * + * @param $repo + * @param $type + * + * @return mixed + */ + protected function get_repo_parts( $repo, $type ) { + $arr['bool'] = false; + $pattern = '/' . strtolower( $repo ) . '_/'; + $type = preg_replace( $pattern, '', $type ); + $repo_types = array( + 'GitHub' => 'github_' . $type, + 'Bitbucket' => 'bitbucket_'. $type, + 'GitLab' => 'gitlab_' . $type, + ); + $repo_base_uris = array( + 'GitHub' => 'https://github.com/', + 'Bitbucket' => 'https://bitbucket.org/', + 'GitLab' => 'https://gitlab.com/', + ); + + if ( array_key_exists( $repo, $repo_types ) ) { + $arr['type'] = $repo_types[ $repo ]; + $arr['git_server'] = strtolower( $repo ); + $arr['base_uri'] = $repo_base_uris[ $repo ]; + $arr['bool'] = true; + foreach ( self::$extra_repo_headers as $key => $value ) { + $arr[ $key ] = $repo . ' ' . $value; + } + } + + return $arr; + } + + /** + * Delete all transients from array of transient ids. + * + * @param $type + * + * @return bool|void + */ + protected function delete_all_transients( $type ) { + $transients = get_site_transient( 'ghu-' . $type ); + if ( ! $transients ) { + return false; + } + + foreach ( $transients as $transient ) { + delete_site_transient( $transient ); + } + delete_site_transient( 'ghu-' . $type ); + + return true; + } + + /** + * Create transient of $type transients for force-check. + * + * @param $type + * + * @return void|bool + */ + protected function make_force_check_transient( $type ) { + $transient = get_site_transient( 'ghu-' . $type ); + if ( $transient ) { + return false; + } + set_site_transient( 'ghu-' . $type, self::$transients, ( self::$hours * HOUR_IN_SECONDS ) ); + self::$transients = array(); + + return true; + } + + /** + * Set repo object file info. + * + * @param $response + */ + protected function set_file_info( $response ) { + $this->type->transient = $response; + $this->type->remote_version = strtolower( $response['Version'] ); + $this->type->requires_php_version = ! empty( $response['Requires PHP'] ) ? $response['Requires PHP'] : $this->type->requires_php_version; + $this->type->requires_wp_version = ! empty( $response['Requires WP'] ) ? $response['Requires WP'] : $this->type->requires_wp_version; + $this->type->release_asset = ! empty( $response['Release Asset'] ) && 'true' === $response['Release Asset'] ? true : false; + } + + /** + * Parse tags and set object data. + * + * @param $response + * @param $repo_type + * + * @return bool + */ + protected function parse_tags( $response, $repo_type ) { + $tags = array(); + $rollback = array(); + if ( false !== $response ) { + switch ( $repo_type['repo'] ) { + case 'github': + foreach ( (array) $response as $tag ) { + if ( isset( $tag->name, $tag->zipball_url ) ) { + $tags[] = $tag->name; + $rollback[ $tag->name ] = $tag->zipball_url; + } + } + break; + case 'bitbucket': + foreach ( (array) $response as $num => $tag ) { + $download_base = implode( '/', array( $repo_type['base_download'], $this->type->owner, $this->type->repo, 'get/' ) ); + if ( isset( $num ) ) { + $tags[] = $num; + $rollback[ $num ] = $download_base . $num . '.zip'; + } + } + break; + case 'gitlab': + foreach ( (array) $response as $tag ) { + $download_link = implode( '/', array( $repo_type['base_download'], $this->type->owner, $this->type->repo, 'repository/archive.zip' ) ); + $download_link = add_query_arg( 'ref', $tag->name, $download_link ); + if ( isset( $tag->name ) ) { + $tags[] = $tag->name; + $rollback[ $tag->name ] = $download_link; + } + } + break; + } + + } + if ( empty( $tags ) ) { + return false; + } + + usort( $tags, 'version_compare' ); + krsort( $rollback ); + + $newest_tag = null; + $newest_tag_key = key( array_slice( $tags, -1, 1, true ) ); + $newest_tag = $tags[ $newest_tag_key ]; + + $this->type->newest_tag = $newest_tag; + $this->type->tags = $tags; + $this->type->rollback = $rollback; + + return true; + } + + /** + * Set data from readme.txt. + * Prefer changelog from CHANGES.md. + * + * @param $response + * + * @return bool + */ + protected function set_readme_info( $response ) { + $readme = array(); + foreach ( $this->type->sections as $section => $value ) { + if ( 'description' === $section ) { + continue; + } + $readme['sections/' . $section ] = $value; + } + foreach ( $readme as $key => $value ) { + $key = explode( '/', $key ); + if ( ! empty( $value ) && 'sections' === $key[0] ) { + unset( $response['sections'][ $key[1] ] ); + } + } + + $response['sections']['other_notes'] = ! empty( $response['remaining_content'] ) ? $response['remaining_content'] : null; + if ( empty( $response['sections']['other_notes'] ) ) { + unset( $response['sections']['other_notes'] ); + } + unset( $response['sections']['screenshots'] ); + unset( $response['sections']['installation'] ); + $this->type->sections = array_merge( (array) $this->type->sections, (array) $response['sections'] ); + $this->type->tested = $response['tested_up_to']; + $this->type->requires = $response['requires_at_least']; + $this->type->donate_link = $response['donate_link']; + $this->type->contributors = $response['contributors']; + + return true; + } + + /** + * Create some sort of rating from 0 to 100 for use in star ratings. + * I'm really just making this up, more based upon popularity. + * + * @param $repo_meta + * + * @return integer + */ + protected function make_rating( $repo_meta ) { + $watchers = empty( $repo_meta->watchers ) ? $this->type->watchers : $repo_meta->watchers; + $forks = empty( $repo_meta->forks ) ? $this->type->forks : $repo_meta->forks; + $open_issues = empty( $repo_meta->open_issues ) ? $this->type->open_issues : $repo_meta->open_issues; + $score = empty( $repo_meta->score ) ? $this->type->score : $repo_meta->score; //what is this anyway? + + $rating = round( $watchers + ( $forks * 1.5 ) - $open_issues + $score ); + + if ( 100 < $rating ) { + return 100; + } + + return (integer) $rating; + } + + /** + * Test to exit early if no update available, saves API calls. + * + * @param $response array|bool + * @param $branch bool + * + * @return bool + */ + protected function exit_no_update( $response, $branch = false ) { + if ( $branch ) { + $options = get_site_option( 'github_updater' ); + return empty( $options['branch_switch'] ); + } + if ( ! isset( $_GET['force-check'] ) ) { + if ( ! $response && ! $this->can_update( $this->type ) ) { + return true; + } + } + + return false; + } + + /** + * Get local file info if no update available. Save API calls. + * + * @param $repo + * @param $file + * + * @return null|string + */ + protected function get_local_info( $repo, $file ) { + $response = null; + + if ( isset( $_GET['force-check'] ) ) { + return $response; + } + + if ( is_dir( $repo->local_path ) ) { + if ( file_exists( $repo->local_path . $file ) ) { + $response = file_get_contents( $repo->local_path . $file ); + } + } elseif ( is_dir( $repo->local_path_extended ) ) { + if ( file_exists( $repo->local_path_extended . $file ) ) { + $response = file_get_contents( $repo->local_path_extended . $file ); + } + } + + switch ( $repo->type ) { + case 'github_plugin': + case 'github_theme': + $response = base64_encode( $response ); + break; + case 'bitbucket_plugin': + case 'bitbucket_theme': + break; + case 'gitlab_plugin': + case 'gitlab_theme': + $response = base64_encode( $response ); + break; + } + + return $response; + } + +} diff --git a/www/wp-content/plugins/github-updater/src/GitHub_Updater/Bitbucket_API.php b/www/wp-content/plugins/github-updater/src/GitHub_Updater/Bitbucket_API.php new file mode 100755 index 0000000..7e6c037 --- /dev/null +++ b/www/wp-content/plugins/github-updater/src/GitHub_Updater/Bitbucket_API.php @@ -0,0 +1,425 @@ +type = $type; + parent::$hours = 12; + $this->response = $this->get_transient(); + + add_filter( 'http_request_args', array( &$this, 'maybe_authenticate_http' ), 10, 2 ); + add_filter( 'http_request_args', array( &$this, 'http_release_asset_auth' ), 15, 2 ); + + if ( ! isset( self::$options['bitbucket_username'] ) ) { + self::$options['bitbucket_username'] = null; + } + if ( ! isset( self::$options['bitbucket_password'] ) ) { + self::$options['bitbucket_password'] = null; + } + add_site_option( 'github_updater', self::$options ); + } + + /** + * Read the remote file and parse headers. + * + * @param $file + * + * @return bool + */ + public function get_remote_info( $file ) { + $response = isset( $this->response[ $file ] ) ? $this->response[ $file ] : false; + + if ( ! $response ) { + if ( empty( $this->type->branch ) ) { + $this->type->branch = 'master'; + } + $response = $this->api( '/1.0/repositories/:owner/:repo/src/' . trailingslashit( $this->type->branch ) . $file ); + + if ( $response ) { + $contents = $response->data; + $response = $this->get_file_headers( $contents, $this->type->type ); + $this->set_transient( $file, $response ); + } + } + + if ( $this->validate_response( $response ) || ! is_array( $response ) ) { + return false; + } + + $this->set_file_info( $response ); + + return true; + } + + /** + * Get the remote info to for tags. + * + * @return bool + */ + public function get_remote_tag() { + $repo_type = $this->return_repo_type(); + $response = isset( $this->response['tags'] ) ? $this->response['tags'] : false; + + if ( $this->exit_no_update( $response ) ) { + return false; + } + + if ( ! $response ) { + $response = $this->api( '/1.0/repositories/:owner/:repo/tags' ); + $arr_resp = (array) $response; + + if ( ! $response || ! $arr_resp ) { + $response = new \stdClass(); + $response->message = 'No tags found'; + } + + if ( $response ) { + $this->set_transient( 'tags', $response ); + } + } + + if ( $this->validate_response( $response ) ) { + return false; + } + + $this->parse_tags( $response, $repo_type ); + + return true; + } + + /** + * Read the remote CHANGES.md file + * + * @param $changes + * + * @return bool + */ + public function get_remote_changes( $changes ) { + $response = isset( $this->response['changes'] ) ? $this->response['changes'] : false; + + /* + * Set $response from local file if no update available. + */ + if ( ! $response && ! $this->can_update( $this->type ) ) { + $response = new \stdClass(); + $content = $this->get_local_info( $this->type, $changes ); + if ( $content ) { + $response->data = $content; + $this->set_transient( 'changes', $response ); + } else { + $response = false; + } + } + + if ( ! $response ) { + if ( ! isset( $this->type->branch ) ) { + $this->type->branch = 'master'; + } + $response = $this->api( '/1.0/repositories/:owner/:repo/src/' . trailingslashit( $this->type->branch ) . $changes ); + + if ( ! $response ) { + $response = new \stdClass(); + $response->message = 'No changelog found'; + } + + if ( $response ) { + $this->set_transient( 'changes', $response ); + } + } + + if ( $this->validate_response( $response ) ) { + return false; + } + + $changelog = isset( $this->response['changelog'] ) ? $this->response['changelog'] : false; + + if ( ! $changelog ) { + $parser = new \Parsedown; + $changelog = $parser->text( $response->data ); + $this->set_transient( 'changelog', $changelog ); + } + + $this->type->sections['changelog'] = $changelog; + + return true; + } + + /** + * Read and parse remote readme.txt. + * + * @return bool + */ + public function get_remote_readme() { + if ( ! file_exists( $this->type->local_path . 'readme.txt' ) && + ! file_exists( $this->type->local_path_extended . 'readme.txt' ) + ) { + return false; + } + + $response = isset( $this->response['readme'] ) ? $this->response['readme'] : false; + + /* + * Set $response from local file if no update available. + */ + if ( ! $response && ! $this->can_update( $this->type ) ) { + $response = new \stdClass(); + $content = $this->get_local_info( $this->type, 'readme.txt' ); + if ( $content ) { + $response->data = $content; + } else { + $response = false; + } + } + + if ( ! $response ) { + if ( ! isset( $this->type->branch ) ) { + $this->type->branch = 'master'; + } + $response = $this->api( '/1.0/repositories/:owner/:repo/src/' . trailingslashit( $this->type->branch ) . 'readme.txt' ); + + if ( ! $response ) { + $response = new \stdClass(); + $response->message = 'No readme found'; + } + + } + + if ( $response && isset( $response->data ) ) { + $parser = new Readme_Parser; + $response = $parser->parse_readme( $response->data ); + $this->set_transient( 'readme', $response ); + } + + if ( $this->validate_response( $response ) ) { + return false; + } + + $this->set_readme_info( $response ); + + return true; + } + + /** + * Read the repository meta from API + * + * @return bool + */ + public function get_repo_meta() { + $response = isset( $this->response['meta'] ) ? $this->response['meta'] : false; + + if ( $this->exit_no_update( $response ) ) { + return false; + } + + if ( ! $response ) { + $response = $this->api( '/2.0/repositories/:owner/:repo' ); + + if ( $response ) { + $this->set_transient( 'meta', $response ); + } + } + + if ( $this->validate_response( $response ) ) { + return false; + } + + $this->type->repo_meta = $response; + $this->_add_meta_repo_object(); + + return true; + } + + /** + * Create array of branches and download links as array. + * + * @return bool + */ + public function get_remote_branches() { + $branches = array(); + $response = isset( $this->response['branches'] ) ? $this->response['branches'] : false; + + if ( $this->exit_no_update( $response, true ) ) { + return false; + } + + if ( ! $response ) { + $response = $this->api( '/1.0/repositories/:owner/:repo/branches' ); + + if ( $response ) { + foreach ( $response as $branch => $api_response ) { + $branches[ $branch ] = $this->construct_download_link( false, $branch ); + } + $this->type->branches = $branches; + $this->set_transient( 'branches', $branches ); + return true; + } + } + + if ( $this->validate_response( $response ) ) { + return false; + } + + $this->type->branches = $response; + + return true; + } + + /** + * Construct $this->type->download_link using Bitbucket API + * + * @param boolean $rollback for theme rollback + * @param boolean $branch_switch for direct branch changing + * + * @return string $endpoint + */ + public function construct_download_link( $rollback = false, $branch_switch = false ) { + $download_link_base = implode( '/', array( 'https://bitbucket.org', $this->type->owner, $this->type->repo, 'get/' ) ); + $endpoint = ''; + + if ( $this->type->release_asset && '0.0.0' !== $this->type->newest_tag ) { + return $this->make_release_asset_download_link(); + } + + /* + * Check for rollback. + */ + if ( ! empty( $_GET['rollback'] ) && + ( isset( $_GET['action'] ) && 'upgrade-theme' === $_GET['action'] ) && + ( isset( $_GET['theme'] ) && $this->type->repo === $_GET['theme'] ) + ) { + $endpoint .= $rollback . '.zip'; + + // for users wanting to update against branch other than master or not using tags, else use newest_tag + } elseif ( 'master' != $this->type->branch || empty( $this->type->tags ) ) { + $endpoint .= $this->type->branch . '.zip'; + } else { + $endpoint .= $this->type->newest_tag . '.zip'; + } + + /* + * Create endpoint for branch switching. + */ + if ( $branch_switch ) { + $endpoint = $branch_switch . '.zip'; + } + + return $download_link_base . $endpoint; + } + + /** + * Add remote data to type object. + * @access private + */ + private function _add_meta_repo_object() { + $this->type->rating = $this->make_rating( $this->type->repo_meta ); + $this->type->last_updated = $this->type->repo_meta->updated_on; + $this->type->num_ratings = $this->type->watchers; + $this->type->private = $this->type->repo_meta->is_private; + } + + /** + * Add Basic Authentication $args to http_request_args filter hook + * for private Bitbucket repositories only. + * + * @param $args + * @param $url + * + * @return mixed $args + */ + public function maybe_authenticate_http( $args, $url ) { + if ( ! isset( $this->type ) || false === stristr( $url, 'bitbucket' ) ) { + return $args; + } + + $bitbucket_private = false; + $bitbucket_private_install = false; + + /* + * Check whether attempting to update private Bitbucket repo. + */ + if ( isset( $this->type->repo ) && + ! empty( parent::$options[ $this->type->repo ] ) && + false !== strpos( $url, $this->type->repo ) + ) { + $bitbucket_private = true; + } + + /* + * Check whether attempting to install private Bitbucket repo + * and abort if Bitbucket user/pass not set. + */ + if ( isset( $_POST['option_page'], $_POST['is_private'] ) && + 'github_updater_install' === $_POST['option_page'] && + 'bitbucket' === $_POST['github_updater_api'] && + ( ! empty( parent::$options['bitbucket_username'] ) || ! empty( parent::$options['bitbucket_password'] ) ) + ) { + $bitbucket_private_install = true; + } + + if ( $bitbucket_private || $bitbucket_private_install ) { + $username = parent::$options['bitbucket_username']; + $password = parent::$options['bitbucket_password']; + $args['headers']['Authorization'] = 'Basic ' . base64_encode( "$username:$password" ); + } + + return $args; + } + + /** + * Removes Basic Authentication header for Bitbucket Release Assets. + * Storage in AmazonS3 buckets, uses Query String Request Authentication Alternative. + * @link http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#RESTAuthenticationQueryStringAuth + * + * @param $args + * @param $url + * + * @return mixed + */ + public function http_release_asset_auth( $args, $url ) { + $arrURL = parse_url( $url ); + if ( 'bbuseruploads.s3.amazonaws.com' === $arrURL['host'] ) { + unset( $args['headers']['Authorization'] ); + } + + return $args; + } + + /** + * Added due to abstract class designation, not used for Bitbucket. + * + * @param $git + * @param $endpoint + */ + protected function add_endpoints( $git, $endpoint ) {} + +} diff --git a/www/wp-content/plugins/github-updater/src/GitHub_Updater/GitHub_API.php b/www/wp-content/plugins/github-updater/src/GitHub_Updater/GitHub_API.php new file mode 100755 index 0000000..306bfcf --- /dev/null +++ b/www/wp-content/plugins/github-updater/src/GitHub_Updater/GitHub_API.php @@ -0,0 +1,412 @@ +type = $type; + $this->response = $this->get_transient(); + } + + /** + * Read the remote file and parse headers. + * + * @param $file + * + * @return bool + */ + public function get_remote_info( $file ) { + $response = isset( $this->response[ $file ] ) ? $this->response[ $file ] : false; + + if ( ! $response ) { + $response = $this->api( '/repos/:owner/:repo/contents/' . $file ); + if ( ! isset( $response->content ) ) { + return false; + } + + if ( $response ) { + $contents = base64_decode( $response->content ); + $response = $this->get_file_headers( $contents, $this->type->type ); + $this->set_transient( $file, $response ); + } + } + + if ( $this->validate_response( $response ) || ! is_array( $response ) ) { + return false; + } + + $this->set_file_info( $response ); + + return true; + } + + /** + * Get remote info for tags. + * + * @return bool + */ + public function get_remote_tag() { + $repo_type = $this->return_repo_type(); + $response = isset( $this->response['tags'] ) ? $this->response['tags'] : false; + + if ( $this->exit_no_update( $response ) ) { + return false; + } + + if ( ! $response ) { + $response = $this->api( '/repos/:owner/:repo/tags' ); + + if ( ! $response ) { + $response = new \stdClass(); + $response->message = 'No tags found'; + } + + if ( $response ) { + $this->set_transient( 'tags', $response ); + } + } + + if ( $this->validate_response( $response ) ) { + return false; + } + + $this->parse_tags( $response, $repo_type ); + + return true; + } + + /** + * Read the remote CHANGES.md file. + * + * @param $changes + * + * @return bool + */ + public function get_remote_changes( $changes ) { + $response = isset( $this->response['changes'] ) ? $this->response['changes'] : false; + + /* + * Set response from local file if no update available. + */ + if ( ! $response && ! $this->can_update( $this->type ) ) { + $response = new \stdClass(); + $content = $this->get_local_info( $this->type, $changes ); + if ( $content ) { + $response->content = $content; + $this->set_transient( 'changes', $response ); + } else { + $response = false; + } + } + + if ( ! $response ) { + $response = $this->api( '/repos/:owner/:repo/contents/' . $changes ); + + if ( $response ) { + $this->set_transient( 'changes', $response ); + } + } + + if ( $this->validate_response( $response ) ) { + return false; + } + + $changelog = isset( $this->response['changelog'] ) ? $this->response['changelog'] : false; + + if ( ! $changelog ) { + $parser = new \Parsedown; + $changelog = $parser->text( base64_decode( $response->content ) ); + $this->set_transient( 'changelog', $changelog ); + } + + $this->type->sections['changelog'] = $changelog; + + return true; + } + + /** + * Read and parse remote readme.txt. + * + * @return bool + */ + public function get_remote_readme() { + if ( ! file_exists( $this->type->local_path . 'readme.txt' ) && + ! file_exists( $this->type->local_path_extended . 'readme.txt' ) + ) { + return false; + } + + $response = isset( $this->response['readme'] ) ? $this->response['readme'] : false; + + /* + * Set $response from local file if no update available. + */ + if ( ! $response && ! $this->can_update( $this->type ) ) { + $response = new \stdClass(); + $content = $this->get_local_info( $this->type, 'readme.txt' ); + if ( $content ) { + $response->content = $content; + } else { + $response = false; + } + } + + if ( ! $response ) { + $response = $this->api( '/repos/:owner/:repo/contents/readme.txt' ); + } + + if ( $response && isset( $response->content ) ) { + $parser = new Readme_Parser; + $response = $parser->parse_readme( base64_decode( $response->content ) ); + $this->set_transient( 'readme', $response ); + } + + if ( $this->validate_response( $response ) ) { + return false; + } + + $this->set_readme_info( $response ); + + return true; + } + + /** + * Read the repository meta from API. + * + * @return bool + */ + public function get_repo_meta() { + $response = isset( $this->response['meta'] ) ? $this->response['meta'] : false; + $meta_query = '?q=' . $this->type->repo . '+user:' . $this->type->owner; + + if ( $this->exit_no_update( $response ) ) { + return false; + } + + if ( ! $response ) { + $response = $this->api( '/search/repositories' . $meta_query ); + + if ( $response ) { + $this->set_transient( 'meta', $response ); + } + } + + if ( $this->validate_response( $response ) || empty( $response->items ) ) { + return false; + } + + $this->type->repo_meta = $response->items[0]; + $this->_add_meta_repo_object(); + + return true; + } + + /** + * Create array of branches and download links as array. + * + * @return bool + */ + public function get_remote_branches() { + $branches = array(); + $response = isset( $this->response['branches'] ) ? $this->response['branches'] : false; + + if ( $this->exit_no_update( $response, true ) ) { + return false; + } + + if ( ! $response ) { + $response = $this->api( '/repos/:owner/:repo/branches' ); + + if ( $response ) { + foreach ( $response as $branch ) { + $branches[ $branch->name ] = $this->construct_download_link( false, $branch->name ); + } + $this->type->branches = $branches; + $this->set_transient( 'branches', $branches ); + return true; + } + } + + if ( $this->validate_response( $response ) ) { + return false; + } + + $this->type->branches = $response; + + return true; + } + + /** + * Construct $this->type->download_link using Repository Contents API + * @url http://developer.github.com/v3/repos/contents/#get-archive-link + * + * @param boolean $rollback for theme rollback + * @param boolean $branch_switch for direct branch changing + * + * @return string $endpoint + */ + public function construct_download_link( $rollback = false, $branch_switch = false ) { + /* + * Check if using GitHub Self-Hosted. + */ + if ( ! empty( $this->type->enterprise_api ) ) { + $github_base = $this->type->enterprise_api; + } else { + $github_base = 'https://api.github.com'; + } + + $download_link_base = implode( '/', array( $github_base, 'repos', $this->type->owner, $this->type->repo, 'zipball/' ) ); + $endpoint = ''; + + if ( $this->type->release_asset && '0.0.0' !== $this->type->newest_tag ) { + return $this->make_release_asset_download_link(); + } + + /* + * Check for rollback. + */ + if ( ! empty( $_GET['rollback'] ) && + ( isset( $_GET['action'] ) && 'upgrade-theme' === $_GET['action'] ) && + ( isset( $_GET['theme'] ) && $this->type->repo === $_GET['theme'] ) + ) { + $endpoint .= $rollback; + + /* + * For users wanting to update against branch other than master + * or if not using tags, else use newest_tag. + */ + } elseif ( 'master' != $this->type->branch || empty( $this->type->tags ) ) { + $endpoint .= $this->type->branch; + } else { + $endpoint .= $this->type->newest_tag; + } + + /* + * Create endpoint for branch switching. + */ + if ( $branch_switch ) { + $endpoint = $branch_switch; + } + + $endpoint = $this->_add_access_token_endpoint( $this, $endpoint ); + + return $download_link_base . $endpoint; + } + + /** + * Add appropriate access token to endpoint. + * + * @param $git + * @param $endpoint + * + * @return string + */ + private function _add_access_token_endpoint( $git, $endpoint ) { + // Add GitHub.com access token. + if ( ! empty( parent::$options['github_access_token'] ) ) { + $endpoint = add_query_arg( 'access_token', parent::$options['github_access_token'], $endpoint ); + } + + // Add GitHub Enterprise access token. + if ( ! empty( $git->type->enterprise ) && + ! empty( parent::$options['github_enterprise_token'] ) + ) { + $endpoint = remove_query_arg( 'access_token', $endpoint ); + $endpoint = add_query_arg( 'access_token', parent::$options['github_enterprise_token'], $endpoint ); + } + + // Add repo access token. + if ( ! empty( parent::$options[ $git->type->repo ] ) ) { + $endpoint = remove_query_arg( 'access_token', $endpoint ); + $endpoint = add_query_arg( 'access_token', parent::$options[ $git->type->repo ], $endpoint ); + } + + return $endpoint; + } + + /** + * Create GitHub API endpoints. + * + * @param $git object + * @param $endpoint string + * + * @return string $endpoint + */ + protected function add_endpoints( $git, $endpoint ) { + + /* + * If a branch has been given, only check that for the remote info. + * If it's not been given, GitHub will use the Default branch. + */ + if ( ! empty( $git->type->branch ) ) { + $endpoint = add_query_arg( 'ref', $git->type->branch, $endpoint ); + } + + $endpoint = $this->_add_access_token_endpoint( $git, $endpoint ); + + /* + * If using GitHub Enterprise header return this endpoint. + */ + if ( ! empty( $git->type->enterprise_api ) ) { + return $git->type->enterprise_api . $endpoint; + } + + return $endpoint; + } + + /** + * Add remote data to type object. + * @access private + */ + private function _add_meta_repo_object() { + $this->type->rating = $this->make_rating( $this->type->repo_meta ); + $this->type->last_updated = $this->type->repo_meta->pushed_at; + $this->type->num_ratings = $this->type->repo_meta->watchers; + $this->type->private = $this->type->repo_meta->private; + } + + /** + * Calculate and store time until rate limit reset. + * + * @param $response + * @param $repo + */ + protected static function ratelimit_reset( $response, $repo ) { + if ( isset( $response['headers']['x-ratelimit-reset'] ) ) { + $reset = (integer) $response['headers']['x-ratelimit-reset']; + $wait = date( 'i', $reset - time() ); + parent::$error_code[ $repo ] = array_merge( parent::$error_code[ $repo ], array( 'git' => 'github', 'wait' => $wait ) ); + } + } + +} diff --git a/www/wp-content/plugins/github-updater/src/GitHub_Updater/GitLab_API.php b/www/wp-content/plugins/github-updater/src/GitHub_Updater/GitLab_API.php new file mode 100755 index 0000000..648a1a4 --- /dev/null +++ b/www/wp-content/plugins/github-updater/src/GitHub_Updater/GitLab_API.php @@ -0,0 +1,463 @@ +type = $type; + parent::$hours = 12; + $this->response = $this->get_transient(); + + if ( ! isset( self::$options['gitlab_private_token'] ) ) { + self::$options['gitlab_private_token'] = null; + } + if ( ! isset( self::$options['gitlab_enterprise_token'] ) ) { + self::$options['gitlab_enterprise_token'] = null; + } + if ( + empty( self::$options['gitlab_private_token'] ) || + ( empty( self::$options['gitlab_enterprise_token'] ) && ! empty( $type->enterprise ) ) + ) { + Messages::create_error_message( 'gitlab' ); + } + add_site_option( 'github_updater', self::$options ); + } + + /** + * Read the remote file and parse headers. + * + * @param $file + * + * @return bool + */ + public function get_remote_info( $file ) { + $response = isset( $this->response[ $file ] ) ? $this->response[ $file ] : false; + + if ( ! $response ) { + $id = $this->get_gitlab_id(); + self::$method = 'file'; + + if ( empty( $this->type->branch ) ) { + $this->type->branch = 'master'; + } + + $response = $this->api( '/projects/' . $id . '/repository/files?file_path=' . $file ); + + if ( empty( $response ) ) { + return false; + } + + if ( $response ) { + $contents = base64_decode( $response->content ); + $response = $this->get_file_headers( $contents, $this->type->type ); + $this->set_transient( $file, $response ); + } + } + + if ( $this->validate_response( $response ) || ! is_array( $response ) ) { + return false; + } + + $this->set_file_info( $response ); + + return true; + } + + /** + * Get remote info for tags. + * + * @return bool + */ + public function get_remote_tag() { + $repo_type = $this->return_repo_type(); + $response = isset( $this->response['tags'] ) ? $this->response['tags'] : false; + + if ( $this->exit_no_update( $response ) ) { + return false; + } + + if ( ! $response ) { + $id = $this->get_gitlab_id(); + self::$method = 'tags'; + $response = $this->api( '/projects/' . $id . '/repository/tags' ); + + if ( ! $response ) { + $response = new \stdClass(); + $response->message = 'No tags found'; + } + + if ( $response ) { + $this->set_transient( 'tags', $response ); + } + } + + if ( $this->validate_response( $response ) ) { + return false; + } + + $this->parse_tags( $response, $repo_type ); + + return true; + } + + /** + * Read the remote CHANGES.md file. + * + * @param $changes + * + * @return bool + */ + public function get_remote_changes( $changes ) { + $response = isset( $this->response['changes'] ) ? $this->response['changes'] : false; + + /* + * Set response from local file if no update available. + */ + if ( ! $response && ! $this->can_update( $this->type ) ) { + $response = new \stdClass(); + $content = $this->get_local_info( $this->type, $changes ); + if ( $content ) { + $response->content = $content; + $this->set_transient( 'changes', $response ); + } else { + $response = false; + } + } + + if ( ! $response ) { + $id = $this->get_gitlab_id(); + self::$method = 'changes'; + $response = $this->api( '/projects/' . $id . '/repository/files?file_path=' . $changes ); + + if ( $response ) { + $this->set_transient( 'changes', $response ); + } + } + + if ( $this->validate_response( $response ) ) { + return false; + } + + $changelog = isset( $this->response['changelog'] ) ? $this->response['changelog'] : false; + + if ( ! $changelog ) { + $parser = new \Parsedown; + $changelog = $parser->text( base64_decode( $response->content ) ); + $this->set_transient( 'changelog', $changelog ); + } + + $this->type->sections['changelog'] = $changelog; + + return true; + } + + /** + * Read and parse remote readme.txt. + * + * @return bool + */ + public function get_remote_readme() { + if ( ! file_exists( $this->type->local_path . 'readme.txt' ) && + ! file_exists( $this->type->local_path_extended . 'readme.txt' ) + ) { + return false; + } + + $response = isset( $this->response['readme'] ) ? $this->response['readme'] : false; + + /* + * Set $response from local file if no update available. + */ + if ( ! $response && ! $this->can_update( $this->type ) ) { + $response = new \stdClass(); + $content = $this->get_local_info( $this->type, 'readme.txt' ); + if ( $content ) { + $response->content = $content; + } else { + $response = false; + } + } + + if ( ! $response ) { + $id = $this->get_gitlab_id(); + self::$method = 'readme'; + $response = $this->api( '/projects/' . $id . '/repository/files?file_path=readme.txt' ); + + if ( $response ) { + $parser = new Readme_Parser; + $response = $parser->parse_readme( base64_decode( $response->content ) ); + $this->set_transient( 'readme', $response ); + } + } + + + if ( $this->validate_response( $response ) ) { + return false; + } + + $this->set_readme_info( $response ); + + return true; + } + + /** + * Read the repository meta from API. + * + * @return bool + */ + public function get_repo_meta() { + $response = isset( $this->response['meta'] ) ? $this->response['meta'] : false; + + if ( ! $response ) { + self::$method = 'meta'; + $projects = isset( $this->response['projects'] ) ? $this->response['projects'] : false; + + // exit if transient is empty + if ( ! $projects ) { + return false; + } + + foreach ( $projects as $project ) { + if ( $this->type->repo === $project->name ) { + $response = $project; + } + } + + if ( $response ) { + $this->set_transient( 'meta', $response ); + } + } + + if ( $this->validate_response( $response ) ) { + return false; + } + + $this->type->repo_meta = $response; + $this->_add_meta_repo_object(); + + return true; + } + + /** + * Create array of branches and download links as array. + * + * @return bool + */ + public function get_remote_branches() { + $branches = array(); + $response = isset( $this->response['branches'] ) ? $this->response['branches'] : false; + + if ( $this->exit_no_update( $response, true ) ) { + return false; + } + + if ( ! $response ) { + $id = $this->get_gitlab_id(); + self::$method = 'branches'; + $response = $this->api( '/projects/' . $id . '/repository/branches' ); + + if ( $response ) { + foreach ( $response as $branch ) { + $branches[ $branch->name ] = $this->construct_download_link( false, $branch->name ); + } + $this->type->branches = $branches; + $this->set_transient( 'branches', $branches ); + return true; + } + } + + if ( $this->validate_response( $response ) ) { + return false; + } + + $this->type->branches = $response; + + return true; + } + + /** + * Construct $this->type->download_link using GitLab API. + * + * @param boolean $rollback for theme rollback + * @param boolean $branch_switch for direct branch changing + * + * @return string $endpoint + */ + public function construct_download_link( $rollback = false, $branch_switch = false ) { + /* + * Check if using GitLab CE/Enterprise. + */ + if ( ! empty( $this->type->enterprise ) ) { + $gitlab_base = $this->type->enterprise; + } else { + $gitlab_base = 'https://gitlab.com'; + } + + $download_link_base = implode( '/', array( $gitlab_base, $this->type->owner, $this->type->repo, 'repository/archive.zip' ) ); + $endpoint = ''; + + /* + * Check for rollback. + */ + if ( ! empty( $_GET['rollback'] ) && + ( isset( $_GET['action'] ) && 'upgrade-theme' === $_GET['action'] ) && + ( isset( $_GET['theme'] ) && $this->type->repo === $_GET['theme'] ) + ) { + $endpoint = add_query_arg( 'ref', esc_attr( $_GET['rollback'] ), $endpoint ); + } elseif ( ! empty( $this->type->branch ) ) { + $endpoint = add_query_arg( 'ref', $this->type->branch, $endpoint ); + } + + /* + * If a branch has been given, only check that for the remote info. + * If it's not been given, GitLab will use the Default branch. + * If branch is master and tags are used, use newest tag. + */ + if ( 'master' === $this->type->branch && ! empty( $this->type->tags ) ) { + $endpoint = remove_query_arg( 'ref', $endpoint ); + $endpoint = add_query_arg( 'ref', $this->type->newest_tag, $endpoint ); + } + + /* + * Create endpoint for branch switching. + */ + if ( $branch_switch ) { + $endpoint = remove_query_arg( 'ref', $endpoint ); + $endpoint = add_query_arg( 'ref', $branch_switch, $endpoint ); + } + + if ( ! empty( parent::$options[ 'gitlab_private_token' ] ) ) { + $endpoint = add_query_arg( 'private_token', parent::$options['gitlab_private_token'], $endpoint ); + } + + /* + * If using GitLab CE/Enterprise header return this endpoint. + */ + if ( ! empty( $this->type->enterprise ) ) { + $endpoint = remove_query_arg( 'private_token', $endpoint ); + if ( ! empty( parent::$options['gitlab_enterprise_token'] ) ) { + $endpoint = add_query_arg( 'private_token', parent::$options['gitlab_enterprise_token'], $endpoint ); + } + } + + return $download_link_base . $endpoint; + } + + /** + * Add remote data to type object. + * @access private + */ + private function _add_meta_repo_object() { + //$this->type->rating = $this->make_rating( $this->type->repo_meta ); + $this->type->last_updated = $this->type->repo_meta->last_activity_at; + //$this->type->num_ratings = $this->type->repo_meta->watchers; + $this->type->private = ! $this->type->repo_meta->public; + } + + /** + * Create GitLab API endpoints. + * + * @param $git object + * @param $endpoint string + * + * @return string + */ + protected function add_endpoints( $git, $endpoint ) { + if ( ! empty( parent::$options['gitlab_private_token'] ) ) { + $endpoint = add_query_arg( 'private_token', parent::$options['gitlab_private_token'], $endpoint ); + } + + switch ( self::$method ) { + case 'projects': + case 'meta': + case 'tags': + break; + case 'file': + case 'changes': + case 'readme': + $endpoint = add_query_arg( 'ref', $git->type->branch, $endpoint ); + break; + default: + break; + } + + /* + * If using GitLab CE/Enterprise header return this endpoint. + */ + if ( ! empty( $git->type->enterprise_api ) ) { + $endpoint = remove_query_arg( 'private_token', $endpoint ); + if ( ! empty( parent::$options['gitlab_enterprise_token'] ) ) { + $endpoint = add_query_arg( 'private_token', parent::$options['gitlab_enterprise_token'], $endpoint ); + } + + return $git->type->enterprise_api . $endpoint; + } + + return $endpoint; + } + + /** + * Get GitLab project ID. + * + * @return bool|null + */ + public function get_gitlab_id() { + $id = null; + $response = isset( $this->response['projects'] ) ? $this->response['projects'] : false; + + if ( ! $response ) { + self::$method = 'projects'; + $response = $this->api( '/projects' ); + if ( empty( $response ) && isset( $this->type->slug ) ) { + $id = rtrim( urlencode( $this->type->slug ), '.php' ); + return $id; + } + } + + foreach ( $response as $project ) { + if ( $this->type->repo === $project->name ) { + $id = $project->id; + $this->set_transient( 'projects', $response ); + break; + } + } + + return $id; + } + +} diff --git a/www/wp-content/plugins/github-updater/src/GitHub_Updater/Install.php b/www/wp-content/plugins/github-updater/src/GitHub_Updater/Install.php new file mode 100755 index 0000000..3c692fc --- /dev/null +++ b/www/wp-content/plugins/github-updater/src/GitHub_Updater/Install.php @@ -0,0 +1,459 @@ +/ directly from GitHub Updater. + * + * @package Fragen\GitHub_Updater + */ +class Install extends Base { + + /** + * Class options. + * @var array + */ + protected static $install = array(); + + /** + * Constructor. + * Need class-wp-upgrader.php for upgrade classes. + * + * @param $type + */ + public function __construct( $type ) { + require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; + $this->install( $type ); + + wp_enqueue_script( 'ghu-install', plugins_url( basename( dirname( dirname( __DIR__ ) ) ) . '/js/ghu_install.js' ), array(), false, true ); + } + + /** + * Install remote plugin or theme. + * + * @param $type + * + * @return bool + */ + public function install( $type ) { + + if ( isset( $_POST['option_page'] ) && 'github_updater_install' == $_POST['option_page'] ) { + if ( empty( $_POST['github_updater_branch'] ) ) { + $_POST['github_updater_branch'] = 'master'; + } + + /* + * Exit early if no repo entered. + */ + if ( empty( $_POST['github_updater_repo'] ) ) { + echo '

'; + esc_html_e( 'A repository URI is required.', 'github-updater' ); + echo '

'; + + return false; + } + + /* + * Transform URI to owner/repo + */ + $headers = Base::parse_header_uri( $_POST['github_updater_repo'] ); + $_POST['github_updater_repo'] = $headers['owner_repo']; + + self::$install = Settings::sanitize( $_POST ); + self::$install['repo'] = $headers['repo']; + + /* + * Create GitHub endpoint. + * Save Access Token if present. + * Check for GitHub Self-Hosted. + */ + if ( 'github' === self::$install['github_updater_api'] ) { + + if ( 'github.com' === $headers['host'] || empty( $headers['host'] ) ) { + $github_base = 'https://api.github.com'; + $headers['host'] = 'github.com'; + } else { + $github_base = $headers['base_uri'] . '/api/v3'; + } + + self::$install['download_link'] = $github_base . '/repos/' . self::$install['github_updater_repo'] . '/zipball/' . self::$install['github_updater_branch']; + + /* + * If asset is entered install it. + */ + if ( false !== stristr( $headers['path'], 'releases/download' ) ) { + self::$install['download_link'] = $headers['uri']; + } + + /* + * Add access token if present. + */ + if ( ! empty( self::$install['github_access_token'] ) ) { + self::$install['download_link'] = add_query_arg( 'access_token', self::$install['github_access_token'], self::$install['download_link'] ); + parent::$options[ self::$install['repo'] ] = self::$install['github_access_token']; + } elseif ( ! empty( parent::$options['github_access_token'] ) && + ( 'github.com' === $headers['host'] || empty( $headers['host'] ) ) + ) { + self::$install['download_link'] = add_query_arg( 'access_token', parent::$options['github_access_token'], self::$install['download_link'] ); + } elseif ( ! empty( parent::$options['github_enterprise_token'] ) ) { + self::$install['download_link'] = add_query_arg( 'access_token', parent::$options['github_enterprise_token'], self::$install['download_link'] ); + } + } + + /* + * Create Bitbucket endpoint and instantiate class Bitbucket_API. + * Save private setting if present. + * Ensures `maybe_authenticate_http()` is available. + */ + if ( 'bitbucket' === self::$install['github_updater_api'] ) { + + self::$install['download_link'] = 'https://bitbucket.org/' . self::$install['github_updater_repo'] . '/get/' . self::$install['github_updater_branch'] . '.zip'; + if ( isset( self::$install['is_private'] ) ) { + parent::$options[ self::$install['repo'] ] = 1; + } + + new Bitbucket_API( (object) $type ); + } + + /* + * Create GitLab endpoint. + * Check for GitLab Self-Hosted. + */ + if ( 'gitlab' === self::$install['github_updater_api'] ) { + + if ( 'gitlab.com' === $headers['host'] || empty( $headers['host'] ) ) { + $gitlab_base = 'https://gitlab.com'; + $headers['host'] = 'gitlab.com'; + } else { + $gitlab_base = $headers['base_uri']; + } + + self::$install['download_link'] = implode( '/', array( $gitlab_base, self::$install['github_updater_repo'], 'repository/archive.zip' ) ); + self::$install['download_link'] = add_query_arg( 'ref', self::$install['github_updater_branch'], self::$install['download_link'] ); + + if ( ! empty( self::$install['gitlab_private_token'] ) ) { + self::$install['download_link'] = add_query_arg( 'private_token', self::$install['gitlab_private_token'], self::$install['download_link'] ); + + if ( 'gitlab.com' === $headers['host'] ) { + parent::$options['gitlab_private_token'] = self::$install['gitlab_private_token']; + } else { + parent::$options['gitlab_enterprise_token'] = self::$install['gitlab_private_token']; + } + } elseif ( ! empty( parent::$options['gitlab_private_token'] ) ) { + self::$install['download_link'] = add_query_arg( 'private_token', parent::$options['gitlab_private_token'], self::$install['download_link'] ); + } + } + + parent::$options['github_updater_install_repo'] = self::$install['repo']; + if ( ( defined( 'GITHUB_UPDATER_EXTENDED_NAMING' ) && GITHUB_UPDATER_EXTENDED_NAMING ) && + 'plugin' === $type + ) { + parent::$options['github_updater_install_repo'] = implode( '-', array( self::$install['github_updater_api'], $headers['owner'], self::$install['repo'] ) ); + } + + update_site_option( 'github_updater', parent::$options ); + $url = self::$install['download_link']; + $nonce = wp_nonce_url( $url ); + + if ( 'plugin' === $type ) { + $plugin = self::$install['repo']; + + /* + * Create a new instance of Plugin_Upgrader. + */ + $upgrader = new \Plugin_Upgrader( $skin = new \Plugin_Installer_Skin( compact( 'type', 'title', 'url', 'nonce', 'plugin', 'api' ) ) ); + add_filter( 'install_plugin_complete_actions', array( &$this, 'install_plugin_complete_actions' ), 10, 3 ); + } + + if ( 'theme' === $type ) { + $theme = self::$install['repo']; + + /* + * Create a new instance of Theme_Upgrader. + */ + $upgrader = new \Theme_Upgrader( $skin = new \Theme_Installer_Skin( compact( 'type', 'title', 'url', 'nonce', 'theme', 'api' ) ) ); + add_filter( 'install_theme_complete_actions', array( &$this, 'install_theme_complete_actions' ), 10, 3 ); + } + + /* + * Perform the action and install the plugin from the $source urldecode(). + * Flush cache so we can make sure that the installed plugins/themes list is always up to date. + */ + $upgrader->install( $url ); + wp_cache_flush(); + } + + if ( ! isset( $_POST['option_page'] ) || ! ( 'github_updater_install' === $_POST['option_page'] ) ) { + $this->create_form( $type ); + } + + return true; + } + + /** + * Create Install Plugin or Install Theme page. + * + * @param $type + */ + public function create_form( $type ) { + $this->register_settings( $type ); + ?> +
+ +
+ + + + + + + + + + + + + 'activate', + //'template' => urlencode( $template ), + 'stylesheet' => urlencode( $stylesheet ), + ), admin_url('themes.php') ); + $activate_link = esc_url( wp_nonce_url( $activate_link, 'switch-theme_' . $stylesheet ) ); + + $install_actions['activate'] = '
' . esc_attr__( 'Activate', 'github-updater' ) . ' “' . $stylesheet . '”'; + + if ( is_network_admin() && current_user_can( 'manage_network_themes' ) ) { + $network_activate_link = add_query_arg( array( + 'action' => 'enable', + 'theme' => urlencode( $stylesheet ), + ), network_admin_url( 'themes.php' ) ); + $network_activate_link = esc_url( wp_nonce_url( $network_activate_link, 'enable-theme_' . $stylesheet ) ); + + $install_actions['network_enable'] = '' . esc_attr_x( 'Network Enable', 'This refers to a network activation in a multisite installation', 'github-updater' ) . ''; + unset( $install_actions['activate'] ); + } + ksort( $install_actions ); + + return $install_actions; + } + +} diff --git a/www/wp-content/plugins/github-updater/src/GitHub_Updater/Messages.php b/www/wp-content/plugins/github-updater/src/GitHub_Updater/Messages.php new file mode 100755 index 0000000..84563ae --- /dev/null +++ b/www/wp-content/plugins/github-updater/src/GitHub_Updater/Messages.php @@ -0,0 +1,144 @@ + +
+

+ +
+ '; + printf( + esc_html__( 'It looks like you are running into GitHub API rate limits. Be sure and configure a %sPersonal Access Token%s to avoid this issue.', 'github-updater' ), + '', + '' + ); + ?> +

+
+ +
+

+ +
+ +

+
+ +
+

+ +

+
+ delete_all_transients( 'plugins' ); + } + + /* + * Get details of installed git sourced plugins. + */ + $this->config = $this->get_plugin_meta(); + + if ( empty( $this->config ) ) { + return false; + } + + /* + * Load post-processing filters. Renaming filters etc. + */ + $this->load_post_filters(); + } + + /** + * The Plugin object can be created/obtained via this + * method - this prevents unnecessary work in rebuilding the object and + * querying to construct a list of categories, etc. + * + * @return Plugin + */ + public static function instance() { + $class = __CLASS__; + if ( false === self::$object ) { + self::$object = new $class(); + } + + return self::$object; + } + + /** + * Get details of Git-sourced plugins from those that are installed. + * + * @return array Indexed array of associative arrays of plugin details. + */ + protected function get_plugin_meta() { + /* + * Ensure get_plugins() function is available. + */ + include_once( ABSPATH . '/wp-admin/includes/plugin.php' ); + + $plugins = get_plugins(); + $git_plugins = array(); + $all_plugins = array(); + $update_plugins = get_site_transient( 'update_plugins' ); + + if ( empty( $update_plugins ) ) { + wp_update_plugins(); + $update_plugins = get_site_transient( 'update_plugins' ); + } + if ( isset( $update_plugins->response, $update_plugins->no_update ) ) { + $all_plugins = array_merge( (array) $update_plugins->response, (array) $update_plugins->no_update ); + } + + /** + * Filter to add plugins not containing appropriate header line. + * + * @since 5.4.0 + * @access public + * + * @param array $additions Listing of plugins to add. + * Default null. + * @param array $plugins Listing of all plugins. + * @param string 'plugin' Type being passed. + */ + $additions = apply_filters( 'github_updater_additions', null, $plugins, 'plugin' ); + $plugins = array_merge( $plugins, (array) $additions ); + + foreach ( (array) $plugins as $plugin => $headers ) { + $git_plugin = array(); + + if ( empty( $headers['GitHub Plugin URI'] ) && + empty( $headers['Bitbucket Plugin URI'] ) && + empty( $headers['GitLab Plugin URI'] ) + ) { + continue; + } + + foreach ( (array) self::$extra_headers as $value ) { + $repo_enterprise_uri = null; + $repo_enterprise_api = null; + + if ( empty( $headers[ $value ] ) || + false === stristr( $value, 'Plugin' ) + ) { + continue; + } + + $header_parts = explode( ' ', $value ); + $repo_parts = $this->get_repo_parts( $header_parts[0], 'plugin' ); + + if ( $repo_parts['bool'] ) { + $header = $this->parse_header_uri( $headers[ $value ] ); + } + + $self_hosted_parts = array_diff( array_keys( self::$extra_repo_headers ), array( 'branch' ) ); + foreach ( $self_hosted_parts as $part ) { + if ( array_key_exists( $repo_parts[ $part ], $headers ) && + ! empty( $headers[ $repo_parts[ $part ] ] ) + ) { + $repo_enterprise_uri = $headers[ $repo_parts[ $part ] ]; + } + } + + if ( ! empty( $repo_enterprise_uri ) ) { + $repo_enterprise_uri = trim( $repo_enterprise_uri, '/' ); + switch( $header_parts[0] ) { + case 'GitHub': + $repo_enterprise_api = $repo_enterprise_uri . '/api/v3'; + break; + case 'GitLab': + $repo_enterprise_api = $repo_enterprise_uri . '/api/v3'; + break; + } + } + + $git_plugin['type'] = $repo_parts['type']; + $git_plugin['uri'] = $repo_parts['base_uri'] . $header['owner_repo']; + $git_plugin['enterprise'] = $repo_enterprise_uri; + $git_plugin['enterprise_api'] = $repo_enterprise_api; + $git_plugin['owner'] = $header['owner']; + $git_plugin['repo'] = $header['repo']; + $git_plugin['extended_repo'] = implode( '-', array( $repo_parts['git_server'], $header['owner'], $header['repo'] ) ); + $git_plugin['branch'] = ! empty( $headers[ $repo_parts['branch'] ] ) ? $headers[ $repo_parts['branch'] ] : 'master'; + $git_plugin['slug'] = $plugin; + $git_plugin['local_path'] = WP_PLUGIN_DIR . '/' . $header['repo'] . '/'; + $git_plugin['local_path_extended'] = WP_PLUGIN_DIR . '/' . $git_plugin['extended_repo'] . '/'; + + $plugin_data = get_plugin_data( WP_PLUGIN_DIR . '/' . $git_plugin['slug'] ); + $git_plugin['author'] = $plugin_data['AuthorName']; + $git_plugin['name'] = $plugin_data['Name']; + $git_plugin['local_version'] = strtolower( $plugin_data['Version'] ); + $git_plugin['sections']['description'] = $plugin_data['Description']; + $git_plugin['private'] = true; + $git_plugin['dot_org'] = false; + } + if ( isset( $all_plugins[ $plugin ]->id ) ) { + $git_plugin['dot_org'] = true; + } + + $git_plugins[ $git_plugin['repo'] ] = (object) $git_plugin; + } + /* + * Load post-processing filters. Renaming filters etc. + */ + $this->load_post_filters(); + + return $git_plugins; + } + + /** + * Get remote plugin meta to populate $config plugin objects.
 + * Calls to remote APIs to get data.
 + */ + public function get_remote_plugin_meta() { + foreach ( (array) $this->config as $plugin ) { + $this->repo_api = null; + switch( $plugin->type ) { + case 'github_plugin': + $this->repo_api = new GitHub_API( $plugin ); + break; + case 'bitbucket_plugin': + $this->repo_api = new Bitbucket_API( $plugin ); + break; + case 'gitlab_plugin'; + $this->repo_api = new GitLab_API( $plugin ); + break; + } + + if ( is_null( $this->repo_api ) ) { + continue; + } + + $this->{$plugin->type} = $plugin; + $this->set_defaults( $plugin->type ); + + if ( $this->repo_api->get_remote_info( basename( $plugin->slug ) ) ) { + $this->repo_api->get_repo_meta(); + $this->repo_api->get_remote_tag(); + $changelog = $this->get_changelog_filename( $plugin->type ); + if ( $changelog ) { + $this->repo_api->get_remote_changes( $changelog ); + } + $this->repo_api->get_remote_readme(); + $this->repo_api->get_remote_branches(); + $plugin->download_link = $this->repo_api->construct_download_link(); + } + + /* + * Update plugin transient with rollback (branch switching) data. + */ + if ( ! empty( $_GET['rollback'] ) && + ( isset( $_GET['plugin'] ) && $_GET['plugin'] === $plugin->slug ) + ) { + $this->tag = $_GET['rollback']; + $updates_transient = get_site_transient('update_plugins'); + $rollback = array( + 'slug' => $plugin->repo, + 'plugin' => $plugin->slug, + 'new_version' => $this->tag, + 'url' => $plugin->uri, + 'package' => $this->repo_api->construct_download_link( false, $this->tag ), + ); + if ( array_key_exists( $this->tag, $plugin->branches ) ) { + $rollback['new_version'] = '0.0.0'; + } + $updates_transient->response[ $plugin->slug ] = (object) $rollback; + set_site_transient( 'update_plugins', $updates_transient ); + } + + if ( ! is_multisite() || is_network_admin() ) { + add_action( "after_plugin_row_$plugin->slug", array( &$this, 'plugin_branch_switcher' ), 15, 3 ); + } + } + $this->make_force_check_transient( 'plugins' ); + set_site_transient( 'ghu_plugin', self::$object, ( self::$hours * HOUR_IN_SECONDS ) ); + $this->load_pre_filters(); + } + + /** + * Load pre-update filters. + */ + public function load_pre_filters() { + add_filter( 'plugin_row_meta', array( &$this, 'plugin_row_meta' ), 10, 2 ); + add_filter( 'plugins_api', array( &$this, 'plugins_api' ), 99, 3 ); + add_filter( 'pre_set_site_transient_update_plugins', array( &$this, 'pre_set_site_transient_update_plugins' ) ); + } + + /** + * Add branch switch row to plugins page. + * + * @param $plugin_file + * @param $plugin_data + * + * @return bool + */ + public function plugin_branch_switcher( $plugin_file, $plugin_data ) { + $options = get_site_option( 'github_updater' ); + if ( empty( $options['branch_switch'] ) ) { + return false; + } + + $wp_list_table = _get_list_table( 'WP_MS_Themes_List_Table' ); + $plugin = $this->get_repo_slugs( dirname( $plugin_file ) ); + if ( ! empty( $plugin ) ) { + $id = $plugin['repo'] . '-id'; + $branches = isset( $this->config[ $plugin['repo'] ] ) ? $this->config[ $plugin['repo'] ]->branches : null; + } else { + return false; + } + + /* + * Get current branch. + */ + foreach ( parent::$git_servers as $server ) { + $branch_key = $server . ' Branch'; + $branch = ! empty( $plugin_data[ $branch_key ] ) ? $plugin_data[ $branch_key ] : 'master'; + if ( 'master' !== $branch ) { + break; + } + } + + /* + * Create after_plugin_row_ + */ + echo '
'; + + printf( esc_html__( 'Current branch is `%1$s`, try %2$sanother branch%3$s.', 'github-updater' ), + $branch, + '', + '' + ); + + print( '' ); + echo '
'; + + return true; + } + + /** + * Add 'View details' link to plugins page. + * + * @param $links + * @param $file + * + * @return array $links + */ + public function plugin_row_meta( $links, $file ) { + $regex_pattern = '/(.*)<\/a>/'; + $repo = dirname ( $file ); + $slugs = $this->get_repo_slugs( $repo ); + $repo = ! empty( $slugs ) ? $slugs['repo'] : null; + + /* + * Sanity check for some commercial plugins. + */ + if ( ! isset( $links[2] ) ) { + return $links; + } + + preg_match( $regex_pattern, $links[2], $matches ); + + /* + * Remove 'Visit plugin site' link in favor or 'View details' link. + */ + if ( array_key_exists( $repo, $this->config ) ) { + if ( false !== stristr( $links[2], 'Visit plugin site' ) ) { + unset( $links[2] ); + $links[] = sprintf( '%s', + esc_url( network_admin_url( 'plugin-install.php?tab=plugin-information&plugin=' . $repo . + '&TB_iframe=true&width=600&height=550' ) ), + esc_html__( 'View details', 'github-updater' ) + ); + } + } + + return $links; + } + + /** + * Put changelog in plugins_api, return WP.org data as appropriate + * + * @param $false + * @param $action + * @param $response + * + * @return mixed + */ + public function plugins_api( $false, $action, $response ) { + $match = false; + if ( ! ( 'plugin_information' === $action ) ) { + return $false; + } + + $transient = 'ghu-' . md5( $response->slug . 'wporg' ); + $wp_repo_data = get_site_transient( $transient ); + if ( ! $wp_repo_data ) { + $wp_repo_data = wp_remote_get( 'https://api.wordpress.org/plugins/info/1.0/' . $response->slug ); + if ( is_wp_error( $wp_repo_data ) ) { + return false; + } + set_site_transient( $transient, $wp_repo_data, ( 12 * HOUR_IN_SECONDS ) ); + } + + $wp_repo_body = unserialize( $wp_repo_data['body'] ); + if ( is_object( $wp_repo_body ) ) { + $response = $wp_repo_body; + } + + foreach ( (array) $this->config as $plugin ) { + /* + * Fix for extended naming. + */ + $repos = $this->get_repo_slugs( $plugin->repo ); + if ( $response->slug === $repos['repo'] || $response->slug === $repos['extended_repo'] ) { + $response->slug = $repos['repo']; + $match = true; + } else { + continue; + } + $contributors = array(); + if ( strtolower( $response->slug ) === strtolower( $plugin->repo ) ) { + if ( is_object( $wp_repo_body ) && 'master' === $plugin->branch ) { + return $response; + } + + $response->slug = $plugin->repo; + $response->plugin_name = $plugin->name; + $response->name = $plugin->name; + $response->author = $plugin->author; + $response->homepage = $plugin->uri; + $response->donate_link = $plugin->donate_link; + $response->version = $plugin->remote_version; + $response->sections = $plugin->sections; + $response->requires = $plugin->requires; + $response->tested = $plugin->tested; + $response->downloaded = $plugin->downloaded; + $response->last_updated = $plugin->last_updated; + $response->download_link = $plugin->download_link; + foreach ( $plugin->contributors as $contributor ) { + $contributors[ $contributor ] = '//profiles.wordpress.org/' . $contributor; + } + $response->contributors = $contributors; + if ( ! $plugin->private ) { + $response->num_ratings = $plugin->num_ratings; + $response->rating = $plugin->rating; + } + } + break; + } + + if ( ! $match ) { + return $false; + } + + return $response; + } + + /** + * Hook into pre_set_site_transient_update_plugins to update from GitHub. + * + * @param $transient + * + * @return mixed + */ + public function pre_set_site_transient_update_plugins( $transient ) { + + foreach ( (array) $this->config as $plugin ) { + $response = null; + + if ( $this->can_update( $plugin ) ) { + $response = array( + 'slug' => dirname( $plugin->slug ), + 'plugin' => $plugin->slug, + 'new_version' => $plugin->remote_version, + 'url' => $plugin->uri, + 'package' => $plugin->download_link, + ); + + /* + * If branch is 'master' and plugin is in wp.org repo then pull update from wp.org + */ + if ( $plugin->dot_org && 'master' === $plugin->branch ) { + continue; + } + + /* + * Don't overwrite if branch switching. + */ + if ( $this->tag && + ( isset( $_GET['plugin'] ) && $plugin->slug === $_GET['plugin'] ) + ) { + continue; + } + + $transient->response[ $plugin->slug ] = (object) $response; + } + } + + return $transient; + } +} diff --git a/www/wp-content/plugins/github-updater/src/GitHub_Updater/Readme_Parser.php b/www/wp-content/plugins/github-updater/src/GitHub_Updater/Readme_Parser.php new file mode 100755 index 0000000..35d3277 --- /dev/null +++ b/www/wp-content/plugins/github-updater/src/GitHub_Updater/Readme_Parser.php @@ -0,0 +1,83 @@ +parse_readme_contents( $file_contents ); + } + + /** + * @param $text + * @param bool $markdown + * + * @return mixed|string + */ + public function filter_text( $text, $markdown = false ) { // fancy, Markdown + $text = trim($text); + $text = call_user_func( array( get_parent_class( $this ), 'code_trick' ), $text, $markdown ); // A better parser than Markdown's for: backticks -> CODE + + if ( $markdown ) { // Parse markdown. + $parser = new \Parsedown; + $text = $parser->text( $text ); + } + + $allowed = array( + 'a' => array( + 'href' => array(), + 'title' => array(), + 'rel' => array()), + 'blockquote' => array('cite' => array()), + 'br' => array(), + 'cite' => array(), + 'p' => array(), + 'code' => array(), + 'pre' => array(), + 'em' => array(), + 'strong' => array(), + 'ul' => array(), + 'ol' => array(), + 'li' => array(), + 'h3' => array(), + 'h4' => array() + ); + + $text = balanceTags($text); + + $text = wp_kses( $text, $allowed ); + $text = trim($text); + return $text; + } + +} diff --git a/www/wp-content/plugins/github-updater/src/GitHub_Updater/Settings.php b/www/wp-content/plugins/github-updater/src/GitHub_Updater/Settings.php new file mode 100755 index 0000000..e0e7fc2 --- /dev/null +++ b/www/wp-content/plugins/github-updater/src/GitHub_Updater/Settings.php @@ -0,0 +1,702 @@ + 'iThemes Sync', + 'infinitewp' => 'InfiniteWP', + ); + + /** + * Start up + */ + public function __construct() { + add_action( is_multisite() ? 'network_admin_menu' : 'admin_menu', array( &$this, 'add_plugin_page' ) ); + add_action( 'network_admin_edit_github-updater', array( &$this, 'update_network_setting' ) ); + add_action( 'admin_init', array( &$this, 'page_init' ) ); + add_action( 'admin_init', array( &$this, 'remote_management_page_init' ) ); + + add_filter( is_multisite() ? 'network_admin_plugin_action_links_' . $this->ghu_plugin_name : 'plugin_action_links_' . $this->ghu_plugin_name, array( &$this, 'plugin_action_links' ) ); + } + + /** + * Define tabs for Settings page. + * By defining in a method, strings can be translated. + * + * @access private + * + * @return array + */ + private function _settings_tabs() { + return array( + 'github_updater_settings' => esc_html__( 'Settings', 'github-updater' ), + 'github_updater_install_plugin' => esc_html__( 'Install Plugin', 'github-updater' ), + 'github_updater_install_theme' => esc_html__( 'Install Theme', 'github-updater' ), + 'github_updater_remote_management' => esc_html__( 'Remote Management', 'github-updater' ), + ); + } + + /** + * Add options page. + */ + public function add_plugin_page() { + if ( is_multisite() ) { + add_submenu_page( + 'settings.php', + esc_html__( 'GitHub Updater Settings', 'github-updater' ), + esc_html__( 'GitHub Updater', 'github-updater' ), + 'manage_network', + 'github-updater', + array( &$this, 'create_admin_page' ) + ); + } else { + add_options_page( + esc_html__( 'GitHub Updater Settings', 'github-updater' ), + esc_html__( 'GitHub Updater', 'github-updater' ), + 'manage_options', + 'github-updater', + array( &$this, 'create_admin_page' ) + ); + } + } + + /** + * Renders setting tabs. + * + * Walks through the object's tabs array and prints them one by one. + * Provides the heading for the settings page. + * + * @access private + */ + private function _options_tabs() { + $current_tab = isset( $_GET['tab'] ) ? $_GET['tab'] : 'github_updater_settings'; + echo ''; + } + + /** + * Options page callback. + */ + public function create_admin_page() { + $action = is_multisite() ? 'edit.php?action=github-updater' : 'options.php'; + $tab = isset( $_GET['tab'] ) ? $_GET['tab'] : 'github_updater_settings'; + $logo = plugins_url( basename( dirname( dirname( __DIR__ ) ) ) . '/assets/GitHub_Updater_logo_small.png' ); + ?> +
+

+ GitHub Updater logo
+ +

+ _options_tabs(); ?> + +

+ + +
+ +
+ + + + + +
+ +
+ +
+ ghu_tokens(); + + /* + * Add basic plugin settings. + */ + add_settings_section( + 'github_updater_settings', + esc_html__( 'GitHub Updater Settings', 'github-updater' ), + array( &$this, 'print_section_ghu_settings'), + 'github_updater_install_settings' + ); + + add_settings_field( + 'branch_switch', + esc_html__( 'Enable Branch Switching', 'github-updater' ), + array( &$this, 'token_callback_checkbox' ), + 'github_updater_install_settings', + 'github_updater_settings', + array( 'id' => 'branch_switch' ) + ); + + /* + * Add settings for GitHub Personal Access Token. + */ + add_settings_section( + 'github_access_token', + esc_html__( 'Personal GitHub Access Token', 'github-updater' ), + array( &$this, 'print_section_github_access_token' ), + 'github_updater_install_settings' + ); + + add_settings_field( + 'github_access_token', + esc_html__( 'GitHub.com Access Token', 'github-updater' ), + array( &$this, 'token_callback_text' ), + 'github_updater_install_settings', + 'github_access_token', + array( 'id' => 'github_access_token' ) + ); + + if ( self::$github_enterprise ) { + add_settings_field( + 'github_enterprise_token', + esc_html__( 'GitHub Enterprise Access Token', 'github-updater' ), + array( &$this, 'token_callback_text' ), + 'github_updater_install_settings', + 'github_access_token', + array( 'id' => 'github_enterprise_token' ) + ); + } + + /* + * Show section for private GitHub repositories. + */ + if ( self::$github_private || self::$github_enterprise ) { + add_settings_section( + 'github_id', + esc_html__( 'GitHub Private Settings', 'github-updater' ), + array( &$this, 'print_section_github_info' ), + 'github_updater_install_settings' + ); + } + + /* + * Add setting for GitLab.com, GitLab Community Edition. + * or GitLab Enterprise Private Token. + */ + if ( self::$gitlab || self::$gitlab_enterprise ) { + add_settings_section( + 'gitlab_settings', + esc_html__( 'GitLab Private Settings', 'github-updater' ), + array( &$this, 'print_section_gitlab_token' ), + 'github_updater_install_settings' + ); + } + + if ( self::$gitlab ) { + add_settings_field( + 'gitlab_private_token', + esc_html__( 'GitLab.com Private Token', 'github-updater' ), + array( &$this, 'token_callback_text' ), + 'github_updater_install_settings', + 'gitlab_settings', + array( 'id' => 'gitlab_private_token' ) + ); + } + + if ( self::$gitlab_enterprise ) { + add_settings_field( + 'gitlab_enterprise_token', + esc_html__( 'GitLab CE or GitLab Enterprise Private Token', 'github-updater' ), + array( &$this, 'token_callback_text' ), + 'github_updater_install_settings', + 'gitlab_settings', + array( 'id' => 'gitlab_enterprise_token' ) + ); + } + + /* + * Add settings for Bitbucket Username and Password. + */ + add_settings_section( + 'bitbucket_user', + esc_html__( 'Bitbucket Private Settings', 'github-updater' ), + array( &$this, 'print_section_bitbucket_username' ), + 'github_updater_install_settings' + ); + + add_settings_field( + 'bitbucket_username', + esc_html__( 'Bitbucket Username', 'github-updater' ), + array( &$this, 'token_callback_text' ), + 'github_updater_install_settings', + 'bitbucket_user', + array( 'id' => 'bitbucket_username' ) + ); + + add_settings_field( + 'bitbucket_password', + esc_html__( 'Bitbucket Password', 'github-updater' ), + array( &$this, 'token_callback_text' ), + 'github_updater_install_settings', + 'bitbucket_user', + array( 'id' => 'bitbucket_password' ) + ); + + /* + * Show section for private Bitbucket repositories. + */ + if ( self::$bitbucket_private ) { + add_settings_section( + 'bitbucket_id', + esc_html__( 'Bitbucket Private Repositories', 'github-updater' ), + array( &$this, 'print_section_bitbucket_info' ), + 'github_updater_install_settings' + ); + } + + /* + * Show if no private repositories are present. + */ + if ( ! self::$github_private && ! self::$bitbucket_private ) { + add_settings_section( + null, + esc_html__( 'No private repositories are installed.', 'github-updater' ), + array(), + 'github_updater_install_settings' + ); + } + + if ( isset( $_POST['github_updater'] ) && ! is_multisite() ) { + $options = get_site_option( 'github_updater' ); + $options = array_merge( $options, self::sanitize( $_POST['github_updater'] ) ); + update_site_option( 'github_updater', $options ); + } + } + + /** + * Create and return settings fields for private repositories. + * + * @return void + */ + public function ghu_tokens() { + $ghu_options_keys = array(); + $plugin = get_site_transient( 'ghu_plugin' ); + $theme = get_site_transient( 'ghu_theme' ); + if ( ! $plugin ) { + $plugin = Plugin::instance(); + $plugin->get_remote_plugin_meta(); + } + if ( ! $theme ) { + $theme = Theme::instance(); + $theme->get_remote_theme_meta(); + } + $ghu_plugins = $plugin->config; + $ghu_themes = $theme->config; + $ghu_tokens = array_merge( $ghu_plugins, $ghu_themes ); + + foreach ( $ghu_tokens as $token ) { + $type = ''; + $setting_field = array(); + $ghu_options_keys[ $token->repo ] = null; + + /* + * Set boolean for Enterprise headers. + */ + if ( $token->enterprise ) { + /* + * Set boolean if GitHub Enterprise header found. + */ + if ( false !== strpos( $token->type, 'github' ) && + ! self::$github_enterprise + ) { + self::$github_enterprise = true; + } + /* + * Set boolean if GitLab CE/Enterprise header found. + */ + if ( false !== strpos( $token->type, 'gitlab' ) && + ! self::$gitlab_enterprise + ) { + self::$gitlab_enterprise = true; + } + } + + /* + * Check to see if it's a private repo and set variables. + */ + if ( $token->private ) { + if ( false !== strpos( $token->type, 'github' ) && ! self::$github_private ) { + self::$github_private = true; + } + if ( false !== strpos( $token->type, 'bitbucket' ) && ! self::$bitbucket_private ) { + self::$bitbucket_private = true; + } + } + + /* + * Set boolean if GitLab header found. + */ + if ( false !== strpos( $token->type, 'gitlab' ) && ! self::$gitlab ) { + self::$gitlab = true; + } + + /* + * Next if not a private repo or token field not empty. + */ + if ( ! $token->private && empty( parent::$options[ $token->repo ] ) ) { + continue; + } + + if ( false !== strpos( $token->type, 'theme') ) { + $type = esc_html__( 'Theme:', 'github-updater' ) . ' '; + } + + $setting_field['id'] = $token->repo; + $setting_field['title'] = $type . $token->name; + $setting_field['page'] = 'github_updater_install_settings'; + + switch ( $token->type ) { + case ( strpos( $token->type, 'github' ) ): + $setting_field['section'] = 'github_id'; + $setting_field['callback_method'] = array( &$this, 'token_callback_text' ); + $setting_field['callback'] = $token->repo; + break; + case ( strpos( $token->type, 'bitbucket' ) ): + $setting_field['section'] = 'bitbucket_id'; + $setting_field['callback_method'] = array( &$this, 'token_callback_checkbox' ); + $setting_field['callback'] = $token->repo; + break; + case ( strpos( $token->type, 'gitlab' ) ): + $setting_field['section'] = 'gitlab_id'; + $setting_field['callback_method'] = array( &$this, 'token_callback_checkbox' ); + $setting_field['callback'] = $token->repo; + break; + } + + add_settings_field( + $setting_field['id'], + $setting_field['title'], + $setting_field['callback_method'], + $setting_field['page'], + $setting_field['section'], + array( 'id' => $setting_field['callback'] ) + ); + } + + /* + * Unset options that are no longer present and update options. + */ + $ghu_unset_keys = array_diff_key( parent::$options, $ghu_options_keys ); + unset( $ghu_unset_keys['github_access_token'] ); + if ( self::$github_enterprise ) { + unset( $ghu_unset_keys['github_enterprise_token'] ); + } + unset( $ghu_unset_keys['branch_switch'] ); + unset( $ghu_unset_keys['bitbucket_username'] ); + unset( $ghu_unset_keys['bitbucket_password'] ); + if ( self::$gitlab ) { + unset( $ghu_unset_keys['gitlab_private_token'] ); + } + if ( self::$gitlab_enterprise ) { + unset( $ghu_unset_keys['gitlab_enterprise_token'] ); + } + if ( ! empty( $ghu_unset_keys ) ) { + foreach ( $ghu_unset_keys as $key => $value ) { + unset( parent::$options [ $key ] ); + } + update_site_option( 'github_updater', parent::$options ); + } + } + + /** + * Settings for Remote Management. + */ + public function remote_management_page_init() { + + register_setting( + 'github_updater_remote_management', + 'github_updater_remote_settings', + array( &$this, 'sanitize' ) + ); + + add_settings_section( + 'remote_management', + esc_html__( 'Remote Management', 'github-updater' ), + array( &$this, 'print_section_remote_management' ), + 'github_updater_remote_settings' + ); + + foreach ( self::$remote_management as $id => $name ) { + add_settings_field( + $id, + esc_html__( $name ), + array( &$this, 'token_callback_checkbox_remote' ), + 'github_updater_remote_settings', + 'remote_management', + array( 'id' => $id ) + ); + } + + if ( isset( $_POST['option_page'] ) && 'github_updater_remote_management' === $_POST['option_page'] ) { + $options = array(); + foreach ( array_keys( self::$remote_management ) as $key ) { + $options[ $key ] = null; + } + if ( isset( $_POST['github_updater_remote_management'] ) ) { + $options = array_replace( $options, (array) self::sanitize( $_POST['github_updater_remote_management'] ) ); + } + update_site_option( 'github_updater_remote_management', $options ); + } + } + + /** + * Sanitize each setting field as needed. + * + * @param array $input Contains all settings fields as array keys + * + * @return array + */ + public static function sanitize( $input ) { + $new_input = array(); + foreach ( array_keys( (array) $input ) as $id ) { + $new_input[ sanitize_file_name( $id ) ] = sanitize_text_field( $input[ $id ] ); + } + + return $new_input; + } + + /** + * Print the GitHub Updater text. + */ + public function print_section_ghu_settings() { + if ( defined( 'GITHUB_UPDATER_EXTENDED_NAMING' ) && GITHUB_UPDATER_EXTENDED_NAMING ) { + printf( esc_html__( 'Extended Naming is %sactive%s.', 'github-updater' ), '', '' ); + } + if ( ! defined( 'GITHUB_UPDATER_EXTENDED_NAMING' ) || + ( defined( 'GITHUB_UPDATER_EXTENDED_NAMING' ) && ! GITHUB_UPDATER_EXTENDED_NAMING ) + ) { + printf( esc_html__( 'Extended Naming is %snot active%s.', 'github-updater' ), '', '' ); + } + printf( '
' . esc_html__( 'Extended Naming renames plugin directories %s to prevent possible conflicts with WP.org plugins.', 'github-updater'), '<git>-<owner>-<repo>'); + printf( '
' . esc_html__( 'Activate Extended Naming by setting %s', 'github-updater' ), 'define( \'GITHUB_UPDATER_EXTENDED_NAMING\', true );' ); + print( '

' . esc_html__( 'Check to enable branch switching from the Plugins or Themes page.', 'github-updater' ) . '

'); + } + + /** + * Print the GitHub text. + */ + public function print_section_github_info() { + esc_html_e( 'Enter your GitHub Access Token. Leave empty for public repositories.', 'github-updater' ); + } + + /** + * Print the GitHub Personal Access Token text. + */ + public function print_section_github_access_token() { + esc_html_e( 'Enter your personal GitHub.com or GitHub Enterprise Access Token to avoid API access limits.', 'github-updater' ); + } + + /** + * Print the Bitbucket repo text. + */ + public function print_section_bitbucket_info() { + esc_html_e( 'Check box if private repository. Leave unchecked for public repositories.', 'github-updater' ); + } + + /** + * Print the Bitbucket user/pass text. + */ + public function print_section_bitbucket_username() { + esc_html_e( 'Enter your personal Bitbucket username and password.', 'github-updater' ); + } + + /** + * Print the GitLab Private Token text. + */ + public function print_section_gitlab_token() { + esc_html_e( 'Enter your GitLab.com, GitLab CE, or GitLab Enterprise Private Token.', 'github-updater' ); + } + + /** + * Print the Remote Management text. + */ + public function print_section_remote_management() { + esc_html_e( 'Use of Remote Management services may result increase some page load speeds only for `admin` level users in the dashboard.', 'github-updater' ); + } + + /** + * Get the settings option array and print one of its values. + * + * @param $args + */ + public function token_callback_text( $args ) { + $name = isset( parent::$options[ $args['id' ] ] ) ? esc_attr( parent::$options[ $args['id'] ] ) : ''; + $type = stristr( $args['id'], 'password' ) ? 'password' : 'text'; + ?> + + + + + + 'github-updater', + 'updated' => 'true', + 'tab' => $arr['tab'], + ), + network_admin_url( 'settings.php' ) + ); + wp_redirect( $location ); + exit; + } + + /** + * Add setting link to plugin page. + * Applied to the list of links to display on the plugins page (beside the activate/deactivate links). + * + * @link http://codex.wordpress.org/Plugin_API/Filter_Reference/plugin_action_links_(plugin_file_name) + * + * @param $links + * + * @return array + */ + public function plugin_action_links( $links ) { + $settings_page = is_multisite() ? 'settings.php' : 'options-general.php'; + $link = array( '' . esc_html__( 'Settings', 'github-updater' ) . '' ); + + return array_merge( $links, $link ); + } + +} diff --git a/www/wp-content/plugins/github-updater/src/GitHub_Updater/Theme.php b/www/wp-content/plugins/github-updater/src/GitHub_Updater/Theme.php new file mode 100755 index 0000000..3109620 --- /dev/null +++ b/www/wp-content/plugins/github-updater/src/GitHub_Updater/Theme.php @@ -0,0 +1,686 @@ +delete_all_transients( 'themes' ); + } + + /* + * Get details of installed git sourced themes. + */ + $this->config = $this->get_theme_meta(); + + if ( empty( $this->config ) ) { + return false; + } + + /* + * Load post-processing filters. Renaming filters, etc. + */ + $this->load_post_filters(); + } + + /** + * The Theme object can be created/obtained via this + * method - this prevents unnecessary work in rebuilding the object and + * querying to construct a list of categories, etc. + * + * @return Theme + */ + public static function instance() { + $class = __CLASS__; + if ( false === self::$object ) { + self::$object = new $class(); + } + + return self::$object; + } + + /** + * Reads in WP_Theme class of each theme. + * Populates variable array. + * + * @return array Indexed array of associative arrays of theme details. + */ + protected function get_theme_meta() { + $git_themes = array(); + $themes = wp_get_themes( array( 'errors' => null ) ); + + foreach ( (array) $themes as $theme ) { + $git_theme = array(); + $repo_uri = null; + $repo_enterprise_uri = null; + $repo_enterprise_api = null; + $additions = apply_filters( 'github_updater_additions', null, $theme, 'theme' ); + + foreach ( (array) self::$extra_headers as $value ) { + + $repo_uri = $theme->get( $value ); + + /** + * Get $repo_uri from themes added to GitHub Updater via hook. + */ + foreach ( (array) $additions as $addition ) { + if ( $theme->stylesheet === $addition['slug'] ) { + if ( ! empty( $addition[ $value ] ) ) { + $repo_uri = $addition[ $value ]; + break; + } + } + } + + if ( empty( $repo_uri ) || + false === stristr( $value, 'Theme' ) + ) { + continue; + } + + $header_parts = explode( ' ', $value ); + $repo_parts = $this->get_repo_parts( $header_parts[0], 'theme' ); + + if ( $repo_parts['bool'] ) { + $header = $this->parse_header_uri( $repo_uri ); + } + + $self_hosted_parts = array_diff( array_keys( self::$extra_repo_headers ), array( 'branch' ) ); + foreach ( $self_hosted_parts as $part ) { + $self_hosted = $theme->get( $repo_parts[ $part ] ); + + if ( ! empty( $self_hosted ) ) { + $repo_enterprise_uri = $self_hosted; + } + } + + if ( ! empty( $repo_enterprise_uri ) ) { + $repo_enterprise_uri = trim( $repo_enterprise_uri, '/' ); + switch( $header_parts[0] ) { + case 'GitHub': + $repo_enterprise_api = $repo_enterprise_uri . '/api/v3'; + break; + case 'GitLab': + $repo_enterprise_api = $repo_enterprise_uri . '/api/v3'; + break; + } + } + + $git_theme['type'] = $repo_parts['type']; + $git_theme['uri'] = $repo_parts['base_uri'] . $header['owner_repo']; + $git_theme['enterprise'] = $repo_enterprise_uri; + $git_theme['enterprise_api'] = $repo_enterprise_api; + $git_theme['owner'] = $header['owner']; + $git_theme['repo'] = $header['repo']; + $git_theme['extended_repo'] = $header['repo']; + $git_theme['name'] = $theme->get( 'Name' ); + $git_theme['theme_uri'] = $theme->get( 'ThemeURI' ); + $git_theme['author'] = $theme->get( 'Author' ); + $git_theme['local_version'] = strtolower( $theme->get( 'Version' ) ); + $git_theme['sections']['description'] = $theme->get( 'Description' ); + $git_theme['local_path'] = get_theme_root() . '/' . $git_theme['repo'] .'/'; + $git_theme['local_path_extended'] = null; + $git_theme['branch'] = $theme->get( $repo_parts['branch'] ); + $git_theme['branch'] = ! empty( $git_theme['branch'] ) ? $git_theme['branch'] : 'master'; + } + + /* + * Exit if not git hosted theme. + */ + if ( empty( $git_theme ) ) { + continue; + } + + $git_themes[ $git_theme['repo'] ] = (object) $git_theme; + } + /* + * Load post-processing filters. Renaming filters, etc. + */ + $this->load_post_filters(); + + return $git_themes; + } + + /** + * Get remote theme meta to populate $config theme objects. + * Calls to remote APIs to get data. + */ + public function get_remote_theme_meta() { + foreach ( (array) $this->config as $theme ) { + $this->repo_api = null; + switch( $theme->type ) { + case 'github_theme': + $this->repo_api = new GitHub_API( $theme ); + break; + case 'bitbucket_theme': + $this->repo_api = new Bitbucket_API( $theme ); + break; + case 'gitlab_theme': + $this->repo_api = new GitLab_API( $theme ); + break; + } + + if ( is_null( $this->repo_api ) ) { + continue; + } + + $this->{$theme->type} = $theme; + $this->set_defaults( $theme->type ); + + if ( $this->repo_api->get_remote_info( 'style.css' ) ) { + $this->repo_api->get_repo_meta(); + $this->repo_api->get_remote_tag(); + $changelog = $this->get_changelog_filename( $theme->type ); + if ( $changelog ) { + $this->repo_api->get_remote_changes( $changelog ); + } + $this->repo_api->get_remote_branches(); + $theme->download_link = $this->repo_api->construct_download_link(); + } + + /* + * Update theme transient with rollback data. + */ + if ( ! empty( $_GET['rollback'] ) && + ( isset( $_GET['theme'] ) && $theme->repo === $_GET['theme'] ) + ) { + $this->tag = $_GET['rollback']; + $updates_transient = get_site_transient('update_themes'); + $rollback = array( + 'theme' => $theme->repo, + 'new_version' => $this->tag, + 'url' => $theme->uri, + 'package' => $this->repo_api->construct_download_link( $this->tag, false ), + ); + if ( array_key_exists( $this->tag, $theme->branches ) ) { + $rollback['new_version'] = '0.0.0'; + } + $updates_transient->response[ $theme->repo ] = $rollback; + set_site_transient( 'update_themes', $updates_transient ); + } + + /* + * Remove WordPress update row in theme row, only in multisite. + * Add update row to theme row, only in multisite. + */ + if ( is_multisite() ) { + add_action( 'after_theme_row', array( &$this, 'remove_after_theme_row' ), 10, 2 ); + if ( ! $this->tag ) { + add_action( "after_theme_row_$theme->repo", array( &$this, 'wp_theme_update_row' ), 10, 2 ); + add_action( "after_theme_row_$theme->repo", array( &$this, 'theme_branch_switcher'), 10, 2 ); + } + } + } + $this->make_force_check_transient( 'themes' ); + set_site_transient( 'ghu_theme', self::$object, ( self::$hours * HOUR_IN_SECONDS ) ); + $this->load_pre_filters(); + } + + /** + * Load pre-update filters. + */ + public function load_pre_filters() { + if ( ! is_multisite() ) { + add_filter( 'wp_prepare_themes_for_js', array( &$this, 'customize_theme_update_html' ) ); + } + add_filter( 'themes_api', array( &$this, 'themes_api' ), 99, 3 ); + add_filter( 'pre_set_site_transient_update_themes', array( &$this, 'pre_set_site_transient_update_themes' ) ); + } + + /** + * Put changelog in themes_api, return WP.org data as appropriate. + * + * @param $false + * @param $action + * @param $response + * + * @return mixed + */ + public function themes_api( $false, $action, $response ) { + if ( ! ( 'theme_information' === $action ) ) { + return $false; + } + + /* + * Early return $false for adding themes from repo + */ + if ( isset( $response->fields ) && ! $response->fields['sections'] ) { + return $false; + } + + foreach ( (array) $this->config as $theme ) { + if ( $response->slug === $theme->repo ) { + $response->slug = $theme->repo; + $response->name = $theme->name; + $response->homepage = $theme->uri; + $response->donate_link = $theme->donate_link; + $response->version = $theme->remote_version; + $response->sections = $theme->sections; + $response->description = implode( "\n", $theme->sections ); + $response->author = $theme->author; + $response->preview_url = $theme->theme_uri; + $response->requires = $theme->requires; + $response->tested = $theme->tested; + $response->downloaded = $theme->downloaded; + $response->last_updated = $theme->last_updated; + $response->rating = $theme->rating; + $response->num_ratings = $theme->num_ratings; + if ( $theme->private ) { + add_action( 'admin_head', array( $this, 'remove_rating_in_private_repo' ) ); + } + break; + } + } + add_action( 'admin_head', array( $this, 'fix_display_in_themes_api' ) ); + + return $response; + } + + /** + * Fix for new issue in 3.9 :-( + */ + public function fix_display_in_themes_api() { + ?> + + #theme-installer div.install-theme-info div.star-rating { display: none; } '; + } + + /** + * Add custom theme update row, from /wp-admin/includes/update.php + * + * @param $theme_key + * @param $theme + * + * @author Seth Carstens + */ + public function wp_theme_update_row( $theme_key, $theme ) { + $current = get_site_transient( 'update_themes' ); + $themes_allowedtags = array( + 'a' => array( 'href' => array(), 'title' => array() ), + 'abbr' => array( 'title' => array() ), + 'acronym' => array( 'title' => array() ), + 'code' => array(), + 'em' => array(), + 'strong' => array(), + ); + $theme_name = wp_kses( $theme['Name'], $themes_allowedtags ); + $wp_list_table = _get_list_table( 'WP_MS_Themes_List_Table' ); + $install_url = self_admin_url( "theme-install.php" ); + $details_url = esc_attr( add_query_arg( + array( + 'tab' => 'theme-information', + 'theme' => $theme_key, + 'TB_iframe' => 'true', + 'width' => 270, + 'height' => 400 + ), + $install_url ) ); + + if ( isset( $current->up_to_date[ $theme_key ] ) ) { + $rollback = $current->up_to_date[ $theme_key ]['rollback']; + $rollback_keys = array_keys( $rollback ); + echo '
'; + esc_html_e( 'Theme is up-to-date!', 'github-updater' ); + echo ' '; + if ( count( $rollback ) > 0 ) { + array_shift( $rollback_keys ); //don't show newest tag, it should be release version + echo ''; + esc_html_e( 'Rollback to:', 'github-updater' ); + echo ' '; + // display last three tags + for ( $i = 0; $i < 3 ; $i++ ) { + $tag = array_shift( $rollback_keys ); + if ( empty( $tag ) ) { + break; + } + if ( $i > 0 ) { + echo ", "; + } + printf( '%s', + wp_nonce_url( self_admin_url( 'update.php?action=upgrade-theme&theme=' ) . $theme_key, 'upgrade-theme_' . $theme_key ), + '&rollback=' . urlencode( $tag ), + $tag + ); + } + } else { + esc_html_e( 'No previous tags to rollback to.', 'github-updater' ); + } + } + + if ( isset( $current->response[ $theme_key ] ) ) { + $r = $current->response[ $theme_key ]; + echo '
'; + if ( empty( $r['package'] ) ) { + printf( esc_html__( 'GitHub Updater shows a new version of %s available.', 'github-updater' ), + $theme_name + ); + printf( ' ', + $details_url, + $theme_name + ); + printf( esc_html__( 'View version %s details.', 'github-updater' ), + $r['new_version'] + ); + echo ''; + esc_html_e( 'Automatic update is unavailable for this theme.', 'github-updater' ); + echo ''; + } else { + printf( esc_html__( 'GitHub Updater shows a new version of %s available.', 'github-updater' ), + $theme_name + ); + printf( ' ', + $details_url, + $theme_name + ); + printf( esc_html__( 'View version %1$s details%2$s or %3$supdate now%4$s.', 'github-updater' ), + $r['new_version'], + '', + '', + '' + ); + } + + do_action( "in_theme_update_message-$theme_key", $theme, $r ); + } + echo '
'; + } + + /** + * Create branch switcher row for themes. + * + * @param $theme_key + * @param $theme + * + * @return bool|void + */ + public function theme_branch_switcher( $theme_key, $theme ) { + $options = get_site_option( 'github_updater' ); + if ( empty( $options['branch_switch'] ) ) { + return false; + } + + $wp_list_table = _get_list_table( 'WP_MS_Themes_List_Table' ); + $id = $theme_key . '-id'; + $branches = isset( $this->config[ $theme_key ] ) ? $this->config[ $theme_key ]->branches : null; + + /* + * Get current branch. + */ + foreach ( parent::$git_servers as $server ) { + $branch_key = $server . ' Branch'; + $branch = $theme->get( $branch_key ) ? $theme->get( $branch_key ) : 'master'; + if ( 'master' !== $branch ) { + break; + } + } + + /* + * Create after_theme_row_ + */ + echo '
'; + + printf( esc_html__( 'Current branch is `%1$s`, try %2$sanother branch%3$s.', 'github-updater' ), + $branch, + '', + '' + ); + + print( '' ); + echo '
'; + } + + /** + * Remove default after_theme_row_$stylesheet. + * + * @author @grappler + * + * @param $theme_key + * @param $theme + */ + public function remove_after_theme_row( $theme_key, $theme ) { + + foreach ( parent::$git_servers as $server ) { + $repo_header = $server . ' Theme URI'; + $repo_uri = $theme->get( $repo_header ); + + /** + * Filter to add themes not containing appropriate header line. + * + * @since 5.4.0 + * @access public + * + * @param array $additions Listing of themes to add. + * Default null. + * @param array $theme Current theme. + * @param string 'theme' Type being passed. + */ + $additions = apply_filters( 'github_updater_additions', null, $theme, 'theme' ); + foreach ( (array) $additions as $addition ) { + if ( $theme_key === $addition['slug'] ) { + if ( ! empty( $addition[ $server . ' Theme URI' ] ) ) { + $repo_uri = $addition[ $server . ' Theme URI' ]; + break; + } + } + } + if ( empty( $repo_uri ) ) { + continue; + } + + remove_action( "after_theme_row_$theme_key", 'wp_theme_update_row', 10 ); + } + } + + /** + * Call update theme messaging if needed for single site installation + * + * @author Seth Carstens + * + * @param $prepared_themes + * + * @return mixed + */ + public function customize_theme_update_html( $prepared_themes ) { + + foreach ( (array) $this->config as $theme ) { + if ( empty( $prepared_themes[ $theme->repo ] ) ) { + continue; + } + + if ( ! empty( $prepared_themes[ $theme->repo ]['hasUpdate'] ) ) { + $prepared_themes[ $theme->repo ]['update'] = $this->append_theme_actions_content( $theme ); + } else { + $prepared_themes[ $theme->repo ]['description'] .= $this->append_theme_actions_content( $theme ); + } + } + + return $prepared_themes; + } + + /** + * Create theme update messaging + * + * @author Seth Carstens + * + * @access private + * @param object $theme + * + * @return string (content buffer) + */ + protected function append_theme_actions_content( $theme ) { + $options = get_site_option( 'github_updater' ); + $details_url = esc_url( self_admin_url( "theme-install.php?tab=theme-information&theme=$theme->repo&TB_iframe=true&width=270&height=400" ) ); + $theme_update_transient = get_site_transient( 'update_themes' ); + + /** + * If the theme is outdated, display the custom theme updater content. + * If theme is not present in theme_update transient response ( theme is not up to date ) + */ + if ( empty( $theme_update_transient->up_to_date[ $theme->repo ] ) ) { + $update_url = wp_nonce_url( self_admin_url( 'update.php?action=upgrade-theme&theme=' ) . urlencode( $theme->repo ), 'upgrade-theme_' . $theme->repo ); + ob_start(); + ?> +
+ name + ); + printf( ' ', + $details_url, + esc_attr( $theme->name ) + ); + printf( esc_html__( 'View version %1$s details%2$s or %3$supdate now%4$s.', 'github-updater' ), + $theme->remote_version, + '', + '', + '' + ); + ?> +
+ repo ), 'upgrade-theme_' . $theme->repo ), '&rollback=' ); + + ?> +

', + '' + ); + ?> +

+ + config as $theme ) { + if ( empty( $theme->uri ) ) { + continue; + } + + $update = array( + 'theme' => $theme->repo, + 'new_version' => $theme->remote_version, + 'url' => $theme->uri, + 'package' => $theme->download_link, + ); + + if ( $this->can_update( $theme ) ) { + $transient->response[ $theme->repo ] = $update; + } else { // up-to-date! + $transient->up_to_date[ $theme->repo ]['rollback'] = $theme->rollback; + $transient->up_to_date[ $theme->repo ]['response'] = $update; + } + } + + return $transient; + } + +} diff --git a/www/wp-content/plugins/github-updater/uninstall.php b/www/wp-content/plugins/github-updater/uninstall.php new file mode 100755 index 0000000..8238e83 --- /dev/null +++ b/www/wp-content/plugins/github-updater/uninstall.php @@ -0,0 +1,35 @@ +parse_readme_contents( $file_contents ); + } + + function parse_readme_contents( $file_contents ) { + $file_contents = str_replace(array("\r\n", "\r"), "\n", $file_contents); + $file_contents = trim($file_contents); + if ( 0 === strpos( $file_contents, "\xEF\xBB\xBF" ) ) + $file_contents = substr( $file_contents, 3 ); + + // === Plugin Name === + // Must be the very first thing. + if ( !preg_match('|^===(.*)===|', $file_contents, $_name) ) + return array(); // require a name + $name = trim($_name[1], '='); + $name = $this->sanitize_text( $name ); + + $file_contents = $this->chop_string( $file_contents, $_name[0] ); + + + // Requires at least: 1.5 + if ( preg_match('|Requires at least:(.*)|i', $file_contents, $_requires_at_least) ) + $requires_at_least = $this->sanitize_text($_requires_at_least[1]); + else + $requires_at_least = NULL; + + + // Tested up to: 2.1 + if ( preg_match('|Tested up to:(.*)|i', $file_contents, $_tested_up_to) ) + $tested_up_to = $this->sanitize_text( $_tested_up_to[1] ); + else + $tested_up_to = NULL; + + + // Stable tag: 10.4-ride-the-fire-eagle-danger-day + if ( preg_match('|Stable tag:(.*)|i', $file_contents, $_stable_tag) ) + $stable_tag = $this->sanitize_text( $_stable_tag[1] ); + else + $stable_tag = NULL; // we assume trunk, but don't set it here to tell the difference between specified trunk and default trunk + + + // Tags: some tag, another tag, we like tags + if ( preg_match('|Tags:(.*)|i', $file_contents, $_tags) ) { + $tags = preg_split('|,[\s]*?|', trim($_tags[1])); + foreach ( array_keys($tags) as $t ) + $tags[$t] = $this->sanitize_text( $tags[$t] ); + } else { + $tags = array(); + } + + + // Contributors: markjaquith, mdawaffe, zefrank + $contributors = array(); + if ( preg_match('|Contributors:(.*)|i', $file_contents, $_contributors) ) { + $temp_contributors = preg_split('|,[\s]*|', trim($_contributors[1])); + foreach ( array_keys($temp_contributors) as $c ) { + $tmp_sanitized = $this->user_sanitize( $temp_contributors[$c] ); + if ( strlen(trim($tmp_sanitized)) > 0 ) + $contributors[$c] = $tmp_sanitized; + unset($tmp_sanitized); + } + } + + // Donate Link: URL + if ( preg_match('|Donate link:\s+(.*)|i', $file_contents, $_donate_link) ) + $donate_link = esc_url( $_donate_link[1] ); + else + $donate_link = NULL; + + // License: GPLv2 (Lots of plugins have this, so lets pull it out so it doesn't get into our short description) + if ( preg_match('|License:(.*)|i', $file_contents, $_license) ) + $license = $this->sanitize_text( $_license[1] ); + else + $license = NULL; + + // License URI: URL + if ( preg_match( '|License URI:\s+(.*)|i', $file_contents, $_license_uri ) ) + $license_uri = esc_url( $_license_uri[1] ); + else + $license_uri = null; + + // togs, conts, etc are optional and order shouldn't matter. So we chop them only after we've grabbed their values. + foreach ( array('tags', 'contributors', 'requires_at_least', 'tested_up_to', 'stable_tag', 'donate_link', 'license', 'license_uri') as $chop ) { + if ( $$chop ) { + $_chop = '_' . $chop; + $file_contents = $this->chop_string( $file_contents, ${$_chop}[0] ); + } + } + + $file_contents = trim($file_contents); + + + // short-description fu + if ( !preg_match('/(^(.*?))^[\s]*=+?[\s]*.+?[\s]*=+?/ms', $file_contents, $_short_description) ) + $_short_description = array( 1 => &$file_contents, 2 => &$file_contents ); + $short_desc_filtered = $this->sanitize_text( $_short_description[2] ); + $short_desc_length = strlen($short_desc_filtered); + $short_description = substr($short_desc_filtered, 0, 150); + if ( $short_desc_length > strlen($short_description) ) + $truncated = true; + else + $truncated = false; + if ( $_short_description[1] ) + $file_contents = $this->chop_string( $file_contents, $_short_description[1] ); // yes, the [1] is intentional + + // == Section == + // Break into sections + // $_sections[0] will be the title of the first section, $_sections[1] will be the content of the first section + // the array alternates from there: title2, content2, title3, content3... and so forth + $_sections = preg_split('/^[\s]*==[\s]*(.+?)[\s]*==/m', $file_contents, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY); + + $sections = array(); + for ( $i=1; $i <= count($_sections); $i +=2 ) { + $_sections[$i] = preg_replace('/^[\s]*=[\s]+(.+?)[\s]+=/m', '

$1

', $_sections[$i]); + $_sections[$i] = $this->filter_text( $_sections[$i], true ); + $title = $this->sanitize_text( $_sections[$i-1] ); + $sections[str_replace(' ', '_', strtolower($title))] = array('title' => $title, 'content' => $_sections[$i]); + } + + + // Special sections + // This is where we nab our special sections, so we can enforce their order and treat them differently, if needed + // upgrade_notice is not a section, but parse it like it is for now + $final_sections = array(); + foreach ( array('description', 'installation', 'frequently_asked_questions', 'screenshots', 'changelog', 'change_log', 'upgrade_notice') as $special_section ) { + if ( isset($sections[$special_section]) ) { + $final_sections[$special_section] = $sections[$special_section]['content']; + unset($sections[$special_section]); + } + } + if ( isset($final_sections['change_log']) && empty($final_sections['changelog']) ) + $final_sections['changelog'] = $final_sections['change_log']; + + + $final_screenshots = array(); + if ( isset($final_sections['screenshots']) ) { + preg_match_all('|
  • (.*?)
  • |s', $final_sections['screenshots'], $screenshots, PREG_SET_ORDER); + if ( $screenshots ) { + foreach ( (array) $screenshots as $ss ) + $final_screenshots[] = $ss[1]; + } + } + + // Parse the upgrade_notice section specially: + // 1.0 => blah, 1.1 => fnord + $upgrade_notice = array(); + if ( isset($final_sections['upgrade_notice']) ) { + $split = preg_split( '#

    (.*?)

    #', $final_sections['upgrade_notice'], -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY ); + for ( $i = 0; $i < count( $split ); $i += 2 ) { + if ( empty( $split[$i + 1] ) ) { + break; + } + $upgrade_notice[$this->sanitize_text( $split[$i] )] = substr( $this->sanitize_text( $split[$i + 1] ), 0, 300 ); + } + unset( $final_sections['upgrade_notice'] ); + } + + // No description? + // No problem... we'll just fall back to the old style of description + // We'll even let you use markup this time! + $excerpt = false; + if ( !isset($final_sections['description']) ) { + $final_sections = array_merge(array('description' => $this->filter_text( $_short_description[2], true )), $final_sections); + $excerpt = true; + } + + + // dump the non-special sections into $remaining_content + // their order will be determined by their original order in the readme.txt + $remaining_content = ''; + foreach ( $sections as $s_name => $s_data ) { + $title_id = esc_attr($s_data['title']); + $title_id = str_replace(' ','-',$title_id); + $remaining_content .= "\n

    {$s_data['title']}

    \n{$s_data['content']}"; + } + $remaining_content = trim($remaining_content); + + + // All done! + // $r['tags'] and $r['contributors'] are simple arrays + // $r['sections'] is an array with named elements + $r = array( + 'name' => $name, + 'tags' => $tags, + 'requires_at_least' => $requires_at_least, + 'tested_up_to' => $tested_up_to, + 'stable_tag' => $stable_tag, + 'contributors' => $contributors, + 'donate_link' => $donate_link, + 'license' => $license, + 'license_uri' => $license_uri, + 'short_description' => $short_description, + 'screenshots' => $final_screenshots, + 'is_excerpt' => $excerpt, + 'is_truncated' => $truncated, + 'sections' => $final_sections, + 'remaining_content' => $remaining_content, + 'upgrade_notice' => $upgrade_notice + ); + + return $r; + } + + function chop_string( $string, $chop ) { // chop a "prefix" from a string: Agressive! uses strstr not 0 === strpos + if ( $_string = strstr($string, $chop) ) { + $_string = substr($_string, strlen($chop)); + return trim($_string); + } else { + return trim($string); + } + } + + function user_sanitize( $text, $strict = false ) { // whitelisted chars + if ( function_exists('user_sanitize') ) // bbPress native + return user_sanitize( $text, $strict ); + + if ( $strict ) { + $text = preg_replace('/[^a-z0-9-]/i', '', $text); + $text = preg_replace('|-+|', '-', $text); + } else { + $text = preg_replace('/[^a-z0-9_-]/i', '', $text); + } + return $text; + } + + function sanitize_text( $text ) { // not fancy + $text = strip_tags($text); + $text = esc_html($text); + $text = trim($text); + return $text; + } + + function filter_text( $text, $markdown = false ) { // fancy, Markdown + $text = trim($text); + + $text = call_user_func( array( __CLASS__, 'code_trick' ), $text, $markdown ); // A better parser than Markdown's for: backticks -> CODE + + if ( $markdown ) { // Parse markdown. + if ( !function_exists('Markdown') ) + require( AUTOMATTIC_README_MARKDOWN ); + $text = Markdown($text); + } + + $allowed = array( + 'a' => array( + 'href' => array(), + 'title' => array(), + 'rel' => array()), + 'blockquote' => array('cite' => array()), + 'br' => array(), + 'cite' => array(), + 'p' => array(), + 'code' => array(), + 'pre' => array(), + 'em' => array(), + 'strong' => array(), + 'ul' => array(), + 'ol' => array(), + 'li' => array(), + 'h3' => array(), + 'h4' => array() + ); + + $text = balanceTags($text); + + $text = wp_kses( $text, $allowed ); + $text = trim($text); + return $text; + } + + function code_trick( $text, $markdown ) { // Don't use bbPress native function - it's incompatible with Markdown + // If doing markdown, first take any user formatted code blocks and turn them into backticks so that + // markdown will preserve things like underscores in code blocks + if ( $markdown ) + $text = preg_replace_callback("!(
    |)(.*?)(
    |)!s", array( __CLASS__,'decodeit'), $text); + + $text = str_replace(array("\r\n", "\r"), "\n", $text); + if ( !$markdown ) { + // This gets the "inline" code blocks, but can't be used with Markdown. + $text = preg_replace_callback("|(`)(.*?)`|", array( __CLASS__, 'encodeit'), $text); + // This gets the "block level" code blocks and converts them to PRE CODE + $text = preg_replace_callback("!(^|\n)`(.*?)`!s", array( __CLASS__, 'encodeit'), $text); + } else { +// // Markdown can do inline code, we convert bbPress style block level code to Markdown style +// $text = preg_replace_callback("!(^|\n)([ \t]*?)`(.*?)`!s", array( __CLASS__, 'indent'), $text); + + // Markdown seems to be choking on block level stuff too. Let's just encode it and be done with it. + $text = preg_replace_callback("!(^|\n)`(.*?)`!s", array( __CLASS__, 'encodeit'), $text); + } + return $text; + } + + function indent( $matches ) { + $text = $matches[3]; + $text = preg_replace('|^|m', $matches[2] . ' ', $text); + return $matches[1] . $text; + } + + function encodeit( $matches ) { + if ( function_exists('encodeit') ) // bbPress native + return encodeit( $matches ); + + $text = trim($matches[2]); + $text = htmlspecialchars($text, ENT_QUOTES); + $text = str_replace(array("\r\n", "\r"), "\n", $text); + $text = preg_replace("|\n\n\n+|", "\n\n", $text); + $text = str_replace('&lt;', '<', $text); + $text = str_replace('&gt;', '>', $text); + $text = "$text"; + if ( "`" != $matches[1] ) + $text = "
    $text
    "; + return $text; + } + + function decodeit( $matches ) { + if ( function_exists('decodeit') ) // bbPress native + return decodeit( $matches ); + + $text = $matches[2]; + $trans_table = array_flip(get_html_translation_table(HTML_ENTITIES)); + $text = strtr($text, $trans_table); + $text = str_replace('
    ', '', $text); + $text = str_replace('&', '&', $text); + $text = str_replace(''', "'", $text); + if ( '
    ' == $matches[1] )
    +			$text = "\n$text\n";
    +		return "`$text`";
    +	}
    +
    +} // end class
    diff --git a/www/wp-content/plugins/github-updater/vendor/parsedown/LICENSE.txt b/www/wp-content/plugins/github-updater/vendor/parsedown/LICENSE.txt
    new file mode 100755
    index 0000000..baca86f
    --- /dev/null
    +++ b/www/wp-content/plugins/github-updater/vendor/parsedown/LICENSE.txt
    @@ -0,0 +1,20 @@
    +The MIT License (MIT)
    +
    +Copyright (c) 2013 Emanuil Rusev, erusev.com
    +
    +Permission is hereby granted, free of charge, to any person obtaining a copy of
    +this software and associated documentation files (the "Software"), to deal in
    +the Software without restriction, including without limitation the rights to
    +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
    +the Software, and to permit persons to whom the Software is furnished to do so,
    +subject to the following conditions:
    +
    +The above copyright notice and this permission notice shall be included in all
    +copies or substantial portions of the Software.
    +
    +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
    +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
    +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
    +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
    +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    \ No newline at end of file
    diff --git a/www/wp-content/plugins/github-updater/vendor/parsedown/Parsedown.php b/www/wp-content/plugins/github-updater/vendor/parsedown/Parsedown.php
    new file mode 100755
    index 0000000..c8c92a3
    --- /dev/null
    +++ b/www/wp-content/plugins/github-updater/vendor/parsedown/Parsedown.php
    @@ -0,0 +1,1528 @@
    +DefinitionData = array();
    +
    +        # standardize line breaks
    +        $text = str_replace(array("\r\n", "\r"), "\n", $text);
    +
    +        # remove surrounding line breaks
    +        $text = trim($text, "\n");
    +
    +        # split text into lines
    +        $lines = explode("\n", $text);
    +
    +        # iterate through lines to identify blocks
    +        $markup = $this->lines($lines);
    +
    +        # trim line breaks
    +        $markup = trim($markup, "\n");
    +
    +        return $markup;
    +    }
    +
    +    #
    +    # Setters
    +    #
    +
    +    function setBreaksEnabled($breaksEnabled)
    +    {
    +        $this->breaksEnabled = $breaksEnabled;
    +
    +        return $this;
    +    }
    +
    +    protected $breaksEnabled;
    +
    +    function setMarkupEscaped($markupEscaped)
    +    {
    +        $this->markupEscaped = $markupEscaped;
    +
    +        return $this;
    +    }
    +
    +    protected $markupEscaped;
    +
    +    function setUrlsLinked($urlsLinked)
    +    {
    +        $this->urlsLinked = $urlsLinked;
    +
    +        return $this;
    +    }
    +
    +    protected $urlsLinked = true;
    +
    +    #
    +    # Lines
    +    #
    +
    +    protected $BlockTypes = array(
    +        '#' => array('Header'),
    +        '*' => array('Rule', 'List'),
    +        '+' => array('List'),
    +        '-' => array('SetextHeader', 'Table', 'Rule', 'List'),
    +        '0' => array('List'),
    +        '1' => array('List'),
    +        '2' => array('List'),
    +        '3' => array('List'),
    +        '4' => array('List'),
    +        '5' => array('List'),
    +        '6' => array('List'),
    +        '7' => array('List'),
    +        '8' => array('List'),
    +        '9' => array('List'),
    +        ':' => array('Table'),
    +        '<' => array('Comment', 'Markup'),
    +        '=' => array('SetextHeader'),
    +        '>' => array('Quote'),
    +        '[' => array('Reference'),
    +        '_' => array('Rule'),
    +        '`' => array('FencedCode'),
    +        '|' => array('Table'),
    +        '~' => array('FencedCode'),
    +    );
    +
    +    # ~
    +
    +    protected $unmarkedBlockTypes = array(
    +        'Code',
    +    );
    +
    +    #
    +    # Blocks
    +    #
    +
    +    private function lines(array $lines)
    +    {
    +        $CurrentBlock = null;
    +
    +        foreach ($lines as $line)
    +        {
    +            if (chop($line) === '')
    +            {
    +                if (isset($CurrentBlock))
    +                {
    +                    $CurrentBlock['interrupted'] = true;
    +                }
    +
    +                continue;
    +            }
    +
    +            if (strpos($line, "\t") !== false)
    +            {
    +                $parts = explode("\t", $line);
    +
    +                $line = $parts[0];
    +
    +                unset($parts[0]);
    +
    +                foreach ($parts as $part)
    +                {
    +                    $shortage = 4 - mb_strlen($line, 'utf-8') % 4;
    +
    +                    $line .= str_repeat(' ', $shortage);
    +                    $line .= $part;
    +                }
    +            }
    +
    +            $indent = 0;
    +
    +            while (isset($line[$indent]) and $line[$indent] === ' ')
    +            {
    +                $indent ++;
    +            }
    +
    +            $text = $indent > 0 ? substr($line, $indent) : $line;
    +
    +            # ~
    +
    +            $Line = array('body' => $line, 'indent' => $indent, 'text' => $text);
    +
    +            # ~
    +
    +            if (isset($CurrentBlock['continuable']))
    +            {
    +                $Block = $this->{'block'.$CurrentBlock['type'].'Continue'}($Line, $CurrentBlock);
    +
    +                if (isset($Block))
    +                {
    +                    $CurrentBlock = $Block;
    +
    +                    continue;
    +                }
    +                else
    +                {
    +                    if (method_exists($this, 'block'.$CurrentBlock['type'].'Complete'))
    +                    {
    +                        $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock);
    +                    }
    +                }
    +            }
    +
    +            # ~
    +
    +            $marker = $text[0];
    +
    +            # ~
    +
    +            $blockTypes = $this->unmarkedBlockTypes;
    +
    +            if (isset($this->BlockTypes[$marker]))
    +            {
    +                foreach ($this->BlockTypes[$marker] as $blockType)
    +                {
    +                    $blockTypes []= $blockType;
    +                }
    +            }
    +
    +            #
    +            # ~
    +
    +            foreach ($blockTypes as $blockType)
    +            {
    +                $Block = $this->{'block'.$blockType}($Line, $CurrentBlock);
    +
    +                if (isset($Block))
    +                {
    +                    $Block['type'] = $blockType;
    +
    +                    if ( ! isset($Block['identified']))
    +                    {
    +                        $Blocks []= $CurrentBlock;
    +
    +                        $Block['identified'] = true;
    +                    }
    +
    +                    if (method_exists($this, 'block'.$blockType.'Continue'))
    +                    {
    +                        $Block['continuable'] = true;
    +                    }
    +
    +                    $CurrentBlock = $Block;
    +
    +                    continue 2;
    +                }
    +            }
    +
    +            # ~
    +
    +            if (isset($CurrentBlock) and ! isset($CurrentBlock['type']) and ! isset($CurrentBlock['interrupted']))
    +            {
    +                $CurrentBlock['element']['text'] .= "\n".$text;
    +            }
    +            else
    +            {
    +                $Blocks []= $CurrentBlock;
    +
    +                $CurrentBlock = $this->paragraph($Line);
    +
    +                $CurrentBlock['identified'] = true;
    +            }
    +        }
    +
    +        # ~
    +
    +        if (isset($CurrentBlock['continuable']) and method_exists($this, 'block'.$CurrentBlock['type'].'Complete'))
    +        {
    +            $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock);
    +        }
    +
    +        # ~
    +
    +        $Blocks []= $CurrentBlock;
    +
    +        unset($Blocks[0]);
    +
    +        # ~
    +
    +        $markup = '';
    +
    +        foreach ($Blocks as $Block)
    +        {
    +            if (isset($Block['hidden']))
    +            {
    +                continue;
    +            }
    +
    +            $markup .= "\n";
    +            $markup .= isset($Block['markup']) ? $Block['markup'] : $this->element($Block['element']);
    +        }
    +
    +        $markup .= "\n";
    +
    +        # ~
    +
    +        return $markup;
    +    }
    +
    +    #
    +    # Code
    +
    +    protected function blockCode($Line, $Block = null)
    +    {
    +        if (isset($Block) and ! isset($Block['type']) and ! isset($Block['interrupted']))
    +        {
    +            return;
    +        }
    +
    +        if ($Line['indent'] >= 4)
    +        {
    +            $text = substr($Line['body'], 4);
    +
    +            $Block = array(
    +                'element' => array(
    +                    'name' => 'pre',
    +                    'handler' => 'element',
    +                    'text' => array(
    +                        'name' => 'code',
    +                        'text' => $text,
    +                    ),
    +                ),
    +            );
    +
    +            return $Block;
    +        }
    +    }
    +
    +    protected function blockCodeContinue($Line, $Block)
    +    {
    +        if ($Line['indent'] >= 4)
    +        {
    +            if (isset($Block['interrupted']))
    +            {
    +                $Block['element']['text']['text'] .= "\n";
    +
    +                unset($Block['interrupted']);
    +            }
    +
    +            $Block['element']['text']['text'] .= "\n";
    +
    +            $text = substr($Line['body'], 4);
    +
    +            $Block['element']['text']['text'] .= $text;
    +
    +            return $Block;
    +        }
    +    }
    +
    +    protected function blockCodeComplete($Block)
    +    {
    +        $text = $Block['element']['text']['text'];
    +
    +        $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8');
    +
    +        $Block['element']['text']['text'] = $text;
    +
    +        return $Block;
    +    }
    +
    +    #
    +    # Comment
    +
    +    protected function blockComment($Line)
    +    {
    +        if ($this->markupEscaped)
    +        {
    +            return;
    +        }
    +
    +        if (isset($Line['text'][3]) and $Line['text'][3] === '-' and $Line['text'][2] === '-' and $Line['text'][1] === '!')
    +        {
    +            $Block = array(
    +                'markup' => $Line['body'],
    +            );
    +
    +            if (preg_match('/-->$/', $Line['text']))
    +            {
    +                $Block['closed'] = true;
    +            }
    +
    +            return $Block;
    +        }
    +    }
    +
    +    protected function blockCommentContinue($Line, array $Block)
    +    {
    +        if (isset($Block['closed']))
    +        {
    +            return;
    +        }
    +
    +        $Block['markup'] .= "\n" . $Line['body'];
    +
    +        if (preg_match('/-->$/', $Line['text']))
    +        {
    +            $Block['closed'] = true;
    +        }
    +
    +        return $Block;
    +    }
    +
    +    #
    +    # Fenced Code
    +
    +    protected function blockFencedCode($Line)
    +    {
    +        if (preg_match('/^['.$Line['text'][0].']{3,}[ ]*([\w-]+)?[ ]*$/', $Line['text'], $matches))
    +        {
    +            $Element = array(
    +                'name' => 'code',
    +                'text' => '',
    +            );
    +
    +            if (isset($matches[1]))
    +            {
    +                $class = 'language-'.$matches[1];
    +
    +                $Element['attributes'] = array(
    +                    'class' => $class,
    +                );
    +            }
    +
    +            $Block = array(
    +                'char' => $Line['text'][0],
    +                'element' => array(
    +                    'name' => 'pre',
    +                    'handler' => 'element',
    +                    'text' => $Element,
    +                ),
    +            );
    +
    +            return $Block;
    +        }
    +    }
    +
    +    protected function blockFencedCodeContinue($Line, $Block)
    +    {
    +        if (isset($Block['complete']))
    +        {
    +            return;
    +        }
    +
    +        if (isset($Block['interrupted']))
    +        {
    +            $Block['element']['text']['text'] .= "\n";
    +
    +            unset($Block['interrupted']);
    +        }
    +
    +        if (preg_match('/^'.$Block['char'].'{3,}[ ]*$/', $Line['text']))
    +        {
    +            $Block['element']['text']['text'] = substr($Block['element']['text']['text'], 1);
    +
    +            $Block['complete'] = true;
    +
    +            return $Block;
    +        }
    +
    +        $Block['element']['text']['text'] .= "\n".$Line['body'];;
    +
    +        return $Block;
    +    }
    +
    +    protected function blockFencedCodeComplete($Block)
    +    {
    +        $text = $Block['element']['text']['text'];
    +
    +        $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8');
    +
    +        $Block['element']['text']['text'] = $text;
    +
    +        return $Block;
    +    }
    +
    +    #
    +    # Header
    +
    +    protected function blockHeader($Line)
    +    {
    +        if (isset($Line['text'][1]))
    +        {
    +            $level = 1;
    +
    +            while (isset($Line['text'][$level]) and $Line['text'][$level] === '#')
    +            {
    +                $level ++;
    +            }
    +
    +            if ($level > 6)
    +            {
    +                return;
    +            }
    +
    +            $text = trim($Line['text'], '# ');
    +
    +            $Block = array(
    +                'element' => array(
    +                    'name' => 'h' . min(6, $level),
    +                    'text' => $text,
    +                    'handler' => 'line',
    +                ),
    +            );
    +
    +            return $Block;
    +        }
    +    }
    +
    +    #
    +    # List
    +
    +    protected function blockList($Line)
    +    {
    +        list($name, $pattern) = $Line['text'][0] <= '-' ? array('ul', '[*+-]') : array('ol', '[0-9]+[.]');
    +
    +        if (preg_match('/^('.$pattern.'[ ]+)(.*)/', $Line['text'], $matches))
    +        {
    +            $Block = array(
    +                'indent' => $Line['indent'],
    +                'pattern' => $pattern,
    +                'element' => array(
    +                    'name' => $name,
    +                    'handler' => 'elements',
    +                ),
    +            );
    +
    +            $Block['li'] = array(
    +                'name' => 'li',
    +                'handler' => 'li',
    +                'text' => array(
    +                    $matches[2],
    +                ),
    +            );
    +
    +            $Block['element']['text'] []= & $Block['li'];
    +
    +            return $Block;
    +        }
    +    }
    +
    +    protected function blockListContinue($Line, array $Block)
    +    {
    +        if ($Block['indent'] === $Line['indent'] and preg_match('/^'.$Block['pattern'].'(?:[ ]+(.*)|$)/', $Line['text'], $matches))
    +        {
    +            if (isset($Block['interrupted']))
    +            {
    +                $Block['li']['text'] []= '';
    +
    +                unset($Block['interrupted']);
    +            }
    +
    +            unset($Block['li']);
    +
    +            $text = isset($matches[1]) ? $matches[1] : '';
    +
    +            $Block['li'] = array(
    +                'name' => 'li',
    +                'handler' => 'li',
    +                'text' => array(
    +                    $text,
    +                ),
    +            );
    +
    +            $Block['element']['text'] []= & $Block['li'];
    +
    +            return $Block;
    +        }
    +
    +        if ($Line['text'][0] === '[' and $this->blockReference($Line))
    +        {
    +            return $Block;
    +        }
    +
    +        if ( ! isset($Block['interrupted']))
    +        {
    +            $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']);
    +
    +            $Block['li']['text'] []= $text;
    +
    +            return $Block;
    +        }
    +
    +        if ($Line['indent'] > 0)
    +        {
    +            $Block['li']['text'] []= '';
    +
    +            $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']);
    +
    +            $Block['li']['text'] []= $text;
    +
    +            unset($Block['interrupted']);
    +
    +            return $Block;
    +        }
    +    }
    +
    +    #
    +    # Quote
    +
    +    protected function blockQuote($Line)
    +    {
    +        if (preg_match('/^>[ ]?(.*)/', $Line['text'], $matches))
    +        {
    +            $Block = array(
    +                'element' => array(
    +                    'name' => 'blockquote',
    +                    'handler' => 'lines',
    +                    'text' => (array) $matches[1],
    +                ),
    +            );
    +
    +            return $Block;
    +        }
    +    }
    +
    +    protected function blockQuoteContinue($Line, array $Block)
    +    {
    +        if ($Line['text'][0] === '>' and preg_match('/^>[ ]?(.*)/', $Line['text'], $matches))
    +        {
    +            if (isset($Block['interrupted']))
    +            {
    +                $Block['element']['text'] []= '';
    +
    +                unset($Block['interrupted']);
    +            }
    +
    +            $Block['element']['text'] []= $matches[1];
    +
    +            return $Block;
    +        }
    +
    +        if ( ! isset($Block['interrupted']))
    +        {
    +            $Block['element']['text'] []= $Line['text'];
    +
    +            return $Block;
    +        }
    +    }
    +
    +    #
    +    # Rule
    +
    +    protected function blockRule($Line)
    +    {
    +        if (preg_match('/^(['.$Line['text'][0].'])([ ]*\1){2,}[ ]*$/', $Line['text']))
    +        {
    +            $Block = array(
    +                'element' => array(
    +                    'name' => 'hr'
    +                ),
    +            );
    +
    +            return $Block;
    +        }
    +    }
    +
    +    #
    +    # Setext
    +
    +    protected function blockSetextHeader($Line, array $Block = null)
    +    {
    +        if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted']))
    +        {
    +            return;
    +        }
    +
    +        if (chop($Line['text'], $Line['text'][0]) === '')
    +        {
    +            $Block['element']['name'] = $Line['text'][0] === '=' ? 'h1' : 'h2';
    +
    +            return $Block;
    +        }
    +    }
    +
    +    #
    +    # Markup
    +
    +    protected function blockMarkup($Line)
    +    {
    +        if ($this->markupEscaped)
    +        {
    +            return;
    +        }
    +
    +        if (preg_match('/^<(\w*)(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*(\/)?>/', $Line['text'], $matches))
    +        {
    +            $element = strtolower($matches[1]);
    +
    +            if (in_array($element, $this->textLevelElements))
    +            {
    +                return;
    +            }
    +
    +            $Block = array(
    +                'name' => $matches[1],
    +                'depth' => 0,
    +                'markup' => $Line['text'],
    +            );
    +
    +            $length = strlen($matches[0]);
    +
    +            $remainder = substr($Line['text'], $length);
    +
    +            if (trim($remainder) === '')
    +            {
    +                if (isset($matches[2]) or in_array($matches[1], $this->voidElements))
    +                {
    +                    $Block['closed'] = true;
    +
    +                    $Block['void'] = true;
    +                }
    +            }
    +            else
    +            {
    +                if (isset($matches[2]) or in_array($matches[1], $this->voidElements))
    +                {
    +                    return;
    +                }
    +
    +                if (preg_match('/<\/'.$matches[1].'>[ ]*$/i', $remainder))
    +                {
    +                    $Block['closed'] = true;
    +                }
    +            }
    +
    +            return $Block;
    +        }
    +    }
    +
    +    protected function blockMarkupContinue($Line, array $Block)
    +    {
    +        if (isset($Block['closed']))
    +        {
    +            return;
    +        }
    +
    +        if (preg_match('/^<'.$Block['name'].'(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*>/i', $Line['text'])) # open
    +        {
    +            $Block['depth'] ++;
    +        }
    +
    +        if (preg_match('/(.*?)<\/'.$Block['name'].'>[ ]*$/i', $Line['text'], $matches)) # close
    +        {
    +            if ($Block['depth'] > 0)
    +            {
    +                $Block['depth'] --;
    +            }
    +            else
    +            {
    +                $Block['closed'] = true;
    +            }
    +        }
    +
    +        if (isset($Block['interrupted']))
    +        {
    +            $Block['markup'] .= "\n";
    +
    +            unset($Block['interrupted']);
    +        }
    +
    +        $Block['markup'] .= "\n".$Line['body'];
    +
    +        return $Block;
    +    }
    +
    +    #
    +    # Reference
    +
    +    protected function blockReference($Line)
    +    {
    +        if (preg_match('/^\[(.+?)\]:[ ]*?(?:[ ]+["\'(](.+)["\')])?[ ]*$/', $Line['text'], $matches))
    +        {
    +            $id = strtolower($matches[1]);
    +
    +            $Data = array(
    +                'url' => $matches[2],
    +                'title' => null,
    +            );
    +
    +            if (isset($matches[3]))
    +            {
    +                $Data['title'] = $matches[3];
    +            }
    +
    +            $this->DefinitionData['Reference'][$id] = $Data;
    +
    +            $Block = array(
    +                'hidden' => true,
    +            );
    +
    +            return $Block;
    +        }
    +    }
    +
    +    #
    +    # Table
    +
    +    protected function blockTable($Line, array $Block = null)
    +    {
    +        if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted']))
    +        {
    +            return;
    +        }
    +
    +        if (strpos($Block['element']['text'], '|') !== false and chop($Line['text'], ' -:|') === '')
    +        {
    +            $alignments = array();
    +
    +            $divider = $Line['text'];
    +
    +            $divider = trim($divider);
    +            $divider = trim($divider, '|');
    +
    +            $dividerCells = explode('|', $divider);
    +
    +            foreach ($dividerCells as $dividerCell)
    +            {
    +                $dividerCell = trim($dividerCell);
    +
    +                if ($dividerCell === '')
    +                {
    +                    continue;
    +                }
    +
    +                $alignment = null;
    +
    +                if ($dividerCell[0] === ':')
    +                {
    +                    $alignment = 'left';
    +                }
    +
    +                if (substr($dividerCell, - 1) === ':')
    +                {
    +                    $alignment = $alignment === 'left' ? 'center' : 'right';
    +                }
    +
    +                $alignments []= $alignment;
    +            }
    +
    +            # ~
    +
    +            $HeaderElements = array();
    +
    +            $header = $Block['element']['text'];
    +
    +            $header = trim($header);
    +            $header = trim($header, '|');
    +
    +            $headerCells = explode('|', $header);
    +
    +            foreach ($headerCells as $index => $headerCell)
    +            {
    +                $headerCell = trim($headerCell);
    +
    +                $HeaderElement = array(
    +                    'name' => 'th',
    +                    'text' => $headerCell,
    +                    'handler' => 'line',
    +                );
    +
    +                if (isset($alignments[$index]))
    +                {
    +                    $alignment = $alignments[$index];
    +
    +                    $HeaderElement['attributes'] = array(
    +                        'style' => 'text-align: '.$alignment.';',
    +                    );
    +                }
    +
    +                $HeaderElements []= $HeaderElement;
    +            }
    +
    +            # ~
    +
    +            $Block = array(
    +                'alignments' => $alignments,
    +                'identified' => true,
    +                'element' => array(
    +                    'name' => 'table',
    +                    'handler' => 'elements',
    +                ),
    +            );
    +
    +            $Block['element']['text'] []= array(
    +                'name' => 'thead',
    +                'handler' => 'elements',
    +            );
    +
    +            $Block['element']['text'] []= array(
    +                'name' => 'tbody',
    +                'handler' => 'elements',
    +                'text' => array(),
    +            );
    +
    +            $Block['element']['text'][0]['text'] []= array(
    +                'name' => 'tr',
    +                'handler' => 'elements',
    +                'text' => $HeaderElements,
    +            );
    +
    +            return $Block;
    +        }
    +    }
    +
    +    protected function blockTableContinue($Line, array $Block)
    +    {
    +        if (isset($Block['interrupted']))
    +        {
    +            return;
    +        }
    +
    +        if ($Line['text'][0] === '|' or strpos($Line['text'], '|'))
    +        {
    +            $Elements = array();
    +
    +            $row = $Line['text'];
    +
    +            $row = trim($row);
    +            $row = trim($row, '|');
    +
    +            preg_match_all('/(?:(\\\\[|])|[^|`]|`[^`]+`|`)+/', $row, $matches);
    +
    +            foreach ($matches[0] as $index => $cell)
    +            {
    +                $cell = trim($cell);
    +
    +                $Element = array(
    +                    'name' => 'td',
    +                    'handler' => 'line',
    +                    'text' => $cell,
    +                );
    +
    +                if (isset($Block['alignments'][$index]))
    +                {
    +                    $Element['attributes'] = array(
    +                        'style' => 'text-align: '.$Block['alignments'][$index].';',
    +                    );
    +                }
    +
    +                $Elements []= $Element;
    +            }
    +
    +            $Element = array(
    +                'name' => 'tr',
    +                'handler' => 'elements',
    +                'text' => $Elements,
    +            );
    +
    +            $Block['element']['text'][1]['text'] []= $Element;
    +
    +            return $Block;
    +        }
    +    }
    +
    +    #
    +    # ~
    +    #
    +
    +    protected function paragraph($Line)
    +    {
    +        $Block = array(
    +            'element' => array(
    +                'name' => 'p',
    +                'text' => $Line['text'],
    +                'handler' => 'line',
    +            ),
    +        );
    +
    +        return $Block;
    +    }
    +
    +    #
    +    # Inline Elements
    +    #
    +
    +    protected $InlineTypes = array(
    +        '"' => array('SpecialCharacter'),
    +        '!' => array('Image'),
    +        '&' => array('SpecialCharacter'),
    +        '*' => array('Emphasis'),
    +        ':' => array('Url'),
    +        '<' => array('UrlTag', 'EmailTag', 'Markup', 'SpecialCharacter'),
    +        '>' => array('SpecialCharacter'),
    +        '[' => array('Link'),
    +        '_' => array('Emphasis'),
    +        '`' => array('Code'),
    +        '~' => array('Strikethrough'),
    +        '\\' => array('EscapeSequence'),
    +    );
    +
    +    # ~
    +
    +    protected $inlineMarkerList = '!"*_&[:<>`~\\';
    +
    +    #
    +    # ~
    +    #
    +
    +    public function line($text)
    +    {
    +        $markup = '';
    +
    +        # $excerpt is based on the first occurrence of a marker
    +
    +        while ($excerpt = strpbrk($text, $this->inlineMarkerList))
    +        {
    +            $marker = $excerpt[0];
    +
    +            $markerPosition = strpos($text, $marker);
    +
    +            $Excerpt = array('text' => $excerpt, 'context' => $text);
    +
    +            foreach ($this->InlineTypes[$marker] as $inlineType)
    +            {
    +                $Inline = $this->{'inline'.$inlineType}($Excerpt);
    +
    +                if ( ! isset($Inline))
    +                {
    +                    continue;
    +                }
    +
    +                # makes sure that the inline belongs to "our" marker
    +
    +                if (isset($Inline['position']) and $Inline['position'] > $markerPosition)
    +                {
    +                    continue;
    +                }
    +
    +                # sets a default inline position
    +
    +                if ( ! isset($Inline['position']))
    +                {
    +                    $Inline['position'] = $markerPosition;
    +                }
    +
    +                # the text that comes before the inline
    +                $unmarkedText = substr($text, 0, $Inline['position']);
    +
    +                # compile the unmarked text
    +                $markup .= $this->unmarkedText($unmarkedText);
    +
    +                # compile the inline
    +                $markup .= isset($Inline['markup']) ? $Inline['markup'] : $this->element($Inline['element']);
    +
    +                # remove the examined text
    +                $text = substr($text, $Inline['position'] + $Inline['extent']);
    +
    +                continue 2;
    +            }
    +
    +            # the marker does not belong to an inline
    +
    +            $unmarkedText = substr($text, 0, $markerPosition + 1);
    +
    +            $markup .= $this->unmarkedText($unmarkedText);
    +
    +            $text = substr($text, $markerPosition + 1);
    +        }
    +
    +        $markup .= $this->unmarkedText($text);
    +
    +        return $markup;
    +    }
    +
    +    #
    +    # ~
    +    #
    +
    +    protected function inlineCode($Excerpt)
    +    {
    +        $marker = $Excerpt['text'][0];
    +
    +        if (preg_match('/^('.$marker.'+)[ ]*(.+?)[ ]*(? strlen($matches[0]),
    +                'element' => array(
    +                    'name' => 'code',
    +                    'text' => $text,
    +                ),
    +            );
    +        }
    +    }
    +
    +    protected function inlineEmailTag($Excerpt)
    +    {
    +        if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<((mailto:)?\S+?@\S+?)>/i', $Excerpt['text'], $matches))
    +        {
    +            $url = $matches[1];
    +
    +            if ( ! isset($matches[2]))
    +            {
    +                $url = 'mailto:' . $url;
    +            }
    +
    +            return array(
    +                'extent' => strlen($matches[0]),
    +                'element' => array(
    +                    'name' => 'a',
    +                    'text' => $matches[1],
    +                    'attributes' => array(
    +                        'href' => $url,
    +                    ),
    +                ),
    +            );
    +        }
    +    }
    +
    +    protected function inlineEmphasis($Excerpt)
    +    {
    +        if ( ! isset($Excerpt['text'][1]))
    +        {
    +            return;
    +        }
    +
    +        $marker = $Excerpt['text'][0];
    +
    +        if ($Excerpt['text'][1] === $marker and preg_match($this->StrongRegex[$marker], $Excerpt['text'], $matches))
    +        {
    +            $emphasis = 'strong';
    +        }
    +        elseif (preg_match($this->EmRegex[$marker], $Excerpt['text'], $matches))
    +        {
    +            $emphasis = 'em';
    +        }
    +        else
    +        {
    +            return;
    +        }
    +
    +        return array(
    +            'extent' => strlen($matches[0]),
    +            'element' => array(
    +                'name' => $emphasis,
    +                'handler' => 'line',
    +                'text' => $matches[1],
    +            ),
    +        );
    +    }
    +
    +    protected function inlineEscapeSequence($Excerpt)
    +    {
    +        if (isset($Excerpt['text'][1]) and in_array($Excerpt['text'][1], $this->specialCharacters))
    +        {
    +            return array(
    +                'markup' => $Excerpt['text'][1],
    +                'extent' => 2,
    +            );
    +        }
    +    }
    +
    +    protected function inlineImage($Excerpt)
    +    {
    +        if ( ! isset($Excerpt['text'][1]) or $Excerpt['text'][1] !== '[')
    +        {
    +            return;
    +        }
    +
    +        $Excerpt['text']= substr($Excerpt['text'], 1);
    +
    +        $Link = $this->inlineLink($Excerpt);
    +
    +        if ($Link === null)
    +        {
    +            return;
    +        }
    +
    +        $Inline = array(
    +            'extent' => $Link['extent'] + 1,
    +            'element' => array(
    +                'name' => 'img',
    +                'attributes' => array(
    +                    'src' => $Link['element']['attributes']['href'],
    +                    'alt' => $Link['element']['text'],
    +                ),
    +            ),
    +        );
    +
    +        $Inline['element']['attributes'] += $Link['element']['attributes'];
    +
    +        unset($Inline['element']['attributes']['href']);
    +
    +        return $Inline;
    +    }
    +
    +    protected function inlineLink($Excerpt)
    +    {
    +        $Element = array(
    +            'name' => 'a',
    +            'handler' => 'line',
    +            'text' => null,
    +            'attributes' => array(
    +                'href' => null,
    +                'title' => null,
    +            ),
    +        );
    +
    +        $extent = 0;
    +
    +        $remainder = $Excerpt['text'];
    +
    +        if (preg_match('/\[((?:[^][]|(?R))*)\]/', $remainder, $matches))
    +        {
    +            $Element['text'] = $matches[1];
    +
    +            $extent += strlen($matches[0]);
    +
    +            $remainder = substr($remainder, $extent);
    +        }
    +        else
    +        {
    +            return;
    +        }
    +
    +        if (preg_match('/^[(]((?:[^ ()]|[(][^ )]+[)])+)(?:[ ]+("[^"]*"|\'[^\']*\'))?[)]/', $remainder, $matches))
    +        {
    +            $Element['attributes']['href'] = $matches[1];
    +
    +            if (isset($matches[2]))
    +            {
    +                $Element['attributes']['title'] = substr($matches[2], 1, - 1);
    +            }
    +
    +            $extent += strlen($matches[0]);
    +        }
    +        else
    +        {
    +            if (preg_match('/^\s*\[(.*?)\]/', $remainder, $matches))
    +            {
    +                $definition = strlen($matches[1]) ? $matches[1] : $Element['text'];
    +                $definition = strtolower($definition);
    +
    +                $extent += strlen($matches[0]);
    +            }
    +            else
    +            {
    +                $definition = strtolower($Element['text']);
    +            }
    +
    +            if ( ! isset($this->DefinitionData['Reference'][$definition]))
    +            {
    +                return;
    +            }
    +
    +            $Definition = $this->DefinitionData['Reference'][$definition];
    +
    +            $Element['attributes']['href'] = $Definition['url'];
    +            $Element['attributes']['title'] = $Definition['title'];
    +        }
    +
    +        $Element['attributes']['href'] = str_replace(array('&', '<'), array('&', '<'), $Element['attributes']['href']);
    +
    +        return array(
    +            'extent' => $extent,
    +            'element' => $Element,
    +        );
    +    }
    +
    +    protected function inlineMarkup($Excerpt)
    +    {
    +        if ($this->markupEscaped or strpos($Excerpt['text'], '>') === false)
    +        {
    +            return;
    +        }
    +
    +        if ($Excerpt['text'][1] === '/' and preg_match('/^<\/\w*[ ]*>/s', $Excerpt['text'], $matches))
    +        {
    +            return array(
    +                'markup' => $matches[0],
    +                'extent' => strlen($matches[0]),
    +            );
    +        }
    +
    +        if ($Excerpt['text'][1] === '!' and preg_match('/^/s', $Excerpt['text'], $matches))
    +        {
    +            return array(
    +                'markup' => $matches[0],
    +                'extent' => strlen($matches[0]),
    +            );
    +        }
    +
    +        if ($Excerpt['text'][1] !== ' ' and preg_match('/^<\w*(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*\/?>/s', $Excerpt['text'], $matches))
    +        {
    +            return array(
    +                'markup' => $matches[0],
    +                'extent' => strlen($matches[0]),
    +            );
    +        }
    +    }
    +
    +    protected function inlineSpecialCharacter($Excerpt)
    +    {
    +        if ($Excerpt['text'][0] === '&' and ! preg_match('/^&#?\w+;/', $Excerpt['text']))
    +        {
    +            return array(
    +                'markup' => '&',
    +                'extent' => 1,
    +            );
    +        }
    +
    +        $SpecialCharacter = array('>' => 'gt', '<' => 'lt', '"' => 'quot');
    +
    +        if (isset($SpecialCharacter[$Excerpt['text'][0]]))
    +        {
    +            return array(
    +                'markup' => '&'.$SpecialCharacter[$Excerpt['text'][0]].';',
    +                'extent' => 1,
    +            );
    +        }
    +    }
    +
    +    protected function inlineStrikethrough($Excerpt)
    +    {
    +        if ( ! isset($Excerpt['text'][1]))
    +        {
    +            return;
    +        }
    +
    +        if ($Excerpt['text'][1] === '~' and preg_match('/^~~(?=\S)(.+?)(?<=\S)~~/', $Excerpt['text'], $matches))
    +        {
    +            return array(
    +                'extent' => strlen($matches[0]),
    +                'element' => array(
    +                    'name' => 'del',
    +                    'text' => $matches[1],
    +                    'handler' => 'line',
    +                ),
    +            );
    +        }
    +    }
    +
    +    protected function inlineUrl($Excerpt)
    +    {
    +        if ($this->urlsLinked !== true or ! isset($Excerpt['text'][2]) or $Excerpt['text'][2] !== '/')
    +        {
    +            return;
    +        }
    +
    +        if (preg_match('/\bhttps?:[\/]{2}[^\s<]+\b\/*/ui', $Excerpt['context'], $matches, PREG_OFFSET_CAPTURE))
    +        {
    +            $Inline = array(
    +                'extent' => strlen($matches[0][0]),
    +                'position' => $matches[0][1],
    +                'element' => array(
    +                    'name' => 'a',
    +                    'text' => $matches[0][0],
    +                    'attributes' => array(
    +                        'href' => $matches[0][0],
    +                    ),
    +                ),
    +            );
    +
    +            return $Inline;
    +        }
    +    }
    +
    +    protected function inlineUrlTag($Excerpt)
    +    {
    +        if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<(\w+:\/{2}[^ >]+)>/i', $Excerpt['text'], $matches))
    +        {
    +            $url = str_replace(array('&', '<'), array('&', '<'), $matches[1]);
    +
    +            return array(
    +                'extent' => strlen($matches[0]),
    +                'element' => array(
    +                    'name' => 'a',
    +                    'text' => $url,
    +                    'attributes' => array(
    +                        'href' => $url,
    +                    ),
    +                ),
    +            );
    +        }
    +    }
    +
    +    # ~
    +
    +    protected function unmarkedText($text)
    +    {
    +        if ($this->breaksEnabled)
    +        {
    +            $text = preg_replace('/[ ]*\n/', "
    \n", $text); + } + else + { + $text = preg_replace('/(?:[ ][ ]+|[ ]*\\\\)\n/', "
    \n", $text); + $text = str_replace(" \n", "\n", $text); + } + + return $text; + } + + # + # Handlers + # + + protected function element(array $Element) + { + $markup = '<'.$Element['name']; + + if (isset($Element['attributes'])) + { + foreach ($Element['attributes'] as $name => $value) + { + if ($value === null) + { + continue; + } + + $markup .= ' '.$name.'="'.$value.'"'; + } + } + + if (isset($Element['text'])) + { + $markup .= '>'; + + if (isset($Element['handler'])) + { + $markup .= $this->{$Element['handler']}($Element['text']); + } + else + { + $markup .= $Element['text']; + } + + $markup .= ''; + } + else + { + $markup .= ' />'; + } + + return $markup; + } + + protected function elements(array $Elements) + { + $markup = ''; + + foreach ($Elements as $Element) + { + $markup .= "\n" . $this->element($Element); + } + + $markup .= "\n"; + + return $markup; + } + + # ~ + + protected function li($lines) + { + $markup = $this->lines($lines); + + $trimmedMarkup = trim($markup); + + if ( ! in_array('', $lines) and substr($trimmedMarkup, 0, 3) === '

    ') + { + $markup = $trimmedMarkup; + $markup = substr($markup, 3); + + $position = strpos($markup, "

    "); + + $markup = substr_replace($markup, '', $position, 4); + } + + return $markup; + } + + # + # Deprecated Methods + # + + function parse($text) + { + $markup = $this->text($text); + + return $markup; + } + + # + # Static Methods + # + + static function instance($name = 'default') + { + if (isset(self::$instances[$name])) + { + return self::$instances[$name]; + } + + $instance = new static(); + + self::$instances[$name] = $instance; + + return $instance; + } + + private static $instances = array(); + + # + # Fields + # + + protected $DefinitionData; + + # + # Read-Only + + protected $specialCharacters = array( + '\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!', '|', + ); + + protected $StrongRegex = array( + '*' => '/^[*]{2}((?:\\\\\*|[^*]|[*][^*]*[*])+?)[*]{2}(?![*])/s', + '_' => '/^__((?:\\\\_|[^_]|_[^_]*_)+?)__(?!_)/us', + ); + + protected $EmRegex = array( + '*' => '/^[*]((?:\\\\\*|[^*]|[*][*][^*]+?[*][*])+?)[*](?![*])/s', + '_' => '/^_((?:\\\\_|[^_]|__[^_]*__)+?)_(?!_)\b/us', + ); + + protected $regexHtmlAttribute = '[a-zA-Z_:][\w:.-]*(?:\s*=\s*(?:[^"\'=<>`\s]+|"[^"]*"|\'[^\']*\'))?'; + + protected $voidElements = array( + 'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', + ); + + protected $textLevelElements = array( + 'a', 'br', 'bdo', 'abbr', 'blink', 'nextid', 'acronym', 'basefont', + 'b', 'em', 'big', 'cite', 'small', 'spacer', 'listing', + 'i', 'rp', 'del', 'code', 'strike', 'marquee', + 'q', 'rt', 'ins', 'font', 'strong', + 's', 'tt', 'sub', 'mark', + 'u', 'xm', 'sup', 'nobr', + 'var', 'ruby', + 'wbr', 'span', + 'time', + ); +} diff --git a/www/wp-content/plugins/github-updater/vendor/parsedown/README.md b/www/wp-content/plugins/github-updater/vendor/parsedown/README.md new file mode 100755 index 0000000..6f9f649 --- /dev/null +++ b/www/wp-content/plugins/github-updater/vendor/parsedown/README.md @@ -0,0 +1,57 @@ +## Parsedown + +[![Build Status](https://img.shields.io/travis/erusev/parsedown/master.svg?style=flat-square)](https://travis-ci.org/erusev/parsedown) + + +Better Markdown Parser in PHP + +[Demo](http://parsedown.org/demo) | +[Benchmarks](http://parsedown.org/speed) | +[Tests](http://parsedown.org/tests/) | +[Documentation](https://github.com/erusev/parsedown/wiki/) + +### Features + +* Super Fast +* [GitHub flavored](https://help.github.com/articles/github-flavored-markdown) +* Extensible +* Tested in 5.3 to 5.6 +* [Markdown Extra extension](https://github.com/erusev/parsedown-extra) + +### Installation + +Include `Parsedown.php` or install [the composer package](https://packagist.org/packages/erusev/parsedown). + +### Example + +``` php +$Parsedown = new Parsedown(); + +echo $Parsedown->text('Hello _Parsedown_!'); # prints:

    Hello Parsedown!

    +``` + +More examples in [the wiki](https://github.com/erusev/parsedown/wiki/) and in [this video tutorial](http://youtu.be/wYZBY8DEikI). + +### Questions + +**How does Parsedown work?** + +It tries to read Markdown like a human. First, it looks at the lines. It’s interested in how the lines start. This helps it recognise blocks. It knows, for example, that if a line start with a `-` then it perhaps belong to a list. Once it recognises the blocks, it continues to the content. As it reads, it watches out for special characters. This helps it recognise inline elements (or inlines). + +We call this approach "line based". We believe that Parsedown is the first Markdown parser to use it. Since the release of Parsedown, other developers have used the same approach to develop other Markdown parsers in PHP and in other languages. + +**Is it compliant with CommonMark?** + +It passes most of the CommonMark tests. Most of the tests that don't pass deal with cases that are quite uncommon. Still, as CommonMark matures, compliance should improve. + +**Who uses it?** + +[phpDocumentor](http://www.phpdoc.org/), [October CMS](http://octobercms.com/), [Bolt CMS](http://bolt.cm/), [Kirby CMS](http://getkirby.com/), [Grav CMS](http://getgrav.org/), [Statamic CMS](http://www.statamic.com/), [RaspberryPi.org](http://www.raspberrypi.org/) and [more](https://www.versioneye.com/php/erusev:parsedown/references). + +**How can I help?** + +Use it, star it, share it and if you feel generous, [donate](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=528P3NZQMP8N2). + +--- + +You might also like [Caret](http://caret.io) - our Markdown editor for the desktop. diff --git a/www/wp-content/plugins/github-updater/vendor/wp-update-php/LICENSE b/www/wp-content/plugins/github-updater/vendor/wp-update-php/LICENSE new file mode 100755 index 0000000..ecbc059 --- /dev/null +++ b/www/wp-content/plugins/github-updater/vendor/wp-update-php/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program 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 2 of the License, or + (at your option) any later version. + + This program 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. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. \ No newline at end of file diff --git a/www/wp-content/plugins/github-updater/vendor/wp-update-php/README.md b/www/wp-content/plugins/github-updater/vendor/wp-update-php/README.md new file mode 100755 index 0000000..d7bd714 --- /dev/null +++ b/www/wp-content/plugins/github-updater/vendor/wp-update-php/README.md @@ -0,0 +1,61 @@ +# WPupdatePHP library +Library to be bundled with WordPress plugins to enforce users to upgrade their PHP versions _or_ switch to a decent host. + +## Installation +We recommend installing the library using [Composer](https://getcomposer.org/), as follows. + +``` +composer require wpupdatephp/wp-update-php +``` + +Another option is to download the [class file](https://github.com/WPupdatePHP/wp-update-php/blob/master/src/WPUpdatePhp.php) manually. + +## Usage +Usage of this library depends on how you start your plugin. The core `does_it_meet_required_php_version` method does all the checking for you and adds an admin notice in case the version requirement is not met. + +For example, when you start your plugin by instantiating a new object, you should wrap a conditional check around it. + +_Example:_ + +```php +$updatePhp = new WPUpdatePhp( '5.4.0' ); + +if ( $updatePhp->does_it_meet_required_php_version() ) { + // Instantiate new object here +} + +// The version check has failed, a admin notice has been thrown +``` + +## Including the library file +Adding the library via Composer has preference. The Composer autoloader will automatically take care of preventing including two classes with the same name. + +In case you want to include the file manually, please wrap the include or require call in a [`class_exists`](http://php.net/class_exists) conditional, like so: + +```php +if ( ! class_exists( 'WPUpdatePhp' ) ) { + // do the file include or require here +} +``` + +## Setting the name of the plugin +The notice that will be thrown can also contain the name of the plugin. Use the `set_plugin_name( $name )` method on the `WPUpdatePhp` object to provide the name. This call needs to be made before the `does_it_meet_required_php_version()` method is called to check versions. + +## License +(GPLv2 license or later) + +WP Update PHP Library +Copyright (C) 2015 Coen Jacobs + +This program 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 2 of the License, or +(at your option) any later version. + +This program 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. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . \ No newline at end of file diff --git a/www/wp-content/plugins/github-updater/vendor/wp-update-php/src/WPUpdatePhp.php b/www/wp-content/plugins/github-updater/vendor/wp-update-php/src/WPUpdatePhp.php new file mode 100755 index 0000000..16a21bb --- /dev/null +++ b/www/wp-content/plugins/github-updater/vendor/wp-update-php/src/WPUpdatePhp.php @@ -0,0 +1,148 @@ +minimum_version = $minimum_version; + $this->recommended_version = $recommended_version; + } + + /** + * Set the plugin name for the admin notice. + * + * @param string $name Name of the plugin to be used in admin notices. + */ + public function set_plugin_name( $name ) { + $this->plugin_name = $name; + } + + /** + * Check given PHP version against minimum required version. + * + * @param string $version Optional. PHP version to check against. + * Default is the current PHP version as a string in + * "major.minor.release[extra]" notation. + * @return bool True if supplied PHP version meets minimum required version. + */ + public function does_it_meet_required_php_version( $version = PHP_VERSION ) { + if ( $this->version_passes_requirement( $this->minimum_version, $version ) ) { + return true; + } + + $this->load_version_notice( array( $this, 'minimum_admin_notice' ) ); + return false; + } + + /** + * Check given PHP version against recommended version. + * + * @param string $version Optional. PHP version to check against. + * Default is the current PHP version as a string in + * "major.minor.release[extra]" notation. + * @return bool True if supplied PHP version meets recommended version. + */ + public function does_it_meet_recommended_php_version( $version = PHP_VERSION ) { + if ( $this->version_passes_requirement( $this->recommended_version, $version ) ) { + return true; + } + + $this->load_version_notice( array( $this, 'recommended_admin_notice' ) ); + return false; + } + + /** + * Check that one PHP version is less than or equal to another. + * + * @param string $requirement The baseline version of PHP. + * @param string $version The given version of PHP. + * @return bool True if the requirement is less than or equal to given version. + */ + private function version_passes_requirement( $requirement, $version ) { + return version_compare( $requirement, $version, '<=' ); + } + + /** + * Conditionally hook in an admin notice. + * + * @param callable $callback Callable that displays admin notice. + */ + private function load_version_notice( $callback ) { + if ( is_admin() && ! defined( 'DOING_AJAX' ) ) { + add_action( 'admin_notices', $callback ); + add_action( 'network_admin_notices', $callback ); + } + } + + /** + * Return the string to be shown in the admin notice. + * + * This is based on the level (`recommended` or default `minimum`) of the + * notice. This will also add the plugin name to the notice string, if set. + * + * @param string $level Optional. Admin notice level, `recommended` or `minimum`. + * Default is `minimum`. + * @return string + */ + public function get_admin_notice( $level = 'minimum' ) { + if ( 'recommended' === $level ) { + if ( ! empty( $this->plugin_name ) ) { + return '

    ' . $this->plugin_name . ' recommends a PHP version higher than ' . $this->recommended_version . '. Read more information about how you can update.

    '; + } else { + return '

    This plugin recommends a PHP version higher than ' . $this->recommended_version . '. Read more information about how you can update.

    '; + } + } + + if ( ! empty( $this->plugin_name ) ) { + return '

    Unfortunately, ' . $this->plugin_name . ' cannot run on PHP versions older than ' . $this->minimum_version . '. Read more information about how you can update.

    '; + } else { + return '

    Unfortunately, this plugin cannot run on PHP versions older than ' . $this->minimum_version . '. Read more information about how you can update.

    '; + } + } + + /** + * Method hooked into admin_notices when minimum required PHP version is not + * available to show this in a notice. + * + * @hook admin_notices + */ + public function minimum_admin_notice() { + echo '
    '; + echo $this->get_admin_notice( 'minimum' ); + echo '
    '; + } + + /** + * Method hooked into admin_notices when recommended PHP version is not + * available to show this in a notice. + * + * @hook admin_notices + */ + public function recommended_admin_notice() { + echo '
    '; + echo $this->get_admin_notice( 'recommended' ); + echo '
    '; + } +} diff --git a/www/wp-content/plugins/wp-sync-db-media-files/.editorconfig b/www/wp-content/plugins/wp-sync-db-media-files/.editorconfig new file mode 100755 index 0000000..e09b844 --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db-media-files/.editorconfig @@ -0,0 +1,12 @@ +# This file is for unifying the coding style for different editors and IDEs +# editorconfig.org + +root = true + +[*] +end_of_line = lf +charset = utf-8 +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = space +indent_size = 2 diff --git a/www/wp-content/plugins/wp-sync-db-media-files/.gitignore b/www/wp-content/plugins/wp-sync-db-media-files/.gitignore new file mode 100755 index 0000000..7194a5b --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db-media-files/.gitignore @@ -0,0 +1,13 @@ +.htaccess +wp-config.php +wp-content/uploads/ +wp-content/blogs.dir/ +wp-content/upgrade/ +wp-content/backup-db/ +wp-content/advanced-cache.php +wp-content/wp-cache-config.php +sitemap.xml +*.log +wp-content/cache/ +wp-content/backups/ +sitemap.xml.gz diff --git a/www/wp-content/plugins/wp-sync-db-media-files/LICENSE b/www/wp-content/plugins/wp-sync-db-media-files/LICENSE new file mode 100755 index 0000000..d7f1051 --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db-media-files/LICENSE @@ -0,0 +1,339 @@ +GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This program 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 2 of the License, or + (at your option) any later version. + + This program 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. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/www/wp-content/plugins/wp-sync-db-media-files/README.md b/www/wp-content/plugins/wp-sync-db-media-files/README.md new file mode 100755 index 0000000..3a9ec39 --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db-media-files/README.md @@ -0,0 +1,4 @@ +# WP Sync DB Media Files +An addon for [WP Sync DB](https://github.com/wp-sync-db/wp-sync-db) that lets you sync media libraries between WordPress installations. + +

    diff --git a/www/wp-content/plugins/wp-sync-db-media-files/asset/js/script.js b/www/wp-content/plugins/wp-sync-db-media-files/asset/js/script.js new file mode 100755 index 0000000..7c5521d --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db-media-files/asset/js/script.js @@ -0,0 +1,302 @@ +// functions +var determine_media_to_migrate; +var remote_media_files_unavailable = false; +var remote_connection_data; +var connection_info; +var media_successfully_determined; + +(function($) { + + // .length doesn't work on JS "associative arrays" i.e. objects with key/value elements, this does + Object.size = function(obj) { + var size = 0, + key; + for (key in obj) { + if (obj.hasOwnProperty(key)) size++; + } + return size; + }; + + $(document).ready(function() { + + if (migration_type() == 'savefile') { + $('.media-files-options').hide(); + } + + var disable_media_files_option = function() { + $('#media-files').attr('data-available', '0'); + $('#media-files').prop('checked', false); + $('#media-files').attr('disabled', 'disabled'); + $('.media-files').addClass('disabled'); + $('.media-files-options .expandable-content').hide(); + }; + + var hide_show_options = function(unavailable) { + var mig_type = migration_type(); + + if ('savefile' == mig_type) { + $('.media-files-options').hide(); + return; + } + + $('.media-files-options').show(); + $('.media-files-push').hide(); + + if (unavailable) { + $('.media-files-options ul').hide(); + $('.media-migration-unavailable').show(); + disable_media_files_option(); + return; + } + + if (typeof remote_connection_data != 'undefined' && + wpsdb_media_files_version != remote_connection_data.media_files_version + ) { + $('.media-files-remote-location').html(remote_connection_data.url); + $('.media-file-remote-version').html(remote_connection_data.media_files_version); + $('.media-files-different-plugin-version-notice').show(); + disable_media_files_option(); + return; + } + + $('.media-files-options ul').show(); + $('.media-migration-unavailable').hide(); + $('.media-files-different-plugin-version-notice').hide(); + $('#media-files').removeAttr('disabled'); + $('.media-files').removeClass('disabled'); + $('#media-files').attr('data-available', '1'); + }; + + $.wpsdb.add_action('move_connection_info_box', function() { + hide_show_options(remote_media_files_unavailable); + $('.remove-scope-1').html('remote'); + $('.remove-scope-2').html('local'); + if (migration_type() == 'pull') { + $('.remove-scope-1').html('local'); + $('.remove-scope-2').html('remote'); + } + }); + + $.wpsdb.add_action('verify_connection_to_remote_site', function( + connection_data) { + remote_connection_data = connection_data; + remote_media_files_unavailable = (typeof connection_data.media_files_available == + 'undefined'); + hide_show_options(remote_media_files_unavailable); + }); + + $.wpsdb.add_filter('wpsdb_before_migration_complete_hooks', function( + hooks) { + if (false == is_media_migration() || 'savefile' == migration_type()) + return hooks; + hooks.push('determine_media_to_migrate'); + return hooks; + }); + + determine_media_to_migrate = function() { + connection_info = $.trim($('.pull-push-connection-info').val()).split( + "\n"); + $('.progress-text').html(wpsdbmf_strings.determining); + + var remove_local_media = 0; + + if ($('#remove-local-media').is(':checked')) { + remove_local_media = 1; + } + + $.ajax({ + url: ajaxurl, + type: 'POST', + dataType: 'text', + cache: false, + data: { + action: 'wpsdbmf_determine_media_to_migrate', + remove_local_media: remove_local_media, + intent: migration_type(), + url: connection_info[0], + key: connection_info[1], + temp_prefix: connection_data.temp_prefix, + nonce: wpsdb_nonces.determine_media_to_migrate, + }, + error: function(jqXHR, textStatus, errorThrown) { + $('.progress-title').html(wpsdbmf_strings.migration_failed); + $('.progress-text').html(wpsdbmf_strings.error_determining + + ' (#101mf)'); + $('.progress-text').addClass('migration-error'); + console.log(jqXHR); + console.log(textStatus); + console.log(errorThrown); + migration_error = true; + migration_complete_events(); + return; + }, + success: function(data) { + original_data = data; + data = JSON.parse(data.trim()); + if (false == data) { + migration_failed(original_data); + return; + } + + next_step_in_migration = { + fn: media_successfully_determined, + args: [data] + }; + execute_next_step(); + } + + }); + + } + + function migration_failed(data) { + $('.progress-title').html(wpsdbmf_strings.migration_failed); + $('.progress-text').html(data); + $('.progress-text').addClass('migration-error'); + migration_error = true; + migration_complete_events(); + } + + media_successfully_determined = function(data) { + if (typeof data.wpsdb_error != 'undefined' && data.wpsdb_error == 1) { + non_fatal_errors += data.body; + next_step_in_migration = { + fn: wpsdb_call_next_hook + }; + execute_next_step(); + return; + } + + var args = {}; + args.media_progress = 0; + args.media_progress_image_number = 0; + args.media_total_size = data.total_size; + args.remote_uploads_url = data.remote_uploads_url; + args.files_to_migrate = data.files_to_migrate; + + args.bottleneck = wpsdb_max_request; + + if (Object.size(args.files_to_migrate) > 0) { + $('.progress-bar').width('0px'); + } + + $('.progress-tables').empty(); + $('.progress-tables-hover-boxes').empty(); + + $('.progress-tables').prepend('
    ' + + wpsdbmf_strings.media_files + + ' (0 / ' + + wpsdb_add_commas(Object.size(args.files_to_migrate)) + + ')
    '); + + next_step_in_migration = { + fn: migrate_media_files_recursive, + args: [args] + }; + execute_next_step(); + } + + function migrate_media_files_recursive(args) { + if (0 == Object.size(args.files_to_migrate)) { + wpsdb_call_next_hook(); + return; + } + + var file_chunk_to_migrate = []; + var file_chunk_size = 0; + var number_of_files_to_migrate = 0; + + $.each(args.files_to_migrate, function(index, value) { + if (!file_chunk_to_migrate.length) { + file_chunk_to_migrate.push(index); + file_chunk_size += value; + delete args.files_to_migrate[index]; + ++args.media_progress_image_number; + ++number_of_files_to_migrate; + } else { + if ((file_chunk_size + value) > args.bottleneck || + number_of_files_to_migrate >= remote_connection_data.media_files_max_file_uploads + ) { + return false; + } else { + file_chunk_to_migrate.push(index); + file_chunk_size += value; + delete args.files_to_migrate[index]; + ++args.media_progress_image_number; + ++number_of_files_to_migrate; + } + } + }); + + var connection_info = $.trim($('.pull-push-connection-info').val()).split( + "\n"); + + $.ajax({ + url: ajaxurl, + type: 'POST', + dataType: 'text', + cache: false, + data: { + action: 'wpsdbmf_migrate_media', + file_chunk: file_chunk_to_migrate, + remote_uploads_url: args.remote_uploads_url, + intent: migration_type(), + url: connection_info[0], + key: connection_info[1], + nonce: wpsdb_nonces.migrate_media, + }, + error: function(jqXHR, textStatus, errorThrown) { + $('.progress-title').html('Migration failed'); + $('.progress-text').html(wpsdbmf_strings.problem_migrating_media + + ' (#102mf)'); + $('.progress-text').addClass('migration-error'); + console.log(jqXHR); + console.log(textStatus); + console.log(errorThrown); + migration_error = true; + migration_complete_events(); + return; + }, + success: function(data) { + original_data = data; + data = JSON.parse(data.trim()); + if (false == data) { + migration_failed(original_data); + return; + } + + if (typeof data.wpsdb_error != 'undefined' && data.wpsdb_error == + 1) { + non_fatal_errors += data.body; + } + + args.media_progress += file_chunk_size; + + var percent = 100 * args.media_progress / args.media_total_size; + $('.progress-bar').width(percent + '%'); + overall_percent = Math.floor(percent); + + $('.progress-text').html(overall_percent + '% - ' + + wpsdbmf_strings.migrating_media_files); + $('.media-migration-current-image').html(wpsdb_add_commas(args.media_progress_image_number)); + + next_step_in_migration = { + fn: migrate_media_files_recursive, + args: [args] + }; + execute_next_step(); + } + }); + } + + function is_media_migration() { + return $('#media-files').attr('data-available') == '1' && $( + '#media-files').is(':checked') ? true : false; + } + + function migration_type() { + return $('input[name=action]:checked').val(); + } + }); +})(jQuery); diff --git a/www/wp-content/plugins/wp-sync-db-media-files/class/wpsdb-media-files.php b/www/wp-content/plugins/wp-sync-db-media-files/class/wpsdb-media-files.php new file mode 100755 index 0000000..e113671 --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db-media-files/class/wpsdb-media-files.php @@ -0,0 +1,677 @@ +plugin_slug = 'wp-sync-db-media-files'; + $this->plugin_version = $GLOBALS['wpsdb_meta']['wp-sync-db-media-files']['version']; + + if( ! $this->meets_version_requirements( '1.4b1' ) ) return; + + add_action( 'wpsdb_after_advanced_options', array( $this, 'migration_form_controls' ) ); + add_action( 'wpsdb_load_assets', array( $this, 'load_assets' ) ); + add_action( 'wpsdb_js_variables', array( $this, 'js_variables' ) ); + add_filter( 'wpsdb_accepted_profile_fields', array( $this, 'accepted_profile_fields' ) ); + add_filter( 'wpsdb_establish_remote_connection_data', array( $this, 'establish_remote_connection_data' ) ); + add_filter( 'wpsdb_nonces', array( $this, 'add_nonces' ) ); + + // compatibility with CLI migraitons + add_filter( 'wpsdb_cli_finalize_migration', array( $this, 'cli_migration' ), 10, 4 ); + + // internal AJAX handlers + add_action( 'wp_ajax_wpsdbmf_determine_media_to_migrate', array( $this, 'ajax_determine_media_to_migrate' ) ); + add_action( 'wp_ajax_wpsdbmf_migrate_media', array( $this, 'ajax_migrate_media' ) ); + + // external AJAX handlers + add_action( 'wp_ajax_nopriv_wpsdbmf_get_remote_media_listing', array( $this, 'respond_to_get_remote_media_listing' ) ); + add_action( 'wp_ajax_nopriv_wpsdbmf_push_request', array( $this, 'respond_to_push_request' ) ); + add_action( 'wp_ajax_nopriv_wpsdbmf_remove_local_attachments', array( $this, 'respond_to_remove_local_attachments' ) ); + } + + function get_local_attachments() { + global $wpdb; + $prefix = $wpdb->prefix; + $temp_prefix = stripslashes( $_POST['temp_prefix'] ); + + /* + * We determine which media files need migrating BEFORE the database migration is finalized. + * Because of this we need to scan the *_post & *_postmeta that are prefixed using the temporary prefix. + * Though this should only happen when we're responding to a get_remote_media_listing() call AND it's a push OR + * we're scanning local files AND it's a pull. + */ + + if( + ( true == $this->responding_to_get_remote_media_listing && $_POST['intent'] == 'push' ) || + ( false == $this->responding_to_get_remote_media_listing && $_POST['intent'] == 'pull' ) + ) { + + $local_tables = array_flip( $this->get_tables() ); + + $posts_table_name = "{$temp_prefix}{$prefix}posts"; + $postmeta_table_name = "{$temp_prefix}{$prefix}postmeta"; + + if( isset( $local_tables[$posts_table_name] ) && isset( $local_tables[$postmeta_table_name] ) ) { + $prefix = $temp_prefix . $prefix; + } + + } + + $local_attachments = $wpdb->get_results( + "SELECT `{$prefix}posts`.`post_modified_gmt` AS 'date', pm1.`meta_value` AS 'file', pm2.`meta_value` AS 'metadata' + FROM `{$prefix}posts` + INNER JOIN `{$prefix}postmeta` pm1 ON `{$prefix}posts`.`ID` = pm1.`post_id` AND pm1.`meta_key` = '_wp_attached_file' + LEFT OUTER JOIN `{$prefix}postmeta` pm2 ON `{$prefix}posts`.`ID` = pm2.`post_id` AND pm2.`meta_key` = '_wp_attachment_metadata' + WHERE `{$prefix}posts`.`post_type` = 'attachment'", ARRAY_A + ); + + if( is_multisite() ) { + $blogs = $this->get_blogs(); + $prefix = $wpdb->prefix; + foreach( $blogs as $blog ) { + $posts_table_name = "{$temp_prefix}{$prefix}{$blog}_posts"; + $postmeta_table_name = "{$temp_prefix}{$prefix}{$blog}_postmeta"; + if( isset( $local_tables[$posts_table_name] ) && isset( $local_tables[$postmeta_table_name] ) ) { + $prefix = $temp_prefix . $prefix; + } + $attachments = $wpdb->get_results( + "SELECT `{$prefix}{$blog}_posts`.`post_modified_gmt` AS 'date', pm1.`meta_value` AS 'file', pm2.`meta_value` AS 'metadata', {$blog} AS 'blog_id' + FROM `{$prefix}{$blog}_posts` + INNER JOIN `{$prefix}{$blog}_postmeta` pm1 ON `{$prefix}{$blog}_posts`.`ID` = pm1.`post_id` AND pm1.`meta_key` = '_wp_attached_file' + LEFT OUTER JOIN `{$prefix}{$blog}_postmeta` pm2 ON `{$prefix}{$blog}_posts`.`ID` = pm2.`post_id` AND pm2.`meta_key` = '_wp_attachment_metadata' + WHERE `{$prefix}{$blog}_posts`.`post_type` = 'attachment'", ARRAY_A + ); + + $local_attachments = array_merge( $attachments, $local_attachments ); + } + } + + $local_attachments = array_map( array( $this, 'process_attachment_data' ), $local_attachments ); + $local_attachments = array_filter( $local_attachments ); + + return $local_attachments; + } + + function get_flat_attachments( $attachments ) { + $flat_attachments = array(); + foreach( $attachments as $attachment ) { + $flat_attachments[] = $attachment['file']; + if( isset( $attachment['sizes'] ) ) { + $flat_attachments = array_merge( $flat_attachments, $attachment['sizes'] ); + } + } + return $flat_attachments; + } + + function process_attachment_data( $attachment ) { + if ( isset( $attachment['blog_id'] ) ) { // used for multisite + if ( defined( 'UPLOADBLOGSDIR' ) ) { + $upload_dir = sprintf( '%s/files/', $attachment['blog_id'] ); + } else { + $upload_dir = sprintf( 'sites/%s/', $attachment['blog_id'] ); + } + $attachment['file'] = $upload_dir . $attachment['file']; + } + $upload_dir = str_replace( basename( $attachment['file'] ), '', $attachment['file'] ); + if ( ! empty( $attachment['metadata'] ) ) { + $attachment['metadata'] = @unserialize( $attachment['metadata'] ); + if ( ! empty( $attachment['metadata']['sizes'] ) && is_array( $attachment['metadata']['sizes'] ) ) { + foreach ( $attachment['metadata']['sizes'] as $size ) { + if ( empty( $size['file'] ) ) continue; + $attachment['sizes'][] = $upload_dir . $size['file']; + } + } + } + unset( $attachment['metadata'] ); + return $attachment; + } + + function uploads_dir() { + if( defined( 'UPLOADBLOGSDIR' ) ) { + $upload_dir = trailingslashit( ABSPATH ) . UPLOADBLOGSDIR; + } + else { + $upload_dir = wp_upload_dir(); + $upload_dir = $upload_dir['basedir']; + } + return trailingslashit( $upload_dir ); + } + + function get_local_media() { + $upload_dir = untrailingslashit( $this->uploads_dir() ); + if( ! file_exists( $upload_dir ) ) return array(); + + $files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $upload_dir ), RecursiveIteratorIterator::SELF_FIRST ); + $local_media = array(); + + foreach( $files as $name => $object ){ + $name = str_replace( array( $upload_dir . DS, '\\' ), array( '', '/' ), $name ); + $local_media[$name] = $object->getSize(); + } + + return $local_media; + } + + function ajax_migrate_media() { + $this->check_ajax_referer( 'migrate-media' ); + $this->set_time_limit(); + + if ( $_POST['intent'] == 'pull' ) { + $result = $this->process_pull_request(); + return $result; + } + + $result = $this->process_push_request(); + return $result; + } + + function process_pull_request() { + $files_to_download = $_POST['file_chunk']; + $remote_uploads_url = trailingslashit( $_POST['remote_uploads_url'] ); + $parsed = parse_url( $_POST['url'] ); + if( ! empty( $parsed['user'] ) ) { + $credentials = sprintf( '%s:%s@', $parsed['user'], $parsed['pass'] ); + $remote_uploads_url = str_replace( '://', '://' . $credentials, $remote_uploads_url ); + } + + $upload_dir = $this->uploads_dir(); + + $errors = array(); + foreach( $files_to_download as $file_to_download ) { + $temp_file_path = $this->download_url( $remote_uploads_url . $file_to_download ); + + if( is_wp_error( $temp_file_path ) ) { + $download_error = $temp_file_path->get_error_message(); + $errors[] = __( sprintf( 'Could not download file: %1$s - %2$s', $remote_uploads_url . $file_to_download, $download_error ), 'wp-sync-db-media-files' ); + continue; + } + + $date = str_replace( basename( $file_to_download ), '', $file_to_download ); + $new_path = $upload_dir . $date . basename( $file_to_download ); + + $move_result = @rename( $temp_file_path, $new_path ); + + if( false === $move_result ) { + $folder = dirname( $new_path ); + if( @file_exists( $folder ) ) { + $errors[] = __( sprintf( 'Error attempting to move downloaded file. Temp path: %1$s - New Path: %2$s', $temp_file_path, $new_path ), 'wp-sync-db-media-files' ) . ' (#103mf)'; + } + else{ + if( false === @mkdir( $folder, 0755, true ) ) { + $errors[] = __( sprintf( 'Error attempting to create required directory: %s', $folder ), 'wp-sync-db-media-files' ) . ' (#104mf)'; + } + else { + $move_result = @rename( $temp_file_path, $new_path ); + if( false === $move_result ) { + $errors[] = __( sprintf( 'Error attempting to move downloaded file. Temp path: %1$s - New Path: %2$s', $temp_file_path, $new_path ), 'wp-sync-db-media-files' ) . ' (#105mf)'; + } + } + } + } + } + + if( ! empty( $errors ) ) { + $return = array( + 'wpsdb_error' => 1, + 'body' => implode( '
    ', $errors ) . '
    ' + ); + $result = $this->end_ajax( json_encode( $return ) ); + return $result; + } + + // not required, just here because we have to return something otherwise the AJAX fails + $return['success'] = 1; + $result = $this->end_ajax( json_encode( $return ) ); + return $result; + } + + function process_push_request() { + $files_to_migrate = $_POST['file_chunk']; + + $upload_dir = $this->uploads_dir(); + + $body = ''; + foreach( $files_to_migrate as $file_to_migrate ) { + $body .= $this->file_to_multipart( $upload_dir . $file_to_migrate ); + } + + $post_args = array( + 'action' => 'wpsdbmf_push_request', + 'files' => serialize( $files_to_migrate ) + ); + + $post_args['sig'] = $this->create_signature( $post_args, $_POST['key'] ); + + $body .= $this->array_to_multipart( $post_args ); + + $args['body'] = $body; + $ajax_url = trailingslashit( $_POST['url'] ) . 'wp-admin/admin-ajax.php'; + $response = $this->remote_post( $ajax_url, '', __FUNCTION__, $args ); + $response = $this->verify_remote_post_response( $response ); + + $result = $this->end_ajax( json_encode( $response ) ); + return $result; + } + + function respond_to_push_request() { + $filtered_post = $this->filter_post_elements( $_POST, array( 'action', 'files' ) ); + $filtered_post['files'] = stripslashes( $filtered_post['files'] ); + if ( ! $this->verify_signature( $filtered_post, $this->settings['key'] ) ) { + $return = array( + 'wpsdb_error' => 1, + 'body' => $this->invalid_content_verification_error . ' (#101mf)', + ); + $result = $this->end_ajax( serialize( $return ) ); + return $result; + } + + if( ! isset( $_FILES['media'] ) ) { + $return = array( + 'wpsdb_error' => 1, + 'body' => __( '$_FILES is empty, the upload appears to have failed', 'wp-sync-db-media-files' ) . ' (#106mf)', + ); + $result = $this->end_ajax( serialize( $return ) ); + return $result; + } + + $upload_dir = $this->uploads_dir(); + + $files = $this->diverse_array( $_FILES['media'] ); + $file_paths = unserialize( $filtered_post['files'] ); + $i = 0; + $errors = array(); + foreach( $files as &$file ) { + $destination = $upload_dir . $file_paths[$i]; + $folder = dirname( $destination ); + + if( false === @file_exists( $folder ) && false === @mkdir( $folder, 0755, true ) ) { + $errors[] = __( sprintf( 'Error attempting to create required directory: %s', $folder ), 'wp-sync-db-media-files' ) . ' (#108mf)'; + ++$i; + continue; + } + + if( false === @move_uploaded_file( $file['tmp_name'], $destination ) ) { + $errors[] = __( sprintf( 'A problem occurred when attempting to move the temp file "%1$s" to "%2$s"', $file['tmp_name'], $destination ), 'wp-sync-db-media-files' ) . ' (#107mf)'; + } + ++$i; + } + + $return = array( 'success' => 1 ); + if( ! empty( $errors ) ) { + $return = array( + 'wpsdb_error' => 1, + 'body' => implode( '
    ', $errors ) . '
    ' + ); + } + $result = $this->end_ajax( serialize( $return ) ); + return $result; + } + + function ajax_determine_media_to_migrate() { + $this->check_ajax_referer( 'determine-media-to-migrate' ); + $this->set_time_limit(); + + $local_attachments = $this->get_local_attachments(); + $local_media = $this->get_local_media(); + + $data = array(); + $data['action'] = 'wpsdbmf_get_remote_media_listing'; + $data['temp_prefix'] = $this->temp_prefix; + $data['intent'] = $_POST['intent']; + $data['sig'] = $this->create_signature( $data, $_POST['key'] ); + $ajax_url = trailingslashit( $_POST['url'] ) . 'wp-admin/admin-ajax.php'; + $response = $this->remote_post( $ajax_url, $data, __FUNCTION__ ); + $response = $this->verify_remote_post_response( $response ); + + $upload_dir = $this->uploads_dir(); + + $remote_attachments = $response['remote_attachments']; + $remote_media = $response['remote_media']; + + $this->files_to_migrate = array(); + + if( $_POST['intent'] == 'pull' ) { + $this->media_diff( $local_attachments, $remote_attachments, $local_media, $remote_media ); + } + else { + $this->media_diff( $remote_attachments, $local_attachments, $remote_media, $local_media ); + } + + $return['files_to_migrate'] = $this->files_to_migrate; + $return['total_size'] = array_sum( $this->files_to_migrate ); + $return['remote_uploads_url'] = $response['remote_uploads_url']; + + // remove local/remote media if it doesn't exist on the local/remote site + if( $_POST['remove_local_media'] == '1' ) { + if( $_POST['intent'] == 'pull' ) { + $this->remove_local_attachments( $remote_attachments ); + } + else { + $data = array(); + $data['action'] = 'wpsdbmf_remove_local_attachments'; + $data['remote_attachments'] = serialize( $local_attachments ); + $data['sig'] = $this->create_signature( $data, $_POST['key'] ); + $ajax_url = trailingslashit( $_POST['url'] ) . 'wp-admin/admin-ajax.php'; + $response = $this->remote_post( $ajax_url, $data, __FUNCTION__ ); + // the response is ignored here (for now) as this is not a critical task + } + } + + $result = $this->end_ajax( json_encode( $return ) ); + return $result; + } + + function respond_to_remove_local_attachments() { + $filtered_post = $this->filter_post_elements( $_POST, array( 'action', 'remote_attachments' ) ); + $filtered_post['remote_attachments'] = stripslashes( $filtered_post['remote_attachments'] ); + if ( ! $this->verify_signature( $filtered_post, $this->settings['key'] ) ) { + $return = array( + 'wpsdb_error' => 1, + 'body' => $this->invalid_content_verification_error . ' (#109mf)', + ); + $result = $this->end_ajax( serialize( $return ) ); + return $result; + } + + $remote_attachments = @unserialize( $filtered_post['remote_attachments'] ); + if( false === $remote_attachments ) { + $return = array( + 'wpsdb_error' => 1, + 'body' => __( 'Error attempting to unserialize the remote attachment data', 'wp-sync-db-media-files' ) . ' (#110mf)', + ); + $result = $this->end_ajax( serialize( $return ) ); + return $result; + } + + $this->remove_local_attachments( $remote_attachments ); + + $return = array( + 'success' => 1, + ); + $result = serialize( json_encode( $return ) ); + return $result; + } + + function remove_local_attachments( $remote_attachments ) { + $flat_remote_attachments = array_flip( $this->get_flat_attachments( $remote_attachments ) ); + $local_media = $this->get_local_media(); + // remove local media if it doesn't exist on the remote site + $temp_local_media = array_keys( $local_media ); + $allowed_mime_types = array_flip( get_allowed_mime_types() ); + $upload_dir = $this->uploads_dir(); + foreach( $temp_local_media as $local_media_file ) { + // don't remove folders + if( false === is_file( $upload_dir . $local_media_file ) ) continue; + $filetype = wp_check_filetype( $local_media_file ); + // don't remove files that we shouldn't remove, e.g. .php, .sql, etc + if( false === isset( $allowed_mime_types[$filetype['type']] ) ) continue; + // don't remove files that exist on the remote site + if( true === isset( $flat_remote_attachments[$local_media_file] ) ) continue; + + @unlink( $upload_dir . $local_media_file ); + } + } + + function media_diff( $site_a_attachments, $site_b_attachments, $site_a_media, $site_b_media ) { + foreach( $site_b_attachments as $attachment ) { + $local_attachment_key = $this->multidimensional_search( array( 'file' => $attachment['file'] ), $site_a_attachments ); + if( false === $local_attachment_key ) continue; + $remote_timestamp = strtotime( $attachment['date'] ); + $local_timestamp = strtotime( $site_a_attachments[$local_attachment_key]['date'] ); + if( $local_timestamp >= $remote_timestamp ) { + if( ! isset( $site_a_media[$attachment['file']] ) ) { + $this->add_files_to_migrate( $attachment, $site_b_media ); + } + else { + $this->maybe_add_resized_images( $attachment, $site_b_media, $site_a_media ); + } + } + else { + $this->add_files_to_migrate( $attachment, $site_b_media ); + } + } + } + + function add_files_to_migrate( $attachment, $remote_media ) { + if( isset( $remote_media[$attachment['file']] ) ) { + $this->files_to_migrate[$attachment['file']] = $remote_media[$attachment['file']]; + } + if( empty( $attachment['sizes'] ) || apply_filters( 'wpsdb_exclude_resized_media', false ) ) return; + foreach( $attachment['sizes'] as $size ) { + if( isset( $remote_media[$size] ) ) { + $this->files_to_migrate[$size] = $remote_media[$size]; + } + } + } + + function maybe_add_resized_images( $attachment, $site_b_media, $site_a_media ) { + if( empty( $attachment['sizes'] ) || apply_filters( 'wpsdb_exclude_resized_media', false ) ) return; + foreach( $attachment['sizes'] as $size ) { + if( isset( $site_b_media[$size] ) && ! isset( $site_a_media[$size] ) ) { + $this->files_to_migrate[$size] = $site_b_media[$size]; + } + } + } + + function respond_to_get_remote_media_listing() { + $filtered_post = $this->filter_post_elements( $_POST, array( 'action', 'temp_prefix', 'intent' ) ); + if ( ! $this->verify_signature( $filtered_post, $this->settings['key'] ) ) { + $return = array( + 'wpsdb_error' => 1, + 'body' => $this->invalid_content_verification_error . ' (#100mf)', + ); + $result = $this->end_ajax( serialize( $return ) ); + return $result; + } + + if( defined( 'UPLOADBLOGSDIR' ) ) { + $upload_url = home_url( UPLOADBLOGSDIR ); + } + else { + $upload_dir = wp_upload_dir(); + $upload_url = $upload_dir['baseurl']; + } + + $this->responding_to_get_remote_media_listing = true; + + $return['remote_attachments'] = $this->get_local_attachments(); + $return['remote_media'] = $this->get_local_media(); + $return['remote_uploads_url'] = $upload_url; + + $result = $this->end_ajax( serialize( $return ) ); + return $result; + } + + function migration_form_controls() { + $this->template( 'migrate' ); + } + + function accepted_profile_fields( $profile_fields ) { + $profile_fields[] = 'media_files'; + $profile_fields[] = 'remove_local_media'; + return $profile_fields; + } + + function load_assets() { + $plugins_url = trailingslashit( plugins_url() ) . trailingslashit( $this->plugin_folder_name ); + $src = $plugins_url . 'asset/js/script.js'; + $version = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? time() : $this->plugin_version; + wp_enqueue_script( 'wp-sync-db-media-files-script', $src, array( 'jquery', 'wp-sync-db-common', 'wp-sync-db-hook', 'wp-sync-db-script' ), $version, true ); + + wp_localize_script( 'wp-sync-db-media-files-script', 'wpsdbmf_strings', array( + 'determining' => __( "Determining which media files to migrate, please wait...", 'wp-sync-db-media-files' ), + 'error_determining' => __( "Error while attempting to determine which media files to migrate.", 'wp-sync-db-media-files' ), + 'migration_failed' => __( "Migration failed", 'wp-sync-db-media-files' ), + 'problem_migrating_media' => __( "A problem occurred when migrating the media files.", 'wp-sync-db-media-files' ), + 'media_files' => __( "Media Files", 'wp-sync-db-media-files' ), + 'migrating_media_files' => __( "Migrating media files", 'wp-sync-db-media-files' ), + ) ); + + } + + function establish_remote_connection_data( $data ) { + $data['media_files_available'] = '1'; + $data['media_files_version'] = $this->plugin_version; + if( function_exists( 'ini_get' ) ) { + $max_file_uploads = ini_get( 'max_file_uploads' ); + } + $max_file_uploads = ( empty( $max_file_uploads ) ) ? 20 : $max_file_uploads; + $data['media_files_max_file_uploads'] = apply_filters( 'wpsdbmf_max_file_uploads', $max_file_uploads ); + return $data; + } + + function multidimensional_search( $needle, $haystack ) { + if( empty( $needle ) || empty( $haystack ) ) return false; + + foreach( $haystack as $key => $value ) { + foreach ( $needle as $skey => $svalue ) { + $exists = ( isset( $haystack[$key][$skey] ) && $haystack[$key][$skey] === $svalue ); + } + if( $exists ) return $key; + } + + return false; + } + + function get_blogs() { + global $wpdb; + + $blogs = $wpdb->get_results( + "SELECT blog_id + FROM {$wpdb->blogs} + WHERE spam = '0' + AND deleted = '0' + AND archived = '0' + AND blog_id != 1 + "); + + $clean_blogs = array(); + foreach( $blogs as $blog ) { + $clean_blogs[] = $blog->blog_id; + } + + return $clean_blogs; + } + + function download_url( $url, $timeout = 300 ) { + //WARNING: The file is not automatically deleted, The script must unlink() the file. + if ( ! $url ) + return new WP_Error('http_no_url', __('Invalid URL Provided.')); + + $tmpfname = wp_tempnam($url); + if ( ! $tmpfname ) + return new WP_Error('http_no_file', __('Could not create Temporary file.')); + + $response = wp_remote_get( $url, array( 'timeout' => $timeout, 'stream' => true, 'filename' => $tmpfname, 'reject_unsafe_urls' => false ) ); + + if ( is_wp_error( $response ) ) { + unlink( $tmpfname ); + return $response; + } + + if ( 200 != wp_remote_retrieve_response_code( $response ) ){ + unlink( $tmpfname ); + return new WP_Error( 'http_404', trim( wp_remote_retrieve_response_message( $response ) ) ); + } + + return $tmpfname; + } + + function js_variables() { + ?> + var wpsdb_media_files_version = 'plugin_version; ?>'; + 1, 'body' => $this->error ); + $result = $this->end_ajax( json_encode( $return ) ); + return $result; + } + + if ( ! is_serialized( trim( $response ) ) ) { + $return = array( 'wpsdb_error' => 1, 'body' => $response ); + $result = $this->end_ajax( json_encode( $return ) ); + return $result; + } + + $response = unserialize( trim( $response ) ); + + if ( isset( $response['wpsdb_error'] ) ) { + $result = $this->end_ajax( json_encode( $response ) ); + return $result; + } + return $response; + } + + function add_nonces( $nonces ) { + $nonces['migrate_media'] = wp_create_nonce( 'migrate-media' ); + $nonces['determine_media_to_migrate'] = wp_create_nonce( 'determine-media-to-migrate' ); + return $nonces; + } + + function cli_migration( $outcome, $profile, $verify_connection_response, $initiate_migration_response ) { + global $wpsdb, $wpsdb_cli; + if ( true !== $outcome ) return $outcome; + if ( !isset( $profile['media_files'] ) || '1' !== $profile['media_files'] ) return $outcome; + + if ( !isset( $verify_connection_response['media_files_max_file_uploads'] ) ) { + return $wpsdb_cli->cli_error( __( 'WP Sync DB Media Files does not seems to be installed/active on the remote website.', 'wp-sync-db-media-files' ) ); + } + + $this->set_time_limit(); + $wpsdb->set_cli_migration(); + $this->set_cli_migration(); + + $connection_info = explode( "\n", $profile['connection_info'] ); + + $_POST['intent'] = $profile['action']; + $_POST['url'] = trim( $connection_info[0] ); + $_POST['key'] = trim( $connection_info[1] ); + $_POST['remove_local_media'] = ( isset( $profile['remove_local_media'] ) ) ? 1 : 0; + $_POST['temp_prefix'] = $verify_connection_response['temp_prefix']; + + do_action( 'wpsdb_cli_before_determine_media_to_migrate', $profile, $verify_connection_response, $initiate_migration_response ); + + $response = $this->ajax_determine_media_to_migrate(); + if( is_wp_error( $determine_media_to_migrate_response = $wpsdb_cli->verify_cli_response( $response, 'ajax_determine_media_to_migrate()' ) ) ) return $determine_media_to_migrate_response; + + $remote_uploads_url = $determine_media_to_migrate_response['remote_uploads_url']; + $files_to_migrate = $determine_media_to_migrate_response['files_to_migrate']; + // seems like this value needs to be different depending on pull/push? + $bottleneck = $wpsdb->get_bottleneck(); + + while ( !empty( $files_to_migrate ) ) { + $file_chunk_to_migrate = array(); + $file_chunk_size = 0; + $number_of_files_to_migrate = 0; + foreach ( $files_to_migrate as $file_to_migrate => $file_size ) { + if ( empty( $file_chunk_to_migrate ) ) { + $file_chunk_to_migrate[] = $file_to_migrate; + $file_chunk_size += $file_size; + unset( $files_to_migrate[$file_to_migrate] ); + ++$number_of_files_to_migrate; + } else { + if ( ( $file_chunk_size + $file_size ) > $bottleneck || $number_of_files_to_migrate >= $verify_connection_response['media_files_max_file_uploads'] ) { + break; + } else { + $file_chunk_to_migrate[] = $file_to_migrate; + $file_chunk_size += $file_size; + unset( $files_to_migrate[$file_to_migrate] ); + ++$number_of_files_to_migrate; + } + } + + $_POST['file_chunk'] = $file_chunk_to_migrate; + $_POST['remote_uploads_url'] = $remote_uploads_url; + + $response = $this->ajax_migrate_media(); + if( is_wp_error( $migrate_media_response = $wpsdb_cli->verify_cli_response( $response, 'ajax_migrate_media()' ) ) ) return $migrate_media_response; + } + } + return true; + } +} diff --git a/www/wp-content/plugins/wp-sync-db-media-files/composer.json b/www/wp-content/plugins/wp-sync-db-media-files/composer.json new file mode 100755 index 0000000..21a028c --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db-media-files/composer.json @@ -0,0 +1,11 @@ +{ + "name": "wp-sync-db/wp-sync-db-media-files", + "type": "wordpress-plugin", + "homepage": "https://github.com/wp-sync-db/wp-sync-db-media-files", + "license": "GPLv2", + "description": "WP Sync DB Media File Addon for WP Sync DB", + "keywords": ["plugin","wordpress","wp-sync-db","media"], + "require": { + "composer/installers": "~1.0.6" + } +} diff --git a/www/wp-content/plugins/wp-sync-db-media-files/languages/wp-migrate-db-pro-media-files-en.pot b/www/wp-content/plugins/wp-sync-db-media-files/languages/wp-migrate-db-pro-media-files-en.pot new file mode 100755 index 0000000..f9ed8be --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db-media-files/languages/wp-migrate-db-pro-media-files-en.pot @@ -0,0 +1,85 @@ +msgid "" +msgstr "" +"Project-Id-Version: WP Sync DB Media Files\n" +"POT-Creation-Date: 2014-05-28 13:46+1000\n" +"PO-Revision-Date: 2014-05-28 13:46+1000\n" +"Last-Translator: Delicious Brains \n" +"Language-Team: Delicious Brains \n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.6.5\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;" +"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;" +"_nx_noop:3c,1,2;__ngettext_noop:1,2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SearchPath-0: .\n" + +#: class/wpsdb-media-files.php:273 +msgid "$_FILES is empty, the upload appears to have failed" +msgstr "" + +#: class/wpsdb-media-files.php:382 +msgid "Error attempting to unserialize the remote attachment data" +msgstr "" + +#: class/wpsdb-media-files.php:504 +msgid "Determining which media files to migrate, please wait..." +msgstr "" + +#: class/wpsdb-media-files.php:505 +msgid "Error while attempting to determine which media files to migrate." +msgstr "" + +#: class/wpsdb-media-files.php:506 +msgid "Migration failed" +msgstr "" + +#: class/wpsdb-media-files.php:507 +msgid "A problem occurred when migrating the media files." +msgstr "" + +#: class/wpsdb-media-files.php:508 template/migrate.php:6 +msgid "Media Files" +msgstr "" + +#: class/wpsdb-media-files.php:509 +msgid "Migrating media files" +msgstr "" + +#: class/wpsdb-media-files.php:561 +msgid "Invalid URL Provided." +msgstr "" + +#: class/wpsdb-media-files.php:565 +msgid "Could not create Temporary file." +msgstr "" + +#: class/wpsdb-media-files.php:623 +msgid "" +"WP Sync DB Media Files does not seems to be installed/active on the " +"remote website." +msgstr "" + +#: template/migrate.php:15 +msgid "" +"Remove local media files that are not " +"found on the remote site" +msgstr "" + +#: template/migrate.php:23 +msgid "Addon Missing" +msgstr "" + +#: template/migrate.php:23 +msgid "" +"The Media Files addon is inactive on the remote site. " +"Please install and activate it to enable media file migration." +msgstr "" + +#: template/migrate.php:27 +msgid "Version Mismatch" +msgstr "" diff --git a/www/wp-content/plugins/wp-sync-db-media-files/template/migrate.php b/www/wp-content/plugins/wp-sync-db-media-files/template/migrate.php new file mode 100755 index 0000000..bafc2ac --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db-media-files/template/migrate.php @@ -0,0 +1,23 @@ + +
    + +
    +
      +
    • + +
    • +
    +
    + + +
    diff --git a/www/wp-content/plugins/wp-sync-db-media-files/version.php b/www/wp-content/plugins/wp-sync-db-media-files/version.php new file mode 100755 index 0000000..d2be2b3 --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db-media-files/version.php @@ -0,0 +1,2 @@ + + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {description} + Copyright (C) {year} {fullname} + + This program 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 2 of the License, or + (at your option) any later version. + + This program 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. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + {signature of Ty Coon}, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/www/wp-content/plugins/wp-sync-db/README.md b/www/wp-content/plugins/wp-sync-db/README.md new file mode 100755 index 0000000..13247e3 --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db/README.md @@ -0,0 +1,75 @@ +# WP Sync DB +WP Sync DB eliminates the manual work of migrating a WP database. Copy your db from one WP install to another with a single-click in your dashboard. Especially handy for syncing a local development database with a live site. + +

    + +## Description +WP Sync DB exports your database as a MySQL data dump (much like phpMyAdmin), does a find and replace on URLs and file paths, then allows you to save it to your computer, or send it directly to another WordPress instance. It is perfect for developers who develop locally and need to move their WordPress site to a staging or production server. + +### Selective Sync +WP Sync DB lets you choose which DB tables are migrated. Have a huge analytics table you'd rather not send? Simply deselect it and it won't be synced. + +### Bi-directional Sync + +#### Pull: Replace a Local DB with a Remote DB +If you have a test site setup locally but you need the latest data from the production server, just install WP Sync DB on both sites and you can pull the live database down, replacing your local database in just a few clicks. + +#### Push: Replace a Remote DB with a Local DB +If you're developing a new feature for a site that's already live, you likely need to tweak your settings locally before deploying. Once you've perfected your configuration on your development machine, it's easy to send the settings to your production server. Just push to the server, replacing your remote database with your local one. + +### Database Export & Backup +Not only can WP Sync DB pull and push your DB: it can export your DB to an SQL file that you can save and backup wherever you want. No need to ssh into your machine or open up phpMyAdmin. + +### Encrypted Transfers +All data is sent over SSL to prevent your database from being read during the transfer. WP Sync DB also uses HMAC encryption to sign and verify every request. This ensures that all requests are coming from an authorized server and haven't been tampered with en route. + +### Automatic Find & Replace +When migrating a WordPress site, URLs in the content, widgets, menus, etc need to be updated to the new site's URL. Doing this manually is annoying, time consuming, and very error-prone. WP Sync DB does all of this for you. + +### Stress Tested on Massive Sites +Huge database? No prob. WP Sync DB has been tested with tables several GBs in size. + +### Detect Limitations Automatically +WP Sync DB checks both the remote and local servers to determine limitations and optimize for performance. For example, we detect the MySQL `max_allowed_packet_size` and adjust how much SQL we execute at a time. + +### Sync Media Libraries Between Installations +Using the optional [WP Sync DB Media Files](https://github.com/wp-sync-db/wp-migrate-db-media-files) addon, you can have media files synced between installs too. + +## Installation +1. Install [github-updater](https://github.com/afragen/github-updater) by downloading the latest zip [here](https://github.com/afragen/github-updater/releases). We rely on this plugin for updating WP Sync DB directly from this git repo. +2. Install WP Sync DB by downloading the latest zip [here](https://github.com/wp-sync-db/wp-sync-db/releases). Both github-updater and WP Sync DB will now download their own updates automatically, so you will never need to go through that tedious zip downloading again. +3. Access the WP Sync DB menu option under Tools. +4. Install the optional [WP Sync DB Media Files](https://github.com/wp-sync-db/wp-migrate-db-media-files) addon. + +## Help Videos + +### Feature Walkthrough +http://www.youtube.com/watch?v=SlfSuuePYaQ + +A brief walkthrough of the WP Sync DB plugin showing all of the different options and explaining them. + +### Pulling Live Data Into Your Local Development Environment +http://www.youtube.com/watch?v=IFdHIpf6jjc + +This screencast demonstrates how you can pull data from a remote, live WordPress install and update the data in your local development environment. + +### Pushing Local Development Data to a Staging Environment +http://www.youtube.com/watch?v=FjTzNqAlQE0 + +This screencast demonstrates how you can push a local WordPress database you've been using for development to a staging environment. + +### Media Files Addon Demo +http://www.youtube.com/watch?v=0aR8-jC2XXM + +A short demo of how the [Media Files addon](https://github.com/wp-sync-db/wp-migrate-db-media-files) allows you to sync up your WordPress Media Libraries. + +## Similar Tools + - [Interconnect IT's Search & Replace](https://github.com/interconnectit/Search-Replace-DB) + +## Isn't this the same as WP Migrate DB Pro? +No, of course not, don't be silly. I took out the license verification code, a really shady looking PressTrends reporter, and the tab for installing the Media Files addon before I published 1.4. Release 1.3 was the same as [WP Migrate DB Pro](https://deliciousbrains.com/wp-migrate-db-pro), but I've made several improvements since then. + +## Is this Illegal? +**No.** Just because this is based on the paid-for WP Migrate DB Pro, it doesn't mean I can't release it. WP Migrate DB Pro is released under GPLv2, a copyleft license that guarantees my freedom (and the freedom of all users) to copy, distribute, and/or modify this software. + +I _was_ forced to rename it from "WP Migrate DB" to "WP Sync DB" after Delicious Brains decided to trademark the name "WP Migrate DB", [filed a DMCA takedown](http://wptavern.com/dmca-takedown-notice-issued-against-fork-of-wp-migrate-db-pro) against the repo, and threatened to take me to court. But they should be OK with it now. diff --git a/www/wp-content/plugins/wp-sync-db/asset/css/styles.css b/www/wp-content/plugins/wp-sync-db/asset/css/styles.css new file mode 100755 index 0000000..81dcc19 --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db/asset/css/styles.css @@ -0,0 +1,1272 @@ +#wpsdb-main { + width: 742px; +} + +#overlay { + background-color: rgba(255, 255, 255, 0.9); +} + +.wpsdb { + /* ============================================================================= + Common & Global + ========================================================================== */ + /* ============================================================================= + Migrate Tab + ========================================================================== */ + /* Misc */ + /* Tabs */ + /* Saved migration profile selection */ + /* Output Selection */ + /* Find and Replace */ + /* Select Tables */ + /* Advanced Options */ + /* Save migration profile */ + /* Action buttons */ + /* ============================================================================= + Settings Tab + ========================================================================== */ + /* ============================================================================= + Help Tab + ========================================================================== */ + /* ============================================================================= + Addons Tab + ========================================================================== */ +} +.wpsdb .updated { + clear: both; +} +.wpsdb div.updated.warning { + max-width: 742px; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 10px 0; +} +.wpsdb div.updated.warning p { + font-size: 13px; + margin: 0.5em 0; +} +.wpsdb a { + text-decoration: none; +} +.wpsdb li { + margin-bottom: 5px; + position: relative; +} +.wpsdb ul { + margin: 0; +} +.wpsdb input[type=checkbox], +.wpsdb input[type=radio] { + margin-right: 5px; + vertical-align: baseline; + margin-top: 0; +} +.wpsdb input[type=text], +.wpsdb input[type=password] { + padding: 5px; +} +.wpsdb input[disabled=disabled] { + cursor: default; +} +.wpsdb label.disabled { + color: #888; + cursor: default; +} +.wpsdb .option-section { + border-bottom: 1px solid #ccc; + padding-bottom: 20px; + margin-bottom: 20px; +} +.wpsdb .option-section h3 { + font-size: 18px; + font-weight: normal; +} +.wpsdb p.migrate-db { + overflow: hidden; +} +.wpsdb p.migrate-db input { + float: left; +} +.wpsdb p.migrate-db img { + float: left; + margin: 3px 0 0 5px; +} +.wpsdb p.migrate-db .save-settings-button { + margin-left: 10px; + display: none; +} +.wpsdb .indent-wrap { + margin-left: 24px; +} +.wpsdb .expandable-content { + display: none; + margin-top: 10px; +} +.wpsdb .expandable-content li:last-child { + margin-bottom: 0px; +} +.wpsdb .header-wrapper { + margin-bottom: 10px; +} +.wpsdb .header-expand-collapse { + cursor: pointer; + display: inline-block; +} +.wpsdb .option-description { + font-size: 12px; + color: #999; + margin-left: 8px; + font-weight: normal; +} +.wpsdb .option-group li:last-child { + margin-bottom: 0; +} +.wpsdb .connection-status { + display: none; + overflow: auto; +} +.wpsdb .connection-status.error { + color: #9D1818; +} +.wpsdb .ajax-spinner { + left: 6px; + position: relative; + top: 3px; +} +.wpsdb div.message { + margin: 15px 0 0; +} +.wpsdb .return-to-profile-selection { + margin-bottom: 15px; + display: inline-block; +} +.wpsdb .return-to-profile-selection.bottom { + margin-top: 10px; +} +.wpsdb h2.nav-tab-wrapper { + margin-top: 10px; + margin-bottom: 20px; + padding-left: 5px; +} +.wpsdb h2.nav-tab-wrapper a { + margin-right: 4px; +} +.wpsdb h2.nav-tab-wrapper a.nav-tab-active { + color: #464646; + cursor: default; +} +.wpsdb label { + display: inline-block; + clear: both; +} +.wpsdb .migration-profile-options li { + position: relative; + width: 520px; +} +.wpsdb .migration-profile-options li a { + padding: 5px 10px; + width: 500px; + border: 1px solid #ddd; + margin: 0px 0px 7px; + display: block; + font-size: 14px; + color: #333; +} +.wpsdb .migration-profile-options li a:hover { + border-color: #bbb; +} +.wpsdb .main-list-delete-profile-link { + color: #999999; + font-family: "Times New Roman", serif; + font-size: 26px; + font-weight: 200; + position: absolute; + right: 7px; + top: 6px; + cursor: pointer; +} +.wpsdb .main-list-delete-profile-link:hover { + color: #444; +} +.wpsdb .option-group li { + margin-bottom: 5px; +} +.wpsdb .option-group > li { + margin-bottom: 8px; +} +.wpsdb .option-group li > label { + font-size: 14px; + font-weight: bold; +} +.wpsdb .option-group ul { + display: none; + margin: 10px 0px 10px 25px; +} +.wpsdb .option-group ul label { + font-size: 12px; + font-weight: normal; +} +.wpsdb .option-heading, .wpsdb .checkbox-label { + font-size: 14px; + font-weight: bold; +} +.wpsdb .checkbox-label input[type=checkbox] { + margin-right: 7px; + position: relative; + top: -1px; +} +.wpsdb .expand-collapse-arrow { + margin-right: 9px; +} +.wpsdb .migrate-connection-info { + min-width: 675px; + margin: 0; +} +.wpsdb .migrate-tab .pull-push-connection-info { + width: 418px; + height: 65px; + color: #333; + font-family: Consolas, Monaco, monospace; + font-size: 15px; + line-height: 21px; + padding: 10px; +} +.wpsdb .basic-access-auth-wrapper { + display: none; + margin-bottom: 5px; +} +.wpsdb .auth-username, .wpsdb .auth-password { + width: 206px; + margin-top: 3px; +} +.wpsdb .auth-password { + width: 207px; +} +.wpsdb .connection-info-wrapper { + display: none; + width: 670px; +} +.wpsdb .connect-button { + margin-top: 2px; +} +.wpsdb .temp-disabled { + background-color: #EEEEEE; + color: #888888; + font-family: Consolas, Monaco, monospace; + text-shadow: 0 1px 0 #FFFFFF; +} +.wpsdb .push-list ul { + margin-bottom: 0px; +} +.wpsdb .find-heading, .wpsdb .replace-heading { + float: left; +} +.wpsdb .find-heading { + width: 400px; +} +.wpsdb .replace-fields { + border-collapse: collapse; + border-spacing: 0px; +} +.wpsdb .replace-fields input { + width: 295px; +} +.wpsdb .replace-fields tr td { + padding-bottom: 7px; +} +.wpsdb .replace-fields tr:last-child td { + padding-bottom: 0px; +} +.wpsdb .arrow-col { + width: 93px; + text-align: center; + vertical-align: middle; +} +.wpsdb .right-arrow { + font-size: 36px; + color: #aaa; + font-family: arial, sans-serif; +} +.wpsdb .replace-right-col span { + border-radius: 50%; + border: 1px solid #ccc; + background-color: #eee; + width: 16px; + height: 16px; + display: inline-block; + position: relative; + top: 4px; + cursor: pointer; +} +.wpsdb .replace-right-col span:hover { + border-color: #aaa; +} +.wpsdb .sort-handle-col { + width: 20px; + cursor: -webkit-grab; + cursor: -moz-grab; +} +.wpsdb .sort-handle:before { + content: "\f214"; + display: inline-block; + -webkit-font-smoothing: antialiased; + font: normal 16px/1 'dashicons'; + vertical-align: top; + color: #aaa; + background-color: transparent !important; +} +.wpsdb .original-repeatable-field { + display: none; +} +.wpsdb .no-replaces-message { + display: none; + margin-bottom: 0px; +} +.wpsdb .inline-message.missing-replace { + margin-top: 15px; + display: none; +} +.wpsdb #new-path-missing-warning { + margin-top: 5px; +} +.wpsdb .tables-header { + display: inline-block; +} +.wpsdb .expand-collapse-arrow { + display: inline-block; + position: relative; + top: -2px; + font-size: 11px; +} +.wpsdb .collapsed { + -moz-transform: scale(1) rotate(-90deg) translateX(0px) translateY(0px) skewX(0deg) skewY(0deg); + -webkit-transform: scale(1) rotate(-90deg) translateX(0px) translateY(0px) skewX(0deg) skewY(0deg); + -o-transform: scale(1) rotate(-90deg) translateX(0px) translateY(0px) skewX(0deg) skewY(0deg); + -ms-transform: scale(1) rotate(-90deg) translateX(0px) translateY(0px) skewX(0deg) skewY(0deg); + transform: scale(1) rotate(-90deg) translateX(0px) translateY(0px) skewX(0deg) skewY(0deg); +} +.wpsdb .select-deselect-divider { + margin: 0 6px; +} +.wpsdb .select-wrap { + display: none; + margin-top: 12px; +} +.wpsdb .select-post-types-wrap { + display: block; +} +.wpsdb .multiselect { + min-width: 420px; + min-height: 180px; + margin-bottom: 10px; +} +.wpsdb .table-migrate-options li label { + font-size: 12px; + font-weight: normal; +} +.wpsdb .table-migrate-options li { + margin-bottom: 5px; +} +.wpsdb .general-helper { + border-radius: 50%; + border: 1px solid #ccc; + background-color: #eee; + width: 15px; + height: 15px; + display: inline-block; + position: relative; + top: 4px; + margin-top: -4px; + cursor: pointer; + margin-left: 2px; +} +.wpsdb .general-helper:hover { + border-color: #aaa; +} +.wpsdb .general-helper:after { + content: "?"; + color: #999999; + font-size: 10px; + font-weight: bold; + left: 4px; + position: absolute; + top: -1px; +} +.wpsdb .helper-message { + padding: 10px; + border: 1px solid #ccc; + border-radius: 3px; + background-color: #fff; + position: absolute; + width: 500px; + z-index: 9999; + display: none; + box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2); +} +.wpsdb .inline-message { + padding: 10px; + border-radius: 3px; + margin-top: 5px; +} +.wpsdb .inline-message.error { + border: 1px solid #CC0000; + background-color: #FFEBE8; +} +.wpsdb .inline-message.warning { + background-color: #FFFFE0; + border: 1px solid #E6DB55; +} +.wpsdb .helper-message:before { + content: ''; + border-bottom: 8px solid transparent; + border-right: 8px solid #aaa; + border-top: 8px solid transparent; + display: block; + height: 0; + left: -8px; + position: absolute; + top: 11px; + width: 0; +} +.wpsdb .helper-message:after { + content: ''; + border-bottom: 8px solid transparent; + border-right: 8px solid #fff; + border-top: 8px solid transparent; + display: block; + height: 0; + left: -7px; + position: absolute; + top: 11px; + width: 0; +} +.wpsdb .helper-message.bottom:before { + content: ''; + border-left: 8px solid transparent; + border-right: 8px solid transparent; + border-bottom: 8px solid #aaa; + border-top: 0; + display: block; + height: 0; + left: 50%; + margin-left: -8px; + position: absolute; + top: -9px; + width: 0; +} +.wpsdb .helper-message.bottom:after { + content: ''; + border-left: 8px solid transparent; + border-right: 8px solid transparent; + border-bottom: 8px solid #fff; + border-top: 0; + display: block; + height: 0; + left: 50%; + margin-left: -8px; + position: absolute; + top: -8px; + width: 0; +} +.wpsdb .label-disabled { + color: #888; +} +.wpsdb .prefix-notice, .wpsdb .ssl-notice, .wpsdb .different-plugin-version-notice, .wpsdb .directory-permission-notice { + background-color: #FFFFE0; + border: 1px solid #E6DB55; + padding: 15px; + border-radius: 3px; + margin-bottom: 15px; + display: none; +} +.wpsdb .prefix-notice p, .wpsdb .ssl-notice p, .wpsdb .different-plugin-version-notice p, .wpsdb .directory-permission-notice p { + margin-top: 0px; +} +.wpsdb .prefix-notice p:last-child, .wpsdb .ssl-notice p:last-child, .wpsdb .different-plugin-version-notice p:last-child, .wpsdb .directory-permission-notice p:last-child { + margin: 0px; +} +.wpsdb .different-plugin-version-notice, .wpsdb .directory-permission-notice { + background-color: #FFEBE8; + border-color: #CC0000; +} +.wpsdb .different-plugin-version-notice a, .wpsdb .directory-permission-notice a { + color: #CC0000; + text-decoration: underline; +} +.wpsdb .save-migration-profile-wrap li label { + font-size: 12px; + font-weight: normal; +} +.wpsdb .save-migration-profile-wrap li { + margin-bottom: 5px; + padding-left: 25px; +} +.wpsdb .save-migration-profile-wrap .indent-wrap { + margin-left: 0px; +} +.wpsdb .create-new-label { + margin-right: 8px; +} +.wpsdb .create-new-profile { + position: absolute; + top: -5px; +} +.wpsdb .replace-remove-row, +.wpsdb .delete-profile { + background-color: #eee; + border: 1px solid #ccc; + border-radius: 50% 50% 50% 50%; + cursor: pointer; + height: 11px; + left: 5px; + margin-left: 2px; + position: absolute; + margin-top: -6px; + top: 50%; + width: 11px; + display: none; + background-position: 50% 50%; + background-size: 6px 6px; + background-repeat: no-repeat; +} +.wpsdb .replace-remove-row:after, +.wpsdb .delete-profile:after { + content: "\00d7"; + left: 2px; + position: absolute; + top: -3px; + color: #aaa; + font-size: 12px; +} +.wpsdb .replace-remove-row:after { + position: relative; +} +.wpsdb .replace-remove-row:hover, +.wpsdb .delete-profile:hover { + border-color: #aaa; +} +.wpsdb .migrate-db .ajax-success-msg { + font-weight: bold; + margin: 3px 0 0 9px; + display: inline-block; +} +.wpsdb p img.save-profile-ajax-spinner { + margin-left: 10px; +} +.wpsdb .backup-description { + left: 20px; + position: relative; +} +.wpsdb .backup-option-disabled { + margin-bottom: 0px !important; +} +.wpsdb .settings-tab { + display: none; +} +.wpsdb .settings-tab .slider { + max-width: 416px; +} +.wpsdb .settings-tab .slider-label { + display: block; + margin-bottom: 10px; + float: left; + width: 50%; +} +.wpsdb .settings-tab .slider-label-wrapper { + max-width: 416px; + width: 100%; + position: relative; +} +.wpsdb .settings-tab .amount { + width: 50%; + text-align: right; + display: block; + text-align: right; + float: left; +} +.wpsdb .settings-tab .slider-spinner { + position: absolute; + right: -35px; + bottom: -13px; +} +.wpsdb .settings-tab .slider-success-msg { + display: none; + right: -53px; + bottom: -13px; + position: absolute; + font-weight: bold; +} +.wpsdb .settings-tab .ui-slider { + border: 1px solid #dfdfdf; + height: 10px; + border-radius: 2px; + position: relative; +} +.wpsdb .settings-tab .ui-slider-handle { + width: 7px; + height: 20px; + background-color: #aaa; + display: block; + position: absolute; + top: -5px; + outline: none; +} +.wpsdb .settings-tab .ui-slider-handle:active { + background-color: #999; +} +.wpsdb .settings-tab .ui-slider-range { + background-color: #eee; + height: 100%; +} +.wpsdb .settings-tab .option-section li label { + font-size: 12px; + font-weight: normal; + position: relative; +} +.wpsdb .settings-tab .option-section li { + margin-bottom: 5px; +} +.wpsdb .settings-tab .option-section li:last-child { + margin-bottom: 0px; +} +.wpsdb .settings-tab .option-section .ajax-spinner { + right: -23px; + left: inherit; + top: 0px; + position: absolute; +} +.wpsdb .settings-tab .option-section .ajax-success-msg { + right: -42px; + left: inherit; + top: 0px; + position: absolute; + font-weight: bold; +} +.wpsdb .settings-tab .option-section .bubble .ajax-spinner { + right: -45px; +} +.wpsdb .settings-tab .option-section .bubble .ajax-success-msg { + right: -65px; +} +.wpsdb .allow-remote-reqeusts { + font-size: 14px; + font-weight: bold; +} +.wpsdb .connection-info-label { + margin-top: 15px; + margin-bottom: 5px; + display: block; +} +.wpsdb .connection-info { + clear: both; + font-size: 15px; + line-height: 21px; + font-family: Consolas, Monaco, monospace; + padding: 10px 10px; + height: 67px; + text-shadow: 0px 1px 0px #fff; + display: block; + margin-bottom: 7px; + width: 418px; +} +.wpsdb .reset-button-wrap { + width: 418px; +} +.wpsdb .reset-api-key { + float: left; +} +.wpsdb .reset-api-key-ajax-spinner { + float: left; + margin: 4px 7px; +} +.wpsdb .plugin-compatibility-wrap { + padding: 18px 18px 18px 24px; + background-color: #e6e6e6; + margin-left: 0; +} +.wpsdb .plugin-compatibility-wrap p:last-of-type { + margin-bottom: 0; +} +.wpsdb ul.plugin-compatibility-options { + display: block; + margin: 10px 0 10px 0px; +} +.wpsdb .plugin-compatibility-spinner { + position: relative; + top: 3px; + left: 10px; +} +.wpsdb .plugin-compatibility-success-msg { + position: relative; + left: 10px; + font-weight: bold; + display: none; +} +.wpsdb .help-tab { + display: none; +} +.wpsdb .help-tab h3 { + font-size: 18px; + font-weight: normal; +} +.wpsdb .help-tab .support { + border-bottom: 1px solid #ccc; + margin-bottom: 25px; + padding-bottom: 18px; +} +.wpsdb .help-tab .support p { + width: 640px; +} +.wpsdb .help-tab .support .email a { + font-size: 12px; +} +.wpsdb .help-tab .support .ajax-spinner { + top: 2px; +} +.wpsdb .help-tab .video-viewer { + margin-bottom: 30px; +} +.wpsdb .help-tab .videos { + width: 640px; +} +.wpsdb .help-tab .videos ul > li { + margin-bottom: 30px; + overflow: hidden; + position: relative; +} +.wpsdb .help-tab .videos ul > li a { + overflow: hidden; + display: block; + width: 320px; + height: 180px; + float: left; + margin-right: 15px; + position: relative; + z-index: 1; +} +.wpsdb .help-tab .videos ul > li a:before, .wpsdb .help-tab .videos ul > li a:after { + position: absolute; + content: " "; + margin: auto; + left: 0; + right: 0; + top: 0; + bottom: 0; +} +.wpsdb .help-tab .videos ul > li a:before { + width: 64px; + height: 64px; + -webkit-border-radius: 64px; + -moz-border-radius: 64px; + -ms-border-radius: 64px; + -o-border-radius: 64px; + border-radius: 64px; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80); + opacity: 0.8; + border: 1px solid #ddd; + background-color: #fff; + z-index: 2; +} +.wpsdb .help-tab .videos ul > li a:after { + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80); + opacity: 0.8; + border: 21.33333px solid transparent; + border-top-width: 12.8px; + border-bottom-width: 12.8px; + border-left-color: #333; + background: transparent; + display: block; + left: 25px; + width: 0px; + height: 0px; + z-index: 3; +} +.wpsdb .help-tab .videos .video:last-child { + margin-bottom: 0px; +} +.wpsdb .help-tab .videos img { + width: 320px; + height: 240px; + position: relative; + top: 50%; + margin-top: -120px; +} +.wpsdb .help-tab .debug { + width: 640px; + border-bottom: 1px solid #CCCCCC; + margin-bottom: 25px; + padding-bottom: 28px; +} +.wpsdb .help-tab .debug textarea { + width: 100%; + min-height: 200px; + font-family: Consolas, Monaco, monospace; + margin-bottom: 5px; +} +.wpsdb .help-tab h4 { + margin: 0 0 0.2em 0; +} +.wpsdb .help-tab p { + margin: 0 0 0.5em 0; +} +.wpsdb .help-tab iframe { + display: none; +} + +/* Progress Information */ +/* Contain floats: h5bp.com/q */ +.clearfix:before, .clearfix:after { + content: ""; + display: table; +} + +.clearfix:after { + clear: both; +} + +.clearfix { + zoom: 1; +} + +.general-spinner { + width: 16px; + height: 16px; +} + +.migration-error { + color: #A21B1B; + display: block; + font-weight: bold; + max-height: 400px; + max-width: 100%; + overflow: scroll; + word-wrap: break-word; +} + +.progress-content { + display: none; + position: relative; + margin: 0 auto; + background-color: #fff; + padding: 50px; + box-shadow: 0 0 10px #ccc; + cursor: default; + width: 80%; + z-index: 99999; + position: fixed; + left: 50%; + margin-left: -40%; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.progress-content .progress-bar { + height: 10px; + background-color: #8cc1e9; + margin-bottom: 5px; + background-image: -webkit-gradient(linear, 50% 100%, 50% 0%, color-stop(0%, #72a7cf), color-stop(100%, #8cc1e9)); + background-image: -webkit-linear-gradient(bottom, #72a7cf, #8cc1e9); + background-image: -moz-linear-gradient(bottom, #72a7cf, #8cc1e9); + background-image: -o-linear-gradient(bottom, #72a7cf, #8cc1e9); + background-image: linear-gradient(bottom, #72a7cf, #8cc1e9); +} +.progress-content .progress-title { + font-size: 18px; + font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", sans-serif; + font-weight: normal; + float: left; +} +.progress-content .progress-bar { + width: 0%; +} +.progress-content .progress-info-wrapper { + margin-bottom: 10px; +} +.progress-content .progress-text { + clear: left; + float: left; + width: 100%; +} +.progress-content .timer { + float: right; +} +.progress-content .progress-tables { + overflow: hidden; + margin-bottom: 2px; + padding: 0 0 20px 0; +} +.progress-content .progress-bar-wrapper { + position: relative; +} +.progress-content .progress-bar-wrapper:before { + content: ''; + display: block; + height: 5px; + width: 1px; + background-color: #ccc; + position: absolute; + top: 15px; + left: 0px; +} +.progress-content .progress-tables-hover-boxes { + position: absolute; + top: 0px; + left: 0px; + display: block; + width: 100%; +} +.progress-content .progress-chunk-hover { + display: block; + float: left; + height: 35px; + position: relative; + top: -5px; + z-index: 1; +} +.progress-content .progress-chunk { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; + float: left; + display: block; + height: 6px; + border-right: 1px solid #ccc; + border-bottom: 1px solid #ccc; + color: #999; + position: relative; + text-align: center; +} +.progress-content .progress-chunk > span { + padding: 0px 3px; + white-space: nowrap; + text-overflow: ellipsis; + margin-top: 10px; + display: inline-block; +} +.progress-content .progress-label { + padding: 5px 10px; + border: 1px solid #ccc; + border-radius: 3px; + background-color: #fff; + font-family: Consolas, Monaco, monospace; + font-size: 12px; + display: inline-block; + top: -35px; + position: absolute; + opacity: 0; + -webkit-transition: opacity 200ms ease-in-out; + -moz-transition: opacity 200ms ease-in-out; + -ms-transition: opacity 200ms ease-in-out; + -o-transition: opacity 200ms ease-in-out; + transition: opacity 200ms ease-in-out; +} +.progress-content .label-visible { + opacity: 1; +} +.progress-content .progress-label:before { + content: ""; + width: 0; + height: 0; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 4px solid #ccc; + display: block; + position: absolute; + bottom: -5px; + left: 50%; + margin-left: -2px; +} +.progress-content .progress-label:after { + content: ""; + width: 0; + height: 0; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 4px solid #fff; + display: block; + position: absolute; + bottom: -4px; + left: 50%; + margin-left: -2px; +} +.progress-content .migration-progress-ajax-spinner { + left: 7px; + position: relative; + top: 15px; +} +.progress-content .close-progress-content { + color: #999999; + cursor: pointer; + font-family: "Times New Roman",serif; + font-size: 26px; + font-weight: 200; + position: absolute; + right: 20px; + top: 20px; + padding: 5px; + display: none; +} +.progress-content .close-progress-content:hover { + color: #666; + border-color: #aaa; +} +.progress-content .migration-controls { + display: block; + margin-top: 45px; +} +.progress-content .migration-controls span { + float: left; + text-align: center; + display: block; +} +.progress-content .migration-controls span:first-child { + margin-right: 10px; + width: 71px; +} + +body.mp6 input[type=checkbox]:disabled { + opacity: 1; + border-color: #ccc; +} +body.mp6 #wpsdb-main { + margin-top: 15px; + font-size: 14px; +} +body.mp6 p { + font-size: 14px; +} +body.mp6 .wrap h2 { + float: left; +} +body.mp6 .wpsdb input[type=checkbox], +body.mp6 .wpsdb input[type=radio] { + vertical-align: middle; + margin-top: -4px; +} +body.mp6 .wpsdb input[type=text], +body.mp6 .wpsdb input[type=password] { + padding: 3px 5px; +} +body.mp6 .wpsdb input.code { + padding-top: 6px; +} +body.mp6 .wpsdb label { + font-size: 14px; +} +body.mp6 .wpsdb h2.nav-tab-wrapper { + float: none; + margin-bottom: 0; + width: 722px; +} +body.mp6 .wpsdb .help-tab h3 { + margin-top: 0; +} +body.mp6 .wpsdb .temp-disabled { + background-color: #f9f9f9; +} +body.mp6 .wpsdb .migration-profile-options li a { + border-color: #ccc; + color: #555; + background-color: #e4e4e4; +} +body.mp6 .wpsdb .migration-profile-options li a:hover { + background-color: #fff; + color: #464646; +} +body.mp6 .wpsdb .settings-tab .slider-label span { + vertical-align: middle; +} +body.mp6 .wpsdb .settings-tab .slider-label-wrapper { + font-size: 14px; +} +body.mp6 .wpsdb .settings-tab .ui-slider { + border-color: #ccc; + background-color: #fff; +} +body.mp6 .wpsdb .settings-tab .ui-slider-range { + background-color: #d8fcd1; +} +body.mp6 .wpsdb .settings-tab .option-section li label { + font-size: 14px; +} +body.mp6 .wpsdb .connection-info, +body.mp6 .wpsdb .migrate-tab .pull-push-connection-info { + font-weight: bold; + font-size: 14px; +} +body.mp6 .wpsdb .general-helper { + border: 0; + width: auto; + height: auto; + top: auto; + margin: 0; +} +body.mp6 .wpsdb .general-helper:after { + content: "\f223"; + display: inline-block; + -webkit-font-smoothing: antialiased; + font: normal 22px/1 'dashicons'; + vertical-align: top; + top: auto; + left: auto; + position: relative; +} +body.mp6 .wpsdb .helper-message { + font-size: 14px; + line-height: 1.4em; +} +body.mp6 .wpsdb .right-arrow { + display: none; +} +body.mp6 .wpsdb .arrow-col { + width: 75px; +} +body.mp6 .wpsdb .arrow-col:after { + content: "\f344"; + display: inline-block; + -webkit-font-smoothing: antialiased; + font: normal 22px/1 'dashicons'; + vertical-align: top; + color: #999; +} +body.mp6 .wpsdb .find-heading { + width: 409px; +} +body.mp6 .wpsdb .replace-fields input { + width: 304px; +} +body.mp6 .wpsdb .replace-right-col span { + border-color: #999; +} +body.mp6 .wpsdb .replace-right-col span:hover { + border-color: #666; +} +body.mp6 .wpsdb .replace-add-row:after, body.mp6 .wpsdb .replace-add-row:before { + background-color: #999; +} +body.mp6 .wpsdb .replace-add-row:hover:after, body.mp6 .wpsdb .replace-add-row:hover:before { + background-color: #666; +} +body.mp6 .wpsdb .option-group.migrate-selection > li > label { + font-size: 16px; +} +body.mp6 .wpsdb .saved-migration-profile-label { + font-size: 16px; +} +body.mp6 .wpsdb .option-heading, body.mp6 .wpsdb .checkbox-label { + font-size: 16px; +} +body.mp6 .wpsdb .checkbox-label input[type=checkbox] { + top: auto; +} +body.mp6 .wpsdb .return-to-profile-selection { + font-size: 14px; +} +body.mp6 .wpsdb .option-description { + font-size: 13px; +} +body.mp6 .wpsdb .save-migration-profile-wrap li { + position: relative; +} +body.mp6 .wpsdb .replace-remove-row, +body.mp6 .wpsdb .delete-profile { + border: 0; + border-radius: 0; + height: auto; + width: auto; + left: 0; + top: 50%; + margin-left: 0; +} +body.mp6 .wpsdb .replace-remove-row:after, +body.mp6 .wpsdb .delete-profile:after { + content: "\f153"; + display: inline-block; + -webkit-font-smoothing: antialiased; + font: normal 18px/1 'dashicons'; + vertical-align: middle; + color: #999; +} +body.mp6 .wpsdb .replace-remove-row:hover:after, +body.mp6 .wpsdb .delete-profile:hover:after { + color: #666; +} +body.mp6 .wpsdb .help-tab .support p, body.mp6 .wpsdb .help-tab .support .email a { + font-size: 14px; +} +body.mp6 .wpsdb .help-tab div.warning p { + font-size: 13px; +} +body.mp6 .wpsdb .help-tab .videos h4, body.mp6 .wpsdb .help-tab .videos p { + font-size: 14px; +} +body.mp6 .wpsdb .inline-message, body.mp6 .wpsdb .notification-message { + border-radius: 0; + border: 0; + box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); + padding: 10px 14px; + font-size: 13px; +} +body.mp6 .wpsdb .notification-message { + margin-bottom: 20px; + background-color: #fff; +} +body.mp6 .wpsdb .notification-message p { + font-size: 13px; + margin-top: 0; +} +body.mp6 .wpsdb .notification-message p:last-child { + margin: 0; +} +body.mp6 .wpsdb .notification-message h4 { + margin-top: 0; +} +body.mp6 .wpsdb .notification-message a { + color: #0074a2; + text-decoration: none; +} +body.mp6 .wpsdb .notification-message a:hover { + color: #2ea2cc; +} +body.mp6 .wpsdb .inline-message.error, body.mp6 .wpsdb .notification-message.error-notice { + border-left: 4px solid #dd3d36; + background-color: #fff; +} +body.mp6 .wpsdb .inline-message.warning, body.mp6 .wpsdb .notification-message.warning-notice { + background-color: #fff; + border-left: 4px solid #ffba00; +} +body.mp6 .wpsdb .inline-message.success, body.mp6 .wpsdb .notification-message.success-notice { + border-left: 4px solid #7ad03a; +} +body.mp6 .wpsdb .ssl-notice { + margin-bottom: 0; +} +body.mp6 .wpsdb .different-plugin-version-notice, body.mp6 .wpsdb .directory-permission-notice { + margin-bottom: 10px; +} +body.mp6 .progress-content { + font-size: 14px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.5); + background-color: #eee; +} +body.mp6 .progress-content .progress-title { + font-family: 'Open Sans', sans-serif; + font-weight: normal; + font-size: 22px; +} +body.mp6 .progress-content .dashicons-yes { + font-size: 42px; + line-height: 0.5em; +} +body.mp6 .progress-content .progress-bar { + background-image: none; + background-color: #0074a2; +} +body.mp6 #overlay { + background-color: rgba(0, 0, 0, 0.5); +} +body.mp6 .migration-progress-ajax-spinner { + top: 20px; +} diff --git a/www/wp-content/plugins/wp-sync-db/asset/js/common.js b/www/wp-content/plugins/wp-sync-db/asset/js/common.js new file mode 100755 index 0000000..5b14e41 --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db/asset/js/common.js @@ -0,0 +1,39 @@ +// global vars +var hooks = []; +var call_stack = []; +var non_fatal_errors = ''; +var migration_error = false; +var connection_data; +var next_step_in_migration; + +function wpsdb_call_next_hook() { + if (!call_stack.length) { + call_stack = hooks; + } + + var func = call_stack[0]; + call_stack.shift(); + window[func](); // Uses the string from the array to call the function of the same name +} + +function wpsdb_add_commas(number_string) { + number_string += ''; + x = number_string.split('.'); + x1 = x[0]; + x2 = x.length > 1 ? '.' + x[1] : ''; + var rgx = /(\d+)(\d{3})/; + while (rgx.test(x1)) { + x1 = x1.replace(rgx, '$1' + ',' + '$2'); + } + return x1 + x2; +} + +function wpsdb_parse_json(maybe_json) { + try { + var json_object = jQuery.parseJSON(maybe_json); + } catch (e) { + // we simply return false here because the json data itself will never just contain a value of "false" + return false; + } + return json_object; +} diff --git a/www/wp-content/plugins/wp-sync-db/asset/js/hook.js b/www/wp-content/plugins/wp-sync-db/asset/js/hook.js new file mode 100755 index 0000000..f5983e5 --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db/asset/js/hook.js @@ -0,0 +1,68 @@ +(function($) { + $.wpsdb = { + /** + * Implement a WordPress-link Hook System for Javascript + * TODO: Change 'tag' to 'args', allow number (priority), string (tag), + object (priority+tag) + */ + hooks: { + action: {}, + filter: {} + }, + add_action: function(action, callable, tag) { + jQuery.wpsdb.add_hook('action', action, callable, tag); + }, + add_filter: function(action, callable, tag) { + jQuery.wpsdb.add_hook('filter', action, callable, tag); + }, + do_action: function(action, args) { + jQuery.wpsdb.do_hook('action', action, null, args); + }, + apply_filters: function(action, value, args) { + return jQuery.wpsdb.do_hook('filter', action, value, args); + }, + remove_action: function(action, tag) { + jQuery.wpsdb.remove_hook('action', action, tag); + }, + remove_filter: function(action, tag) { + jQuery.wpsdb.remove_hook('filter', action, tag); + }, + add_hook: function(hook_type, action, callable, tag) { + if (undefined == jQuery.wpsdb.hooks[hook_type][action]) { + jQuery.wpsdb.hooks[hook_type][action] = []; + } + var hooks = jQuery.wpsdb.hooks[hook_type][action]; + if (undefined == tag) { + tag = action + '_' + hooks.length; + } + jQuery.wpsdb.hooks[hook_type][action].push({ + tag: tag, + callable: callable + }); + }, + do_hook: function(hook_type, action, value, args) { + if (undefined != jQuery.wpsdb.hooks[hook_type][action]) { + var hooks = jQuery.wpsdb.hooks[hook_type][action]; + for (var i = 0; i < hooks.length; i++) { + if ('action' == hook_type) { + hooks[i].callable(args); + } else { + value = hooks[i].callable(value, args); + } + } + } + if ('filter' == hook_type) { + return value; + } + }, + remove_hook: function(hook_type, action, tag) { + if (undefined != jQuery.wpsdb.hooks[hook_type][action]) { + var hooks = jQuery.wpsdb.hooks[hook_type][action]; + for (var i = hooks.length - 1; i >= 0; i--) { + if (undefined == tag || tag == hooks[i].tag) + hooks.splice(i, 1); + } + } + } + }; +})(jQuery); diff --git a/www/wp-content/plugins/wp-sync-db/asset/js/script.js b/www/wp-content/plugins/wp-sync-db/asset/js/script.js new file mode 100755 index 0000000..c6ab2fa --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db/asset/js/script.js @@ -0,0 +1,2317 @@ +// global functions +var migration_complete; +var migration_complete_events; +var migrate_table_recursive; +var execute_next_step; + +(function($) { + var connection_established = false; + var last_replace_switch = ''; + var doing_ajax = false; + var doing_reset_api_key_ajax = false; + var doing_save_profile = false; + var doing_plugin_compatibility_ajax = false; + var profile_name_edited = false; + var show_prefix_notice = false; + var show_ssl_notice = false; + var show_version_notice = false; + var migration_completed = false; + var currently_migrating = false; + var dump_filename = ''; + var dump_url = ''; + var migration_intent; + var remote_site; + var secret_key; + var form_data; + var stage; + var elapsed_interval; + var completed_msg; + var tables_to_migrate = ''; + var migration_paused = false; + var previous_progress_title; + var previous_progress_text; + var timer_count; + var overall_percent; + var migration_cancelled = false; + + var admin_url = ajaxurl.replace('/admin-ajax.php', ''), + spinner_url = admin_url + '/images/wpspin_light'; + + if (window.devicePixelRatio >= 2) { + spinner_url += '-2x'; + } + + spinner_url += '.gif'; + + window.onbeforeunload = function(e) { + if (currently_migrating) { + e = e || window.event; + + // For IE and Firefox prior to version 4 + if (e) { + e.returnValue = 'Sure?'; + } + + // For Safari + return 'Sure?'; + } + }; + + function pad(n, width, z) { + z = z || '0'; + n = n + ''; + return n.length >= width ? n : new Array(width - n.length + 1).join(z) + + n; + } + + function is_int(n) { + n = parseInt(n); + return typeof n === 'number' && n % 1 == 0; + } + + function setup_counter() { + timer_count = 0, + counter_display = $('.timer'), + label = wpsdb_i10n.time_elapsed + ' '; + + elapsed_interval = setInterval(count, 1000); + } + + function display_count() { + hours = Math.floor(timer_count / 3600) % 24; + minutes = Math.floor(timer_count / 60) % 60; + seconds = timer_count % 60; + var display = label + pad(hours, 2, 0) + ':' + pad(minutes, 2, 0) + ':' + + pad(seconds, 2, 0); + counter_display.html(display); + } + + function count() { + timer_count = timer_count + 1; + display_count(); + } + + function get_intersect(arr1, arr2) { + var r = [], + o = {}, l = arr2.length, + i, v; + for (i = 0; i < l; i++) { + o[arr2[i]] = true; + } + l = arr1.length; + for (i = 0; i < l; i++) { + v = arr1[i]; + if (v in o) { + r.push(v); + } + } + return r; + } + + function get_query_var(name) { + name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); + var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"), + results = regex.exec(location.search); + return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, + " ")); + } + + function maybe_show_ssl_warning(url, key, remote_scheme) { + var scheme = url.substr(0, url.indexOf(':')); + if (remote_scheme != scheme && url.indexOf('https') != -1) { + $('.ssl-notice').show(); + show_ssl_notice = true; + url = url.replace('https', 'http'); + $('.pull-push-connection-info').val(url + "\n" + key); + return; + } + show_ssl_notice = false; + return; + } + + function maybe_show_version_warning(plugin_version, url) { + if (typeof plugin_version != 'undefined' && plugin_version != + wpsdb_plugin_version) { + $('.different-plugin-version-notice').show(); + $('.remote-version').html(plugin_version); + $('.remote-location').html(url); + $('.step-two').hide(); + show_version_notice = true; + } + } + + function maybe_show_prefix_notice(prefix) { + if (prefix != wpsdb_this_prefix) { + $('.remote-prefix').html(prefix); + show_prefix_notice = true; + if ($('#pull').is(':checked')) { + $('.prefix-notice.pull').show(); + } else { + $('.prefix-notice.push').show(); + } + } + } + + function get_domain_name(url) { + var temp_url = url; + var domain = temp_url.replace(/\/\/(.*)@/, '//').replace('http://', '').replace( + 'https://', '').replace('www.', ''); + return domain; + } + + function get_default_profile_name(url, intent, ing_suffix) { + var domain = get_domain_name(url); + var action = intent; + action = action.charAt(0).toUpperCase() + action.slice(1); + if (ing_suffix) { + action += 'ing'; + } + var preposition = 'to'; + if (intent == 'pull') { + preposition = 'from'; + } + + return profile_name = action + ' ' + preposition + ' ' + domain; + } + + function remove_protocol(url) { + return url.replace(/^https?:/i, ""); + } + + $(document).ready(function() { + $('#plugin-compatibility').change(function(e) { + var install = '1'; + if ($(this).is(':checked')) { + // replace with l10n string when available + var answer = confirm( + 'If confirmed we will install an additional WordPress "Must Use" plugin. This plugin will allow us to control which plugins are loaded during WP Sync DB specific operations. Do you wish to continue?' + ); + + if (!answer) { + $(this).prop('checked', false); + return; + } + } else { + install = '0'; + } + + $('.plugin-compatibility-wrap').toggle(); + + $(this).parent().append(''); + $('#plugin-compatibility').attr('disabled', 'disabled'); + $('.plugin-compatibility').addClass('disabled'); + + $.ajax({ + url: ajaxurl, + type: 'POST', + dataType: 'text', + cache: false, + data: { + action: 'wpsdb_plugin_compatibility', + install: install, + }, + error: function(jqXHR, textStatus, errorThrown) { + // replace with l10n string when available + alert( + 'A problem occurred when trying to change the plugin compatibility setting.\r\n\r\nStatus: ' + + jqXHR.status + ' ' + jqXHR.statusText + + '\r\n\r\nResponse:\r\n' + jqXHR.responseText); + $('.ajax-spinner').remove(); + $('#plugin-compatibility').removeAttr('disabled'); + $('.plugin-compatibility').removeClass('disabled'); + }, + success: function(data) { + if ('' != $.trim(data)) { + alert(data); + } else { + $('.plugin-compatibility').append( + 'Saved'); + $('.ajax-success-msg').fadeOut(2000, function() { + $(this).remove(); + }); + } + $('.ajax-spinner').remove(); + $('#plugin-compatibility').removeAttr('disabled'); + $('.plugin-compatibility').removeClass('disabled'); + } + }); + + }); + + if ($('#plugin-compatibility').is(':checked')) { + $('.plugin-compatibility-wrap').show(); + } + + if (navigator.userAgent.indexOf('MSIE') > 0 || navigator.userAgent.indexOf( + 'Trident') > 0) { + $('.ie-warning').show(); + } + + $('.slider').slider({ + range: 'min', + value: wpsdb_max_request / 1024, + min: 512, + max: wpsdb_bottleneck / 1024, + step: 512, + slide: function(event, ui) { + $('.amount').html(wpsdb_add_commas(ui.value) + ' kB'); + }, + change: function(event, ui) { + $('.amount').after(''); + $('.slider').slider('disable'); + $.ajax({ + url: ajaxurl, + type: 'POST', + dataType: 'json', + cache: false, + data: { + action: 'wpsdb_update_max_request_size', + max_request_size: parseInt(ui.value), + nonce: wpsdb_nonces.update_max_request_size, + }, + error: function(jqXHR, textStatus, errorThrown) { + $('.slider').slider('enable'); + $('.slider-spinner').remove(); + alert(wpsdb_i10n.max_request_size_problem); + }, + success: function(data) { + $('.slider').slider('enable'); + $('.slider-spinner').remove(); + $('.slider-success-msg').show(); + $('.slider-success-msg').fadeOut(2000, function() { + $(this).hide(); + }); + } + }); + } + }); + $('.amount').html(wpsdb_add_commas($('.slider').slider('value')) + + ' kB'); + + var progress_content_original = $('.progress-content').clone(); + $('.progress-content').remove(); + + var push_select = $('#select-tables').clone(); + var pull_select = $('#select-tables').clone(); + var push_post_type_select = $('#select-post-types').clone(); + var pull_post_type_select = $('#select-post-types').clone(); + var push_select_backup = $('#select-backup').clone(); + var pull_select_backup = $('#select-backup').clone(); + + $('.help-tab .video').each(function() { + var $container = $(this), + $viewer = $('.video-viewer'); + + $('a', this).click(function(e) { + e.preventDefault(); + + $viewer.attr('src', '//www.youtube.com/embed/' + $container.data( + 'video-id') + '?autoplay=1'); + $viewer.show(); + var offset = $viewer.offset(); + $(window).scrollTop(offset.top - 50); + }); + }); + + $('.backup-options').show(); + $('.keep-active-plugins').show(); + if ($('#savefile').is(':checked')) { + $('.backup-options').hide(); + $('.keep-active-plugins').hide(); + } + + function disable_export_type_controls() { + $('.option-group').each(function(index) { + $('input', this).attr('disabled', 'disabled'); + $('label', this).css('cursor', 'default'); + }); + } + + function enable_export_type_controls() { + $('.option-group').each(function(index) { + $('input', this).removeAttr('disabled'); + $('label', this).css('cursor', 'pointer'); + }); + } + + // automatically validate connnection info if we're loading a saved profile + establish_remote_connection_from_saved_profile(); + + function establish_remote_connection_from_saved_profile() { + var action = $('input[name=action]:checked').val(); + var connection_info = $.trim($('.pull-push-connection-info').val()).split( + "\n"); + if (typeof wpsdb_default_profile == 'undefined' || + wpsdb_default_profile == true || action == 'savefile' || doing_ajax + ) { + return; + } + + last_replace_switch = action; + + doing_ajax = true; + disable_export_type_controls(); + + $('.connection-status').html(wpsdb_i10n.establishing_remote_connection); + $('.connection-status').removeClass( + 'notification-message error-notice migration-error'); + $('.connection-status').append(''); + + var intent = $('input[name=action]:checked').val(); + + $.ajax({ + url: ajaxurl, + type: 'POST', + dataType: 'json', + cache: false, + data: { + action: 'wpsdb_verify_connection_to_remote_site', + url: connection_info[0], + key: connection_info[1], + intent: intent, + nonce: wpsdb_nonces.verify_connection_to_remote_site, + convert_post_type_selection: wpsdb_convert_post_type_selection, + profile: wpsdb_profile + }, + error: function(jqXHR, textStatus, errorThrown) { + $('.connection-status').html(wpsdb_i10n.connection_local_server_problem + + ' (#102)'); + $('.connection-status').append('

    Status: ' + jqXHR.status + + ' ' + jqXHR.statusText + '

    Response:
    ' + + jqXHR.responseText); + $('.connection-status').addClass( + 'notification-message error-notice migration-error'); + $('.ajax-spinner').remove(); + doing_ajax = false; + enable_export_type_controls(); + }, + success: function(data) { + $('.ajax-spinner').remove(); + doing_ajax = false; + enable_export_type_controls(); + + if (typeof data.wpsdb_error != 'undefined' && data.wpsdb_error == + 1) { + $('.connection-status').html(data.body); + $('.connection-status').addClass( + 'notification-message error-notice migration-error'); + + if (data.body.indexOf('401 Unauthorized') > -1) { + $('.basic-access-auth-wrapper').show(); + } + return; + } + + maybe_show_ssl_warning(connection_info[0], connection_info[1], + data.scheme); + maybe_show_version_warning(data.plugin_version, connection_info[ + 0]); + maybe_show_prefix_notice(data.prefix); + + $('.pull-push-connection-info').addClass('temp-disabled'); + $('.pull-push-connection-info').attr('readonly', 'readonly'); + $('.connect-button').hide(); + + $('.connection-status').hide(); + $('.step-two').show(); + connection_established = true; + connection_data = data; + move_connection_info_box(); + + var loaded_tables = ''; + if (wpsdb_default_profile == false && typeof wpsdb_loaded_tables != + 'undefined') { + loaded_tables = wpsdb_loaded_tables; + } + + var table_select = document.createElement('select'); + $(table_select).attr({ + multiple: 'multiple', + name: 'select_tables[]', + id: 'select-tables', + class: 'multiselect' + }); + + $.each(connection_data.tables, function(index, value) { + var selected = $.inArray(value, loaded_tables); + if (selected != -1) { + selected = ' selected="selected" '; + } else { + selected = ' '; + } + $(table_select).append('' + value + ' (' + connection_data.table_sizes_hr[ + value] + ')'); + }); + + pull_select = table_select; + + var loaded_post_types = ''; + if (wpsdb_default_profile == false && typeof wpsdb_loaded_post_types != + 'undefined') { + if (typeof data.select_post_types != 'undefined') { + $('#exclude-post-types').attr('checked', 'checked'); + $('.post-type-select-wrap').show(); + loaded_post_types = data.select_post_types; + } else { + loaded_post_types = wpsdb_loaded_post_types; + } + } + + var post_type_select = document.createElement('select'); + $(post_type_select).attr({ + multiple: 'multiple', + name: 'select_post_types[]', + id: 'select-post-types', + class: 'multiselect' + }); + + $.each(connection_data.post_types, function(index, value) { + var selected = $.inArray(value, loaded_post_types); + if (selected != -1 || (wpsdb_convert_exclude_revisions == + true && value != 'revision')) { + selected = ' selected="selected" '; + } else { + selected = ' '; + } + $(post_type_select).append('' + value + ''); + }); + + pull_post_type_select = post_type_select; + + var loaded_tables_backup = ''; + if (wpsdb_default_profile == false && typeof wpsdb_loaded_tables_backup != + 'undefined') { + loaded_tables_backup = wpsdb_loaded_tables_backup; + } + + var table_select_backup = document.createElement('select'); + $(table_select_backup).attr({ + multiple: 'multiple', + name: 'select_backup[]', + id: 'select-backup', + class: 'multiselect' + }); + + $.each(connection_data.tables, function(index, value) { + var selected = $.inArray(value, loaded_tables_backup); + if (selected != -1) { + selected = ' selected="selected" '; + } else { + selected = ' '; + } + $(table_select_backup).append('' + value + ' (' + connection_data + .table_sizes_hr[value] + ')'); + }); + + push_select_backup = table_select_backup; + + if ($('#pull').is(':checked')) { + $('#select-tables').remove(); + $('.select-tables-wrap').prepend(pull_select); + $('#select-post-types').remove(); + $('.select-post-types-wrap').prepend(pull_post_type_select); + $('#select-backup').remove(); + $('.backup-tables-wrap').prepend(pull_select_backup); + $('.table-prefix').html(data.prefix); + $('.uploads-dir').html(wpsdb_this_uploads_dir); + } else { + $('#select-backup').remove(); + $('.backup-tables-wrap').prepend(push_select_backup); + } + + $.wpsdb.do_action('verify_connection_to_remote_site', + connection_data); + + } + + }); + + } + + // add to tags which act as JS event buttons, will not jump page to top + // and will deselect the button + $('.js-action-link').click(function(e) { + e.preventDefault(); + $(this).blur(); + }); + + // clears the debug log + $('.clear-log').click(function() { + $('.debug-log-textarea').val(''); + $.ajax({ + url: ajaxurl, + type: 'POST', + dataType: 'text', + cache: false, + data: { + action: 'wpsdb_clear_log', + nonce: wpsdb_nonces.clear_log, + }, + error: function(jqXHR, textStatus, errorThrown) { + alert(wpsdb_i10n.clear_log_problem); + }, + success: function(data) {} + }); + }); + + // updates the debug log when the user switches to the help tab + function refresh_debug_log() { + $.ajax({ + url: ajaxurl, + type: 'POST', + dataType: 'text', + cache: false, + data: { + action: 'wpsdb_get_log', + nonce: wpsdb_nonces.get_log, + }, + error: function(jqXHR, textStatus, errorThrown) { + alert(wpsdb_i10n.update_log_problem); + }, + success: function(data) { + $('.debug-log-textarea').val(data); + } + }); + } + + // select all tables + $('.multiselect-select-all').click(function() { + var multiselect = $(this).parents('.select-wrap').children( + '.multiselect'); + $(multiselect).focus(); + $('option', multiselect).attr('selected', 1); + }); + + // deselect all tables + $('.multiselect-deselect-all').click(function() { + var multiselect = $(this).parents('.select-wrap').children( + '.multiselect'); + $(multiselect).focus(); + $('option', multiselect).removeAttr('selected'); + }); + + // invert table selection + $('.multiselect-invert-selection').click(function() { + var multiselect = $(this).parents('.select-wrap').children( + '.multiselect'); + $(multiselect).focus(); + $('option', multiselect).each(function() { + $(this).attr('selected', !$(this).attr('selected')); + }); + }); + + // on option select hide all "advanced" option divs and show the correct div + // for the option selected + $('.option-group input[type=radio]').change(function() { + group = $(this).closest('.option-group'); + $('ul', group).hide(); + parent = $(this).closest('li'); + $('ul', parent).show(); + }); + + // on page load, expand hidden divs for selected options (browser form + // cache) + $('.option-group').each(function() { + $('.option-group input[type=radio]').each(function() { + if ($(this).is(':checked')) { + parent = $(this).closest('li'); + $('ul', parent).show(); + } + }); + }); + + // expand and collapse content on click + $('.header-expand-collapse').click(function() { + if ($('.expand-collapse-arrow', this).hasClass('collapsed')) { + $('.expand-collapse-arrow', this).removeClass('collapsed'); + $(this).next().show(); + } else { + $('.expand-collapse-arrow', this).addClass('collapsed'); + $(this).next().hide(); + } + }); + + $('.checkbox-label input[type=checkbox]').change(function() { + if ($(this).is(':checked')) { + $(this).parent().next().show(); + } else { + $(this).parent().next().hide(); + } + }); + + // special expand and collapse content on click for save migration profile + $('#save-migration-profile').change(function() { + if ($(this).is(':checked')) { + $('.save-settings-button').show(); + $('.migrate-db .button-primary').val(wpsdb_i10n.migrate_db_save); + } else { + $('.save-settings-button').hide(); + $('.migrate-db .button-primary').val(wpsdb_i10n.migrate_db); + } + }); + + if ($('#save-migration-profile').is(':checked')) { + $('.save-settings-button').show(); + $('.migrate-db .button-primary').val(wpsdb_i10n.migrate_db_save); + }; + + $('.checkbox-label input[type=checkbox]').each(function() { + if ($(this).is(':checked')) { + $(this).parent().next().show(); + } + }); + + $('#new-url').change(function() { + $('#new-url-missing-warning').hide(); + }); + + $('#new-path').change(function() { + $('#new-path-missing-warning').hide(); + }); + + // AJAX migrate button + $('.migrate-db-button').click(function(event) { + $(this).blur(); + event.preventDefault(); + + // check that they've selected some tables to migrate + if ($('#migrate-selected').is(':checked') && $('#select-tables').val() == + null) { + alert(wpsdb_i10n.please_select_one_table); + return; + } + + new_url_missing = false; + new_file_path_missing = false; + if ($('#new-url').length && !$('#new-url').val()) { + $('#new-url-missing-warning').show(); + $('#new-url').focus(); + $('html,body').scrollTop(0); + new_url_missing = true; + } + + if ($('#new-path').length && !$('#new-path').val()) { + $('#new-path-missing-warning').show(); + if (false == new_url_missing) { + $('#new-path').focus(); + $('html,body').scrollTop(0); + } + new_file_path_missing = true; + } + + if (true == new_url_missing || true == new_file_path_missing) return; + + // also save profile + if ($('#save-migration-profile').is(':checked')) { + + if ($.trim($('.create-new-profile').val()) == '' && $( + '#create_new').is(':checked')) { + alert(wpsdb_i10n.enter_name_for_profile); + $('.create-new-profile').focus(); + return; + } + + var create_new_profile = false; + + if ($('#create_new').is(':checked')) { + create_new_profile = true; + } + var profile_name = $('.create-new-profile').val(); + + profile = $('#migrate-form').serialize(); + + $.ajax({ + url: ajaxurl, + type: 'POST', + dataType: 'text', + cache: false, + data: { + action: 'wpsdb_save_profile', + profile: profile, + nonce: wpsdb_nonces.save_profile, + }, + error: function(jqXHR, textStatus, errorThrown) { + alert(wpsdb_i10n.save_profile_problem); + }, + success: function(data) { + if (create_new_profile) { + var new_profile_key = parseInt(data, 10); + var new_profile_id = new_profile_key + 1; + var new_li = + '
  • '; + $('#create_new').parents('li').before(new_li); + $('#profile-' + new_profile_id).attr('checked', 'checked'); + $('.create-new-profile').val(''); + } + } + }); + } + + form_data = $('#migrate-form').serialize(); + + var doc_height = $(document).height(); + + $('body').append('
    '); + + $('#overlay') + .height(doc_height) + .css({ + 'position': 'fixed', + 'top': 0, + 'left': 0, + 'width': '100%', + 'z-index': 99999, + 'display': 'none', + }); + + $progress_content = progress_content_original.clone(); + migration_intent = $('input[name=action]:checked').val(); + + stage = 'backup'; + + if (migration_intent == 'savefile') { + stage = 'migrate'; + } + + if ($('#create-backup').is(':checked') == false) { + stage = 'migrate'; + } + + var table_intent = $('input[name=table_migrate_option]:checked').val(); + var connection_info = $.trim($('.pull-push-connection-info').val()) + .split("\n"); + var table_rows = ''; + + remote_site = connection_info[0]; + secret_key = connection_info[1]; + + var static_migration_label = ''; + + $('#overlay').after($progress_content); + + completed_msg = wpsdb_i10n.exporting_complete; + + if (migration_intent == 'savefile') { + static_migration_label = wpsdb_i10n.exporting_please_wait; + } else { + static_migration_label = get_default_profile_name(remote_site, + migration_intent, true) + ', ' + wpsdb_i10n.please_wait; + completed_msg = get_default_profile_name(remote_site, + migration_intent, true) + ' ' + wpsdb_i10n.complete; + } + + $('.progress-title').html(static_migration_label); + + $('#overlay').show(); + backup_option = $('input[name=backup_option]:checked').val(); + table_option = $('input[name=table_migrate_option]:checked').val(); + + if (stage == 'backup') { + if (table_option == 'migrate_only_with_prefix' && backup_option == + 'backup_selected') { + backup_option = 'backup_only_with_prefix'; + } + if (migration_intent == 'push') { + table_rows = connection_data.table_rows; + if (backup_option == 'backup_only_with_prefix') { + tables_to_migrate = connection_data.prefixed_tables; + } else if (backup_option == 'backup_selected') { + selected_tables = $('#select-tables').val(); + tables_to_migrate = get_intersect(selected_tables, + connection_data.tables); + } else if (backup_option == 'backup_manual_select') { + tables_to_migrate = $('#select-backup').val(); + } + } else { + table_rows = wpsdb_this_table_rows; + if (backup_option == 'backup_only_with_prefix') { + tables_to_migrate = wpsdb_this_prefixed_tables; + } else if (backup_option == 'backup_selected') { + selected_tables = $('#select-tables').val(); + tables_to_migrate = get_intersect(selected_tables, + wpsdb_this_tables); + } else if (backup_option == 'backup_manual_select') { + tables_to_migrate = $('#select-backup').val(); + } + } + } else { + if (table_intent == 'migrate_select') { // user has elected to migrate only certain tables + // grab tables as per what the user has selected from the multiselect box + tables_to_migrate = $('#select-tables').val(); + // user is pushing or exporting + if (migration_intent == 'push' || migration_intent == + 'savefile') { + // default value, assuming we're not backing up + table_rows = wpsdb_this_table_rows; + } else { + table_rows = connection_data.table_rows; + } + } else { + if (migration_intent == 'push' || migration_intent == + 'savefile') { + tables_to_migrate = wpsdb_this_prefixed_tables; + table_rows = wpsdb_this_table_rows; + } else { + tables_to_migrate = connection_data.prefixed_tables; + table_rows = connection_data.table_rows; + } + } + } + + function decide_tables_to_display_rows(tables_to_migrate, + table_rows) { + + var total_size = 0; + $.each(tables_to_migrate, function(index, value) { + total_size += parseInt(table_rows[value]); + }); + + var last_element = ''; + $.each(tables_to_migrate, function(index, value) { + var percent = table_rows[value] / total_size * 100; + var percent_rounded = Math.round(percent * 1000) / 1000; + $('.progress-tables').append('
    ' + value + + '
    '); + $('.progress-tables-hover-boxes').append( + '
    '); + var label = $('.progress-tables .progress-chunk:last span'); + last_element = value; + }); + + $('.progress-chunk').each(function(index) { + if ($(this).width() < 1 && tables_to_migrate[index] != + last_element) { + $(this).hide(); + $('.progress-chunk-hover[data-table=' + tables_to_migrate[ + index] + ']').hide(); + table_rows[last_element] = Number(table_rows[last_element]); + table_rows[last_element] += Number(table_rows[ + tables_to_migrate[index]]); + table_rows[tables_to_migrate[index]] = 0; + } + var element = this; + setTimeout(function() { + hide_overflowing_elements(element); + }, 0); + + function hide_overflowing_elements(element) { + if ($('span', element).innerWidth() > $(element).width()) { + $('span', element).hide(); + } + } + }); + + percent_rounded = 0; + if (table_rows[last_element] != 0) { + var percent = table_rows[last_element] / total_size * 100; + var percent_rounded = Math.round(percent * 1000) / 1000; + } + $('.progress-tables .progress-chunk:last').css('width', + percent_rounded + '%'); + $('.progress-chunk-hover:last').css('width', percent_rounded + + '%'); + + var return_vals = [table_rows, total_size]; + return return_vals; + + } + + table_details = decide_tables_to_display_rows(tables_to_migrate, + table_rows); + table_rows = table_details[0]; + total_size = table_details[1]; + + $('.progress-title').after('' + ); + + var height = $('.progress-content').outerHeight(); + $('.progress-content').css('top', '-' + height + 'px').show().animate({ + 'top': '0px' + }); + + setup_counter(); + currently_migrating = true; + + $.ajax({ + url: ajaxurl, + type: 'POST', + dataType: 'json', + cache: false, + data: { + action: 'wpsdb_initiate_migration', + intent: migration_intent, + url: remote_site, + key: secret_key, + form_data: form_data, + stage: stage, + nonce: wpsdb_nonces.initiate_migration, + }, + error: function(jqXHR, textStatus, errorThrown) { + $('.progress-title').html('Migration failed'); + $('.progress-text').html(wpsdb_i10n.connection_local_server_problem + + ' (#112)'); + $('.progress-text').append('

    Status: ' + jqXHR.status + + ' ' + jqXHR.statusText + '

    Response:
    ' + + jqXHR.responseText); + $('.progress-text').addClass('migration-error'); + console.log(jqXHR); + console.log(textStatus); + console.log(errorThrown); + migration_error = true; + migration_complete_events(); + return; + }, + success: function(data) { + if (typeof data.wpsdb_error != 'undefined' && data.wpsdb_error == + 1) { + migration_error = true; + migration_complete_events(); + $('.progress-title').html(wpsdb_i10n.migration_failed); + $('.progress-text').addClass('migration-error'); + $('.progress-text').html(data.body); + return; + } + + dump_url = data.dump_url; + dump_filename = data.dump_filename; + + var i = 0; + var progress_size = 0; + overall_percent = 0; + var table_progress = 0; + var temp_progress = 0; + var last_progress = 0; + var overall_table_progress = 0; + + migrate_table_recursive = function(current_row, primary_keys) { + if (i >= tables_to_migrate.length) { + if (stage == 'backup') { + stage = 'migrate'; + i = 0; + progress_size = 0; + $('.progress-bar').width('0px'); + + if (table_intent == 'migrate_select') { + tables_to_migrate = $('#select-tables').val(); + if (migration_intent == 'push' || migration_intent == + 'savefile') { + table_rows = wpsdb_this_table_rows; + } else { + table_rows = connection_data.table_rows; + } + } else { + if (migration_intent == 'push' || migration_intent == + 'savefile') { + tables_to_migrate = wpsdb_this_prefixed_tables; + table_rows = wpsdb_this_table_rows; + } else { + tables_to_migrate = connection_data.prefixed_tables; + table_rows = connection_data.table_rows; + } + } + + $('.progress-tables').empty(); + $('.progress-tables-hover-boxes').empty(); + + table_details = decide_tables_to_display_rows( + tables_to_migrate, table_rows); + table_rows = table_details[0]; + total_size = table_details[1]; + } else { + hooks = $.wpsdb.apply_filters( + 'wpsdb_before_migration_complete_hooks', hooks); + hooks.push('migration_complete'); + hooks = $.wpsdb.apply_filters( + 'wpsdb_after_migration_complete_hooks', hooks); + hooks.push('migration_complete_events'); + next_step_in_migration = { + fn: wpsdb_call_next_hook + }; + execute_next_step(); + return; + } + } + + if (stage == 'backup') { + $('.progress-text').html(overall_percent + '% - ' + + wpsdb_i10n.backing_up + ' "' + tables_to_migrate[i] + + '"'); + } else { + $('.progress-text').html(overall_percent + '% - ' + + wpsdb_i10n.migrating + ' "' + tables_to_migrate[i] + + '"'); + } + + last_table = 0; + if (i == (tables_to_migrate.length - 1)) { + last_table = 1; + } + + gzip = 0; + if (migration_intent != 'savefile' && parseInt( + connection_data.gzip) == 1) { + gzip = 1; + } + + var request_data = { + action: 'wpsdb_migrate_table', + intent: migration_intent, + url: remote_site, + key: secret_key, + table: tables_to_migrate[i], + form_data: form_data, + stage: stage, + current_row: current_row, + dump_filename: dump_filename, + last_table: last_table, + primary_keys: primary_keys, + gzip: gzip, + nonce: wpsdb_nonces.migrate_table, + }; + + if (migration_intent != 'savefile') { + request_data.bottleneck = connection_data.bottleneck; + request_data.prefix = connection_data.prefix; + } + + if (connection_data && connection_data.path_current_site && + connection_data.domain) { + request_data.path_current_site = connection_data.path_current_site; + request_data.domain_current_site = connection_data.domain; + } + + doing_ajax = true; + + $.ajax({ + url: ajaxurl, + type: 'POST', + dataType: 'text', + cache: false, + timeout: 0, + data: request_data, + error: function(jqXHR, textStatus, errorThrown) { + $('.progress-title').html('Migration failed'); + $('.progress-text').html(wpsdb_i10n.table_process_problem + + ' ' + tables_to_migrate[i]); + $('.progress-text').append('

    ' + + wpsdb_i10n.status + ': ' + jqXHR.status + ' ' + + jqXHR.statusText + '

    ' + wpsdb_i10n.response + + ':
    ' + jqXHR.responseText); + $('.progress-text').addClass('migration-error'); + doing_ajax = false; + console.log(jqXHR); + console.log(textStatus); + console.log(errorThrown); + migration_error = true; + migration_complete_events(); + return; + }, + success: function(data) { + doing_ajax = false; + data = $.trim(data); + row_information = wpsdb_parse_json(data); + if (false == row_information || null == + row_information) { + $('.progress-title').html('Migration failed'); + if ('' == data || null == data) { + $('.progress-text').html(wpsdb_i10n.table_process_problem_empty_response + + ' ' + tables_to_migrate[i]); + } else { + $('.progress-text').html(data); + } + $('.progress-text').addClass('migration-error'); + migration_error = true; + migration_complete_events(); + return; + } + + if (typeof row_information.wpsdb_error != 'undefined' && + row_information.wpsdb_error == 1) { + $('.progress-title').html('Migration failed'); + $('.progress-text').addClass('migration-error'); + $('.progress-text').html(row_information.body); + migration_error = true; + migration_complete_events(); + return; + } + + if (row_information.current_row == '-1') { + progress_size -= overall_table_progress; + overall_table_progress = 0; + last_progress = 0; + progress_size += parseInt(table_rows[ + tables_to_migrate[i]]); + i++; + row_information.current_row = ''; + row_information.primary_keys = ''; + } else { + temp_progress = parseInt(row_information.current_row); + table_progress = temp_progress - last_progress; + last_progress = temp_progress; + progress_size += table_progress; + overall_table_progress += table_progress; + } + var percent = 100 * progress_size / total_size; + $('.progress-bar').width(percent + '%'); + overall_percent = Math.floor(percent); + next_step_in_migration = { + fn: migrate_table_recursive, + args: [row_information.current_row, row_information + .primary_keys + ] + }; + execute_next_step(); + } + }); + } + + next_step_in_migration = { + fn: migrate_table_recursive, + args: ['-1', ''] + }; + execute_next_step(); + } + }); // end ajax + }); + + migration_complete_events = function() { + if (false == migration_error) { + if (non_fatal_errors == '') { + if ('savefile' != migration_intent && true == $('#save_computer') + .is(':checked')) { + $('.progress-text').css('visibility', 'hidden'); + } + $('.progress-title').html(completed_msg).append( + '
    '); + } else { + $('.progress-text').html(non_fatal_errors); + $('.progress-text').addClass('migration-error'); + $('.progress-title').html(wpsdb_i10n.completed_with_some_errors); + } + $('.progress-bar-wrapper').hide(); + } + + $('.migration-controls').hide(); + + // reset migration variables so consecutive migrations work correctly + hooks = []; + call_stack = []; + migration_error = false; + currently_migrating = false; + migration_completed = true; + migration_paused = false; + migration_cancelled = false; + doing_ajax = false; + non_fatal_errors = ''; + + $('.progress-label').remove(); + $('.migration-progress-ajax-spinner').remove(); + $('.close-progress-content').show(); + $('#overlay').css('cursor', 'pointer'); + clearInterval(elapsed_interval); + }; + + migration_complete = function() { + $('.migration-controls').fadeOut(); + if (migration_intent == 'savefile') { + currently_migrating = false; + var migrate_complete_text = 'Migration complete'; + if ($('#save_computer').is(':checked')) { + var url = wpsdb_this_download_url + encodeURIComponent( + dump_filename); + if ($('#gzip_file').is(':checked')) { + url += '&gzip=1'; + } + window.location = url; + } else { + migrate_complete_text = wpsdb_i10n.completed_dump_located_at + + '
    ' + dump_url + '.'; + } + + if (migration_error == false) { + $('.progress-text').html(migrate_complete_text); + migration_complete_events(); + $('.progress-title').html(completed_msg); + } + + } else { // rename temp tables, delete old tables + $('.progress-text').html('Finalizing migration'); + $.ajax({ + url: ajaxurl, + type: 'POST', + dataType: 'text', + cache: false, + data: { + action: 'wpsdb_finalize_migration', + intent: migration_intent, + url: remote_site, + key: secret_key, + form_data: form_data, + prefix: connection_data.prefix, + temp_prefix: connection_data.temp_prefix, + tables: tables_to_migrate.join(','), + nonce: wpsdb_nonces.finalize_migration, + }, + error: function(jqXHR, textStatus, errorThrown) { + $('.progress-title').html(wpsdb_i10n.migration_failed); + $('.progress-text').html(wpsdb_i10n.finalize_tables_problem); + $('.progress-text').addClass('migration-error'); + alert(jqXHR + ' : ' + textStatus + ' : ' + errorThrown); + migration_error = true; + migration_complete_events(); + return; + }, + success: function(data) { + if ($.trim(data) != '') { + $('.progress-title').html(wpsdb_i10n.migration_failed); + $('.progress-text').html(data); + $('.progress-text').addClass('migration-error'); + migration_error = true; + migration_complete_events(); + return; + } + next_step_in_migration = { + fn: wpsdb_call_next_hook + }; + execute_next_step(); + } + }); + } + }; + + // close progress pop up once migration is completed + $('body').delegate('.close-progress-content-button', 'click', function( + e) { + hide_overlay(); + }); + + $('body').delegate('#overlay', 'click', function() { + if (migration_completed == true) { + hide_overlay(); + } + }); + + function hide_overlay() { + var height = $('.progress-content').outerHeight(); + $('.progress-content').animate({ + 'top': '-' + height + 'px' + }, 400, 'swing', function() { + $('#overlay').remove(); + $('.progress-content').remove(); + }); + migration_completed = false; + } + + // AJAX save button profile + $('.save-settings-button').click(function(event) { + var profile; + $(this).blur(); + event.preventDefault(); + + if (doing_save_profile) { + return; + } + + // check that they've selected some tables to migrate + if ($('#migrate-selected').is(':checked') && $('#select-tables').val() == + null) { + alert(wpsdb_i10n.please_select_one_table); + return; + } + + if ($.trim($('.create-new-profile').val()) == '' && $('#create_new') + .is(':checked')) { + alert(wpsdb_i10n.enter_name_for_profile); + $('.create-new-profile').focus(); + return; + } + + var create_new_profile = false; + + if ($('#create_new').is(':checked')) { + create_new_profile = true; + } + var profile_name = $('.create-new-profile').val(); + + doing_save_profile = true; + profile = $('#migrate-form').serialize(); + + $('.save-settings-button').after(''); + $(this).attr('disabled', 'disabled'); + + $.ajax({ + url: ajaxurl, + type: 'POST', + dataType: 'text', + cache: false, + data: { + action: 'wpsdb_save_profile', + profile: profile, + nonce: wpsdb_nonces.save_profile, + }, + error: function(jqXHR, textStatus, errorThrown) { + alert(wpsdb_i10n.save_profile_problem); + $('.save-settings-button').removeAttr('disabled'); + $('.save-profile-ajax-spinner').remove(); + $('.save-settings-button').after( + '' + wpsdb_i10n.saved + + ''); + $('.ajax-success-msg').fadeOut(2000, function() { + $(this).remove(); + }); + doing_save_profile = false; + }, + success: function(data) { + $('.save-settings-button').removeAttr('disabled'); + $('.save-profile-ajax-spinner').remove(); + $('.save-settings-button').after( + '' + wpsdb_i10n.saved + + ''); + $('.ajax-success-msg').fadeOut(2000, function() { + $(this).remove(); + }); + doing_save_profile = false; + $('.create-new-profile').val(''); + + if (create_new_profile) { + var new_profile_key = parseInt(data, 10); + var new_profile_id = new_profile_key + 1; + var new_li = + '
  • '; + $('#create_new').parents('li').before(new_li); + $('#profile-' + new_profile_id).attr('checked', 'checked'); + } + } + }); + }); + + // progress label updating + $('body').delegate('.progress-chunk-hover', 'mousemove', function(e) { + mX = e.pageX; + offset = $('.progress-bar-wrapper').offset(); + label_offset = $('.progress-label').outerWidth() / 2; + mX = (mX - offset.left) - label_offset; + $('.progress-label').css('left', mX + 'px'); + $('.progress-label').html($(this).attr('data-table')); + }); + + // show / hide progress lavel on hover + $('body').delegate('.progress-chunk-hover', 'hover', function(event) { + if (event.type === 'mouseenter') { + $('.progress-label').addClass('label-visible'); + } else { + $('.progress-label').removeClass('label-visible'); + } + }); + + // move around textarea depending on whether or not the push/pull options are selected + connection_info_box = $('.connection-info-wrapper'); + move_connection_info_box(); + + $('.migrate-selection.option-group input[type=radio]').change(function() { + move_connection_info_box(); + if (connection_established) { + change_replace_values(); + } + }); + + // save file (export) / push / pull special conditions + function move_connection_info_box() { + $('.connection-status').hide(); + $('.prefix-notice').hide(); + $('.ssl-notice').hide(); + $('.different-plugin-version-notice').hide(); + $('.step-two').show(); + $('.backup-options').show(); + $('.keep-active-plugins').show(); + $('.directory-permission-notice').hide(); + $('#create-backup').removeAttr('disabled'); + $('#create-backup-label').removeClass('disabled'); + $('.backup-option-disabled').hide(); + var connection_info = $.trim($('.pull-push-connection-info').val()).split( + "\n"); + if ($('#pull').is(':checked')) { + $('.pull-list li').append(connection_info_box); + connection_info_box.show(); + if (connection_established) { + $('.connection-status').hide(); + $('.step-two').show(); + $('.table-prefix').html(connection_data.prefix); + $('.uploads-dir').html(wpsdb_this_uploads_dir); + if (profile_name_edited == false) { + var profile_name = get_domain_name(connection_info[0]); + $('.create-new-profile').val(profile_name); + } + if (show_prefix_notice == true) { + $('.prefix-notice.pull').show(); + } + if (show_ssl_notice == true) { + $('.ssl-notice').show(); + } + if (show_version_notice == true) { + $('.different-plugin-version-notice').show(); + $('.step-two').hide(); + } + $('.directory-scope').html('local'); + if (false == wpsdb_write_permission) { + $('#create-backup').prop('checked', false); + $('#create-backup').attr('disabled', 'disabled'); + $('#create-backup-label').addClass('disabled'); + $('.backup-option-disabled').show(); + $('.upload-directory-location').html(wpsdb_this_upload_dir_long); + } + } else { + $('.connection-status').show(); + $('.step-two').hide(); + } + } else if ($('#push').is(':checked')) { + $('.push-list li').append(connection_info_box); + connection_info_box.show(); + if (connection_established) { + $('.connection-status').hide(); + $('.step-two').show(); + $('.table-prefix').html(wpsdb_this_prefix); + $('.uploads-dir').html(connection_data.uploads_dir); + if (profile_name_edited == false) { + var profile_name = get_domain_name(connection_info[0]); + $('.create-new-profile').val(profile_name); + } + if (show_prefix_notice == true) { + $('.prefix-notice.push').show(); + } + if (show_ssl_notice == true) { + $('.ssl-notice').show(); + } + if (show_version_notice == true) { + $('.different-plugin-version-notice').show(); + $('.step-two').hide(); + } + $('.directory-scope').html('remote'); + if ('0' == connection_data.write_permissions) { + $('#create-backup').prop('checked', false); + $('#create-backup').attr('disabled', 'disabled'); + $('#create-backup-label').addClass('disabled'); + $('.backup-option-disabled').show(); + $('.upload-directory-location').html(connection_data.upload_dir_long); + } + } else { + $('.connection-status').show(); + $('.step-two').hide(); + } + } else if ($('#savefile').is(':checked')) { + $('.connection-status').hide(); + $('.step-two').show(); + $('.table-prefix').html(wpsdb_this_prefix); + if (profile_name_edited == false) { + $('.create-new-profile').val(''); + } + $('.backup-options').hide(); + $('.keep-active-plugins').hide(); + if (false == wpsdb_write_permission) { + $('.directory-permission-notice').show(); + $('.step-two').hide(); + } + } + $.wpsdb.do_action('move_connection_info_box'); + } + + function change_replace_values() { + if ($('#push').is(':checked') || $('#savefile').is(':checked')) { + if (last_replace_switch == '' || last_replace_switch == 'pull') { + $('.replace-row').each(function() { + var old_val = $('.old-replace-col input', this).val(); + $('.old-replace-col input', this).val($( + '.replace-right-col input', this).val()); + $('.replace-right-col input', this).val(old_val); + }); + } + $('#select-tables').remove(); + $('.select-tables-wrap').prepend(push_select); + $('#select-post-types').remove(); + $('.select-post-types-wrap').prepend(push_post_type_select); + $('#select-backup').remove(); + $('.backup-tables-wrap').prepend(push_select_backup); + last_replace_switch = 'push'; + } else if ($('#pull').is(':checked')) { + if (last_replace_switch == '' || last_replace_switch == 'push') { + $('.replace-row').each(function() { + var old_val = $('.old-replace-col input', this).val(); + $('.old-replace-col input', this).val($( + '.replace-right-col input', this).val()); + $('.replace-right-col input', this).val(old_val); + }); + } + $('#select-tables').remove(); + $('.select-tables-wrap').prepend(pull_select); + $('#select-post-types').remove(); + $('.select-post-types-wrap').prepend(pull_post_type_select); + $('#select-backup').remove(); + $('.backup-tables-wrap').prepend(pull_select_backup); + last_replace_switch = 'pull'; + } + } + + // hide second section if pull or push is selected with no connection established + if (($('#pull').is(':checked') || $('#push').is(':checked')) && ! + connection_established) { + $('.step-two').hide(); + $('.connection-status').show(); + } + + // show / hide GUID helper description + $('.general-helper').click(function(e) { + var icon = $(this), + bubble = $(this).next(); + + // Close any that are already open + $('.helper-message').not(bubble).hide(); + + var position = icon.position(); + if (bubble.hasClass('bottom')) { + bubble.css({ + 'left': (position.left - bubble.width() / 2) + 'px', + 'top': (position.top + icon.height() + 9) + 'px' + }); + } else { + bubble.css({ + 'left': (position.left + icon.width() + 9) + 'px', + 'top': (position.top + icon.height() / 2 - 18) + 'px' + }); + } + + bubble.toggle(); + e.stopPropagation(); + }); + + $('body').click(function() { + $('.helper-message').hide(); + }); + + $('.helper-message').click(function(e) { + e.stopPropagation(); + }); + + // migrate / settings tabs + $('.nav-tab').click(function() { + $('.nav-tab').removeClass('nav-tab-active'); + $(this).addClass('nav-tab-active'); + $('.content-tab').hide(); + $('.' + $(this).attr('data-div-name')).show(); + + var hash = $(this).attr('data-div-name'); + hash = hash.replace('-tab', ''); + window.location.hash = hash; + + if ($(this).hasClass('help')) { + refresh_debug_log(); + } + }); + + // repeatable fields + $('body').delegate('.add-row', 'click', function() { + $(this).parents('tr').before($('.original-repeatable-field').clone() + .removeClass('original-repeatable-field')); + }); + + // repeatable fields + $('body').delegate('.replace-remove-row', 'click', function() { + $(this).parents('tr').remove(); + if ($('.replace-row').length < 2) { + $('.no-replaces-message').show(); + } + }); + + $('.add-replace').click(function() { + $('.replace-fields').prepend($('.original-repeatable-field').clone() + .removeClass('original-repeatable-field')); + $('.no-replaces-message').hide(); + }); + + $('body').delegate('#find-and-replace-sort tbody tr.replace-row', + 'hover', function(event) { + if (event.type === 'mouseenter') { + $('.replace-remove-row', this).show(); + } else { + $('.replace-remove-row', this).hide(); + } + }); + + $('#find-and-replace-sort tbody').sortable({ + items: '> tr:not(.pin)', + handle: 'td:first', + start: function() { + $('.sort-handle').css('cursor', '-webkit-grabbing'); + $('.sort-handle').css('cursor', '-moz-grabbing'); + }, + stop: function() { + $('.sort-handle').css('cursor', '-webkit-grab'); + $('.sort-handle').css('cursor', '-moz-grab'); + } + }); + + // delete saved profiles + $('body').delegate('.save-migration-profile-wrap li', 'hover', function( + event) { + if (event.type === 'mouseenter') { + $('.delete-profile', this).show(); + } else { + $('.delete-profile', this).hide(); + } + }); + + function validate_url(url) { + return /^([a-z]([a-z]|\d|\+|-|\.)*):(\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?((\[(|(v[\da-f]{1,}\.(([a-z]|\d|-|\.|_|~)|[!\$&'\(\)\*\+,;=]|:)+))\])|((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=])*)(:\d*)?)(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*|(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)|((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)){0})(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i + .test(url); + } + + // check for hash in url (settings || migrate) switch tabs accordingly + if (window.location.hash) { + var hash = window.location.hash.substring(1); + switch_to_plugin_tab(hash, false); + } + + if (get_query_var('install-plugin') != '') { + hash = 'addons'; + switch_to_plugin_tab(hash, true); + } + + function switch_to_plugin_tab(hash, skip_addons_check) { + $('.nav-tab').removeClass('nav-tab-active'); + $('.nav-tab.' + hash).addClass('nav-tab-active'); + $('.content-tab').hide(); + $('.' + hash + '-tab').show(); + + if (hash == 'help') { + refresh_debug_log(); + } + } + + // regenerates the saved secret key + $('.reset-api-key').click(function() { + var answer = confirm(wpsdb_i10n.reset_api_key); + + if (!answer || doing_reset_api_key_ajax) { + return; + } + + doing_reset_api_key_ajax = true; + $('.reset-api-key').after(''); + + $.ajax({ + url: ajaxurl, + type: 'POST', + dataType: 'text', + cache: false, + data: { + action: 'wpsdb_reset_api_key', + nonce: wpsdb_nonces.reset_api_key, + }, + error: function(jqXHR, textStatus, errorThrown) { + alert(wpsdb_i10n.reset_api_key_problem); + $('.reset-api-key-ajax-spinner').remove(); + doing_reset_api_key_ajax = false; + }, + success: function(data) { + $('.reset-api-key-ajax-spinner').remove(); + doing_reset_api_key_ajax = false; + $('.connection-info').html(data); + } + }); + + }); + + // show / hide table select box when specific settings change + $('input.multiselect-toggle').change(function() { + $(this).parents('.expandable-content').children('.select-wrap').toggle(); + }); + + $('.show-multiselect').each(function() { + if ($(this).is(':checked')) { + $(this).parents('.option-section').children( + '.header-expand-collapse').children('.expand-collapse-arrow').removeClass( + 'collapsed'); + $(this).parents('.expandable-content').show(); + $(this).parents('.expandable-content').children('.select-wrap').toggle(); + } + }); + + $('input[name=backup_option]').change(function() { + $('.backup-tables-wrap').hide(); + if ($(this).val() == 'backup_manual_select') { + $('.backup-tables-wrap').show(); + } + }); + + if ($('#backup-manual-select').is(':checked')) { + $('.backup-tables-wrap').show(); + } + + $('.plugin-compatibility-save').click(function() { + if (doing_plugin_compatibility_ajax) { + return; + } + $(this).addClass('disabled'); + select_element = $('#selected-plugins'); + $(select_element).attr('disabled', 'disabled'); + + doing_plugin_compatibility_ajax = true; + $(this).after('' + ); + + $.ajax({ + url: ajaxurl, + type: 'POST', + dataType: 'text', + cache: false, + data: { + action: 'wpsdb_blacklist_plugins', + blacklist_plugins: $(select_element).val(), + }, + error: function(jqXHR, textStatus, errorThrown) { + // replace with l10n string when available + alert( + 'A problem occurred when trying to add plugins to backlist.\r\n\r\nStatus: ' + + jqXHR.status + ' ' + jqXHR.statusText + + '\r\n\r\nResponse:\r\n' + jqXHR.responseText); + $(select_element).removeAttr('disabled'); + $('.plugin-compatibility-save').removeClass('disabled'); + doing_plugin_compatibility_ajax = false; + $('.plugin-compatibility-spinner').remove(); + $('.plugin-compatibility-success-msg').show().fadeOut(2000); + }, + success: function(data) { + if ('' != $.trim(data)) { + alert(data); + } + $(select_element).removeAttr('disabled'); + $('.plugin-compatibility-save').removeClass('disabled'); + doing_plugin_compatibility_ajax = false; + $('.plugin-compatibility-spinner').remove(); + $('.plugin-compatibility-success-msg').show().fadeOut(2000); + } + }); + }); + + // delete a profile from the migrate form area + $('body').delegate('.delete-profile', 'click', function() { + var name = $(this).next().clone(); + $('input', name).remove(); + var name = $.trim($(name).html()); + var answer = confirm(wpsdb_i10n.remove_profile + ' "' + name + '"'); + + if (!answer) { + return; + } + + $(this).parent().fadeOut(500); + + $.ajax({ + url: ajaxurl, + type: 'POST', + dataType: 'text', + cache: false, + data: { + action: 'wpsdb_delete_migration_profile', + profile_id: $(this).attr('data-profile-id'), + nonce: wpsdb_nonces.delete_migration_profile, + }, + error: function(jqXHR, textStatus, errorThrown) { + alert(wpsdb_i10n.remove_profile_problem); + }, + success: function(data) { + if (data == '-1') { + alert(wpsdb_i10n.remove_profile_not_found); + } + } + }); + + }); + + // deletes a profile from the main profile selection screen + $('.main-list-delete-profile-link').click(function() { + var name = $(this).prev().html(); + var answer = confirm(wpsdb_i10n.remove_profile + ' "' + name + '"'); + + if (!answer) { + return; + } + + $(this).parent().fadeOut(500); + + $.ajax({ + url: ajaxurl, + type: 'POST', + dataType: 'text', + cache: false, + data: { + action: 'wpsdb_delete_migration_profile', + profile_id: $(this).attr('data-profile-id'), + nonce: wpsdb_nonces.delete_migration_profile, + }, + error: function(jqXHR, textStatus, errorThrown) { + alert(wpsdb_i10n.remove_profile_problem); + } + }); + + }); + + // warn the user when editing the connection info after a connection has + // been established + $('body').delegate('.temp-disabled', 'click', function() { + var answer = confirm(wpsdb_i10n.change_connection_info); + + if (!answer) { + return; + } else { + $('.ssl-notice').hide(); + $('.different-plugin-version-notice').hide(); + $('.migrate-db-button').show(); + $('.temp-disabled').removeAttr('readonly'); + $('.temp-disabled').removeClass('temp-disabled'); + $('.connect-button').show(); + $('.step-two').hide(); + $('.connection-status').show().html(wpsdb_i10n.enter_connection_info); + connection_established = false; + } + }); + + // ajax request for settings page when checking/unchecking setting radio + // buttons + $('.settings-tab input[type=checkbox]').change(function() { + if ('plugin-compatibility' == $(this).attr('id')) return; + var checked = $(this).is(':checked'); + var setting = $(this).attr('id'); + + $(this).parent().append(''); + var $label = $(this).parent(); + + $.ajax({ + url: ajaxurl, + type: 'POST', + dataType: 'text', + cache: false, + data: { + action: 'wpsdb_save_setting', + checked: checked, + setting: setting, + nonce: wpsdb_nonces.save_setting, + }, + error: function(jqXHR, textStatus, errorThrown) { + alert(wpsdb_i10n.save_settings_problem); + $('.ajax-spinner').remove(); + }, + success: function(data) { + $('.ajax-spinner').remove(); + $($label).append('' + + wpsdb_i10n.saved + ''); + $('.ajax-success-msg').fadeOut(2000, function() { + $(this).remove(); + }); + } + }); + + }); + + // disable form submissions + $('.migrate-form').submit(function(e) { + e.preventDefault(); + }); + + // fire connection_box_changed when the connect button is pressed + $('.connect-button').click(function(event) { + event.preventDefault(); + $(this).blur(); + connection_box_changed(); + }); + + // send paste even to connection_box_changed() function + $('.pull-push-connection-info').bind('paste', function(e) { + var $this = this; + setTimeout(function() { + connection_box_changed(); + }, 0); + + }); + + $('body').delegate('.try-again', 'click', function() { + connection_box_changed(); + }); + + $('body').delegate('.try-http', 'click', function() { + var connection_info = $.trim($('.pull-push-connection-info').val()) + .split("\n"); + var new_url = connection_info[0].replace('https', 'http'); + var new_contents = new_url + "\n" + connection_info[1]; + $('.pull-push-connection-info').val(new_contents); + connection_box_changed(); + }); + + $('.create-new-profile').change(function() { + profile_name_edited = true; + }); + + $('body').delegate('.temporarily-disable-ssl', 'click', function() { + if (window.location.hash) { + var hash = window.location.hash.substring(1); + } + $(this).attr('href', $(this).attr('href') + '&hash=' + hash); + }); + + // fired when the connection info box changes (e.g. gets pasted into) + function connection_box_changed(data) { + var $this = $('.pull-push-connection-info'); + + if (doing_ajax || $($this).hasClass('temp-disabled')) { + return; + } + + var data = $('.pull-push-connection-info').val(); + + var connection_info = $.trim(data).split("\n"); + var error = false; + var error_message = ''; + + if (connection_info == '') { + error = true; + error_message = wpsdb_i10n.connection_info_missing; + } + + if (connection_info.length != 2 && !error) { + error = true; + error_message = wpsdb_i10n.connection_info_incorrect; + } + + if (!error && !validate_url(connection_info[0])) { + error = true; + error_message = wpsdb_i10n.connection_info_url_invalid; + } + + if (!error && connection_info[1].length != 32) { + error = true; + error_message = wpsdb_i10n.connection_info_key_invalid; + } + + if (!error && connection_info[0] == wpsdb_connection_info[0]) { + error = true; + error_message = wpsdb_i10n.connection_info_local_url; + } + + if (!error && connection_info[1] == wpsdb_connection_info[1]) { + error = true; + error_message = wpsdb_i10n.connection_info_local_key; + } + + if (error) { + $('.connection-status').html(error_message); + $('.connection-status').addClass( + 'notification-message error-notice migration-error'); + return; + } + + if (wpsdb_openssl_available == false) { + connection_info[0] = connection_info[0].replace('https://', + 'http://'); + var new_connection_info_contents = connection_info[0] + "\n" + + connection_info[1]; + $('.pull-push-connection-info').val(new_connection_info_contents); + } + + show_prefix_notice = false; + doing_ajax = true; + disable_export_type_controls(); + + if ($('.basic-access-auth-wrapper').is(':visible')) { + connection_info[0] = connection_info[0].replace(/\/\/(.*)@/, '//'); + connection_info[0] = connection_info[0].replace('//', '//' + + encodeURIComponent($.trim($('.auth-username').val())) + ':' + + encodeURIComponent($.trim($('.auth-password').val())) + '@'); + var new_connection_info_contents = connection_info[0] + "\n" + + connection_info[1]; + $('.pull-push-connection-info').val(new_connection_info_contents); + $('.basic-access-auth-wrapper').hide(); + } + + $('.step-two').hide(); + $('.ssl-notice').hide(); + $('.prefix-notice').hide(); + $('.connection-status').show(); + + $('.connection-status').html(wpsdb_i10n.establishing_remote_connection); + $('.connection-status').removeClass( + 'notification-message error-notice migration-error'); + $('.connection-status').append(''); + + var intent = $('input[name=action]:checked').val(); + + profile_name_edited = false; + + $.ajax({ + url: ajaxurl, + type: 'POST', + dataType: 'json', + cache: false, + data: { + action: 'wpsdb_verify_connection_to_remote_site', + url: connection_info[0], + key: connection_info[1], + intent: intent, + nonce: wpsdb_nonces.verify_connection_to_remote_site, + }, + error: function(jqXHR, textStatus, errorThrown) { + $('.connection-status').html(wpsdb_i10n.connection_local_server_problem + + ' (#100)'); + $('.connection-status').append('

    Status: ' + jqXHR.status + + ' ' + jqXHR.statusText + '

    Response:
    ' + + jqXHR.responseText); + $('.connection-status').addClass( + 'notification-message error-notice migration-error'); + $('.ajax-spinner').remove(); + doing_ajax = false; + enable_export_type_controls(); + }, + success: function(data) { + $('.ajax-spinner').remove(); + doing_ajax = false; + enable_export_type_controls(); + + if (typeof data.wpsdb_error != 'undefined' && data.wpsdb_error == + 1) { + $('.connection-status').html(data.body); + $('.connection-status').addClass( + 'notification-message error-notice migration-error'); + + if (data.body.indexOf('401 Unauthorized') > -1) { + $('.basic-access-auth-wrapper').show(); + } + return; + } + + var profile_name = get_domain_name(connection_info[0]); + $('.create-new-profile').val(profile_name); + + $('.pull-push-connection-info').addClass('temp-disabled'); + $('.pull-push-connection-info').attr('readonly', 'readonly'); + $('.connect-button').hide(); + + $('.connection-status').hide(); + $('.step-two').show(); + + maybe_show_ssl_warning(connection_info[0], connection_info[1], + data.scheme); + maybe_show_version_warning(data.plugin_version, connection_info[ + 0]); + maybe_show_prefix_notice(data.prefix); + + connection_established = true; + connection_data = data; + move_connection_info_box(); + + var table_select = document.createElement('select'); + $(table_select).attr({ + multiple: 'multiple', + name: 'select_tables[]', + id: 'select-tables', + class: 'multiselect' + }); + + $.each(connection_data.tables, function(index, value) { + $(table_select).append(''); + }); + + pull_select = table_select; + push_select_backup = $(table_select).clone(); + $(push_select_backup).attr({ + name: 'select_backup[]', + id: 'select-backup' + }); + + var post_type_select = document.createElement('select'); + $(post_type_select).attr({ + multiple: 'multiple', + name: 'select_post_types[]', + id: 'select-post-types', + class: 'multiselect' + }); + + $.each(connection_data.post_types, function(index, value) { + $(post_type_select).append(''); + }); + + pull_post_type_select = post_type_select; + + if ($('#pull').is(':checked')) { + $('#new-url').val(remove_protocol(wpsdb_this_url)); + $('#new-path').val(wpsdb_this_path); + if (wpsdb_is_multisite == true) { + $('#new-domain').val(wpsdb_this_domain); + } + $('#old-url').val(remove_protocol(data.url)); + $('#old-path').val(data.path); + $('#select-tables').remove(); + $('.select-tables-wrap').prepend(pull_select); + $('#select-post-types').remove(); + $('.select-post-types-wrap').prepend(pull_post_type_select); + $('.table-prefix').html(data.prefix); + $('.uploads-dir').html(wpsdb_this_uploads_dir); + } else { + $('#select-backup').remove(); + $('.backup-tables-wrap').prepend(push_select_backup); + $('#new-url').val(remove_protocol(data.url)); + $('#new-path').val(data.path); + } + + next_step_in_migration = { + fn: $.wpsdb.do_action, + args: ['verify_connection_to_remote_site', connection_data] + }; + execute_next_step(); + } + }); + } + + $('body').delegate('.pause-resume', 'click', function() { + if (true == migration_paused) { + migration_paused = false; + doing_ajax = true; + $('.progress-title').html(previous_progress_title); + $('.progress-text').html(previous_progress_text); + $('.migration-progress-ajax-spinner').show(); + $('.pause-resume').html(wpsdb_i10n.pause); + // resume the timer + elapsed_interval = setInterval(count, 1000); + execute_next_step(); + } else { + migration_paused = true; + doing_ajax = false; + previous_progress_title = $('.progress-title').html(); + previous_progress_text = $('.progress-text').html(); + $('.progress-title').html(wpsdb_i10n.migration_paused); + $('.pause-resume').html(wpsdb_i10n.resume); + $('.progress-text').html(wpsdb_i10n.completing_current_request); + } + }); + + $('body').delegate('.cancel', 'click', function() { + migration_cancelled = true; + migration_paused = false; + $('.progress-text').html(wpsdb_i10n.completing_current_request); + $('.progress-title').html(wpsdb_i10n.cancelling_migration); + $('.migration-controls').fadeOut(); + $('.migration-progress-ajax-spinner').show(); + + if (false == doing_ajax) { + execute_next_step(); + } + }); + + execute_next_step = function() { + if (true == migration_paused) { + $('.migration-progress-ajax-spinner').hide(); + // pause the timer + clearInterval(elapsed_interval); + $('.progress-text').html(wpsdb_i10n.paused); + return; + } else if (true == migration_cancelled) { + migration_intent = $('input[name=action]:checked').val(); + + if ('savefile' == migration_intent) { + progress_msg = wpsdb_i10n.removing_local_sql; + } else if ('pull' == migration_intent) { + if ('backup' == stage) { + progress_msg = wpsdb_i10n.removing_local_backup; + } else { + progress_msg = wpsdb_i10n.removing_local_temp_tables; + } + } else if ('push' == migration_intent) { + if ('backup' == stage) { + progress_msg = wpsdb_i10n.removing_remote_sql; + } else { + progress_msg = wpsdb_i10n.removing_remote_temp_tables; + } + } + $('.progress-text').html(progress_msg); + + var request_data = { + action: 'wpsdb_cancel_migration', + intent: migration_intent, + url: remote_site, + key: secret_key, + stage: stage, + dump_filename: dump_filename, + form_data: form_data, + }; + + if (typeof connection_data != 'undefined') { + request_data.temp_prefix = connection_data.temp_prefix; + } + + $.ajax({ + url: ajaxurl, + type: 'POST', + dataType: 'text', + cache: false, + data: request_data, + error: function(jqXHR, textStatus, errorThrown) { + $('.progress-title').html(wpsdb_i10n.migration_cancellation_failed); + $('.progress-text').html(wpsdb_i10n.manually_remove_temp_files); + $('.progress-text').append('

    Status: ' + jqXHR.status + + ' ' + jqXHR.statusText + '

    Response:
    ' + + jqXHR.responseText); + $('.progress-text').addClass('migration-error'); + console.log(jqXHR); + console.log(textStatus); + console.log(errorThrown); + migration_error = true; + migration_complete_events(); + return; + }, + success: function(data) { + doing_ajax = false; + data = $.trim(data); + if (data != '') { + $('.progress-title').html(wpsdb_i10n.migration_cancellation_failed); + $('.progress-text').html(data); + $('.progress-text').addClass('migration-error'); + migration_error = true; + migration_complete_events(); + return; + } + completed_msg = wpsdb_i10n.migration_cancelled; + $('.progress-text').hide(); + migration_complete_events(); + } + }); + } else { + next_step_in_migration.fn.apply(null, next_step_in_migration.args); + } + } + }); +})(jQuery); diff --git a/www/wp-content/plugins/wp-sync-db/class/wpsdb-addon.php b/www/wp-content/plugins/wp-sync-db/class/wpsdb-addon.php new file mode 100755 index 0000000..20a196c --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db/class/wpsdb-addon.php @@ -0,0 +1,63 @@ +=' ); + $this->version_required = $version_required; + if( false == $result ) $this->hook_version_requirement_actions(); + + if ( $result ) { + // If pre-1.1.2 version of Media Files addon, + // then it's not supported by this version of core + if ( empty( $this->plugin_version ) ) { + $result = false; + } + // Check that this version of core supports the addon version + else { + $plugin_basename = sprintf( '%1$s/%1$s.php', $this->plugin_slug ); + $required_addon_version = $this->addons[$plugin_basename]['required_version']; + $result = version_compare( $this->plugin_version, $required_addon_version, '>=' ); + } + } + + return $result; + } + + function hook_version_requirement_actions() { + add_action( 'wpsdb_notices', array( $this, 'version_requirement_actions' ) ); + } + + function version_requirement_actions() { + $addon_requirement_check = get_option( 'wpsdb_addon_requirement_check', array() ); + // we only want to delete the transients once, here we keep track of which versions we've checked + if( ! isset( $addon_requirement_check[$this->plugin_slug] ) || $addon_requirement_check[$this->plugin_slug] != $GLOBALS['wpsdb_meta'][$this->plugin_slug]['version'] ) { + delete_site_transient( 'wpsdb_upgrade_data' ); + delete_site_transient( 'update_plugins' ); + $addon_requirement_check[$this->plugin_slug] = $GLOBALS['wpsdb_meta'][$this->plugin_slug]['version']; + update_option( 'wpsdb_addon_requirement_check', $addon_requirement_check ); + } + $this->version_requirement_warning(); + } + + function version_requirement_warning() { ?> +
    + Update Required — + get_plugin_name(); + $required = $this->version_required; + $installed = $GLOBALS['wpsdb_meta']['wp-sync-db']['version']; + $wpsdb_basename = sprintf( '%s/%s.php', $GLOBALS['wpsdb_meta']['wp-sync-db']['folder'], 'wp-sync-db' ); + $update = wp_nonce_url( network_admin_url( 'update.php?action=upgrade-plugin&plugin=' . urlencode( $wpsdb_basename ) ), 'upgrade-plugin_' . $wpsdb_basename ); + printf( __( 'The version of %1$s you have installed, requires version %2$s of WP Sync DB. You currently have %3$s installed. Update Now', 'wp-sync-db' ), $addon_name, $required, $installed, $update ); + ?> +
    + settings = get_option( 'wpsdb_settings' ); + + $this->addons = array( + 'wp-sync-db-media-files/wp-sync-db-media-files.php' => array( + 'name' => 'Media Files', + 'required_version' => '1.1.4b1', + ), + 'wp-sync-db-cli/wp-sync-db-cli.php' => array( + 'name' => 'CLI', + 'required_version' => '1.0b1', + ) + ); + + $this->invalid_content_verification_error = __( 'Invalid content verification signature, please verify the connection information on the remote site and try again.', 'wp-sync-db' ); + + $this->transient_timeout = 60 * 60 * 12; + $this->transient_retry_timeout = 60 * 60 * 2; + + $this->plugin_file_path = $plugin_file_path; + $this->plugin_dir_path = plugin_dir_path( $plugin_file_path ); + $this->plugin_folder_name = basename( $this->plugin_dir_path ); + $this->plugin_basename = plugin_basename( $plugin_file_path ); + $this->template_dir = $this->plugin_dir_path . 'template' . DS; + $this->plugin_title = ucwords( str_ireplace( '-', ' ', basename( $plugin_file_path ) ) ); + $this->plugin_title = str_ireplace( array( 'db', 'wp', '.php' ), array( 'DB', 'WP', '' ), $this->plugin_title ); + + if ( is_multisite() ) { + $this->plugin_base = 'settings.php?page=wp-sync-db'; + } + else { + $this->plugin_base = 'tools.php?page=wp-sync-db'; + } + + // allow devs to change the temporary prefix applied to the tables + $this->temp_prefix = apply_filters( 'wpsdb_temporary_prefix', $this->temp_prefix ); + } + + function template( $template ) { + include $this->template_dir . $template . '.php'; + } + + function open_ssl_enabled() { + if ( defined( 'OPENSSL_VERSION_TEXT' ) ) { + return true; + } + else { + return false; + } + } + + function set_time_limit() { + if ( !function_exists( 'ini_get' ) || !ini_get( 'safe_mode' ) ) { + @set_time_limit( 0 ); + } + } + + function remote_post( $url, $data, $scope, $args = array(), $expecting_serial = false ) { + $this->set_time_limit(); + + if( function_exists( 'fsockopen' ) && strpos( $url, 'https://' ) === 0 && $scope == 'ajax_verify_connection_to_remote_site' ) { + $url_parts = parse_url( $url ); + $host = $url_parts['host']; + if( $pf = @fsockopen( $host, 443, $err, $err_string, 1 ) ) { + // worked + fclose( $pf ); + } + else { + // failed + $url = substr_replace( $url, 'http', 0, 5 ); + } + } + + $sslverify = ( $this->settings['verify_ssl'] == 1 ? true : false ); + + $default_remote_post_timeout = apply_filters( 'wpsdb_default_remote_post_timeout', 60 * 20 ); + + $args = wp_parse_args( $args, array( + 'timeout' => $default_remote_post_timeout, + 'blocking' => true, + 'sslverify' => $sslverify, + ) ); + + $args['method'] = 'POST'; + if( ! isset( $args['body'] ) ) { + $args['body'] = $this->array_to_multipart( $data ); + } + $args['headers']['Content-Type'] = 'multipart/form-data; boundary=' . $this->multipart_boundary; + $args['headers']['Referer'] = network_admin_url( 'admin-ajax.php' ); + + $this->attempting_to_connect_to = $url; + + $response = wp_remote_post( $url, $args ); + + if ( ! is_wp_error( $response ) ) { + $response['body'] = trim( $response['body'], "\xef\xbb\xbf" ); + } + + if ( is_wp_error( $response ) ) { + if( strpos( $url, 'https://' ) === 0 && $scope == 'ajax_verify_connection_to_remote_site' ) { + return $this->retry_remote_post( $url, $data, $scope, $args, $expecting_serial ); + } + else if( isset( $response->errors['http_request_failed'][0] ) && strstr( $response->errors['http_request_failed'][0], 'timed out' ) ) { + $this->error = sprintf( __( 'The connection to the remote server has timed out, no changes have been committed. (#134 - scope: %s)', 'wp-sync-db' ), $scope ); + } + else if ( isset( $response->errors['http_request_failed'][0] ) && ( strstr( $response->errors['http_request_failed'][0], 'Could not resolve host' ) || strstr( $response->errors['http_request_failed'][0], 'couldn\'t connect to host' ) ) ) { + $this->error = sprintf( __( 'We could not find: %s. Are you sure this is the correct URL?', 'wp-sync-db' ), $_POST['url'] ); + $url_bits = parse_url( $_POST['url'] ); + if( strstr( $_POST['url'], 'dev.' ) || strstr( $_POST['url'], '.dev' ) || ! strstr( $url_bits['host'], '.' ) ) { + $this->error .= '
    '; + if( $_POST['intent'] == 'pull' ) { + $this->error .= __( 'It appears that you might be trying to pull from a local environment. This will not work if this website happens to be located on a remote server, it would be impossible for this server to contact your local environment.', 'wp-sync-db' ); + } + else { + $this->error .= __( 'It appears that you might be trying to push to a local environment. This will not work if this website happens to be located on a remote server, it would be impossible for this server to contact your local environment.', 'wp-sync-db' ); + } + } + } + else { + $this->error = sprintf( __( 'The connection failed, an unexpected error occurred, please contact support. (#121 - scope: %s)', 'wp-sync-db' ), $scope ); + } + $this->log_error( $this->error, $response ); + return false; + } + elseif ( (int) $response['response']['code'] < 200 || (int) $response['response']['code'] > 399 ) { + if( strpos( $url, 'https://' ) === 0 && $scope == 'ajax_verify_connection_to_remote_site' ) { + return $this->retry_remote_post( $url, $data, $scope, $args, $expecting_serial ); + } + else if( $response['response']['code'] == '401' ) { + $this->error = __( 'The remote site is protected with Basic Authentication. Please enter the username and password above to continue. (401 Unauthorized)', 'wp-sync-db' ); + $this->log_error( $this->error, $response ); + return false; + } + else { + $this->error = sprintf( __( 'Unable to connect to the remote server, please check the connection details - %1$s %2$s (#129 - scope: %3$s)', 'wp-sync-db' ), $response['response']['code'], $response['response']['message'], $scope ); + $this->log_error( $this->error, $response ); + return false; + } + } + elseif ( $expecting_serial && is_serialized( $response['body'] ) == false ) { + if( strpos( $url, 'https://' ) === 0 && $scope == 'ajax_verify_connection_to_remote_site' ) { + return $this->retry_remote_post( $url, $data, $scope, $args, $expecting_serial ); + } + $this->error = __( 'There was a problem with the AJAX request, we were expecting a serialized response, instead we received:
    ', 'wp-sync-db' ) . htmlentities( $response['body'] ); + $this->log_error( $this->error, $response ); + return false; + } + elseif ( $response['body'] === '0' ) { + if( strpos( $url, 'https://' ) === 0 && $scope == 'ajax_verify_connection_to_remote_site' ) { + return $this->retry_remote_post( $url, $data, $scope, $args, $expecting_serial ); + } + $this->error = sprintf( __( 'WP Sync DB does not seem to be installed or active on the remote site. (#131 - scope: %s)', 'wp-sync-db' ), $scope ); + $this->log_error( $this->error, $response ); + return false; + } + elseif ( $expecting_serial && is_serialized( $response['body'] ) == true && $scope == 'ajax_verify_connection_to_remote_site' ) { + $unserialized_response = unserialize( $response['body'] ); + if ( isset( $unserialized_response['error'] ) && '1' == $unserialized_response['error'] && strpos( $url, 'https://' ) === 0 ) { + return $this->retry_remote_post( $url, $data, $scope, $args, $expecting_serial ); + } + } + + return $response['body']; + } + + function retry_remote_post( $url, $data, $scope, $args = array(), $expecting_serial = false ) { + $url = substr_replace( $url, 'http', 0, 5 ); + if( $response = $this->remote_post( $url, $data, $scope, $args, $expecting_serial ) ) { + return $response; + } + return false; + } + + function array_to_multipart( $data ) { + if ( !$data || !is_array( $data ) ) { + return $data; + } + + $result = ''; + + foreach ( $data as $key => $value ) { + $result .= '--' . $this->multipart_boundary . "\r\n" . + sprintf( 'Content-Disposition: form-data; name="%s"', $key ); + + if ( 'chunk' == $key ) { + if ( $data['chunk_gzipped'] ) { + $result .= "; filename=\"chunk.txt.gz\"\r\nContent-Type: application/x-gzip"; + } + else { + $result .= "; filename=\"chunk.txt\"\r\nContent-Type: text/plain;"; + } + } + else { + $result .= "\r\nContent-Type: text/plain; charset=" . get_option( 'blog_charset' ); + } + + $result .= "\r\n\r\n" . $value . "\r\n"; + } + + $result .= "--" . $this->multipart_boundary . "--\r\n"; + + return $result; + } + + function file_to_multipart( $file ) { + $result = ''; + + if( false == file_exists( $file ) ) return false; + + $filetype = wp_check_filetype( $file ); + $contents = file_get_contents( $file ); + + $result .= '--' . $this->multipart_boundary . "\r\n" . + sprintf( 'Content-Disposition: form-data; name="media[]"; filename="%s"', basename( $file ) ); + + $result .= sprintf( "\r\nContent-Type: %s", $filetype['type'] ); + + $result .= "\r\n\r\n" . $contents . "\r\n"; + + $result .= "--" . $this->multipart_boundary . "--\r\n"; + + return $result; + } + + function log_error( $wpsdb_error, $additional_error_var = false ){ + $error_header = "********************************************\n****** Log date: " . date( 'Y/m/d H:i:s' ) . " ******\n********************************************\n\n"; + $error = $error_header . "WPSDB Error: " . $wpsdb_error . "\n\n"; + if( ! empty( $this->attempting_to_connect_to ) ) { + $error .= "Attempted to connect to: " . $this->attempting_to_connect_to . "\n\n"; + } + if( $additional_error_var !== false ){ + $error .= print_r( $additional_error_var, true ) . "\n\n"; + } + $log = get_option( 'wpsdb_error_log' ); + if( $log ) { + $log = $log . $error; + } + else { + $log = $error; + } + update_option( 'wpsdb_error_log', $log ); + } + + function display_errors() { + if ( ! empty( $this->error ) ) { + echo $this->error; + $this->error = ''; + return true; + } + return false; + } + + function filter_post_elements( $post_array, $accepted_elements ) { + if ( isset( $post_array['form_data'] ) ) { + $post_array['form_data'] = stripslashes( $post_array['form_data'] ); + } + $accepted_elements[] = 'sig'; + return array_intersect_key( $post_array, array_flip( $accepted_elements ) ); + } + + function create_signature( $data, $key ) { + if ( isset( $data['sig'] ) ) { + unset( $data['sig'] ); + } + $flat_data = implode( '', $data ); + return base64_encode( hash_hmac( 'sha1', $flat_data, $key, true ) ); + } + + function verify_signature( $data, $key ) { + if( empty( $data['sig'] ) ) { + return false; + } + if ( isset( $data['nonce'] ) ) { + unset( $data['nonce'] ); + } + $temp = $data; + $computed_signature = $this->create_signature( $temp, $key ); + return $computed_signature === $data['sig']; + } + + function diverse_array( $vector ) { + $result = array(); + foreach( $vector as $key1 => $value1 ) + foreach( $value1 as $key2 => $value2 ) + $result[$key2][$key1] = $value2; + return $result; + } + + function set_time_limit_available() { + if ( ! function_exists( 'set_time_limit' ) || ! function_exists( 'ini_get' ) ) return false; + $current_max_execution_time = ini_get( 'max_execution_time' ); + $proposed_max_execution_time = ( $current_max_execution_time == 30 ) ? 31 : 30; + @set_time_limit( $proposed_max_execution_time ); + $current_max_execution_time = ini_get( 'max_execution_time' ); + return ( $proposed_max_execution_time == $current_max_execution_time ); + } + + function get_plugin_name( $plugin = false ) { + if ( !is_admin() ) return false; + + $plugin_basename = ( false !== $plugin ? $plugin : $this->plugin_basename ); + + $plugins = get_plugins(); + + if ( !isset( $plugins[$plugin_basename]['Name'] ) ) { + return false; + } + + return $plugins[$plugin_basename]['Name']; + } + + function get_class_props() { + return get_object_vars( $this ); + } + + // Get only the table beginning with our DB prefix or temporary prefix, also skip views + function get_tables( $scope = 'regular' ) { + global $wpdb; + $prefix = ( $scope == 'temp' ? $this->temp_prefix : $wpdb->prefix ); + $tables = $wpdb->get_results( 'SHOW FULL TABLES', ARRAY_N ); + foreach ( $tables as $table ) { + if ( ( ( $scope == 'temp' || $scope == 'prefix' ) && 0 !== strpos( $table[0], $prefix ) ) || $table[1] == 'VIEW' ) { + continue; + } + $clean_tables[] = $table[0]; + } + return apply_filters( 'wpsdb_tables', $clean_tables, $scope ); + } + + function plugins_dir() { + $path = untrailingslashit( $this->plugin_dir_path ); + return substr( $path, 0, strrpos( $path, DS ) ) . DS; + } + + function is_addon_outdated( $addon_basename ) { + $addon_slug = current( explode( '/', $addon_basename ) ); + // If pre-1.1.2 version of Media Files addon, then it is outdated + if ( ! isset( $GLOBALS['wpsdb_meta'][$addon_slug]['version'] ) ) return true; + $installed_version = $GLOBALS['wpsdb_meta'][$addon_slug]['version']; + $required_version = $this->addons[$addon_basename]['required_version']; + return version_compare( $installed_version, $required_version, '<' ); + } + + function get_plugin_file_path() { + return $this->plugin_file_path; + } + + function set_cli_migration() { + $this->doing_cli_migration = true; + } + + function end_ajax( $return = false ) { + if( defined( 'DOING_WPSDB_TESTS' ) || $this->doing_cli_migration ) { + return ( false === $return ) ? NULL : $return; + } + + echo ( false === $return ) ? '' : $return; + exit; + } + + function check_ajax_referer( $action ) { + if ( defined( 'DOING_WPSDB_TESTS' ) || $this->doing_cli_migration ) return; + $result = check_ajax_referer( $action, 'nonce', false ); + if ( false === $result ) { + $return = array( 'wpsdb_error' => 1, 'body' => sprintf( __( 'Invalid nonce for: %s', 'wp-sync-db' ), $action ) ); + $this->end_ajax( json_encode( $return ) ); + } + + $cap = ( is_multisite() ) ? 'manage_network_options' : 'export'; + $cap = apply_filters( 'wpsdb_ajax_cap', $cap ); + if ( !current_user_can( $cap ) ) { + $return = array( 'wpsdb_error' => 1, 'body' => sprintf( __( 'Access denied for: %s', 'wp-sync-db' ), $action ) ); + $this->end_ajax( json_encode( $return ) ); + } + } + +} diff --git a/www/wp-content/plugins/wp-sync-db/class/wpsdb.php b/www/wp-content/plugins/wp-sync-db/class/wpsdb.php new file mode 100755 index 0000000..7de84d2 --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db/class/wpsdb.php @@ -0,0 +1,2521 @@ +plugin_slug = 'wp-sync-db'; + $this->plugin_version = $GLOBALS['wpsdb_meta']['wp-sync-db']['version']; + + $this->max_insert_string_len = 50000; // 50000 is the default as defined by phphmyadmin + + $default_settings = array( + 'key' => $this->generate_key(), + 'allow_pull' => false, + 'allow_push' => false, + 'profiles' => array(), + 'verify_ssl' => false, + 'blacklist_plugins' => array(), + ); + + if( empty( $this->settings['max_request'] ) ) { + $this->settings['max_request'] = min( 1024 * 1024, $this->get_bottleneck( 'max' ) ); + update_option( 'wpsdb_settings', $this->settings ); + } + + // if no settings exist then this is a fresh install, set up some default settings + if ( empty( $this->settings ) ) { + $this->settings = $default_settings; + update_option( 'wpsdb_settings', $this->settings ); + } + // When we add a new setting, an existing customer's db won't have this + // new setting, so we need to add it. Otherwise, they'll see + // array index errors in debug mode + else { + $update_settings = false; + + foreach ( $default_settings as $key => $value ) { + if ( !isset( $this->settings[$key] ) ) { + $this->settings[$key] = $value; + $update_settings = true; + } + } + + if ( $update_settings ) { + update_option( 'wpsdb_settings', $this->settings ); + } + } + + add_filter( 'plugin_action_links_' . $this->plugin_basename, array( $this, 'plugin_action_links' ) ); + add_filter( 'network_admin_plugin_action_links_' . $this->plugin_basename, array( $this, 'plugin_action_links' ) ); + + // internal AJAX handlers + add_action( 'wp_ajax_wpsdb_verify_connection_to_remote_site', array( $this, 'ajax_verify_connection_to_remote_site' ) ); + add_action( 'wp_ajax_wpsdb_reset_api_key', array( $this, 'ajax_reset_api_key' ) ); + add_action( 'wp_ajax_wpsdb_delete_migration_profile', array( $this, 'ajax_delete_migration_profile' ) ); + add_action( 'wp_ajax_wpsdb_save_setting', array( $this, 'ajax_save_setting' ) ); + add_action( 'wp_ajax_wpsdb_save_profile', array( $this, 'ajax_save_profile' ) ); + add_action( 'wp_ajax_wpsdb_initiate_migration', array( $this, 'ajax_initiate_migration' ) ); + add_action( 'wp_ajax_wpsdb_migrate_table', array( $this, 'ajax_migrate_table' ) ); + add_action( 'wp_ajax_wpsdb_finalize_migration', array( $this, 'ajax_finalize_migration' ) ); + add_action( 'wp_ajax_wpsdb_clear_log', array( $this, 'ajax_clear_log' ) ); + add_action( 'wp_ajax_wpsdb_get_log', array( $this, 'ajax_get_log' ) ); + add_action( 'wp_ajax_wpsdb_fire_migration_complete', array( $this, 'fire_migration_complete' ) ); + add_action( 'wp_ajax_wpsdb_update_max_request_size', array( $this, 'ajax_update_max_request_size' ) ); + add_action( 'wp_ajax_wpsdb_plugin_compatibility', array( $this, 'ajax_plugin_compatibility' ) ); + add_action( 'wp_ajax_wpsdb_blacklist_plugins', array( $this, 'ajax_blacklist_plugins' ) ); + add_action( 'wp_ajax_wpsdb_cancel_migration', array( $this, 'ajax_cancel_migration' ) ); + + // external AJAX handlers + add_action( 'wp_ajax_nopriv_wpsdb_verify_connection_to_remote_site', array( $this, 'respond_to_verify_connection_to_remote_site' ) ); + add_action( 'wp_ajax_nopriv_wpsdb_remote_initiate_migration', array( $this, 'respond_to_remote_initiate_migration' ) ); + add_action( 'wp_ajax_nopriv_wpsdb_process_chunk', array( $this, 'ajax_process_chunk' ) ); + add_action( 'wp_ajax_nopriv_wpsdb_process_pull_request', array( $this, 'respond_to_process_pull_request' ) ); + add_action( 'wp_ajax_nopriv_wpsdb_fire_migration_complete', array( $this, 'fire_migration_complete' ) ); + add_action( 'wp_ajax_nopriv_wpsdb_backup_remote_table', array( $this, 'respond_to_backup_remote_table' ) ); + add_action( 'wp_ajax_nopriv_wpsdb_remote_finalize_migration', array( $this, 'respond_to_remote_finalize_migration' ) ); + add_action( 'wp_ajax_nopriv_wpsdb_process_push_migration_cancellation', array( $this, 'respond_to_process_push_migration_cancellation' ) ); + + // Clear update transients when the user clicks the "Check Again" button from the update screen + add_action( 'current_screen', array( $this, 'check_again_clear_transients' ) ); + + $absolute_path = rtrim( ABSPATH, '\\/' ); + $site_url = rtrim( site_url( '', 'http' ), '\\/' ); + $home_url = rtrim( home_url( '', 'http' ), '\\/' ); + if ( $site_url != $home_url ) { + $difference = str_replace( $home_url, '', $site_url ); + if( strpos( $absolute_path, $difference ) !== false ) { + $absolute_path = rtrim( substr( $absolute_path, 0, -strlen( $difference ) ), '\\/' ); + } + } + $this->absolute_root_file_path = $absolute_path; + + $this->accepted_fields = array( + 'action', + 'save_computer', + 'gzip_file', + 'connection_info', + 'replace_old', + 'replace_new', + 'table_migrate_option', + 'select_tables', + 'replace_guids', + 'exclude_spam', + 'save_migration_profile', + 'save_migration_profile_option', + 'create_new_profile', + 'create_backup', + 'remove_backup', + 'keep_active_plugins', + 'select_post_types', + 'backup_option', + 'select_backup', + 'exclude_transients', + 'exclude_post_types' + ); + + $this->default_profile = array( + 'action' => 'savefile', + 'save_computer' => '1', + 'gzip_file' => '1', + 'table_migrate_option' => 'migrate_only_with_prefix', + 'replace_guids' => '1', + 'default_profile' => true, + 'name' => '', + 'select_tables' => array(), + 'select_post_types' => array(), + 'backup_option' => 'backup_only_with_prefix', + 'exclude_transients' => '1', + ); + + $this->checkbox_options = array( + 'save_computer' => '0', + 'gzip_file' => '0', + 'replace_guids' => '0', + 'exclude_spam' => '0', + 'keep_active_plugins' => '0', + 'create_backup' => '0', + 'exclude_post_types' =>'0' + ); + + if ( is_multisite() ) { + add_action( 'network_admin_menu', array( $this, 'network_admin_menu' ) ); + } + else { + add_action( 'admin_menu', array( $this, 'admin_menu' ) ); + } + + add_filter( 'admin_body_class', array( $this, 'admin_body_class' ) ); + + // this is how many DB rows are processed at a time, allow devs to change this value + $this->rows_per_segment = apply_filters( 'wpsdb_rows_per_segment', $this->rows_per_segment ); + + if ( is_multisite() ) { + add_action( 'network_admin_menu', array( $this, 'network_admin_menu' ) ); + $this->plugin_base = 'settings.php?page=wp-sync-db'; + } + else { + add_action( 'admin_menu', array( $this, 'admin_menu' ) ); + $this->plugin_base = 'tools.php?page=wp-sync-db'; + } + } + + function ajax_blacklist_plugins() { + $this->settings['blacklist_plugins'] = $_POST['blacklist_plugins']; + update_option( 'wpsdb_settings', $this->settings ); + exit; + } + + function ajax_plugin_compatibility() { + $mu_dir = ( defined( 'WPMU_PLUGIN_DIR' ) && defined( 'WPMU_PLUGIN_URL' ) ) ? WPMU_PLUGIN_DIR : trailingslashit( WP_CONTENT_DIR ) . 'mu-plugins'; + $source = trailingslashit( $this->plugin_dir_path ) . 'compatibility/wp-sync-db-compatibility.php'; + $dest = trailingslashit( $mu_dir ) . 'wp-sync-db-compatibility.php'; + if ( '1' === trim( $_POST['install'] ) ) { // install MU plugin + if ( !wp_mkdir_p( $mu_dir ) ) { + _e( sprintf( 'The following directory could not be created: %s', $mu_dir ), 'wp-sync-db' ); + exit; + } + if ( !copy( $source, $dest ) ) { + _e( sprintf( 'Could not copy the compatibility plugin from %1$s to %2$s', $source, $destination ), 'wp-sync-db' ); + exit; + } + } else { // uninstall MU plugin + if ( file_exists( $dest ) && !unlink( $dest ) ) { + _e( sprintf( 'Could not remove the compatibility plugin from %s', $dest ), 'wp-sync-db' ); + exit; + } + } + exit; + } + + function check_again_clear_transients( $current_screen ) { + if( ! isset( $current_screen->id ) || strpos( $current_screen->id, 'update-core' ) === false || ! isset( $_GET['force-check'] ) ) return; + delete_site_transient( 'wpsdb_upgrade_data' ); + delete_site_transient( 'update_plugins' ); + } + + function get_alter_table_name() { + if ( ! is_null( $this->alter_table_name ) ) { + return $this->alter_table_name; + } + global $wpdb; + $this->alter_table_name = apply_filters( 'wpsdb_alter_table_name', $wpdb->prefix . 'wpsdb_alter_statements' ); + return $this->alter_table_name; + } + + function get_create_alter_table_query() { + if ( ! is_null( $this->create_alter_table_query ) ) { + return $this->create_alter_table_query; + } + $alter_table_name = $this->get_alter_table_name(); + $this->create_alter_table_query = sprintf( "DROP TABLE IF EXISTS `%s`;\n", $alter_table_name ); + $this->create_alter_table_query .= sprintf( "CREATE TABLE `%s` ( `query` longtext NOT NULL );\n", $alter_table_name ); + $this->create_alter_table_query = apply_filters( 'wpsdb_create_alter_table_query', $this->create_alter_table_query ); + return $this->create_alter_table_query; + } + + function get_short_uploads_dir() { + $short_path = str_replace( $this->absolute_root_file_path, '', $this->get_upload_info( 'path' ) ); + return trailingslashit( substr( str_replace( '\\', '/', $short_path ), 1 ) ); + } + + function get_upload_info( $type = 'path' ) { + // Let developers define their own path to for export files + // Note: We require a very specific data set here, it should be similiar to the following + // array( + // 'path' => '/path/to/custom/uploads/directory', <- note missing end trailing slash + // 'url' => 'http://yourwebsite.com/custom/uploads/directory' <- note missing end trailing slash + // ); + $upload_info = apply_filters( 'wpsdb_upload_info', array() ); + if ( !empty( $upload_info ) ) { + return $upload_info[$type]; + } + + $upload_dir = wp_upload_dir(); + + $upload_info['path'] = $upload_dir['basedir']; + $upload_info['url'] = $upload_dir['baseurl']; + + $upload_dir_name = apply_filters( 'wpsdb_upload_dir_name', 'wp-sync-db' ); + + if( ! file_exists( $upload_dir['basedir'] . DS . $upload_dir_name ) ) { + $url = wp_nonce_url( $this->plugin_base, 'wp-sync-db-nonce' ); + + if( false === @mkdir( $upload_dir['basedir'] . DS . $upload_dir_name, 0755 ) ) { + return $upload_info[$type]; + } + + $filename = $upload_dir['basedir'] . DS . $upload_dir_name . DS . 'index.php'; + if( false === @file_put_contents( $filename, "" ) ) { + return $upload_info[$type]; + } + } + + $upload_info['path'] .= DS . $upload_dir_name; + $upload_info['url'] .= '/' . $upload_dir_name; + + return $upload_info[$type]; + } + + function ajax_update_max_request_size() { + $this->check_ajax_referer( 'update-max-request-size' ); + $this->settings['max_request'] = (int) $_POST['max_request_size'] * 1024; + update_option( 'wpsdb_settings', $this->settings ); + $result = $this->end_ajax(); + return $result; + } + + function is_json( $string, $strict = false ) { + $json = @json_decode( $string, true ); + if( $strict == true && ! is_array( $json ) ) return false; + return ! ( $json == NULL || $json == false ); + } + + function get_sql_dump_info( $migration_type, $info_type ) { + if( empty( $this->session_salt ) ) { + $this->session_salt = strtolower( wp_generate_password( 5, false, false ) ); + } + $datetime = date('YmdHis'); + $ds = ( $info_type == 'path' ? DS : '/' ); + return sprintf( '%s%s%s-%s-%s-%s.sql', $this->get_upload_info( $info_type ), $ds, sanitize_title_with_dashes( DB_NAME ), $migration_type, $datetime, $this->session_salt ); + } + + function parse_migration_form_data( $data ) { + parse_str( $data, $form_data ); + $this->accepted_fields = apply_filters( 'wpsdb_accepted_profile_fields', $this->accepted_fields ); + $form_data = array_intersect_key( $form_data, array_flip( $this->accepted_fields ) ); + unset( $form_data['replace_old'][0] ); + unset( $form_data['replace_new'][0] ); + return $form_data; + } + + function plugin_action_links( $links ) { + $link = sprintf( '%s', network_admin_url( $this->plugin_base ), __( 'Settings', 'wp-sync-db' ) ); + array_unshift( $links, $link ); + return $links; + } + + function ajax_clear_log() { + $this->check_ajax_referer( 'clear-log' ); + delete_option( 'wpsdb_error_log' ); + $result = $this->end_ajax(); + return $result; + } + + function ajax_get_log() { + $this->check_ajax_referer( 'get-log' ); + ob_start(); + $this->output_diagnostic_info(); + $this->output_log_file(); + $return = ob_get_clean(); + $result = $this->end_ajax( $return ); + return $result; + } + + function output_log_file() { + $log = get_option( 'wpsdb_error_log' ); + if( $log ) { + echo $log; + } + } + + function output_diagnostic_info() { + global $table_prefix; + global $wpdb; + + echo 'site_url(): '; + echo site_url(); + echo "\r\n"; + + echo 'home_url(): '; + echo home_url(); + echo "\r\n"; + + echo 'Table Prefix: '; + echo $table_prefix; + echo "\r\n"; + + echo 'WordPress: '; + if ( is_multisite() ) echo 'WPMU'; else echo 'WP'; echo bloginfo('version'); + echo "\r\n"; + + echo 'Web Server: '; + echo $_SERVER['SERVER_SOFTWARE']; + echo "\r\n"; + + echo 'PHP: '; + if ( function_exists( 'phpversion' ) ) echo esc_html( phpversion() ); + echo "\r\n"; + + echo 'MySQL: '; + echo esc_html( empty( $wpdb->use_mysqli ) ? mysql_get_server_info() : mysqli_get_server_info( $wpdb->dbh ) ); + echo "\r\n"; + + _e( 'ext/mysqli', 'wp-app-store' ); echo ': '; + echo empty( $wpdb->use_mysqli ) ? 'no' : 'yes'; + echo "\r\n"; + + _e( 'WP Memory Limit', 'wp-app-store' ); echo ': '; + echo WP_MEMORY_LIMIT; + echo "\r\n"; + + echo 'WPSDB Bottleneck: '; + echo size_format( $this->get_bottleneck() ); + echo "\r\n"; + + if ( function_exists( 'ini_get' ) && $suhosin_limit = ini_get( 'suhosin.post.max_value_length' ) ) { + echo 'Suhosin Post Max Value Length: '; + echo is_numeric( $suhosin_limit ) ? size_format( $suhosin_limit ) : $suhosin_limit; + echo "\r\n"; + } + + if ( function_exists( 'ini_get' ) && $suhosin_limit = ini_get( 'suhosin.request.max_value_length' ) ) { + echo 'Suhosin Request Max Value Length: '; + echo is_numeric( $suhosin_limit ) ? size_format( $suhosin_limit ) : $suhosin_limit; + echo "\r\n"; + } + + echo 'Debug Mode: '; + if ( defined('WP_DEBUG') && WP_DEBUG ) { echo 'Yes'; } else { echo 'No'; } + echo "\r\n"; + + echo 'WP Max Upload Size: '; + echo size_format( wp_max_upload_size() ); + echo "\r\n"; + + echo 'PHP Post Max Size: '; + echo size_format( $this->get_post_max_size() ); + echo "\r\n"; + + echo 'PHP Time Limit: '; + if ( function_exists( 'ini_get' ) ) echo ini_get('max_execution_time'); + echo "\r\n"; + + echo 'PHP Error Log: '; + if ( function_exists( 'ini_get' ) ) echo ini_get('error_log'); + echo "\r\n"; + + echo 'fsockopen: '; + if ( function_exists( 'fsockopen' ) ) { + echo 'Enabled'; + } else { + echo 'Disabled'; + } + echo "\r\n"; + + echo 'OpenSSL: '; + if ( $this->open_ssl_enabled() ) { + echo OPENSSL_VERSION_TEXT; + + } else { + echo 'Disabled'; + } + echo "\r\n"; + + echo 'cURL: '; + if ( function_exists( 'curl_init' ) ) { + echo 'Enabled'; + } else { + echo 'Disabled'; + } + echo "\r\n"; + echo "\r\n"; + + echo "Active Plugins:\r\n"; + + $active_plugins = (array) get_option( 'active_plugins', array() ); + + if ( is_multisite() ) { + $network_active_plugins = wp_get_active_network_plugins(); + $active_plugins = array_map( array( $this, 'remove_wp_plugin_dir' ), $network_active_plugins ); + } + + foreach ( $active_plugins as $plugin ) { + $plugin_data = @get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ); + if ( empty( $plugin_data['Name'] ) ) continue; + printf( "%s (v%s) by %s\r\n", $plugin_data['Name'], $plugin_data['Version'], $plugin_data['AuthorName'] ); + } + + echo "\r\n"; + } + + function remove_wp_plugin_dir( $name ) { + $plugin = str_replace( WP_PLUGIN_DIR, '', $name ); + return substr( $plugin, 1 ); + } + + function fire_migration_complete() { + $filtered_post = $this->filter_post_elements( $_POST, array( 'action', 'url' ) ); + if ( ! $this->verify_signature( $filtered_post, $this->settings['key'] ) ) { + $error_msg = $this->invalid_content_verification_error . ' (#138)'; + $this->log_error( $error_msg, $filtered_post ); + $result = $this->end_ajax( $error_msg ); + return $result; + } + + do_action( 'wpsdb_migration_complete', 'pull', $_POST['url'] ); + $result = $this->end_ajax(); + return $result; + } + + function get_alter_queries() { + global $wpdb; + $alter_table_name = $this->get_alter_table_name(); + $sql = ''; + $alter_queries = $wpdb->get_results( "SELECT * FROM `{$alter_table_name}`", ARRAY_A ); + if( ! empty( $alter_queries ) ) { + foreach( $alter_queries as $alter_query ) { + $sql .= $alter_query['query']; + } + } + return $sql; + } + + // After table migration, delete old tables and rename new tables removing the temporarily prefix + function ajax_finalize_migration() { + $this->check_ajax_referer( 'finalize-migration' ); + global $wpdb; + $return = ''; + if ( $_POST['intent'] == 'pull' ) { + $return = $this->finalize_migration(); + } + else { + do_action( 'wpsdb_migration_complete', 'push', $_POST['url'] ); + $data = $_POST; + if ( isset( $data['nonce'] ) ) { + unset( $data['nonce'] ); + } + $data['action'] = 'wpsdb_remote_finalize_migration'; + $data['intent'] = 'pull'; + $data['prefix'] = $wpdb->prefix; + $data['type'] = 'push'; + $data['location'] = home_url(); + $data['temp_prefix'] = $this->temp_prefix; + $data['sig'] = $this->create_signature( $data, $data['key'] ); + $ajax_url = trailingslashit( $_POST['url'] ) . 'wp-admin/admin-ajax.php'; + $response = $this->remote_post( $ajax_url, $data, __FUNCTION__ ); + ob_start(); + echo $response; + $this->display_errors(); + $return = ob_get_clean(); + } + $result = $this->end_ajax( $return ); + return $result; + } + + function respond_to_remote_finalize_migration() { + $filtered_post = $this->filter_post_elements( $_POST, array( 'action', 'intent', 'url', 'key', 'form_data', 'prefix', 'type', 'location', 'tables', 'temp_prefix' ) ); + if ( ! $this->verify_signature( $filtered_post, $this->settings['key'] ) ) { + $error_msg = $this->invalid_content_verification_error . ' (#123)'; + $this->log_error( $error_msg, $filtered_post ); + $result = $this->end_ajax( $error_msg ); + return $result; + } + $return = $this->finalize_migration(); + $result = $this->end_ajax( $return ); + return $result; + } + + function finalize_migration() { + global $wpdb; + + $tables = explode( ',', $_POST['tables'] ); + $temp_tables = array(); + foreach( $tables as $table ) { + $temp_prefix = stripslashes( $_POST['temp_prefix'] ); + $temp_tables[] = $temp_prefix . $table; + } + + $sql = "SET FOREIGN_KEY_CHECKS=0;\n"; + + $preserved_options = array( 'wpsdb_settings', 'wpsdb_error_log' ); + + $this->form_data = $this->parse_migration_form_data( $_POST['form_data'] ); + if( isset( $this->form_data['keep_active_plugins'] ) ) { + $preserved_options[] = 'active_plugins'; + } + + $preserved_options = apply_filters( 'wpsdb_preserved_options', $preserved_options ); + + foreach ( $temp_tables as $table ) { + $sql .= 'DROP TABLE IF EXISTS ' . $this->backquote( substr( $table, strlen( $temp_prefix ) ) ) . ';'; + $sql .= "\n"; + $sql .= 'RENAME TABLE ' . $this->backquote( $table ) . ' TO ' . $this->backquote( substr( $table, strlen( $temp_prefix ) ) ) . ';'; + $sql .= "\n"; + } + + $preserved_options_data = $wpdb->get_results( sprintf( "SELECT * FROM %soptions WHERE `option_name` IN ('%s')", $wpdb->prefix, implode( "','", $preserved_options ) ), ARRAY_A ); + + foreach( $preserved_options_data as $option ) { + $sql .= $wpdb->prepare( "DELETE FROM `{$_POST['prefix']}options` WHERE `option_name` = %s;\n", $option['option_name'] ); + $sql .= $wpdb->prepare( "INSERT INTO `{$_POST['prefix']}options` ( `option_id`, `option_name`, `option_value`, `autoload` ) VALUES ( NULL , %s, %s, %s );\n", $option['option_name'], $option['option_value'], $option['autoload'] ); + } + + $alter_table_name = $this->get_alter_table_name(); + $sql .= $this->get_alter_queries(); + $sql .= "DROP TABLE IF EXISTS " . $this->backquote( $alter_table_name ) . ";\n"; + + $process_chunk_result = $this->process_chunk( $sql ); + if( true !== $process_chunk_result ) { + $result = $this->end_ajax( $process_chunk_result ); + return $result; + } + + $type = ( isset( $_POST['type'] ) ? 'push' : 'pull' ); + $location = ( isset( $_POST['location'] ) ? $_POST['location'] : $_POST['url'] ); + + if( ! isset( $_POST['location'] ) ) { + $data = array(); + $data['action'] = 'wpsdb_fire_migration_complete'; + $data['url'] = home_url(); + $data['sig'] = $this->create_signature( $data, $_POST['key'] ); + $ajax_url = trailingslashit( $_POST['url'] ) . 'wp-admin/admin-ajax.php'; + $response = $this->remote_post( $ajax_url, $data, __FUNCTION__ ); + ob_start(); + echo $response; + $this->display_errors(); + $maybe_errors = trim( ob_get_clean() ); + if( false === empty( $maybe_errors ) ) { + $result = $this->end_ajax( $maybe_errors ); + return $result; + } + } + + // flush rewrite rules to prevent 404s and other oddities + flush_rewrite_rules( true ); // true = hard refresh, recreates the .htaccess file + + do_action( 'wpsdb_migration_complete', $type, $location ); + } + + function ajax_process_chunk() { + $filtered_post = $this->filter_post_elements( $_POST, array( 'action', 'table', 'chunk_gzipped' ) ); + $gzip = ( isset( $_POST['chunk_gzipped'] ) && $_POST['chunk_gzipped'] ); + + $tmp_file_name = 'chunk.txt'; + if( $gzip ) { + $tmp_file_name .= '.gz'; + } + + $tmp_file_path = wp_tempnam( $tmp_file_name ); + if ( !isset( $_FILES['chunk']['tmp_name'] ) || !move_uploaded_file( $_FILES['chunk']['tmp_name'], $tmp_file_path ) ) { + $result = $this->end_ajax( __( 'Could not upload the SQL to the server. (#135)', 'wp-sync-db' ) ); + return $result; + } + + if ( false === ( $chunk = file_get_contents( $tmp_file_path ) ) ) { + $result = $this->end_ajax( __( 'Could not read the SQL file we uploaded to the server. (#136)', 'wp-sync-db' ) ); + return $result; + } + + @unlink( $tmp_file_path ); + + $filtered_post['chunk'] = $chunk; + + if ( !$this->verify_signature( $filtered_post, $this->settings['key'] ) ) { + $error_msg = $this->invalid_content_verification_error . ' (#130)'; + $this->log_error( $error_msg, $filtered_post ); + $result = $this->end_ajax( $error_msg ); + return $result; + } + + if ( $this->settings['allow_push'] != true ) { + $result = $this->end_ajax( __( 'The connection succeeded but the remote site is configured to reject push connections. You can change this in the "settings" tab on the remote site. (#133)', 'wp-sync-db' ) ); + return $result; + } + + if( $gzip ) { + $filtered_post['chunk'] = gzuncompress( $filtered_post['chunk'] ); + } + + $process_chunk_result = $this->process_chunk( $filtered_post['chunk'] ); + $result = $this->end_ajax( $process_chunk_result ); + return $result; + } + + function process_chunk( $chunk ) { + // prepare db + global $wpdb; + $this->set_time_limit(); + + $queries = array_filter( explode( ";\n", $chunk ) ); + array_unshift( $queries, "SET sql_mode='NO_AUTO_VALUE_ON_ZERO';" ); + + ob_start(); + $wpdb->show_errors(); + if( empty( $wpdb->charset ) ) { + $charset = ( defined( 'DB_CHARSET' ) ? DB_CHARSET : 'utf8' ); + $wpdb->charset = $charset; + $wpdb->set_charset( $wpdb->dbh, $wpdb->charset ); + } + foreach( $queries as $query ) { + if( false === $wpdb->query( $query ) ) { + $return = ob_get_clean(); + $result = $this->end_ajax( $return ); + return $result; + } + } + return true; + } + + function ajax_migrate_table() { + $this->check_ajax_referer( 'migrate-table' ); + global $wpdb; + + $this->form_data = $this->parse_migration_form_data( $_POST['form_data'] ); + + $result = ''; + // checks if we're performing a backup, if so, continue with the backup and exit immediately after + if ( $_POST['stage'] == 'backup' && $_POST['intent'] != 'savefile' ) { + // if performing a push we need to backup the REMOTE machine's DB + if ( $_POST['intent'] == 'push' ) { + $data = $_POST; + if ( isset( $data['nonce'] ) ) { + unset( $data['nonce'] ); + } + $data['action'] = 'wpsdb_backup_remote_table'; + $data['intent'] = 'pull'; + $ajax_url = trailingslashit( $_POST['url'] ) . 'wp-admin/admin-ajax.php'; + $data['primary_keys'] = stripslashes( $data['primary_keys'] ); + $data['sig'] = $this->create_signature( $data, $data['key'] ); + $response = $this->remote_post( $ajax_url, $data, __FUNCTION__ ); + ob_start(); + $this->display_errors(); + $return = ob_get_clean(); + $return .= $response; + } + else { + $return = $this->handle_table_backup(); + } + $result = $this->end_ajax( $return ); + return $result; + } + + // Pull and push need to be handled differently for obvious reasons, trigger different code depending on the migration intent (push or pull) + if ( $_POST['intent'] == 'push' || $_POST['intent'] == 'savefile' ) { + $this->maximum_chunk_size = $this->get_bottleneck(); + if ( isset( $_POST['bottleneck'] ) ) { + $this->maximum_chunk_size = (int) $_POST['bottleneck']; + } + if ( $_POST['intent'] == 'push' ) { + $this->remote_key = $_POST['key']; + $this->remote_url = $_POST['url']; + } + $sql_dump_file_name = $this->get_upload_info( 'path' ) . DS; + $sql_dump_file_name .= $this->format_dump_name( $_POST['dump_filename'] ); + + if ( $_POST['intent'] == 'savefile' ) { + $this->fp = $this->open( $sql_dump_file_name ); + } + $result = $this->export_table( $_POST['table'] ); + if ( $_POST['intent'] == 'savefile' ) { + $this->close( $this->fp ); + } + ob_start(); + $this->display_errors(); + $maybe_errors = trim( ob_get_clean() ); + if( false === empty( $maybe_errors ) ) { + $result = $this->end_ajax( $maybe_errors ); + return $result; + } + return $result; + } + else { + $data = $_POST; + if ( isset( $data['nonce'] ) ) { + unset( $data['nonce'] ); + } + $data['action'] = 'wpsdb_process_pull_request'; + $data['pull_limit'] = $this->get_sensible_pull_limit(); + if( is_multisite() ) { + $data['path_current_site'] = $this->get_path_current_site(); + $data['domain_current_site'] = $this->get_domain_current_site(); + } + $data['prefix'] = $wpdb->prefix; + if ( isset( $data['sig'] ) ) { + unset( $data['sig'] ); + } + $ajax_url = trailingslashit( $data['url'] ) . 'wp-admin/admin-ajax.php'; + $data['primary_keys'] = stripslashes( $data['primary_keys'] ); + $data['sig'] = $this->create_signature( $data, $data['key'] ); + + $response = $this->remote_post( $ajax_url, $data, __FUNCTION__ ); + ob_start(); + $this->display_errors(); + $maybe_errors = trim( ob_get_clean() ); + if( false === empty( $maybe_errors ) ) { + $result = $this->end_ajax( $maybe_errors ); + return $result; + } + + if( strpos( $response, ';' ) === false ) { + $result = $this->end_ajax( $response ); + return $result; + } + + // returned data is just a big string like this query;query;query;33 + // need to split this up into a chunk and row_tracker + $row_information = trim( substr( strrchr( $response, "\n" ), 1 ) ); + $row_information = explode( ',', $row_information ); + $chunk = substr( $response, 0, strrpos( $response, ";\n" ) + 1 ); + + if ( ! empty( $chunk ) ) { + $process_chunk_result = $this->process_chunk( $chunk ); + if( true !== $process_chunk_result ) { + $result = $this->end_ajax( $process_chunk_result ); + return $result; + } + } + + $result = $this->end_ajax( json_encode( + array( + 'current_row' => $row_information[0], + 'primary_keys' => $row_information[1] + ) + ) ); + } + return $result; + } + + function respond_to_backup_remote_table() { + $filtered_post = $this->filter_post_elements( $_POST, array( 'action', 'intent', 'url', 'key', 'table', 'form_data', 'stage', 'bottleneck', 'prefix', 'current_row', 'dump_filename', 'last_table', 'gzip', 'primary_keys', 'path_current_site', 'domain_current_site' ) ); + $filtered_post['primary_keys'] = stripslashes( $filtered_post['primary_keys'] ); + if ( ! $this->verify_signature( $filtered_post, $this->settings['key'] ) ) { + $error_msg = $this->invalid_content_verification_error . ' (#137)'; + $this->log_error( $error_msg, $filtered_post ); + $result = $this->end_ajax( $error_msg ); + return $result; + } + + $this->form_data = $this->parse_migration_form_data( $_POST['form_data'] ); + $result = $this->handle_table_backup(); + return $result; + } + + function handle_table_backup() { + if ( isset( $this->form_data['gzip_file'] ) ) { + unset( $this->form_data['gzip_file'] ); + } + $this->maximum_chunk_size = $this->get_bottleneck(); + $sql_dump_file_name = $this->get_upload_info( 'path' ) . DS; + $sql_dump_file_name .= $this->format_dump_name( $_POST['dump_filename'] ); + $file_created = file_exists( $sql_dump_file_name ); + $this->fp = $this->open( $sql_dump_file_name ); + if ( $file_created == false ) { + $this->db_backup_header(); + } + $result = $this->export_table( $_POST['table'] ); + if( isset( $this->fp ) ) { + $this->close( $this->fp ); + } + ob_start(); + $this->display_errors(); + $maybe_errors = trim( ob_get_clean() ); + if( false === empty( $maybe_errors ) ) { + $result = $this->end_ajax( $maybe_errors ); + return $result; + } + + return $result; + } + + function respond_to_process_pull_request() { + $filtered_post = $this->filter_post_elements( $_POST, array( 'action', 'intent', 'url', 'key', 'table', 'form_data', 'stage', 'bottleneck', 'prefix', 'current_row', 'dump_filename', 'pull_limit', 'last_table', 'gzip', 'primary_keys', 'path_current_site', 'domain_current_site' ) ); + + // verification will fail unless we strip slashes on primary_keys and form_data + $filtered_post['primary_keys'] = stripslashes( $filtered_post['primary_keys'] ); + $filtered_post['form_data'] = stripslashes( $filtered_post['form_data'] ); + if( isset( $filtered_post['path_current_site'] ) ) { + $filtered_post['path_current_site'] = stripslashes( $filtered_post['path_current_site'] ); + } + + if ( ! $this->verify_signature( $filtered_post, $this->settings['key'] ) ) { + $error_msg = $this->invalid_content_verification_error . ' (#124)'; + $this->log_error( $error_msg, $filtered_post ); + $result = $this->end_ajax( $error_msg ); + return $result; + } + + if ( $this->settings['allow_pull'] != true ) { + $result = $this->end_ajax( __( 'The connection succeeded but the remote site is configured to reject pull connections. You can change this in the "settings" tab on the remote site. (#132)', 'wp-sync-db' ) ); + return $result; + } + + $this->maximum_chunk_size = $_POST['pull_limit']; + $this->export_table( $_POST['table'] ); + ob_start(); + $this->display_errors(); + $return = ob_get_clean(); + $result = $this->end_ajax( $return ); + return $result; + } + + // Occurs right before the first table is migrated / backed up during the migration process + // Does a quick check to make sure the verification string is valid and also opens / creates files for writing to (if required) + function ajax_initiate_migration() { + $this->check_ajax_referer( 'initiate-migration' ); + $this->form_data = $this->parse_migration_form_data( $_POST['form_data'] ); + if ( $_POST['intent'] == 'savefile' ) { + + $return = array( + 'code' => 200, + 'message' => 'OK', + 'body' => json_encode( array( 'error' => 0 ) ), + ); + + $return['dump_filename'] = basename( $this->get_sql_dump_info( 'migrate', 'path' ) ); + $return['dump_url'] = $this->get_sql_dump_info( 'migrate', 'url' ); + $dump_filename_no_extension = substr( $return['dump_filename'], 0, -4 ); + + $create_alter_table_query = $this->get_create_alter_table_query(); + // sets up our table to store 'ALTER' queries + $process_chunk_result = $this->process_chunk( $create_alter_table_query ); + if( true !== $process_chunk_result ) { + $result = $this->end_ajax( $process_chunk_result ); + return $result; + } + + if ( $this->gzip() && isset( $this->form_data['gzip_file'] ) ) { + $return['dump_filename'] .= '.gz'; + $return['dump_url'] .= '.gz'; + } + $this->fp = $this->open( $this->get_upload_info( 'path' ) . DS . $return['dump_filename'] ); + $this->db_backup_header(); + $this->close( $this->fp ); + + $return['dump_filename'] = $dump_filename_no_extension; + } + else { // does one last check that our verification string is valid + + $data = array( + 'action' => 'wpsdb_remote_initiate_migration', + 'intent' => $_POST['intent'], + 'form_data' => $_POST['form_data'], + ); + + $data['sig'] = $this->create_signature( $data, $_POST['key'] ); + $ajax_url = trailingslashit( $_POST['url'] ) . 'wp-admin/admin-ajax.php'; + $response = $this->remote_post( $ajax_url, $data, __FUNCTION__ ); + + if ( false === $response ) { + $return = array( 'wpsdb_error' => 1, 'body' => $this->error ); + $result = $this->end_ajax( json_encode( $return ) ); + return $result; + } + + $return = @unserialize( trim( $response ) ); + + if ( false === $return ) { + $error_msg = __( 'Failed attempting to unserialize the response from the remote server. Please contact support.', 'wp-sync-db' ); + $return = array( 'wpsdb_error' => 1, 'body' => $error_msg ); + $this->log_error( $error_msg, $response ); + $result = $this->end_ajax( json_encode( $return ) ); + return $result; + } + + if ( isset( $return['error'] ) && $return['error'] == 1 ) { + $return = array( 'wpsdb_error' => 1, 'body' => $return['message'] ); + $result = $this->end_ajax( json_encode( $return ) ); + return $result; + } + + if( $_POST['intent'] == 'pull' ) { + // sets up our table to store 'ALTER' queries + $create_alter_table_query = $this->get_create_alter_table_query(); + $process_chunk_result = $this->process_chunk( $create_alter_table_query ); + if( true !== $process_chunk_result ) { + $result = $this->end_ajax( $process_chunk_result ); + return $result; + } + } + + if( ! empty( $this->form_data['create_backup'] ) && $_POST['intent'] == 'pull' ) { + $return['dump_filename'] = basename( $this->get_sql_dump_info( 'backup', 'path' ) ); + $return['dump_filename'] = substr( $return['dump_filename'], 0, -4 ); + $return['dump_url'] = $this->get_sql_dump_info( 'backup', 'url' ); + } + + } + + $return['dump_filename'] = ( empty( $return['dump_filename'] ) ) ? '' : $return['dump_filename']; + $return['dump_url'] = ( empty( $return['dump_url'] ) ) ? '' : $return['dump_url']; + + $result = $this->end_ajax( json_encode( $return ) ); + return $result; + } + + // End point for the above remote_post call, ensures that the verification string is valid before continuing with the migration + function respond_to_remote_initiate_migration() { + $return = array(); + $filtered_post = $this->filter_post_elements( $_POST, array( 'action', 'intent', 'form_data' ) ); + if ( $this->verify_signature( $filtered_post, $this->settings['key'] ) ) { + if ( isset( $this->settings['allow_' . $_POST['intent']] ) && ( true === $this->settings['allow_' . $_POST['intent']] || 1 === $this->settings['allow_' . $_POST['intent']] ) ) { + $return['error'] = 0; + } + else { + $return['error'] = 1; + if( $_POST['intent'] == 'pull' ) { + $intent = __( 'pull', 'wp-sync-db' ); + } + else { + $intent = __( 'push', 'wp-sync-db' ); + } + $return['message'] = sprintf( __( 'The connection succeeded but the remote site is configured to reject %s connections. You can change this in the "settings" tab on the remote site. (#110)', 'wp-sync-db'), $intent ); + } + } + else { + $return['error'] = 1; + $error_msg = $this->invalid_content_verification_error . ' (#111)'; + $this->log_error( $error_msg, $filtered_post ); + $return['message'] = $error_msg; + } + + $this->form_data = $this->parse_migration_form_data( $_POST['form_data'] ); + if( ! empty( $this->form_data['create_backup'] ) && $_POST['intent'] == 'push' ) { + $return['dump_filename'] = basename( $this->get_sql_dump_info( 'backup', 'path' ) ); + $return['dump_filename'] = substr( $return['dump_filename'], 0, -4 ); + $return['dump_url'] = $this->get_sql_dump_info( 'backup', 'url' ); + } + + if( $_POST['intent'] == 'push' ) { + // sets up our table to store 'ALTER' queries + $create_alter_table_query = $this->get_create_alter_table_query(); + $process_chunk_result = $this->process_chunk( $create_alter_table_query ); + if( true !== $process_chunk_result ) { + $result = $this->end_ajax( $process_chunk_result ); + return $result; + } + } + + $result = $this->end_ajax( serialize( $return ) ); + return $result; + } + + function ajax_save_profile() { + $this->check_ajax_referer( 'save-profile' ); + $profile = $this->parse_migration_form_data( $_POST['profile'] ); + $profile = wp_parse_args( $profile, $this->checkbox_options ); + if ( isset( $profile['save_migration_profile_option'] ) && $profile['save_migration_profile_option'] == 'new' ) { + $profile['name'] = $profile['create_new_profile']; + $this->settings['profiles'][] = $profile; + } + else { + $key = $profile['save_migration_profile_option']; + $name = $this->settings['profiles'][$key]['name']; + $this->settings['profiles'][$key] = $profile; + $this->settings['profiles'][$key]['name'] = $name; + } + update_option( 'wpsdb_settings', $this->settings ); + end( $this->settings['profiles'] ); + $key = key( $this->settings['profiles'] ); + $result = $this->end_ajax( $key ); + return $result; + } + + function ajax_save_setting() { + $this->check_ajax_referer( 'save-setting' ); + $this->settings[$_POST['setting']] = ( $_POST['checked'] == 'false' ? false : true ); + update_option( 'wpsdb_settings', $this->settings ); + $result = $this->end_ajax(); + return $result; + } + + function ajax_delete_migration_profile() { + $this->check_ajax_referer( 'delete-migration-profile' ); + $key = absint( $_POST['profile_id'] ); + --$key; + $return = ''; + if ( isset( $this->settings['profiles'][$key] ) ) { + unset( $this->settings['profiles'][$key] ); + update_option( 'wpsdb_settings', $this->settings ); + } + else { + $return = '-1'; + } + $result = $this->end_ajax( $return ); + return $result; + } + + function ajax_reset_api_key() { + $this->check_ajax_referer( 'reset-api-key' ); + $this->settings['key'] = $this->generate_key(); + update_option( 'wpsdb_settings', $this->settings ); + $result = $this->end_ajax( sprintf( "%s\n%s", site_url( '', 'https' ), $this->settings['key'] ) ); + return $result; + } + + // AJAX endpoint for when the user pastes into the connection info box (or when they click "connect") + // Responsible for contacting the remote website and retrieving info and testing the verification string + function ajax_verify_connection_to_remote_site() { + $this->check_ajax_referer( 'verify-connection-to-remote-site' ); + $data = array( + 'action' => 'wpsdb_verify_connection_to_remote_site', + 'intent' => $_POST['intent'] + ); + + $data['sig'] = $this->create_signature( $data, $_POST['key'] ); + $ajax_url = trailingslashit( $_POST['url'] ) . 'wp-admin/admin-ajax.php'; + $timeout = apply_filters( 'wpsdb_prepare_remote_connection_timeout', 10 ); + $response = $this->remote_post( $ajax_url, $data, __FUNCTION__, compact( 'timeout' ), true ); + $url_bits = parse_url( $this->attempting_to_connect_to ); + $return = $response; + + $alt_action = ''; + + if ( false === $response ) { + $return = array( 'wpsdb_error' => 1, 'body' => $this->error ); + $result = $this->end_ajax( json_encode( $return ) ); + return $result; + } + + $response = unserialize( trim( $response ) ); + + if ( false === $response ) { + $error_msg = __( 'Failed attempting to unserialize the response from the remote server. Please contact support.', 'wp-sync-db' ); + $return = array( 'wpsdb_error' => 1, 'body' => $error_msg ); + $this->log_error( $error_msg ); + $result = $this->end_ajax( json_encode( $return ) ); + return $result; + } + + if ( isset( $response['error'] ) && $response['error'] == 1 ) { + $return = array( 'wpsdb_error' => 1, 'body' => $response['message'] ); + $this->log_error( $response['message'], $response ); + $result = $this->end_ajax( json_encode( $return ) ); + return $result; + } + + if ( isset( $_POST['convert_post_type_selection'] ) && '1' == $_POST['convert_post_type_selection'] ) { + $profile = (int) $_POST['profile']; + unset( $this->settings['profiles'][$profile]['post_type_migrate_option'] ); + $this->settings['profiles'][$profile]['exclude_post_types'] = '1'; + $this->settings['profiles'][$profile]['select_post_types'] = array_values( array_diff( $response['post_types'], $this->settings['profiles'][$profile]['select_post_types'] ) ); + $response['select_post_types'] = $this->settings['profiles'][$profile]['select_post_types']; + update_option( 'wpsdb_settings', $this->settings ); + } + + $response['scheme'] = $url_bits['scheme']; + $return = json_encode( $response ); + + $result = $this->end_ajax( $return ); + return $result; + } + + // End point for the above remote_post call, returns table information, absolute file path, table prefix, etc + function respond_to_verify_connection_to_remote_site() { + global $wpdb; + + $return = array(); + + $filtered_post = $this->filter_post_elements( $_POST, array( 'action', 'intent' ) ); + if ( !$this->verify_signature( $filtered_post, $this->settings['key'] ) ) { + $return['error'] = 1; + $return['message'] = $this->invalid_content_verification_error . ' (#120) ' . __( 'Try again?', 'wp-sync-db' ) . ''; + $this->log_error( $this->invalid_content_verification_error . ' (#120)', $filtered_post ); + $result = $this->end_ajax( serialize( $return ) ); + return $result; + } + + if ( !isset( $this->settings['allow_' . $_POST['intent']] ) || $this->settings['allow_' . $_POST['intent']] != true ) { + $return['error'] = 1; + if( $_POST['intent'] == 'pull' ) { + $intent = __( 'pull', 'wp-sync-db' ); + } + else { + $intent = __( 'push', 'wp-sync-db' ); + } + $return['message'] = sprintf( __( 'The connection succeeded but the remote site is configured to reject %s connections. You can change this in the "settings" tab on the remote site. (#122) Try again?', 'wp-sync-db' ), $intent ); + $result = $this->end_ajax( serialize( $return ) ); + return $result; + } + + $return['tables'] = $this->get_tables(); + $return['prefixed_tables'] = $this->get_tables( 'prefix' ); + $return['table_sizes'] = $this->get_table_sizes(); + $return['table_rows'] = $this->get_table_row_count(); + $return['table_sizes_hr'] = array_map( array( $this, 'format_table_sizes' ), $this->get_table_sizes() ); + $return['path'] = $this->absolute_root_file_path; + $return['url'] = home_url(); + $return['prefix'] = $wpdb->prefix; + $return['bottleneck'] = $this->get_bottleneck(); + $return['error'] = 0; + $return['plugin_version'] = $this->plugin_version; + $return['domain'] = $this->get_domain_current_site(); + $return['path_current_site'] = $this->get_path_current_site(); + $return['uploads_dir'] = $this->get_short_uploads_dir(); + $return['gzip'] = ( $this->gzip() ? '1' : '0' ); + $return['post_types'] = $this->get_post_types(); + $return['write_permissions'] = ( is_writeable( $this->get_upload_info( 'path' ) ) ? '1' : '0' ); + $return['upload_dir_long'] = $this->get_upload_info( 'path' ); + $return['temp_prefix'] = $this->temp_prefix; + $return = apply_filters( 'wpsdb_establish_remote_connection_data', $return ); + $result = $this->end_ajax( serialize( $return ) ); + return $result; + } + + function format_table_sizes( $size ) { + $size *= 1024; + return size_format( $size ); + } + // Generates our secret key + function generate_key() { + $keyset = 'abcdefghijklmnopqrstuvqxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/'; + $key = ''; + for ( $i = 0; $i < 32; $i++ ) { + $key .= substr( $keyset, rand( 0, strlen( $keyset ) -1 ), 1 ); + } + return $key; + } + + function get_post_types() { + global $wpdb; + + if( is_multisite() ) { + $tables = $this->get_tables(); + $sql = "SELECT `post_type` FROM `{$wpdb->prefix}posts` "; + foreach( $tables as $table ) { + if( 0 == preg_match( '/' . $wpdb->prefix . '[0-9]+_posts/', $table ) ) continue; + $blog_id = str_replace( array( $wpdb->prefix, '_posts' ), array( '', '' ), $table ); + $sql .= "UNION SELECT `post_type` FROM `{$wpdb->prefix}" . $blog_id . "_posts` "; + } + $sql .= ";"; + $post_types = $wpdb->get_results( $sql, ARRAY_A ); + } + else { + $post_types = $wpdb->get_results( + "SELECT DISTINCT `post_type` + FROM `{$wpdb->prefix}posts` + WHERE 1;", ARRAY_A + ); + } + + $return = array( 'revision' ); + foreach( $post_types as $post_type ) { + $return[] = $post_type['post_type']; + } + return apply_filters( 'wpsdb_post_types', array_unique( $return ) ); + } + + // Retrieves the specified profile, if -1, returns the default profile + function get_profile( $profile_id ) { + --$profile_id; + if ( $profile_id == '-1' || ! isset( $this->settings['profiles'][$profile_id] ) ) { + return $this->default_profile; + } + return $this->settings['profiles'][$profile_id]; + } + + function get_table_row_count() { + global $wpdb; + $results = $wpdb->get_results( $wpdb->prepare( + 'SELECT table_name, TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = %s', DB_NAME + ), ARRAY_A + ); + $return = array(); + foreach( $results as $results ) { + $return[$results['table_name']] = ( $results['TABLE_ROWS'] == 0 ? 1 : $results['TABLE_ROWS'] ); + } + return $return; + } + + function get_table_sizes( $scope = 'regular' ) { + global $wpdb; + $prefix = ( $scope == 'temp' ? $this->temp_prefix : $wpdb->prefix ); + $results = $wpdb->get_results( $wpdb->prepare( + 'SELECT TABLE_NAME AS "table", + ROUND((data_length + index_length)/1024,0) AS "size" + FROM information_schema.TABLES + WHERE information_schema.TABLES.table_schema="%s" + AND information_schema.TABLES.table_type="%s"', DB_NAME, "BASE TABLE" + ), ARRAY_A + ); + + $return = array(); + + foreach ( $results as $result ) { + $return[$result['table']] = $result['size']; + } + + return apply_filters( 'wpsdb_table_sizes', $return, $scope ); + } + + function get_post_max_size() { + $val = trim( ini_get( 'post_max_size' ) ); + $last = strtolower( $val[ strlen( $val ) - 1 ] ); + switch ( $last ) { + case 'g': + $val *= 1024; + case 'm': + $val *= 1024; + case 'k': + $val *= 1024; + } + return $val; + } + + function get_sensible_pull_limit() { + return apply_filters( 'wpsdb_sensible_pull_limit', min( 26214400, $this->settings['max_request'] ) ); + } + + function get_bottleneck( $type = 'regular' ) { + $suhosin_limit = false; + $suhosin_request_limit = false; + $suhosin_post_limit = false; + + if ( function_exists( 'ini_get' ) ) { + $suhosin_request_limit = $this->return_bytes( ini_get( 'suhosin.request.max_value_length' ) ); + $suhosin_post_limit = $this->return_bytes( ini_get( 'suhosin.post.max_value_length' ) ); + } + + if ( $suhosin_request_limit && $suhosin_post_limit ) { + $suhosin_limit = min( $suhosin_request_limit, $suhosin_post_limit ); + } + + // we have to account for HTTP headers and other bloating, here we minus 1kb for bloat + $post_max_upper_size = apply_filters( 'wpsdb_post_max_upper_size', 26214400 ); + $calculated_bottleneck = min( ( $this->get_post_max_size() - 1024 ), $post_max_upper_size ); + + if ( $suhosin_limit ) { + $calculated_bottleneck = min( $calculated_bottleneck, $suhosin_limit - 1024 ); + } + + if( $type != 'max' ) { + $calculated_bottleneck = min( $calculated_bottleneck, $this->settings['max_request'] ); + } + + return apply_filters( 'wpsdb_bottleneck', $calculated_bottleneck ); + } + + function format_dump_name( $dump_name ) { + $extension = '.sql'; + $dump_name = sanitize_file_name( $dump_name ); + if ( $this->gzip() && isset( $this->form_data['gzip_file'] ) ) { + $extension .= '.gz'; + } + return $dump_name . $extension; + } + + function options_page() { + ?> + +
    + +

    Migrate DB

    + + + + + + addons as $addon_basename => $addon ) { + if( false == $this->is_addon_outdated( $addon_basename ) || false == is_plugin_active( $addon_basename ) ) continue; + $update_url = wp_nonce_url( network_admin_url( 'update.php?action=upgrade-plugin&plugin=' . urlencode( $addon_basename ) ), 'upgrade-plugin_' . $addon_basename ); + $addon_slug = current( explode( '/', $addon_basename ) ); + if ( isset( $GLOBALS['wpsdb_meta'][$addon_slug]['version'] ) ) { + $version = ' (' . $GLOBALS['wpsdb_meta'][$addon_slug]['version'] . ')'; + } + else { + $version = ''; + } + ?> +
    + Update Required — + Update Now', 'wp-sync-db' ), $addon['name'], $version, $update_url ); ?> +
    + +
    + PHP Safe Mode Enabled — We do not officially support running this plugin in safe mode because set_time_limit() has no effect. Therefore we can't extend the run time of the script and ensure it doesn't time out before the migration completes. We haven't disabled the plugin however, so you're free to cross your fingers and hope for the best. However, if you have trouble, we can't help you until you turn off safe mode.", 'wp-sync-db' ); + if ( function_exists( 'ini_get' ) ) { + printf( __( 'Your current PHP run time limit is set to %s seconds.', 'wp-sync-db' ), ini_get( 'max_execution_time' ) ); + } ?> +
    + + + + + set_time_limit_available() && !$hide_warning && !$safe_mode ) { + ?> +
    + PHP Function Disabled — The set_time_limit() function is currently disabled on your server. We use this function to ensure that the migration doesn't time out. We haven't disabled the plugin however, so you're free to cross your fingers and hope for the best. You may want to contact your web host to enable this function.", 'wp-sync-db' ); + if ( function_exists( 'ini_get' ) ) { + printf( __( 'Your current PHP run time limit is set to %s seconds.', 'wp-sync-db' ), ini_get( 'max_execution_time' ) ); + } ?> +
    + + +
    + + 1 profile saved + if ( ! empty( $this->settings['profiles'] ) && ! isset( $_GET['wpsdb-profile'] ) ) { + $this->template( 'profile' ); + } + else { + $this->template( 'migrate' ); + } + + $this->template( 'settings' ); + + $this->template( 'help' ); + ?> + +
    + +
    + form_data['replace_old']; + $replace = $this->form_data['replace_new']; + $new = str_ireplace( $search, $replace, $subject, $count ); + + /* + * Automatically replace URLs for subdomain based multisite installations + * e.g. //site1.example.com -> //site1.example.local for site with domain example.com + * NB: only handles the current network site, does not work for additional networks / mapped domains + */ + $subdomain_replace_enabled = apply_filters( 'wpsdb_subdomain_replace', true ); // allow developers to turn off this functionality + if ( $subdomain_replace_enabled && is_multisite() && defined( 'SUBDOMAIN_INSTALL' ) && SUBDOMAIN_INSTALL & !empty( $_POST['domain_current_site'] ) ) { + $pattern = '|//(.*?)\\.' . preg_quote( $this->get_domain_current_site(), '|' ) . '|'; + $replacement = '//$1.' . trim( $_POST['domain_current_site'] ); + $new = preg_replace( $pattern, $replacement, $new ); + } + + return $new; + } + + function process_sql_constraint( $create_query, $table, &$alter_table_query ) { + if( preg_match( '@CONSTRAINT|FOREIGN[\s]+KEY@', $create_query ) ) { + + $sql_constraints_query = ''; + + $nl_nix = "\n"; + $nl_win = "\r\n"; + $nl_mac = "\r"; + if( strpos( $create_query, $nl_win ) !== false ) { + $crlf = $nl_win; + } + elseif( strpos( $create_query, $nl_mac ) !== false ) { + $crlf = $nl_mac; + } + elseif( strpos( $create_query, $nl_nix ) !== false ) { + $crlf = $nl_nix; + } + + // Split the query into lines, so we can easily handle it. + // We know lines are separated by $crlf (done few lines above). + $sql_lines = explode( $crlf, $create_query ); + $sql_count = count( $sql_lines ); + + // lets find first line with constraints + for( $i = 0; $i < $sql_count; $i++ ) { + if (preg_match( + '@^[\s]*(CONSTRAINT|FOREIGN[\s]+KEY)@', + $sql_lines[$i] + )) { + break; + } + } + + // If we really found a constraint + if( $i != $sql_count ) { + + // remove, from the end of create statement + $sql_lines[$i - 1] = preg_replace( + '@,$@', + '', + $sql_lines[$i - 1] + ); + + // let's do the work + $sql_constraints_query .= 'ALTER TABLE ' + . $this->backquote( $table ) + . $crlf; + + $first = true; + for( $j = $i; $j < $sql_count; $j++ ) { + if( preg_match( + '@CONSTRAINT|FOREIGN[\s]+KEY@', + $sql_lines[$j] + )) { + if( strpos( $sql_lines[$j], 'CONSTRAINT' ) === false ) { + $tmp_str = preg_replace( + '/(FOREIGN[\s]+KEY)/', + 'ADD \1', + $sql_lines[$j] + ); + $sql_constraints_query .= $tmp_str; + } + else { + $tmp_str = preg_replace( + '/(CONSTRAINT)/', + 'ADD \1', + $sql_lines[$j] + ); + $sql_constraints_query .= $tmp_str; + preg_match( + '/(CONSTRAINT)([\s])([\S]*)([\s])/', + $sql_lines[$j], + $matches + ); + } + $first = false; + } + else { + break; + } + } + $sql_constraints_query .= ";\n"; + + $create_query = implode( + $crlf, + array_slice($sql_lines, 0, $i) + ) + . $crlf + . implode( + $crlf, + array_slice( $sql_lines, $j, $sql_count - 1 ) + ); + unset( $sql_lines ); + + $alter_table_query = $sql_constraints_query; + return $create_query; + } + } + return $create_query; + } + + /** + * Taken partially from phpMyAdmin and partially from + * Alain Wolf, Zurich - Switzerland + * Website: http://restkultur.ch/personal/wolf/scripts/db_backup/ + * Modified by Scott Merrill (http://www.skippy.net/) + * to use the WordPress $wpdb object + * + * @param string $table + * @return void + */ + function export_table( $table ) { + global $wpdb; + $this->set_time_limit(); + + if ( empty( $this->form_data ) ) { + $this->form_data = $this->parse_migration_form_data( $_POST['form_data'] ); + } + + $temp_prefix = $this->temp_prefix; + $remote_prefix = ( isset( $_POST['prefix'] ) ? $_POST['prefix'] : $wpdb->prefix ); + + $table_structure = $wpdb->get_results( "DESCRIBE " . $this->backquote( $table ) ); + if ( ! $table_structure ) { + $this->error = __( 'Failed to retrieve table structure, please ensure your database is online. (#125)', 'wp-sync-db' ); + return false; + } + + $current_row = -1; + if ( ! empty( $_POST['current_row'] ) ) { + $temp_current_row = trim( $_POST['current_row'] ); + if ( ! empty( $temp_current_row ) ) { + $current_row = (int) $temp_current_row; + } + } + + if ( $current_row == -1 ) { + // Add SQL statement to drop existing table + if ( $this->form_data['action'] == 'savefile' || $_POST['stage'] == 'backup' ) { + $this->stow( "\n\n" ); + $this->stow( "#\n" ); + $this->stow( "# " . sprintf( __( 'Delete any existing table %s', 'wp-sync-db' ), $this->backquote( $table ) ) . "\n" ); + $this->stow( "#\n" ); + $this->stow( "\n" ); + $this->stow( "DROP TABLE IF EXISTS " . $this->backquote( $table ) . ";\n" ); + } + else { + $this->stow( "DROP TABLE IF EXISTS " . $this->backquote( $temp_prefix . $table ) . ";\n" ); + } + + // Table structure + // Comment in SQL-file + if ( $this->form_data['action'] == 'savefile' || $_POST['stage'] == 'backup' ) { + $this->stow( "\n\n" ); + $this->stow( "#\n" ); + $this->stow( "# " . sprintf( __( 'Table structure of table %s', 'wp-sync-db' ), $this->backquote( $table ) ) . "\n" ); + $this->stow( "#\n" ); + $this->stow( "\n" ); + } + + $create_table = $wpdb->get_results( "SHOW CREATE TABLE " . $this->backquote( $table ), ARRAY_N ); + if ( false === $create_table ) { + $this->error = __( 'Failed to generate the create table query, please ensure your database is online. (#126)', 'wp-sync-db' ); + return false; + } + + if ( $this->form_data['action'] != 'savefile' && $_POST['stage'] != 'backup' ) { + $create_table[0][1] = str_replace( 'CREATE TABLE `', 'CREATE TABLE `' . $temp_prefix, $create_table[0][1] ); + } + + $create_table[0][1] = str_replace( 'TYPE=', 'ENGINE=', $create_table[0][1] ); + + $alter_table_query = ''; + $create_table[0][1] = $this->process_sql_constraint( $create_table[0][1], $table, $alter_table_query ); + + $create_table[0][1] = apply_filters( 'wpsdb_create_table_query', $create_table[0][1], $table ); + + $this->stow( $create_table[0][1] . ";\n" ); + + if( ! empty( $alter_table_query ) ) { + $alter_table_name = $this->get_alter_table_name(); + $insert = sprintf( "INSERT INTO %s ( `query` ) VALUES ( '%s' );\n", $this->backquote( $alter_table_name ), esc_sql( $alter_table_query ) ); + if ( $this->form_data['action'] == 'savefile' || $_POST['stage'] == 'backup' ) { + $process_chunk_result = $this->process_chunk( $insert ); + if( true !== $process_chunk_result ) { + $result = $this->end_ajax( $process_chunk_result ); + return $result; + } + } + else { + $this->stow( $insert ); + } + } + + // Comment in SQL-file + if ( $this->form_data['action'] == 'savefile' || $_POST['stage'] == 'backup' ) { + $this->stow( "\n\n" ); + $this->stow( "#\n" ); + $this->stow( '# ' . sprintf( __( 'Data contents of table %s', 'wp-sync-db' ), $this->backquote( $table ) ) . "\n" ); + $this->stow( "#\n" ); + } + } + + // $defs = mysql defaults, looks up the default for that paricular column, used later on to prevent empty inserts values for that column + // $ints = holds a list of the possible integar types so as to not wrap them in quotation marks later in the insert statements + $defs = array(); + $ints = array(); + foreach ( $table_structure as $struct ) { + if ( ( 0 === strpos( $struct->Type, 'tinyint' ) ) || + ( 0 === strpos( strtolower( $struct->Type ), 'smallint' ) ) || + ( 0 === strpos( strtolower( $struct->Type ), 'mediumint' ) ) || + ( 0 === strpos( strtolower( $struct->Type ), 'int' ) ) || + ( 0 === strpos( strtolower( $struct->Type ), 'bigint' ) ) ) { + $defs[strtolower( $struct->Field )] = ( null === $struct->Default ) ? 'NULL' : $struct->Default; + $ints[strtolower( $struct->Field )] = "1"; + } + } + + // Batch by $row_inc + + $row_inc = $this->rows_per_segment; + $row_start = 0; + if ( $current_row != -1 ) { + $row_start = $current_row; + } + + $this->row_tracker = $row_start; + + // \x08\\x09, not required + $search = array( "\x00", "\x0a", "\x0d", "\x1a" ); + $replace = array( '\0', '\n', '\r', '\Z' ); + + $query_size = 0; + + $table_name = $table; + + if ( $this->form_data['action'] != 'savefile' && $_POST['stage'] != 'backup' ) { + $table_name = $temp_prefix . $table; + } + + $this->primary_keys = array(); + $use_primary_keys = true; + foreach( $table_structure as $col ){ + $field_set[] = $this->backquote( $col->Field ); + if( $col->Key == 'PRI' && true == $use_primary_keys ) { + if( false === strpos( $col->Type, 'int' ) ) { + $use_primary_keys = false; + $this->primary_keys = array(); + continue; + } + $this->primary_keys[$col->Field] = 0; + } + } + + $first_select = true; + if( ! empty( $_POST['primary_keys'] ) ) { + $_POST['primary_keys'] = trim( $_POST['primary_keys'] ); + if( ! empty( $_POST['primary_keys'] ) && is_serialized( $_POST['primary_keys'] ) ) { + $this->primary_keys = unserialize( stripslashes( $_POST['primary_keys'] ) ); + $first_select = false; + } + } + + $fields = implode( ', ', $field_set ); + + $insert_buffer = $insert_query_template = "INSERT INTO " . $this->backquote( $table_name ) . " ( " . $fields . ") VALUES\n"; + + do { + $join = array(); + $where = 'WHERE 1=1'; + $order_by = ''; + // We need ORDER BY here because with LIMIT, sometimes it will return + // the same results from the previous query and we'll have duplicate insert statements + if ( 'backup' != $_POST['stage'] && isset( $this->form_data['exclude_spam'] ) ) { + if ( $this->table_is( 'comments', $table ) ) { + $where .= ' AND comment_approved != "spam"'; + } + elseif ( $this->table_is( 'commentmeta', $table ) ) { + extract( $this->get_ms_compat_table_names( array( 'commentmeta', 'comments' ), $table ) ); + $join[] = sprintf( 'INNER JOIN %1$s ON %1$s.comment_ID = %2$s.comment_id', $this->backquote( $comments_table ), $this->backquote( $commentmeta_table ) ); + $where .= sprintf( ' AND %1$s.comment_approved != \'spam\'', $this->backquote( $comments_table ) ); + } + } + + if ( 'backup' != $_POST['stage'] && isset( $this->form_data['exclude_post_types'] ) && ! empty( $this->form_data['select_post_types'] ) ) { + $post_types = '\'' . implode( '\', \'', $this->form_data['select_post_types'] ) . '\''; + if( $this->table_is( 'posts', $table ) ) { + $where .= ' AND `post_type` NOT IN ( ' . $post_types . ' )'; + } + elseif( $this->table_is( 'postmeta', $table ) ) { + extract( $this->get_ms_compat_table_names( array( 'postmeta', 'posts' ), $table ) ); + $join[] = sprintf( 'INNER JOIN %1$s ON %1$s.ID = %2$s.post_id', $this->backquote( $posts_table ), $this->backquote( $postmeta_table ) ); + $where .= sprintf( ' AND %1$s.post_type NOT IN ( ' . $post_types . ' )', $this->backquote( $posts_table ) ); + } + elseif ( $this->table_is( 'comments', $table ) ) { + extract( $this->get_ms_compat_table_names( array( 'comments', 'posts' ), $table ) ); + $join[] = sprintf( 'INNER JOIN %1$s ON %1$s.ID = %2$s.comment_post_ID', $this->backquote( $posts_table ), $this->backquote( $comments_table ) ); + $where .= sprintf( ' AND %1$s.post_type NOT IN ( ' . $post_types . ' )', $this->backquote( $posts_table ) ); + } + elseif( $this->table_is( 'commentmeta', $table ) ) { + extract( $this->get_ms_compat_table_names( array( 'commentmeta', 'posts', 'comments' ), $table ) ); + $join[] = sprintf( 'INNER JOIN %1$s ON %1$s.comment_ID = %2$s.comment_id', $this->backquote( $comments_table ), $this->backquote( $commentmeta_table ) ); + $join[] = sprintf( 'INNER JOIN %2$s ON %2$s.ID = %1$s.comment_post_ID', $this->backquote( $comments_table ), $this->backquote( $posts_table ) ); + $where .= sprintf( ' AND %1$s.post_type NOT IN ( ' . $post_types . ' )', $this->backquote( $posts_table ) ); + } + } + + if ( 'backup' != $_POST['stage'] && true === apply_filters( 'wpsdb_exclude_transients', true ) && isset( $this->form_data['exclude_transients'] ) && '1' === $this->form_data['exclude_transients'] && ( $this->table_is( 'options', $table ) || ( isset( $wpdb->sitemeta ) && $wpdb->sitemeta == $table ) ) ) { + $col_name = 'option_name'; + + if( isset( $wpdb->sitemeta ) && $wpdb->sitemeta == $table ) { + $col_name = 'meta_key'; + } + + $where .= " AND `{$col_name}` NOT LIKE '\_transient\_%' AND `{$col_name}` NOT LIKE '\_site\_transient\_%'"; + } + + $limit = "LIMIT {$row_start}, {$row_inc}"; + + if( ! empty( $this->primary_keys ) ) { + $primary_keys_keys = array_keys( $this->primary_keys ); + $primary_keys_keys = array_map( array( $this, 'backquote' ), $primary_keys_keys ); + + $order_by = 'ORDER BY ' . implode( ',', $primary_keys_keys ); + $limit = "LIMIT $row_inc"; + if( false == $first_select ) { + $where .= ' AND '; + + $temp_primary_keys = $this->primary_keys; + $primary_key_count = count( $temp_primary_keys ); + + // build a list of clauses, iteratively reducing the number of fields compared in the compound key + // e.g. (a = 1 AND b = 2 AND c > 3) OR (a = 1 AND b > 2) OR (a > 1) + $clauses = array(); + for( $j = 0; $j < $primary_key_count; $j++ ) { + // build a subclause for each field in the compound index + $subclauses = array(); + $i = 0; + foreach( $temp_primary_keys as $primary_key => $value ) { + // only the last field in the key should be different in this subclause + $operator = ( count( $temp_primary_keys ) - 1 == $i ? '>' : '=' ); + $subclauses[] = sprintf( '%s %s %s', $this->backquote( $primary_key ), $operator, $wpdb->prepare( '%s', $value ) ); + ++$i; + } + + // remove last field from array to reduce fields in next clause + array_pop( $temp_primary_keys ); + + // join subclauses into a single clause + // NB: AND needs to be wrapped in () as it has higher precedence than OR + $clauses[] = '( ' . implode( ' AND ', $subclauses ) . ' )'; + } + // join clauses into a single clause + // NB: OR needs to be wrapped in () as it has lower precedence than AND + $where .= '( ' . implode( ' OR ', $clauses ) . ' )'; + } + $first_select = false; + } + + $join = implode( ' ', array_unique( $join ) ); + $join = apply_filters( 'wpsdb_rows_join', $join, $table ); + $where = apply_filters( 'wpsdb_rows_where', $where, $table ); + $order_by = apply_filters( 'wpsdb_rows_order_by', $order_by, $table ); + $limit = apply_filters( 'wpsdb_rows_limit', $limit, $table ); + + $sql = "SELECT " . $this->backquote( $table ) . ".* FROM " . $this->backquote( $table ) . " $join $where $order_by $limit"; + $sql = apply_filters( 'wpsdb_rows_sql', $sql, $table ); + + $table_data = $wpdb->get_results( $sql ); + + if ( $table_data ) { + foreach ( $table_data as $row ) { + $values = array(); + foreach ( $row as $key => $value ) { + if ( isset( $ints[strtolower( $key )] ) && $ints[strtolower( $key )] ) { + // make sure there are no blank spots in the insert syntax, + // yet try to avoid quotation marks around integers + $value = ( null === $value || '' === $value ) ? $defs[strtolower( $key )] : $value; + $values[] = ( '' === $value ) ? "''" : $value; + } else { + if ( null === $value ) { + $values[] = 'NULL'; + } + else { + + if( is_multisite() && 'path' == $key && $_POST['stage'] != 'backup' && ( $wpdb->site == $table || $wpdb->blogs == $table ) ) { + $old_path_current_site = $this->get_path_current_site(); + if( ! empty( $_POST['path_current_site'] ) ) { + $new_path_current_site = stripslashes( $_POST['path_current_site'] ); + } + else { + $new_path_current_site = $this->get_path_from_url( $this->form_data['replace_new'][1] ); + } + + if( $old_path_current_site != $new_path_current_site ) { + $pos = strpos( $value, $old_path_current_site ); + $value = substr_replace( $value, $new_path_current_site, $pos, strlen( $old_path_current_site ) ); + } + } + + if( is_multisite() && 'domain' == $key && $_POST['stage'] != 'backup' && ( $wpdb->site == $table || $wpdb->blogs == $table ) ) { + if( ! empty( $_POST['domain_current_site'] ) ) { + $main_domain_replace = $_POST['domain_current_site']; + } + else { + $url = parse_url( $this->form_data['replace_new'][1] ); + $main_domain_replace = $url['host']; + } + + $main_domain_find = sprintf( "/%s/", $this->get_domain_current_site() ); + $domain_replaces[$main_domain_find] = $main_domain_replace; + $domain_replaces = apply_filters( 'wpsdb_domain_replaces', $domain_replaces ); + + $value = preg_replace( array_keys( $domain_replaces ), array_values( $domain_replaces ), $value ); + } + + if ( 'guid' != $key || ( isset( $this->form_data['replace_guids'] ) && $this->table_is( 'posts', $table ) ) ) { + if ( $_POST['stage'] != 'backup' ) { + $value = $this->recursive_unserialize_replace( $value ); + } + } + + $values[] = "'" . str_replace( $search, $replace, $this->sql_addslashes( $value ) ) . "'"; + } + } + } + + $insert_line = '(' . implode( ', ', $values ) . '),'; + $insert_line .= "\n"; + + if ( ( strlen( $this->current_chunk ) + strlen( $insert_line ) + strlen( $insert_buffer ) + 10 ) > $this->maximum_chunk_size ) { + if( $insert_buffer == $insert_query_template ) { + $insert_buffer .= $insert_line; + + ++$this->row_tracker; + + if( ! empty( $this->primary_keys ) ) { + foreach( $this->primary_keys as $primary_key => $value ) { + $this->primary_keys[$primary_key] = $row->$primary_key; + } + } + } + $insert_buffer = rtrim( $insert_buffer, "\n," ); + $insert_buffer .= " ;\n"; + $this->stow( $insert_buffer ); + $insert_buffer = $insert_query_template; + $query_size = 0; + return $this->transfer_chunk(); + } + + if ( ( $query_size + strlen( $insert_line ) ) > $this->max_insert_string_len && $insert_buffer != $insert_query_template ) { + $insert_buffer = rtrim( $insert_buffer, "\n," ); + $insert_buffer .= " ;\n"; + $this->stow( $insert_buffer ); + $insert_buffer = $insert_query_template; + $query_size = 0; + } + + $insert_buffer .= $insert_line; + $query_size += strlen( $insert_line ); + + ++$this->row_tracker; + + if( ! empty( $this->primary_keys ) ) { + foreach( $this->primary_keys as $primary_key => $value ) { + $this->primary_keys[$primary_key] = $row->$primary_key; + } + } + } + $row_start += $row_inc; + + if ( $insert_buffer != $insert_query_template ) { + $insert_buffer = rtrim( $insert_buffer, "\n," ); + $insert_buffer .= " ;\n"; + $this->stow( $insert_buffer ); + $insert_buffer = $insert_query_template; + $query_size = 0; + } + + } + } while ( count( $table_data ) > 0 ); + + // Create footer/closing comment in SQL-file + if ( $this->form_data['action'] == 'savefile' || $_POST['stage'] == 'backup' ) { + $this->stow( "\n" ); + $this->stow( "#\n" ); + $this->stow( "# " . sprintf( __( 'End of data contents of table %s', 'wp-sync-db' ), $this->backquote( $table ) ) . "\n" ); + $this->stow( "# --------------------------------------------------------\n" ); + $this->stow( "\n" ); + + if( $_POST['last_table'] == '1' ) { + $this->stow( "#\n" ); + $this->stow( "# Add constraints back in\n" ); + $this->stow( "#\n\n" ); + $this->stow( $this->get_alter_queries() ); + $alter_table_name = $this->get_alter_table_name(); + if ( $this->form_data['action'] == 'savefile' ) { + $wpdb->query( "DROP TABLE IF EXISTS " . $this->backquote( $alter_table_name ) . ";" ); + } + } + } + + $this->row_tracker = -1; + return $this->transfer_chunk(); + + } // end backup_table() + + function table_is( $desired_table, $given_table ) { + global $wpdb; + return ( $wpdb->{$desired_table} == $given_table || preg_match( '/' . $wpdb->prefix . '[0-9]+_' . $desired_table . '/', $given_table ) ); + } + + /** + * return multisite-compatible names for requested tables, based on queried table name + * + * @param array $tables list of table names required + * @param string $queried_table name of table from which to derive the blog ID + * + * @return array list of table names altered for multisite compatibility + */ + function get_ms_compat_table_names( $tables, $queried_table ) { + global $wpdb; + + // default table prefix + $prefix = $wpdb->prefix; + + // if multisite, extract blog ID from queried table name and add to prefix + // won't match for primary blog because it uses standard table names, i.e. blog_id will never be 1 + if ( is_multisite() && preg_match( '/^' . preg_quote( $wpdb->prefix, '/' ) . '([0-9]+)_/', $queried_table, $matches ) ) { + $blog_id = $matches[1]; + $prefix .= $blog_id . '_'; + } + + // build table names + $ms_compat_table_names = array(); + foreach( $tables as $table ) { + $ms_compat_table_names[$table . '_table'] = $prefix . $table; + } + return $ms_compat_table_names; + } + + /** + * Take a serialized array and unserialize it replacing elements as needed and + * unserialising any subordinate arrays and performing the replace on those too. + * + * Mostly from https://github.com/interconnectit/Search-Replace-DB + * + * @param array $data Used to pass any subordinate arrays back to in. + * @param bool $serialized Does the array passed via $data need serialising. + * @param bool $parent_serialized Passes whether the original data passed in was serialized + * + * @return array The original array with all elements replaced as needed. + */ + function recursive_unserialize_replace( $data, $serialized = false, $parent_serialized = false ) { + + $is_json = false; + // some unseriliased data cannot be re-serialized eg. SimpleXMLElements + try { + + if ( is_string( $data ) && ( $unserialized = @unserialize( $data ) ) !== false ) { + // PHP currently has a bug that doesn't allow you to clone the DateInterval / DatePeriod classes. + // We skip them here as they probably won't need data to be replaced anyway + if( is_object( $unserialized ) ) { + if( $unserialized instanceof DateInterval || $unserialized instanceof DatePeriod ) return $data; + } + $data = $this->recursive_unserialize_replace( $unserialized, true, true ); + } + elseif ( is_array( $data ) ) { + $_tmp = array( ); + foreach ( $data as $key => $value ) { + $_tmp[ $key ] = $this->recursive_unserialize_replace( $value, false, $parent_serialized ); + } + + $data = $_tmp; + unset( $_tmp ); + } + // Submitted by Tina Matter + elseif ( is_object( $data ) ) { + $_tmp = clone $data; + foreach ( $data as $key => $value ) { + $_tmp->$key = $this->recursive_unserialize_replace( $value, false, $parent_serialized ); + } + + $data = $_tmp; + unset( $_tmp ); + } + elseif ( $this->is_json( $data, true ) ) { + $_tmp = array( ); + $data = json_decode( $data, true ); + foreach ( $data as $key => $value ) { + $_tmp[ $key ] = $this->recursive_unserialize_replace( $value, false, $parent_serialized ); + } + + $data = $_tmp; + unset( $_tmp ); + $is_json = true; + } + elseif ( is_string( $data ) ) { + $data = $this->apply_replaces( $data, $parent_serialized ); + } + + if ( $serialized ) + return serialize( $data ); + + if ( $is_json ) + return json_encode( $data ); + + } catch( Exception $error ) { + + } + + return $data; + } + + function db_backup_header() { + $charset = ( defined( 'DB_CHARSET' ) ? DB_CHARSET : 'utf8' ); + $this->stow( "# " . __( 'WordPress MySQL database migration', 'wp-sync-db' ) . "\n", false ); + $this->stow( "#\n", false ); + $this->stow( "# " . sprintf( __( 'Generated: %s', 'wp-sync-db' ), date( "l j. F Y H:i T" ) ) . "\n", false ); + $this->stow( "# " . sprintf( __( 'Hostname: %s', 'wp-sync-db' ), DB_HOST ) . "\n", false ); + $this->stow( "# " . sprintf( __( 'Database: %s', 'wp-sync-db' ), $this->backquote( DB_NAME ) ) . "\n", false ); + $this->stow( "# --------------------------------------------------------\n\n", false ); + $this->stow( "/*!40101 SET NAMES $charset */;\n\n", false ); + $this->stow( "SET sql_mode='NO_AUTO_VALUE_ON_ZERO';\n\n", false ); + } + + function gzip() { + return function_exists( 'gzopen' ); + } + + function open( $filename = '', $mode = 'a' ) { + if ( '' == $filename ) return false; + if ( $this->gzip() && isset( $this->form_data['gzip_file'] ) ) + $fp = gzopen( $filename, $mode ); + else + $fp = fopen( $filename, $mode ); + return $fp; + } + + function close( $fp ) { + if ( $this->gzip() && isset( $this->form_data['gzip_file'] ) ) gzclose( $fp ); + else fclose( $fp ); + unset( $this->fp ); + } + + function stow( $query_line, $replace = true ) { + $this->current_chunk .= $query_line; + if ( $this->form_data['action'] == 'savefile' || $_POST['stage'] == 'backup' ) { + if ( $this->gzip() && isset( $this->form_data['gzip_file'] ) ) { + if ( ! @gzwrite( $this->fp, $query_line ) ) { + $this->error = __( 'Failed to write the gzipped SQL data to the file. (#127)', 'wp-sync-db' ); + return false; + } + } + else { + if ( false === @fwrite( $this->fp, $query_line ) ) { + $this->error = __( 'Failed to write the SQL data to the file. (#128)', 'wp-sync-db' ); + return false; + } + } + } + else if ( $_POST['intent'] == 'pull' ) { + echo $query_line; + } + } + + // Called in the $this->stow function once our chunk buffer is full, will transfer the SQL to the remote server for importing + function transfer_chunk() { + if( $_POST['intent'] == 'savefile' || $_POST['stage'] == 'backup' ) { + $this->close( $this->fp ); + $result = $this->end_ajax( json_encode( + array( + 'current_row' => $this->row_tracker, + 'primary_keys' => serialize( $this->primary_keys ) + ) + ) ); + return $result; + } + + if ( $_POST['intent'] == 'pull' ) { + $result = $this->end_ajax( $this->row_tracker . ',' . serialize( $this->primary_keys ) ); + return $result; + } + + $chunk_gzipped = '0'; + if( isset( $_POST['gzip'] ) && $_POST['gzip'] == '1' && $this->gzip() ) { + $this->current_chunk = gzcompress( $this->current_chunk ); + $chunk_gzipped = '1'; + } + + $data = array( + 'action' => 'wpsdb_process_chunk', + 'table' => $_POST['table'], + 'chunk_gzipped' => $chunk_gzipped, + 'chunk' => $this->current_chunk // NEEDS TO BE the last element in this array because of adding it back into the array in ajax_process_chunk() + ); + + $data['sig'] = $this->create_signature( $data, $_POST['key'] ); + + $ajax_url = trailingslashit( $this->remote_url ) . 'wp-admin/admin-ajax.php'; + $response = $this->remote_post( $ajax_url, $data, __FUNCTION__ ); + ob_start(); + $this->display_errors(); + $response = ob_get_clean(); + $response .= trim( $response ); + if( ! empty( $response ) ) { + $result = $this->end_ajax( $response ); + return $result; + } + + $result = $this->end_ajax( json_encode( + array( + 'current_row' => $this->row_tracker, + 'primary_keys' => serialize( $this->primary_keys ) + ) + ) ); + return $result; + } + + /** + * Add backquotes to tables and db-names in + * SQL queries. Taken from phpMyAdmin. + */ + function backquote( $a_name ) { + if ( !empty( $a_name ) && $a_name != '*' ) { + if ( is_array( $a_name ) ) { + $result = array(); + reset( $a_name ); + while ( list( $key, $val ) = each( $a_name ) ) + $result[$key] = '`' . $val . '`'; + return $result; + } else { + return '`' . $a_name . '`'; + } + } else { + return $a_name; + } + } + + /** + * Better addslashes for SQL queries. + * Taken from phpMyAdmin. + */ + function sql_addslashes( $a_string = '', $is_like = false ) { + if ( $is_like ) $a_string = str_replace( '\\', '\\\\\\\\', $a_string ); + else $a_string = str_replace( '\\', '\\\\', $a_string ); + return str_replace( '\'', '\\\'', $a_string ); + } + + function network_admin_menu() { + $hook_suffix = add_submenu_page( 'settings.php', 'Migrate DB', 'Migrate DB', 'manage_network_options', 'wp-sync-db', array( $this, 'options_page' ) ); + $this->after_admin_menu( $hook_suffix ); + } + + function admin_menu() { + $hook_suffix = add_management_page( 'Migrate DB', 'Migrate DB', 'export', 'wp-sync-db', array( $this, 'options_page' ) ); + $this->after_admin_menu( $hook_suffix ); + } + + function after_admin_menu( $hook_suffix ) { + add_action( 'admin_head-' . $hook_suffix, array( $this, 'admin_head_connection_info' ) ); + add_action( 'load-' . $hook_suffix , array( $this, 'load_assets' ) ); + } + + function admin_body_class( $classes ) { + if ( !$classes ) { + $classes = array(); + } + else { + $classes = explode( ' ', $classes ); + } + + // Recommended way to target WP 3.8+ + // http://make.wordpress.org/ui/2013/11/19/targeting-the-new-dashboard-design-in-a-post-mp6-world/ + if ( version_compare( $GLOBALS['wp_version'], '3.8-alpha', '>' ) ) { + if ( !in_array( 'mp6', $classes ) ) { + $classes[] = 'mp6'; + } + } + + return implode( ' ', $classes ); + } + + function load_assets() { + if ( ! empty( $_GET['download'] ) ) { + $this->download_file(); + } + + $plugins_url = trailingslashit( plugins_url() ) . trailingslashit( $this->plugin_folder_name ); + + $version = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? time() : $this->plugin_version; + + $src = $plugins_url . 'asset/css/styles.css'; + wp_enqueue_style( 'wp-sync-db-styles', $src, array(), $version ); + + $src = $plugins_url . 'asset/js/common.js'; + wp_enqueue_script( 'wp-sync-db-common', $src, NULL, $version, true ); + + $src = $plugins_url . 'asset/js/hook.js'; + wp_enqueue_script( 'wp-sync-db-hook', $src, NULL, $version, true ); + + do_action( 'wpsdb_load_assets' ); + + $src = $plugins_url . 'asset/js/script.js'; + wp_enqueue_script( 'wp-sync-db-script', $src, array( 'jquery' ), $version, true ); + + wp_localize_script( 'wp-sync-db-script', 'wpsdb_i10n', array( + 'max_request_size_problem' => __( "A problem occurred when trying to change the maximum request size, please try again.", 'wp-sync-db' ), + 'establishing_remote_connection' => __( "Establishing connection to remote server, please wait", 'wp-sync-db' ), + 'connection_local_server_problem' => __( "A problem occurred when attempting to connect to the local server, please check the details and try again.", 'wp-sync-db' ), + 'clear_log_problem' => __( "An error occurred when trying to clear the debug log. Please contact support. (#132)", 'wp-sync-db' ), + 'update_log_problem' => __( "An error occurred when trying to update the debug log. Please contact support. (#133)", 'wp-sync-db' ), + 'migrate_db_save' => __( "Migrate DB & Save", 'wp-sync-db' ), + 'migrate_db' => __( "Migrate DB", 'wp-sync-db' ), + 'please_select_one_table' => __( "Please select at least one table to migrate.", 'wp-sync-db' ), + 'enter_name_for_profile' => __( "Please enter a name for your migration profile.", 'wp-sync-db' ), + 'save_profile_problem' => __( "An error occurred when attempting to save the migration profile. Please see the Help tab for details on how to request support. (#118)", 'wp-sync-db' ), + 'exporting_complete' => __( "Exporting complete", 'wp-sync-db' ), + 'exporting_please_wait' => __( "Exporting, please wait...", 'wp-sync-db' ), + 'please_wait' => __( "please wait...", 'wp-sync-db' ), + 'complete' => __( "complete", 'wp-sync-db' ), + 'migration_failed' => __( "Migration failed", 'wp-sync-db' ), + 'backing_up' => __( "Backing up", 'wp-sync-db' ), + 'migrating' => __( "Migrating", 'wp-sync-db' ), + 'status' => __( "Status", 'wp-sync-db' ), + 'response' => __( "Response", 'wp-sync-db' ), + 'table_process_problem' => __( "A problem occurred when attempting to process the following table (#113)", 'wp-sync-db' ), + 'table_process_problem_empty_response' => __( "A problem occurred when processing the following table. We were expecting a response in JSON format but instead received an empty response.", 'wp-sync-db' ), + 'completed_with_some_errors' => __( "Migration completed with some errors", 'wp-sync-db' ), + 'completed_dump_located_at' => __( "Migration complete, your backup is located at:", 'wp-sync-db' ), + 'finalize_tables_problem' => __( "A problem occurred when finalizing the backup. (#132)", 'wp-sync-db' ), + 'saved' => __( "Saved", 'wp-sync-db' ), + 'reset_api_key' => __( "Any sites setup to use the current API key will no longer be able to connect. You will need to update those sites with the newly generated API key. Do you wish to continue?", 'wp-sync-db' ), + 'reset_api_key_problem' => __( "An error occurred when trying to generate the API key. Please see the Help tab for details on how to request support. (#105)", 'wp-sync-db' ), + 'remove_profile' => __( "You are removing the following migration profile. This cannot be undone. Do you wish to continue?", 'wp-sync-db' ), + 'remove_profile_problem' => __( "An error occurred when trying to delete the profile. Please see the Help tab for details on how to request support. (#106)", 'wp-sync-db' ), + 'remove_profile_not_found' => __( "The selected migration profile could not be deleted because it was not found.\nPlease refresh this page to see an accurate list of the currently available migration profiles.", 'wp-sync-db' ), + 'change_connection_info' => __( "If you change the connection details, you will lose any replaces and table selections you have made below. Do you wish to continue?", 'wp-sync-db' ), + 'enter_connection_info' => __( "Please enter the connection information above to continue.", 'wp-sync-db' ), + 'save_settings_problem' => __( "An error occurred when trying to save the settings. Please try again. If the problem persists, please see the Help tab for details on how to request support. (#108)", 'wp-sync-db' ), + 'connection_info_missing' => __( "The connection information appears to be missing, please enter it to continue.", 'wp-sync-db' ), + 'connection_info_incorrect' => __( "The connection information appears to be incorrect, it should consist of two lines. The first being the remote server's URL and the second being the secret key.", 'wp-sync-db' ), + 'connection_info_url_invalid' => __( "The URL on the first line appears to be invalid, please check it and try again.", 'wp-sync-db' ), + 'connection_info_key_invalid' => __( "The secret key on the second line appears to be invalid. It should be a 32 character string that consists of letters, numbers and special characters only.", 'wp-sync-db' ), + 'connection_info_local_url' => __( "It appears you've entered the URL for this website, you need to provide the URL of the remote website instead.", 'wp-sync-db' ), + 'connection_info_local_key' => __( "It appears you've entered the secret key for this website, you need to provide the secret key for the remote website instead.", 'wp-sync-db' ), + 'time_elapsed' => __( "Time Elapsed:", 'wp-sync-db' ), + 'pause' => __( "Pause", 'wp-sync-db' ), + 'migration_paused' => __( "Migration Paused", 'wp-sync-db' ), + 'resume' => __( "Resume", 'wp-sync-db' ), + 'completing_current_request' => __( "Completing current request", 'wp-sync-db' ), + 'cancelling_migration' => __( "Cancelling migration", 'wp-sync-db' ), + 'paused' => __( "Paused", 'wp-sync-db' ), + 'removing_local_sql' => __( "Removing the local MySQL export file", 'wp-sync-db' ), + 'removing_local_backup' => __( "Removing the local backup MySQL export file", 'wp-sync-db' ), + 'removing_local_temp_tables' => __( "Removing the local temporary tables", 'wp-sync-db' ), + 'removing_remote_sql' => __( "Removing the remote backup MySQL export file", 'wp-sync-db' ), + 'removing_remote_temp_tables' => __( "Removing the remote temporary tables", 'wp-sync-db' ), + 'migration_cancellation_failed' => __( "Migration cancellation failed", 'wp-sync-db' ), + 'manually_remove_temp_files' => __( "A problem occurred while cancelling the migration, you may have to manually delete some temporary files / tables.", 'wp-sync-db' ), + 'migration_cancelled' => __( "Migration cancelled", 'wp-sync-db' ), + ) ); + + wp_enqueue_script('jquery'); + wp_enqueue_script('jquery-ui-core'); + wp_enqueue_script('jquery-ui-slider'); + wp_enqueue_script('jquery-ui-sortable'); + + } + + function download_file() { + // dont need to check for user permissions as our 'add_management_page' already takes care of this + $this->set_time_limit(); + + $dump_name = $this->format_dump_name( $_GET['download'] ); + if( isset( $_GET['gzip'] ) ) { + $dump_name .= '.gz'; + } + $diskfile = $this->get_upload_info( 'path' ) . DS . $dump_name; + $filename = basename( $diskfile ); + $last_dash = strrpos( $filename, '-' ); + $salt = substr( $filename, $last_dash, 6 ); + $filename_no_salt = str_replace( $salt, '', $filename ); + + if ( file_exists( $diskfile ) ) { + header( 'Content-Description: File Transfer' ); + header( 'Content-Type: application/octet-stream' ); + header( 'Content-Length: ' . filesize( $diskfile ) ); + header( 'Content-Disposition: attachment; filename=' . $filename_no_salt ); + $success = readfile( $diskfile ); + unlink( $diskfile ); + exit; + } + else { + wp_die( __( 'Could not find the file to download:', 'wp-sync-db' ) . '
    ' . $diskfile ); + } + } + + function admin_head_connection_info() { + global $table_prefix; + + $nonces = array( + 'update_max_request_size' => wp_create_nonce( 'update-max-request-size' ), + 'verify_connection_to_remote_site' => wp_create_nonce( 'verify-connection-to-remote-site' ), + 'clear_log' => wp_create_nonce( 'clear-log' ), + 'get_log' => wp_create_nonce( 'get-log' ), + 'save_profile' => wp_create_nonce( 'save-profile' ), + 'initiate_migration' => wp_create_nonce( 'initiate-migration' ), + 'migrate_table' => wp_create_nonce( 'migrate-table' ), + 'finalize_migration' => wp_create_nonce( 'finalize-migration' ), + 'reset_api_key' => wp_create_nonce( 'reset-api-key' ), + 'delete_migration_profile' => wp_create_nonce( 'delete-migration-profile' ), + 'save_setting' => wp_create_nonce( 'save-setting' ), + ); + + $nonces = apply_filters( 'wpsdb_nonces', $nonces ); + + ?> + + get_post_types(); + $profile['select_post_types'] = array_diff( $all_post_types, $profile['select_post_types'] ); + $profile_changed = true; + } + + if ( $profile_changed ) { + $this->settings['profiles'][$profile_id] = $profile; + update_option( 'wpsdb_settings', $this->settings ); + } + return $profile; + } + + function get_path_from_url( $url ) { + $parts = parse_url( $url ); + return ( ! empty( $parts['path'] ) ) ? trailingslashit( $parts['path'] ) : '/'; + } + + function get_path_current_site() { + if( ! is_multisite() ) return ''; + $current_site = get_current_site(); + return $current_site->path; + } + + function get_domain_current_site() { + if( ! is_multisite() ) return ''; + $current_site = get_current_site(); + return $current_site->domain; + } + + function return_bytes($val) { + if( is_numeric( $val ) ) return $val; + if( empty( $val ) ) return false; + $val = trim($val); + $last = strtolower($val[strlen($val)-1]); + switch($last) { + // The 'G' modifier is available since PHP 5.1.0 + case 'g': + $val *= 1024; + case 'm': + $val *= 1024; + case 'k': + $val *= 1024; + break; + default : + $val = false; + break; + } + + return $val; + } + + function maybe_checked( $option ) { + echo ( isset( $option ) && $option == '1' ) ? ' checked="checked"' : ''; + } + + function ajax_cancel_migration() { + $this->form_data = $this->parse_migration_form_data( $_POST['form_data'] ); + + switch( $_POST['intent'] ) { + case 'savefile' : + $this->delete_export_file( $_POST['dump_filename'], false ); + break; + + case 'push' : + $data = $_POST; + $data['action'] = 'wpsdb_process_push_migration_cancellation'; + $data['temp_prefix'] = $this->temp_prefix; + $ajax_url = trailingslashit( $data['url'] ) . 'wp-admin/admin-ajax.php'; + $data['sig'] = $this->create_signature( $data, $data['key'] ); + + $response = $this->remote_post( $ajax_url, $data, __FUNCTION__ ); + $this->display_errors(); + + echo trim( $response ); + break; + + case 'pull' : + if( $_POST['stage'] == 'backup' ) { + $this->delete_export_file( $_POST['dump_filename'], true ); +} + else { + $this->delete_temporary_tables( $_POST['temp_prefix'] ); + } + break; + + default: + break; + } + + exit; + } + + function respond_to_process_push_migration_cancellation() { + $filtered_post = $this->filter_post_elements( $_POST, array( 'action', 'intent', 'url', 'key', 'form_data', 'dump_filename', 'temp_prefix', 'stage' ) ); + if ( ! $this->verify_signature( $filtered_post, $this->settings['key'] ) ) { + echo $this->invalid_content_verification_error; + exit; + } + + $this->form_data = $this->parse_migration_form_data( $filtered_post['form_data'] ); + + if( $filtered_post['stage'] == 'backup' ) { + $this->delete_export_file( $filtered_post['dump_filename'], true ); + } + else { + $this->delete_temporary_tables( $filtered_post['temp_prefix'] ); + } + exit; + } + + function delete_export_file( $filename, $is_backup ) { + $dump_file = $this->format_dump_name( $filename ); + if( true == $is_backup ) { + $dump_file = preg_replace( '/.gz$/', '', $dump_file ); + } + $dump_file = $this->get_upload_info( 'path' ) . DS . $dump_file; + + if( empty( $dump_file ) || false == file_exists( $dump_file ) ) { + _e( 'MySQL export file not found.', 'wp-sync-db' ); + exit; + } + + if( false === @unlink( $dump_file ) ) { + e( 'Could not delete the MySQL export file.', 'wp-sync-db' ); + exit; + } + } + + function delete_temporary_tables( $prefix ) { + $tables = $this->get_tables(); + $delete_queries = ''; + foreach( $tables as $table ) { + if( 0 !== strpos( $table, $prefix ) ) continue; + $delete_queries .= sprintf( "DROP TABLE %s;\n", $this->backquote( $table ) ); + } + $this->process_chunk( $delete_queries ); + } + + function empty_current_chunk() { + $this->current_chunk = ''; + } + +} diff --git a/www/wp-content/plugins/wp-sync-db/compatibility/wp-sync-db-compatibility.php b/www/wp-content/plugins/wp-sync-db/compatibility/wp-sync-db-compatibility.php new file mode 100755 index 0000000..69c24a4 --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db/compatibility/wp-sync-db-compatibility.php @@ -0,0 +1,50 @@ + $plugin ) { + if ( false !== strpos( $plugin, 'wp-sync-db' ) || !isset( $blacklist_plugins[$plugin] ) ) continue; + unset( $plugins[$key] ); + } + return $plugins; +} +add_filter( 'option_active_plugins', 'wpsdbc_exclude_plugins' ); + + +/** +* remove network-active plugins +* @param array $plugins array of plugins keyed by name (name=>timestamp pairs) +* @return array +*/ +function wpsdbc_exclude_site_plugins( $plugins ) { + if ( !defined( 'DOING_AJAX' ) || !DOING_AJAX || !isset( $_POST['action'] ) || false === strpos( $_POST['action'], 'wpsdb' ) ) return $plugins; + $wpsdb_settings = get_option( 'wpsdb_settings' ); + if ( !empty( $wpsdb_settings['blacklist_plugins'] ) ) { + $blacklist_plugins = array_flip( $wpsdb_settings['blacklist_plugins'] ); + } + foreach( array_keys( $plugins ) as $plugin ) { + if ( false !== strpos( $plugin, 'wp-sync-db' ) || !isset( $blacklist_plugins[$plugin] ) ) continue; + unset( $plugins[$plugin] ); + } + return $plugins; +} +add_filter( 'site_option_active_sitewide_plugins', 'wpsdbc_exclude_site_plugins' ); diff --git a/www/wp-content/plugins/wp-sync-db/languages/wp-sync-db-en.pot b/www/wp-content/plugins/wp-sync-db/languages/wp-sync-db-en.pot new file mode 100755 index 0000000..1fe566e --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db/languages/wp-sync-db-en.pot @@ -0,0 +1,1085 @@ +msgid "" +msgstr "" +"Project-Id-Version: WP Sync DB\n" +"POT-Creation-Date: 2014-05-28 13:07+1000\n" +"PO-Revision-Date: 2014-05-28 13:08+1000\n" +"Last-Translator: Delicious Brains \n" +"Language-Team: Delicious Brains \n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.6.5\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-SourceCharset: UTF-8\n" +"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;" +"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;" +"_nx_noop:3c,1,2;__ngettext_noop:1,2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Poedit-SearchPath-0: .\n" + +#: class/wpsdb-addon.php:57 +#, php-format +msgid "" +"The version of %1$s you have installed, requires version %2$s of WP Sync " +"DB. You currently have %3$s installed. Update " +"Now" +msgstr "" + +#: class/wpsdb-base.php:39 +msgid "" +"Invalid content verification signature, please verify the connection " +"information on the remote site and try again." +msgstr "" + +#: class/wpsdb-base.php:154 +#, php-format +msgid "" +"The connection to the remote server has timed out, no changes have been " +"committed. (#134 - scope: %s)" +msgstr "" + +#: class/wpsdb-base.php:157 +#, php-format +msgid "We could not find: %s. Are you sure this is the correct URL?" +msgstr "" + +#: class/wpsdb-base.php:162 +msgid "" +"It appears that you might be trying to pull from a local environment. This " +"will not work if this website happens to be located on a remote " +"server, it would be impossible for this server to contact your local " +"environment." +msgstr "" + +#: class/wpsdb-base.php:165 +msgid "" +"It appears that you might be trying to push to a local environment. This " +"will not work if this website happens to be located on a remote " +"server, it would be impossible for this server to contact your local " +"environment." +msgstr "" + +#: class/wpsdb-base.php:170 +#, php-format +msgid "" +"The connection failed, an unexpected error occurred, please contact support. " +"(#121 - scope: %s)" +msgstr "" + +#: class/wpsdb-base.php:180 +msgid "" +"The remote site is protected with Basic Authentication. Please enter the " +"username and password above to continue. (401 Unauthorized)" +msgstr "" + +#: class/wpsdb-base.php:185 +#, php-format +msgid "" +"Unable to connect to the remote server, please check the connection details " +"- %1$s %2$s (#129 - scope: %3$s)" +msgstr "" + +#: class/wpsdb-base.php:194 +msgid "" +"There was a problem with the AJAX request, we were expecting a serialized " +"response, instead we received:
    " +msgstr "" + +#: class/wpsdb-base.php:202 +#, php-format +msgid "" +"WP Sync DB does not seem to be installed or active on the remote " +"site. (#131 - scope: %s)" +msgstr "" + +#: class/wpsdb-base.php:359 +#, php-format +msgid "" +"Could not connect to deliciousbrains.com — You will " +"not receive update notifications or be able to activate your license until " +"this is fixed. This issue is often caused by an improperly configured SSL " +"server (https). We recommend fixing the " +"SSL configuration on your server, but if you need a quick fix you can:" +"

    Temporarily " +"disable SSL for connections to deliciousbrains.com

    " +msgstr "" + +#: class/wpsdb-base.php:380 +msgid "Could not retrieve version details. Please try again." +msgstr "" + +#: class/wpsdb-base.php:412 +msgid "There is a new version of " +msgstr "" + +#: class/wpsdb-base.php:414 +#, php-format +msgid "View version %s details" +msgstr "" + +#: class/wpsdb-base.php:422 class/wpsdb-base.php:509 +#: class/wpsdb.php:417 class/wpsdb.php:1435 +msgid "Settings" +msgstr "" + +#: class/wpsdb-base.php:478 +msgid "My Account" +msgstr "" + +#: class/wpsdb-base.php:704 +msgid "Update Available" +msgstr "" + +#: class/wpsdb-base.php:705 +#, php-format +msgid "" +"%1$s %2$s is now available. You currently have %3$s installed. %5$s" +msgstr "" + +#: class/wpsdb-base.php:705 +msgid "Update Now" +msgstr "" + +#: class/wpsdb-base.php:763 +#, php-format +msgid "" +"An Unexpected Error Occurred — Please contact us at " +"%2$s and quote the following:" +msgstr "" + +#: class/wpsdb-base.php:787 +#, php-format +msgid "Invalid nonce for: %s" +msgstr "" + +#: class/wpsdb-base.php:794 +#, php-format +msgid "Access denied for: %s" +msgstr "" + +#: class/wpsdb.php:317 +msgid "Addons Unavailable" +msgstr "" + +#: class/wpsdb.php:330 +msgid "Installed" +msgstr "" + +#: class/wpsdb.php:332 +msgid "Activated" +msgstr "" + +#: class/wpsdb.php:336 +msgid "Activate" +msgstr "" + +#: class/wpsdb.php:341 +msgid "Install" +msgstr "" + +#: class/wpsdb.php:344 +msgid "Download" +msgstr "" + +#: class/wpsdb.php:478 +msgid "ext/mysqli" +msgstr "" + +#: class/wpsdb.php:482 +msgid "WP Memory Limit" +msgstr "" + +#: class/wpsdb.php:725 +msgid "Could not upload the SQL to the server. (#135)" +msgstr "" + +#: class/wpsdb.php:730 +msgid "Could not read the SQL file we uploaded to the server. (#136)" +msgstr "" + +#: class/wpsdb.php:746 +msgid "" +"The connection succeeded but the remote site is configured to reject push " +"connections. You can change this in the \"settings\" tab on the remote site. " +"(#133)" +msgstr "" + +#: class/wpsdb.php:963 +msgid "" +"The connection succeeded but the remote site is configured to reject pull " +"connections. You can change this in the \"settings\" tab on the remote site. " +"(#132)" +msgstr "" + +#: class/wpsdb.php:1032 class/wpsdb.php:1204 +msgid "" +"Failed attempting to unserialize the response from the remote server. Please " +"contact support." +msgstr "" + +#: class/wpsdb.php:1081 class/wpsdb.php:1252 +msgid "pull" +msgstr "" + +#: class/wpsdb.php:1084 class/wpsdb.php:1255 +msgid "push" +msgstr "" + +#: class/wpsdb.php:1086 +#, php-format +msgid "" +"The connection succeeded but the remote site is configured to reject %s " +"connections. You can change this in the \"settings\" tab on the remote site. " +"(#110)" +msgstr "" + +#: class/wpsdb.php:1175 +msgid "" +"Please activate your license before attempting a pull or push migration." +msgstr "" + +#: class/wpsdb.php:1243 +msgid "Try again?" +msgstr "" + +#: class/wpsdb.php:1257 +#, php-format +msgid "" +"The connection succeeded but the remote site is configured to reject %s " +"connections. You can change this in the \"settings\" tab on the remote site. " +"(#122) Try again?" +msgstr "" + +#: class/wpsdb.php:1435 +msgid "Migrate" +msgstr "" + +#: class/wpsdb.php:1435 +msgid "Addons" +msgstr "" + +#: class/wpsdb.php:1435 +msgid "Help" +msgstr "" + +#: class/wpsdb.php:1455 +#, php-format +msgid "" +"The version of the %1$s addon you have installed%2$s is out-of-date and will " +"not work with this version WP Sync DB. Update Now" +msgstr "" + +#: class/wpsdb.php:1464 +msgid "" +"PHP Safe Mode Enabled — We do not officially support " +"running this plugin in safe mode because set_time_limit() has " +"no effect. Therefore we can't extend the run time of the script and ensure " +"it doesn't time out before the migration completes. We haven't disabled the " +"plugin however, so you're free to cross your fingers and hope for the best. " +"However, if you have trouble, we can't help you until you turn off safe mode." +msgstr "" + +#: class/wpsdb.php:1466 class/wpsdb.php:1485 +#, php-format +msgid "Your current PHP run time limit is set to %s seconds." +msgstr "" + +#: class/wpsdb.php:1474 +#, php-format +msgid "" +"Internet Explorer Not Supported — Less than 2% of our " +"customers use IE, so we've decided not to spend time supporting it. We ask " +"that you use Firefox or a Webkit-based browser like Chrome or Safari " +"instead. If this is a problem for you, please let us know." +msgstr "" + +#: class/wpsdb.php:1483 +msgid "" +"PHP Function Disabled — The set_time_limit() function is currently disabled on your server. We use this function to " +"ensure that the migration doesn't time out. We haven't disabled the plugin " +"however, so you're free to cross your fingers and hope for the best. You may " +"want to contact your web host to enable this function." +msgstr "" + +#: class/wpsdb.php:1660 +msgid "" +"Failed to retrieve table structure, please ensure your database is online. " +"(#125)" +msgstr "" + +#: class/wpsdb.php:1677 +#, php-format +msgid "Delete any existing table %s" +msgstr "" + +#: class/wpsdb.php:1691 +#, php-format +msgid "Table structure of table %s" +msgstr "" + +#: class/wpsdb.php:1698 +msgid "" +"Failed to generate the create table query, please ensure your database is " +"online. (#126)" +msgstr "" + +#: class/wpsdb.php:1734 +#, php-format +msgid "Data contents of table %s" +msgstr "" + +#: class/wpsdb.php:2022 +#, php-format +msgid "End of data contents of table %s" +msgstr "" + +#: class/wpsdb.php:2153 +msgid "WordPress MySQL database migration" +msgstr "" + +#: class/wpsdb.php:2155 +#, php-format +msgid "Generated: %s" +msgstr "" + +#: class/wpsdb.php:2156 +#, php-format +msgid "Hostname: %s" +msgstr "" + +#: class/wpsdb.php:2157 +#, php-format +msgid "Database: %s" +msgstr "" + +#: class/wpsdb.php:2187 +msgid "Failed to write the gzipped SQL data to the file. (#127)" +msgstr "" + +#: class/wpsdb.php:2193 +msgid "Failed to write the SQL data to the file. (#128)" +msgstr "" + +#: class/wpsdb.php:2382 +msgid "" +"A problem occurred when trying to change the maximum request size, please " +"try again." +msgstr "" + +#: class/wpsdb.php:2383 class/wpsdb.php:2593 +msgid "A problem occurred when trying to check the license, please try again." +msgstr "" + +#: class/wpsdb.php:2384 +msgid "Establishing connection to remote server, please wait" +msgstr "" + +#: class/wpsdb.php:2385 +msgid "" +"A problem occurred when attempting to connect to the local server, please " +"check the details and try again." +msgstr "" + +#: class/wpsdb.php:2386 +msgid "Please enter your license key." +msgstr "" + +#: class/wpsdb.php:2387 +msgid "" +"A problem occurred when trying to register the license, please try again." +msgstr "" + +#: class/wpsdb.php:2388 +msgid "" +"Your license has been activated. You will now receive automatic updates and " +"access to email support." +msgstr "" + +#: class/wpsdb.php:2389 template/help.php:29 +msgid "Fetching license details, please wait..." +msgstr "" + +#: class/wpsdb.php:2390 +msgid "" +"An error occurred when trying to clear the debug log. Please contact " +"support. (#132)" +msgstr "" + +#: class/wpsdb.php:2391 +msgid "" +"An error occurred when trying to update the debug log. Please contact " +"support. (#133)" +msgstr "" + +#: class/wpsdb.php:2392 +msgid "Migrate DB & Save" +msgstr "" + +#: class/wpsdb.php:2393 +msgid "Migrate DB" +msgstr "" + +#: class/wpsdb.php:2394 +msgid "Please select at least one table to migrate." +msgstr "" + +#: class/wpsdb.php:2395 +msgid "Please enter a name for your migration profile." +msgstr "" + +#: class/wpsdb.php:2396 +msgid "" +"An error occurred when attempting to save the migration profile. Please see " +"the Help tab for details on how to request support. (#118)" +msgstr "" + +#: class/wpsdb.php:2397 +msgid "Exporting complete" +msgstr "" + +#: class/wpsdb.php:2398 +msgid "Exporting, please wait..." +msgstr "" + +#: class/wpsdb.php:2399 +msgid "please wait..." +msgstr "" + +#: class/wpsdb.php:2400 +msgid "complete" +msgstr "" + +#: class/wpsdb.php:2401 +msgid "Migration failed" +msgstr "" + +#: class/wpsdb.php:2402 +msgid "Backing up" +msgstr "" + +#: class/wpsdb.php:2403 +msgid "Migrating" +msgstr "" + +#: class/wpsdb.php:2404 +msgid "Status" +msgstr "" + +#: class/wpsdb.php:2405 +msgid "Response" +msgstr "" + +#: class/wpsdb.php:2406 +msgid "" +"A problem occurred when attempting to process the following table (#113)" +msgstr "" + +#: class/wpsdb.php:2407 +msgid "" +"A problem occurred when processing the following table. We were expecting a " +"response in JSON format but instead received an empty response." +msgstr "" + +#: class/wpsdb.php:2408 +msgid "Migration completed with some errors" +msgstr "" + +#: class/wpsdb.php:2409 +msgid "Migration complete, your backup is located at:" +msgstr "" + +#: class/wpsdb.php:2410 +msgid "A problem occurred when finalizing the backup. (#132)" +msgstr "" + +#: class/wpsdb.php:2411 template/settings.php:78 template/settings.php:92 +msgid "Saved" +msgstr "" + +#: class/wpsdb.php:2412 +msgid "" +"Any sites setup to use the current API key will no longer be able to " +"connect. You will need to update those sites with the newly generated API " +"key. Do you wish to continue?" +msgstr "" + +#: class/wpsdb.php:2413 +msgid "" +"An error occurred when trying to generate the API key. Please see the Help " +"tab for details on how to request support. (#105)" +msgstr "" + +#: class/wpsdb.php:2414 +msgid "" +"You are removing the following migration profile. This cannot be undone. Do " +"you wish to continue?" +msgstr "" + +#: class/wpsdb.php:2415 +msgid "" +"An error occurred when trying to delete the profile. Please see the Help tab " +"for details on how to request support. (#106)" +msgstr "" + +#: class/wpsdb.php:2416 +msgid "" +"The selected migration profile could not be deleted because it was not " +"found.\n" +"Please refresh this page to see an accurate list of the currently available " +"migration profiles." +msgstr "" + +#: class/wpsdb.php:2417 +msgid "" +"If you change the connection details, you will lose any replaces and table " +"selections you have made below. Do you wish to continue?" +msgstr "" + +#: class/wpsdb.php:2418 template/migrate.php:129 +msgid "Please enter the connection information above to continue." +msgstr "" + +#: class/wpsdb.php:2419 +msgid "" +"An error occurred when trying to save the settings. Please try again. If the " +"problem persists, please see the Help tab for details on how to request " +"support. (#108)" +msgstr "" + +#: class/wpsdb.php:2420 +msgid "" +"The connection information appears to be missing, please enter it to " +"continue." +msgstr "" + +#: class/wpsdb.php:2421 +msgid "" +"The connection information appears to be incorrect, it should consist of two " +"lines. The first being the remote server's URL and the second being the " +"secret key." +msgstr "" + +#: class/wpsdb.php:2422 +msgid "" +"The URL on the first line appears to be invalid, please check it and try " +"again." +msgstr "" + +#: class/wpsdb.php:2423 +msgid "" +"The secret key on the second line appears to be invalid. It should be a 32 " +"character string that consists of letters, numbers and special characters " +"only." +msgstr "" + +#: class/wpsdb.php:2424 +msgid "" +"It appears you've entered the URL for this website, you need to provide the " +"URL of the remote website instead." +msgstr "" + +#: class/wpsdb.php:2425 +msgid "" +"It appears you've entered the secret key for this website, you need to " +"provide the secret key for the remote website instead." +msgstr "" + +#: class/wpsdb.php:2426 template/migrate-progress.php:8 +msgid "Time Elapsed:" +msgstr "" + +#: class/wpsdb.php:2427 template/migrate-progress.php:19 +msgid "Pause" +msgstr "" + +#: class/wpsdb.php:2428 +msgid "Migration Paused" +msgstr "" + +#: class/wpsdb.php:2429 +msgid "Resume" +msgstr "" + +#: class/wpsdb.php:2430 +msgid "Completing current request" +msgstr "" + +#: class/wpsdb.php:2431 +msgid "Cancelling migration" +msgstr "" + +#: class/wpsdb.php:2432 +msgid "Paused" +msgstr "" + +#: class/wpsdb.php:2433 +msgid "Removing the local MySQL export file" +msgstr "" + +#: class/wpsdb.php:2434 +msgid "Removing the local backup MySQL export file" +msgstr "" + +#: class/wpsdb.php:2435 +msgid "Removing the local temporary tables" +msgstr "" + +#: class/wpsdb.php:2436 +msgid "Removing the remote backup MySQL export file" +msgstr "" + +#: class/wpsdb.php:2437 +msgid "Removing the remote temporary tables" +msgstr "" + +#: class/wpsdb.php:2438 +msgid "Migration cancellation failed" +msgstr "" + +#: class/wpsdb.php:2439 +msgid "" +"A problem occurred while cancelling the migration, you may have to manually " +"delete some temporary files / tables." +msgstr "" + +#: class/wpsdb.php:2440 +msgid "Migration cancelled" +msgstr "" + +#: class/wpsdb.php:2474 +msgid "Could not find the file to download:" +msgstr "" + +#: class/wpsdb.php:2652 +msgctxt "" +"\"Remove\" in this context is used to delete a license, example formatting: " +"xxxx-xxxx-xxxx Remove" +msgid "Remove" +msgstr "" + +#: class/wpsdb.php:2785 +msgid "MySQL export file not found." +msgstr "" + +#: template/addons.php:7 +msgid "Fetching addon details, please wait..." +msgstr "" + +#: template/addons.php:9 template/help.php:31 +msgid "" +"We couldn't find your license information. Please switch to the settings tab " +"and enter your license." +msgstr "" + +#: template/addons.php:10 +msgid "Once completed, you may visit this tab to view the available addons." +msgstr "" + +#: template/help.php:4 +msgid "Feature Walkthrough" +msgstr "" + +#: template/help.php:5 +msgid "" +"A brief walkthrough of the WP Sync DB plugin showing all of the different " +"options and explaining them." +msgstr "" + +#: template/help.php:8 +msgid "Pulling Live Data Into Your Local Development Environment" +msgstr "" + +#: template/help.php:9 +msgid "" +"This screencast demonstrates how you can pull data from a remote, live " +"WordPress install and update the data in your local development environment." +msgstr "" + +#: template/help.php:12 +msgid "Pushing Local Development Data to a Staging Environment" +msgstr "" + +#: template/help.php:13 +msgid "" +"This screencast demonstrates how you can push a local WordPress database " +"you've been using for development to a staging environment." +msgstr "" + +#: template/help.php:16 +msgid "Media Files Addon Demo" +msgstr "" + +#: template/help.php:17 +msgid "" +"A short demo of how the Media Files addon allows you to sync up your " +"WordPress Media Libraries." +msgstr "" + +#: template/help.php:26 +msgid "Email Support" +msgstr "" + +#: template/help.php:32 +msgid "Once completed, you may visit this tab to view your support details." +msgstr "" + +#: template/help.php:38 +msgid "Diagnostic Info & Error Log" +msgstr "" + +#: template/help.php:40 +msgid "Clear Error Log" +msgstr "" + +#: template/help.php:44 +msgid "Videos" +msgstr "" + +#: template/migrate-progress.php:4 +msgid "Please wait while migration is running..." +msgstr "" + +#: template/migrate-progress.php:7 +msgid "Establishing Connection" +msgstr "" + +#: template/migrate-progress.php:20 +msgid "Cancel" +msgstr "" + +#: template/migrate.php:61 template/migrate.php:467 +msgid "Back to select a saved profile" +msgstr "" + +#: template/migrate.php:70 +msgid "Export File" +msgstr "" + +#: template/migrate.php:76 +msgid "Save as file to your computer" +msgstr "" + +#: template/migrate.php:83 +msgid "Compress file with gzip" +msgstr "" + +#: template/migrate.php:92 +msgid "Pull" +msgstr "" + +#: template/migrate.php:92 +msgid "Replace this site's db with remote db" +msgstr "" + +#: template/migrate.php:101 +msgid "Push" +msgstr "" + +#: template/migrate.php:101 +msgid "Replace remote db with this site's db" +msgstr "" + +#: template/migrate.php:110 +msgid "Connection Info - Site URL & Secret Key" +msgstr "" + +#: template/migrate.php:120 +msgid "SSL Disabled" +msgstr "" + +#: template/migrate.php:120 +msgid "" +"We couldn't connect over SSL but regular http (no SSL) appears to be working " +"so we've switched to that. If you run a push or pull, your data will be " +"transmitted unencrypted. Most people are fine with this, but just a heads up." +msgstr "" + +#: template/migrate.php:132 +msgid "Version Mismatch" +msgstr "" + +#: template/migrate.php:132 +#, php-format +msgid "" +"We've detected you have version of WP " +"Sync DB at but are using %1$s " +"here. Please go to the Plugins page on both installs " +"and check for updates." +msgstr "" + +#: template/migrate.php:136 +msgid "Cannot Access Uploads Directory" +msgstr "" + +#: template/migrate.php:138 +msgid "" +"We require write permissions to the standard WordPress uploads directory. " +"Without this permission exports are unavailable. Please grant 755 " +"permissions on the following directory:" +msgstr "" + +#: template/migrate.php:147 +msgid "Find" +msgstr "" + +#: template/migrate.php:148 +msgid "Replace" +msgstr "" + +#: template/migrate.php:151 +msgid "" +"Doesn't look we have any replaces yet, add one?" +msgstr "" + +#: template/migrate.php:230 +#, php-format +msgid "" +"New URL Missing — Please enter the protocol-relative " +"URL of the remote website in the \"New URL\" field. If you are unsure of " +"what this URL should be, please consult our " +"documentation on find and replace fields." +msgstr "" + +#: template/migrate.php:231 +#, php-format +msgid "" +"New File Path Missing — Please enter the root file " +"path of the remote website in the \"New file path\" field. If you are unsure " +"of what the file path should be, please consult our documentation on find and replace fields." +msgstr "" + +#: template/migrate.php:248 +msgid "Migrate all tables with prefix" +msgstr "" + +#: template/migrate.php:254 +msgid "Migrate only selected tables below" +msgstr "" + +#: template/migrate.php:272 template/migrate.php:300 template/migrate.php:395 +#: template/settings.php:70 +msgid "Select All" +msgstr "" + +#: template/migrate.php:274 template/migrate.php:302 template/migrate.php:397 +#: template/settings.php:72 +msgid "Deselect All" +msgstr "" + +#: template/migrate.php:276 template/migrate.php:304 template/migrate.php:399 +#: template/settings.php:74 +msgid "Invert Selection" +msgstr "" + +#: template/migrate.php:284 +msgid "Exclude Post Types" +msgstr "" + +#: template/migrate.php:312 +msgid "Advanced Options" +msgstr "" + +#: template/migrate.php:321 +msgid "Replace GUIDs" +msgstr "" + +#: template/migrate.php:327 +#, php-format +msgid "" +"Although the WordPress Codex emphasizes " +"that GUIDs should not be changed, this is limited to sites that are already " +"live. If the site has never been live, I recommend replacing the GUIDs. For " +"example, you may be developing a new site locally at dev.somedomain.com and " +"want to migrate the site live to somedomain.com." +msgstr "" + +#: template/migrate.php:333 +msgid "Exclude spam comments" +msgstr "" + +#: template/migrate.php:339 +msgid "" +"Do not migrate the 'active_plugins' setting (i.e. which plugins are " +"activated/deactivated)" +msgstr "" + +#: template/migrate.php:356 +msgid "" +"Backup the local database before " +"replacing it" +msgstr "" + +#: template/migrate.php:357 +msgid "An SQL file will be saved to" +msgstr "" + +#: template/migrate.php:365 +msgid "Backup all tables with prefix" +msgstr "" + +#: template/migrate.php:371 +msgid "Backup only tables selected for migration" +msgstr "" + +#: template/migrate.php:377 +msgid "Backup only selected tables below" +msgstr "" + +#: template/migrate.php:402 +#, php-format +msgid "" +"The backup option has been disabled as your local uploads directory is currently not writeable. The following " +"directory should have 755 permissions: %s

    " +msgstr "" + +#: template/migrate.php:410 +msgid "Save Migration Profile" +msgstr "" + +#: template/migrate.php:410 +msgid "Save the above settings for the next time you do a similiar migration" +msgstr "" + +#: template/migrate.php:429 +msgid "Create new profile" +msgstr "" + +#: template/migrate.php:438 template/migrate.php:448 +msgid "Warning: Different Table Prefixes" +msgstr "" + +#: template/migrate.php:440 +msgid "" +"Whoa! We've detected that the database table prefix differs between " +"installations. Clicking the Migrate DB button below will create new database " +"tables in your local database with prefix \"\"." +msgstr "" + +#: template/migrate.php:442 +#, php-format +msgid "" +"However, your local install is configured to use table prefix \"%1$s\" and " +"will ignore the migrated tables. So, AFTER migration is complete, you " +"will need to edit your local install's wp-config.php and change the \"%1$s\" " +"variable to \"\"." +msgstr "" + +#: template/migrate.php:444 +msgid "" +"This will allow your local install the use the migrated tables. Once you do " +"this, you shouldn't have to do it again." +msgstr "" + +#: template/migrate.php:450 +#, php-format +msgid "" +"Whoa! We've detected that the database table prefix differs between " +"installations. Clicking the Migrate DB button below will create new database " +"tables in the remote database with prefix \"%s\"." +msgstr "" + +#: template/migrate.php:452 +#, php-format +msgid "" +"However, your remote install is configured to use table prefix \"\" and will ignore the migrated tables. So, " +"AFTER migration is complete, you will need to edit your remote " +"install's wp-config.php and change the \"\" variable to \"%s\"." +msgstr "" + +#: template/migrate.php:454 +msgid "" +"This will allow your remote install the use the migrated tables. Once you do " +"this, you shouldn't have to do it again." +msgstr "" + +#: template/profile.php:2 +msgid "Would you like to use a saved migration profile?" +msgstr "" + +#: template/profile.php:7 +msgid "Nope, let's start fresh..." +msgstr "" + +#: template/settings.php:20 +msgid "" +"Accept pull requests allow this database to be exported and downloaded" +msgstr "" + +#: template/settings.php:26 +msgid "Accept push requests allow this database to be overwritten" +msgstr "" + +#: template/settings.php:32 +msgid "Enable SSL verification" +msgstr "" + +#: template/settings.php:36 +msgid "" +"We disable SSL verification by default because a lot of people's " +"environments are not setup for it to work. For example, with XAMPP, you have " +"to manually enable OpenSSL by editing the php.ini. Without SSL verification, " +"an HTTPS connection is vulnerable to a man-in-the-middle attack, so we do " +"recommend you configure your environment and enable this." +msgstr "" + +#: template/settings.php:43 +msgid "Connection Info" +msgstr "" + +#: template/settings.php:45 +msgid "Reset API Key" +msgstr "" + +#: template/settings.php:51 +msgid "" +"Improve performance and reliability by not loading the following plugins for " +"migration requests" +msgstr "" + +#: template/settings.php:55 +msgid "" +"Some plugins add a lot of overhead to each request, requiring extra memory " +"and CPU. And some plugins even interfere with migrations and cause them to " +"fail. We recommend only loading plugins that affect migration requests, for " +"example a plugin that hooks into WP Sync DB." +msgstr "" + +#: template/settings.php:77 +msgid "Save Changes" +msgstr "" + +#: template/settings.php:85 +msgid "Maximum Request Size" +msgstr "" + +#: template/settings.php:88 +#, php-format +msgid "" +"We've detected that your server supports requests up to %s, but it's " +"possible that your server has limitations that we could not detect. To be on " +"the safe side, we set the default to 1 MB, but you can try throttling it up " +"to get better performance. If you're getting a 413 error or having trouble " +"with time outs, try throttling this setting down." +msgstr "" + +#: template/settings.php:100 +msgid "Your License" +msgstr "" + +#: template/settings.php:103 +msgid "The license key is currently defined in wp-config.php." +msgstr "" + +#: template/settings.php:111 +msgid "Activate License" +msgstr "" diff --git a/www/wp-content/plugins/wp-sync-db/template/help.php b/www/wp-content/plugins/wp-sync-db/template/help.php new file mode 100755 index 0000000..2fe6616 --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db/template/help.php @@ -0,0 +1,48 @@ + array( + 'title' => __( 'Feature Walkthrough', 'wp-sync-db' ), + 'desc' => __( 'A brief walkthrough of the WP Sync DB plugin showing all of the different options and explaining them.', 'wp-sync-db' ) + ), + 'IFdHIpf6jjc' => array( + 'title' => __( 'Pulling Live Data Into Your Local Development Environment', 'wp-sync-db' ), + 'desc' => __( 'This screencast demonstrates how you can pull data from a remote, live WordPress install and update the data in your local development environment.', 'wp-sync-db' ) + ), + 'FjTzNqAlQE0' => array( + 'title' => __( 'Pushing Local Development Data to a Staging Environment', 'wp-sync-db' ), + 'desc' => __( 'This screencast demonstrates how you can push a local WordPress database you\'ve been using for development to a staging environment.', 'wp-sync-db' ) + ), + '0aR8-jC2XXM' => array( + 'title' => __( 'Media Files Addon Demo', 'wp-sync-db' ), + 'desc' => __( 'A short demo of how the Media Files addon allows you to sync up your WordPress Media Libraries.', 'wp-sync-db' ) + ) +); +?> + +
    +
    +

    Support

    +

    Please report bugs or ask questions in the GitHub Issue Tracker.

    +
    +
    +

    + + +
    +
    +

    + + +
      + $video ) : ?> +
    • + +

      +

      + +

      +
    • + +
    +
    +
    diff --git a/www/wp-content/plugins/wp-sync-db/template/migrate-progress.php b/www/wp-content/plugins/wp-sync-db/template/migrate-progress.php new file mode 100755 index 0000000..0a46139 --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db/template/migrate-progress.php @@ -0,0 +1,23 @@ +
    + × +
    +

    +
    +
    +
    + +
    +
    +
    +
    +
    wp_options
    +
    +
    +
    + +
    + + +
    + +
    diff --git a/www/wp-content/plugins/wp-sync-db/template/migrate.php b/www/wp-content/plugins/wp-sync-db/template/migrate.php new file mode 100755 index 0000000..f54a92f --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db/template/migrate.php @@ -0,0 +1,471 @@ +get_profile( $_GET['wpsdb-profile'] ); +} +else{ + $loaded_profile = $this->default_profile; +} + +$is_default_profile = isset( $loaded_profile['default_profile'] ); + +$convert_exclude_revisions = false; +$convert_post_type_selection = false; +if( ! $is_default_profile ) { + if( isset( $loaded_profile['exclude_revisions'] ) ) { + $convert_exclude_revisions = true; + } + /* We used to provide users the option of selecting which post types they'd like to migrate. + * We found that our wording for this funtionality was a little confusing so we switched it to instead read "Exclude Post Types" + * Once we made the switch we needed a way of inverting their saved post type selection to instead exclude the select post types. + * This was required to make their select compatible with the new "exclude" wording. + * This is easy enough for "push" and "export" saved profile as we know which post types exist on the local system and + * can easily invert the selection. Pull saved profiles is a little tricker. + * $this->maybe_update_profile() is used to update deprecated profile options to their new values. + * At the time of page request $this->maybe_update_profile() cannot be used to update a pull profile as we don't know which + * post types exist on the remote machine. As such we invert this selection later using the $convert_post_type_selection flag below. + */ + if ( isset( $loaded_profile['post_type_migrate_option'] ) && 'migrate_select_post_types' == $loaded_profile['post_type_migrate_option'] && 'pull' == $loaded_profile['action'] ) { + $convert_post_type_selection = true; + } + $loaded_profile = $this->maybe_update_profile( $loaded_profile, $_GET['wpsdb-profile'] ); +} + +if( false == $is_default_profile ) { + $loaded_profile = wp_parse_args( $loaded_profile, $this->default_profile ); +} +$loaded_profile = wp_parse_args( $loaded_profile, $this->checkbox_options ); +?> + + +
    + +
    + + settings['profiles'] ) > 0 ){ ?> + + + +
    + +
      +
    • + +
        +
      • + +
      • + gzip() ) : ?> +
      • + +
      • + +
      +
    • +
    • + +
        +
      • +
      +
    • +
    • + +
        +
      • +
      +
    • +
    + +
    + +
    +
    + + +
    + +
    + +
    + +
    + +
    + +

    + + + + + +
    + +
    +
    +
    +
    +
    + +

    add one?', 'wp-sync-db' ); ?>

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + +
    + + + + + + + + + +
    + + + + + + + + +
    + + + + + + + + +
    Add Row
    + +
    New URL Missing — Please enter the protocol-relative URL of the remote website in the "New URL" field. If you are unsure of what this URL should be, please consult our documentation on find and replace fields.', 'wp-sync-db' ), 'https://deliciousbrains.com/wp-sync-db/documentation/#find-and-replace' ); ?>
    +
    New File Path Missing — Please enter the root file path of the remote website in the "New file path" field. If you are unsure of what the file path should be, please consult our documentation on find and replace fields.', 'wp-sync-db' ), 'https://deliciousbrains.com/wp-sync-db/documentation/#find-and-replace' ); ?>
    + +
    + +
    + get_table_sizes(); ?> +
    + +
    Tables
    +
    + + +
    + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
      +
    • + + + + +
      + WordPress Codex emphasizes that GUIDs should not be changed, this is limited to sites that are already live. If the site has never been live, I recommend replacing the GUIDs. For example, you may be developing a new site locally at dev.somedomain.com and want to migrate the site live to somedomain.com.', 'wp-sync-db' ), 'http://codex.wordpress.org/Changing_The_Site_URL#Important_GUID_Note' ); ?> +
      +
    • +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    + +
    +
    + +
    + + +
    +
      +
    • + +
    • +
    • + +
    • +
    • + +
    • +
    + +
    + +
    + + / + + / + +
    +
    + ', 'wp-sync-db' ), $this->get_upload_info( 'path' ) ); ?> +
    + + + +
    + + +
    +
      + settings['profiles'] as $profile_id => $profile ){ ++$profile_id; ?> +
    • + + +
    • + +
    • + + +
    • +
    +
    +
    + +
    +

    + +

    ".', 'wp-sync-db' ); ?>

    + +

    AFTER migration is complete, you will need to edit your local install\'s wp-config.php and change the "%1$s" variable to "".', 'wp-sync-db' ), $wpdb->prefix, $wpdb->prefix ); ?>

    + +

    +
    + +
    +

    + +

    prefix ); ?>

    + +

    " and will ignore the migrated tables. So, AFTER migration is complete, you will need to edit your remote install\'s wp-config.php and change the "" variable to "%s".', 'wp-sync-db' ), $wpdb->prefix ); ?>

    + +

    +
    + +

    + + + +

    + +
    + + settings['profiles'] ) > 0 ){ ?> + + + +
    + template( 'migrate-progress' ); + ?> + +
    diff --git a/www/wp-content/plugins/wp-sync-db/template/profile.php b/www/wp-content/plugins/wp-sync-db/template/profile.php new file mode 100755 index 0000000..66cc049 --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db/template/profile.php @@ -0,0 +1,9 @@ +
    +

    +
      + settings['profiles'] as $key => $profile ) { ++$key ?> +
    • ×
    • + +
    • +
    +
    diff --git a/www/wp-content/plugins/wp-sync-db/template/settings.php b/www/wp-content/plugins/wp-sync-db/template/settings.php new file mode 100755 index 0000000..9d99b8c --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db/template/settings.php @@ -0,0 +1,96 @@ +
    + + settings['key'] ); + $pull_checked = ( $this->settings['allow_pull'] ? ' checked="checked"' : '' ); + $push_checked = ( $this->settings['allow_push'] ? ' checked="checked"' : '' ); + $verify_ssl_checked = ( $this->settings['verify_ssl'] ? ' checked="checked"' : '' ); + $plugin_compatibility_checked = ( isset( $GLOBALS['wpsdb_compatibility'] ) ? ' checked="checked"' : '' ); + ?> + +
    + +
    +
      +
    • + requests allow this database to be exported and downloaded', 'wp-sync-db' ); ?> + +
    • +
    • + +
    • +
    • + + +
      + +
      +
    • +
    +
    + +
    + + +
    +
    + +
    + + +
    +
    +
    + +
    + +
    + + / + + / + + +

    + + +

    +
    +
    + +
    +
    +
    + +
    + get_bottleneck( 'max' ) ) ); ?> +
    +
    +
    + +
    +
    +
    + +
    +
    diff --git a/www/wp-content/plugins/wp-sync-db/wp-sync-db.php b/www/wp-content/plugins/wp-sync-db/wp-sync-db.php new file mode 100755 index 0000000..027e7d9 --- /dev/null +++ b/www/wp-content/plugins/wp-sync-db/wp-sync-db.php @@ -0,0 +1,46 @@ +