From 9430dd4a4332769175c598b978c392959cebeb9d Mon Sep 17 00:00:00 2001 From: balexey88 Date: Thu, 12 Sep 2024 16:14:31 +0300 Subject: [PATCH 1/3] Fix compatibility with BuddyPress 14.1.0 --- .github/workflows/publish-release.yml | 152 ++++++++++++++++++++++ .github/workflows/tests.yml | 2 - README.md | 2 +- SECURITY.md | 23 ++++ class-buddypress.php | 178 +++++++++++++++++--------- readme.txt | 6 +- tests/ClassBuddyPressTest.php | 52 ++++++-- tests/prepend.php | 8 ++ vendor/bin/.phpunit.result.cache | 2 +- vendor/composer/installed.php | 4 +- wp-stateless-buddypress-addon.php | 12 +- 11 files changed, 356 insertions(+), 85 deletions(-) create mode 100644 .github/workflows/publish-release.yml create mode 100644 SECURITY.md diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml new file mode 100644 index 0000000..9ff0505 --- /dev/null +++ b/.github/workflows/publish-release.yml @@ -0,0 +1,152 @@ +name: Publish Release +run-name: Publish Release + +on: + workflow_dispatch: + inputs: + release: + description: 'Release version (e.g. 1.2.3)' + required: true + prerelease: + description: 'Pre-release version (e.g. RC1, beta, etc...)' + required: false + +permissions: + contents: write + +env: + TAG: ${{ github.event.inputs.release }} + PRETAG: ${{ github.event.inputs.prerelease }} + BRANCH: temp-release-${{ github.event.inputs.release }} + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Prepare vars + id: vars + uses: actions/github-script@v7 + with: + script: | + const full_tag = [ + process.env.TAG, + process.env.PRETAG + ].filter(Boolean).join('-'); + const branch = `temp-release-${full_tag}`; + const is_prerelease = !!process.env.PRETAG; + + core.setOutput('full_tag', full_tag ); + core.setOutput('branch', branch ); + core.setOutput('is_prerelease', is_prerelease ); + + # 'ref' and 'repository' are required, otherwise repo could appear in detached head state + - name: Checkout + uses: actions/checkout@v4 + with: + ref: ${{ github.head_ref }} + repository: ${{ github.repository }} + + - name: Parse Changelog Entries + uses: actions/github-script@v7 + id: changelog + with: + script: | + const { open } = require('fs/promises'); + + const version = process.env.TAG; + const delimiter = '#### '; + const file = await open('./changes.md'); + + let description = []; + let found = false; + + for await (let line of file.readLines()) { + line = line.trim(); + + if ( line.startsWith(`${delimiter}${version}`) ) { + found = true; + continue; + } + + if (!found) continue; + if ( line.startsWith(delimiter) ) break; + + description.push(line); + } + + if ( !description.length ) core.setFailed(`Release ${version} not found in the changelog!`); + + core.setOutput('description', description.join('\n') ); + + + # cleanup files that are not needed for the release + # but keep the .git folder, because we need it for the next step + - name: Cleanup files + run: | + rm -f composer.lock || true + rm -rf tests || true + rm -rf vendor/bin || true + rm -rf vendor/composer/installers || true + find ./ -name '.git*' -not -path './.git' -type f -delete || true + find ./ -name '.git*' -not -path './.git' -type d -exec rm -rf {} \; || true + find ./vendor -name .svn -exec rm -rf {} \; || true + + # cleanup files, specific to Google API PHP library + - name: Cleanup files for Google API library + run: | + rm -f lib/Google/phpstan.neon.dist || true + rm -f lib/Google/vendor/paragonie/random_compat/build-phar.sh || true + find ./lib/Google/ -name '.repo-metadata.json' -type f -delete || true + find ./lib/Google/vendor -name .svn -exec rm -rf '{}' \; || true + + # commit changes to temporary release branch and create a new tag + - name: Commit changes + uses: EndBug/add-and-commit@v9 + with: + message: Cleanup files for release + new_branch: ${{ steps.vars.outputs.branch }} + tag: ${{ steps.vars.outputs.full_tag }} + + # generate SBOM that will be attached to a release as an artifact + - name: Create SBOM + id: sbom + uses: anchore/sbom-action@v0 + with: + path: . + output-file: sbom.spdx.json + format: spdx-json + + # create a draft release with the version changelog as a description + - name: Create Draft Release + id: draft_release + uses: softprops/action-gh-release@v2 + with: + name: "Release ${{ steps.vars.outputs.full_tag }}" + body: "${{ steps.changelog.outputs.description }}" + tag_name: ${{ steps.vars.outputs.full_tag }} + draft: true + prerelease: ${{ steps.vars.outputs.is_prerelease }} + + # attach SBOM to release + - name: Upload SBOM to release + uses: actions/upload-release-asset@v1.0.2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.draft_release.outputs.upload_url }} + asset_path: ./sbom.spdx.json + asset_name: sbom.spdx.json + asset_content_type: application/json + + # publish release using an ID from the 'draft_release' step + - name: Publish Release + uses: eregon/publish-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + release_id: ${{ steps.draft_release.outputs.id }} + + # delete temporary release branch + - name: Delete temporary release branch + run: | + git push origin --delete ${{ steps.vars.outputs.branch }} diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 076dde0..153a3ce 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -2,9 +2,7 @@ name: Tests on: push: - branches: [main] pull_request: - branches: [main] jobs: build: diff --git a/README.md b/README.md index a9f49d2..8d74cbc 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Provides compatibility between the [BuddyPress](https://wordpress.org/plugins/bu ### Notes -* Tested with BuddyPress plugin version 11.4.0 +* Tested with BuddyPress plugin version 14.1.0 ### Support, Feedback, & Contribute diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..1f1c149 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,23 @@ +# Security Policy Overview + +Thank you for using and contributing to our product. At [UDX](https://udx.io), we take the security of our products seriously and appreciate collaborative efforts to ensure the safety of our users and contributors. + +## Reporting a Security Vulnerability + +**Please do not report security vulnerabilities through public GitHub issues.** + +If you find a security vulnerability, please [submit a vulnerability report](https://github.com/udx/wp-stateless-buddypress-addon/security/advisories/new). Provide detailed information about the vulnerability to help us understand and address the issue promptly. We kindly request that you avoid public disclosure until we've had the opportunity to analyze and resolve the reported issue. + +## Responsible Disclosure + +Responsible disclosure is crucial to maintaining the security of our product. We ask for your cooperation in allowing us sufficient time to investigate and address the reported vulnerability before making it public. We will keep you informed of our progress and make every effort to address the issue promptly. + +## Supported Versions + +Security updates are provided for the latest stable release. Please ensure that you are using a supported version before reporting a security vulnerability. + +## Contact Information + +For security-related matters, please contact our security team at [security@udx.io](mailto:security@udx.io). For general inquiries, feature requests, and other non-security-related discussions, please use our regular [issue tracker](https://github.com/udx/wp-stateless-buddypress-addon/issues). + +Thank you for helping us ensure the security of WP-Stateless - BuddyPress Addon. Your contributions are greatly appreciated. diff --git a/class-buddypress.php b/class-buddypress.php index 358302d..babd81f 100644 --- a/class-buddypress.php +++ b/class-buddypress.php @@ -1,10 +1,17 @@ 'thumb', )); - $wp_uploads_dir = wp_get_upload_dir(); - - $full_avatar_path = $wp_uploads_dir['basedir'] . '/' . apply_filters('wp_stateless_file_name', $full_avatar, false); - $full_avatar = apply_filters('wp_stateless_file_name', $full_avatar, 0); - - $thumb_avatar_path = $wp_uploads_dir['basedir'] . '/' . apply_filters('wp_stateless_file_name', $thumb_avatar, false); - $thumb_avatar = apply_filters('wp_stateless_file_name', $thumb_avatar, 0); - - do_action('sm:sync::syncFile', $full_avatar, $full_avatar_path, true, array('ephemeral' => false)); - do_action('sm:sync::syncFile', $thumb_avatar, $thumb_avatar_path, true, array('ephemeral' => false)); - } + foreach ( [$full_avatar, $thumb_avatar] as $url ) { + $name = apply_filters('wp_stateless_file_name', $url, 0); + $absolutePath = apply_filters('wp_stateless_addon_files_root', ''); + $absolutePath .= '/' . $name; - /** - * Convert image url in image html to GCS URL. - * - * @param [type] $image_html html code for image. - * @return void - */ - public function bp_core_fetch_avatar($image_html) { - try { - preg_match("/src=(?:'|\")(http.*?)(?:'|\")/", $image_html, $image_url); - if (!empty($image_url[1])) { - $gs_image_url = $this->bp_core_fetch_avatar_url($image_url[1]); - $image_html = str_replace($image_url[1], $gs_image_url, $image_html); - } - } catch (\Throwable $th) { - //throw $th; + do_action( 'sm:sync::syncFile', $name, $absolutePath ); } - return $image_html; - } - - /** - * Sync then return GCS url. - * - * @param [type] $url image url. - * @return void - */ - public function bp_core_fetch_avatar_url($url) { - $wp_uploads_dir = wp_get_upload_dir(); - $name = apply_filters('wp_stateless_file_name', $url, 0); - $full_avatar_path = $wp_uploads_dir['basedir'] . '/' . $name; - - $root_dir = ud_get_stateless_media()->get('sm.root_dir'); - $root_dir = apply_filters("wp_stateless_handle_root_dir", $root_dir); - $root_dir = trim($root_dir, '/ '); // Remove any forward slash and empty space. - // Making sure that we only modify url for uploads dir. - // @todo support photo in plugins directory. - - if (strpos($name, plugins_url()) === 0) { - $name = str_replace(plugins_url() . '/', '', $name); - $name = apply_filters('wp_stateless_file_name', $name, 0); - $full_avatar_path = WP_PLUGIN_DIR . '/' . $name; - } - - if (strpos($name, "$root_dir/http") !== 0 && strpos($name, "http") !== 0 && $root_dir !== $name) { - do_action('sm:sync::syncFile', $name, $full_avatar_path, false, array('ephemeral' => false)); - $url = ud_get_stateless_media()->get_gs_host() . '/' . $name; - } - return $url; } /** @@ -121,7 +87,7 @@ public function delete_existing_avatar($return, $args) { do_action('sm:sync::deleteFile', apply_filters('wp_stateless_file_name', $full_avatar, 0)); do_action('sm:sync::deleteFile', apply_filters('wp_stateless_file_name', $thumb_avatar, 0)); - if (ud_get_stateless_media()->get('sm.mode') === 'ephemeral') { + if ( ud_get_stateless_media()->is_mode( ['ephemeral', 'stateless'] ) ) { $return = false; } @@ -164,8 +130,98 @@ public function bp_attachments_pre_get_attachment($return, $r) { } } } catch (\Throwable $th) { - //throw $th; } return $return; } + + /** + * Skip cache busting while Buddypress processes images. + * + * @param $return + * @param $filename + * @return mixed + */ + public function skip_cache_busting($return, $filename) { + $back_trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); + + foreach ($back_trace as $trace) { + if ( isset($trace['file']) && strpos($trace['file'], 'buddypress') !== false ) { + if ( isset($trace['function']) && $trace['function'] === 'sanitize_file_name' ) { + return $filename; + } + } + } + + return $return; + } + + /** + * Update args when uploading/syncing file to GCS. + * + * @param array $args + * @param string $name + * @param string $file + * @param bool $force + * + * @return array + */ + public function sync_args($args, $name, $file, $force) { + if ( !$this->is_avatar_dir($name) ) { + return $args; + } + + if ( ud_get_stateless_media()->is_mode('stateless') ) { + $args['name_with_root'] = false; + } + + $args['source'] = 'BuddyPress'; + $args['source_version'] = ''; + + try { + $args['source_version'] = bp_get_version(); + } catch (\Throwable $th) { + } + + return $args; + } + + /** + * Override BP avatar folder URL. + */ + public function bp_core_avatar_folder_url($folder_url, $item_id, $object, $avatar_dir) { + if ( ud_get_stateless_media()->is_mode( ['disabled', 'backup'] ) ) { + return $folder_url; + } + + $position = strpos($folder_url, $avatar_dir); + + if ( $position === false ) { + return $folder_url; + } + + $url = substr($folder_url, $position); + $url = apply_filters('wp_stateless_addon_files_url', '', $url); + + return $url; + } + + /** + * Override BP avatar folder. + */ + public function bp_core_avatar_folder_dir($folder_dir, $item_id, $object, $avatar_dir) { + if ( !ud_get_stateless_media()->is_mode('stateless') ) { + return $folder_dir; + } + + $position = strpos($folder_dir, $avatar_dir); + + if ( $position === false ) { + return $folder_dir; + } + + $dir = substr($folder_dir, $position); + $dir = apply_filters('wp_stateless_addon_files_url', '', $dir); + + return $dir; + } } diff --git a/readme.txt b/readme.txt index e061f36..cc24f69 100644 --- a/readme.txt +++ b/readme.txt @@ -1,11 +1,11 @@ === WP-Stateless - BuddyPress Addon === Contributors: usability_dynamics, andypotanin, ideric, maxim.peshkov, planvova, obolgun Donate link: https://udx.io -Tags: buddypress, avatars, groups, profiles, google, google cloud, google cloud storage, cdn, uploads, media, stateless, backup +Tags: buddypress, buddypress addon extension, google cloud storage, stateless, wp-stateless License: GPLv2 or later Requires PHP: 8.0 Requires at least: 5.0 -Tested up to: 6.4.1 +Tested up to: 6.6.2 Stable tag: 0.0.1 Provides compatibility between the BuddyPress and the WP-Stateless plugins. @@ -20,7 +20,7 @@ Provides compatibility between the [BuddyPress](https://wordpress.org/plugins/bu = Notes = -* Tested with BuddyPress plugin version 11.4.0 +* Tested with BuddyPress plugin version 14.1.0 = Support, Feedback, & Contribute = diff --git a/tests/ClassBuddyPressTest.php b/tests/ClassBuddyPressTest.php index 54c3853..8a39ceb 100644 --- a/tests/ClassBuddyPressTest.php +++ b/tests/ClassBuddyPressTest.php @@ -1,6 +1,6 @@ once(); + Functions\expect('add_action')->times(2); + Functions\expect('add_filter')->times(6); - $this->assertEquals( - '', - $budypress->bp_core_fetch_avatar(''), - ); + $budypress->module_init([]); } public function testShouldSyncAvatar() { @@ -111,6 +112,39 @@ public function testShouldPreGetAttachment() { $budypress->bp_attachments_pre_get_attachment(self::AVATAR_DST_URL, self::TEST_BP_DATA), ); } + + public function testShouldUpdateArgs() { + $budypress = new BuddyPress(); + + $args = $budypress->sync_args([], self::AVATAR_FILE, '', false); + + self::assertTrue( isset( $args['source'] ) ); + self::assertTrue( isset( $args['source_version'] ) ); + self::assertEquals( 'BuddyPress', $args['source'] ); + self::assertFalse( isset( $args['name_with_root'] ) ); + } + + public function testShouldUpdateArgsStateless() { + $budypress = new BuddyPress(); + + ud_get_stateless_media()->set('sm.mode', 'stateless'); + + $args = $budypress->sync_args([], self::AVATAR_FILE, '', false); + + self::assertTrue( isset( $args['source'] ) ); + self::assertTrue( isset( $args['source_version'] ) ); + self::assertEquals( 'BuddyPress', $args['source'] ); + self::assertTrue( isset( $args['name_with_root'] ) ); + } + + public function testShouldNotUpdateArgs() { + $budypress = new BuddyPress(); + + self::assertEquals( + 0, + count( $budypress->sync_args([], self::TEST_URL, '', false) ) + ); + } } function debug_backtrace($a) { diff --git a/tests/prepend.php b/tests/prepend.php index 924f11e..654fe65 100644 --- a/tests/prepend.php +++ b/tests/prepend.php @@ -31,4 +31,12 @@ public function get($key): ?string { public function get_gs_host(): string { return self::TEST_GS_HOST; } + + public function is_mode($key): ?bool { + if ( !is_array($key) ) { + $key = [$key]; + } + + return in_array( $this->options['sm.mode'], $key ); + } } diff --git a/vendor/bin/.phpunit.result.cache b/vendor/bin/.phpunit.result.cache index 6a637db..1fbb550 100644 --- a/vendor/bin/.phpunit.result.cache +++ b/vendor/bin/.phpunit.result.cache @@ -1 +1 @@ -{"version":1,"defects":{"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldInitModule":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldSkipCacheBusting":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldFetchAvatar":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldInitHooks":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldSyncAvatar":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldDeleteAvatar":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldGetAttachment":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldPreGetAttachment":4},"times":{"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldInitModule":0.008,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldSkipCacheBusting":0,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldFetchAvatar":0.004,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldInitHooks":0.111,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldSyncAvatar":0.001,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldDeleteAvatar":0,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldGetAttachment":0.004,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldPreGetAttachment":0.001}} \ No newline at end of file +{"version":1,"defects":{"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldInitModule":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldSkipCacheBusting":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldFetchAvatar":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldInitHooks":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldSyncAvatar":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldDeleteAvatar":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldGetAttachment":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldPreGetAttachment":4,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldCountHooks":4,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldFetchAvatar":4,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldDeleteAvatar":4,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldUpdateArgs":4},"times":{"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldInitModule":0.008,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldSkipCacheBusting":0,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldFetchAvatar":0.004,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldInitHooks":0.111,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldSyncAvatar":0.001,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldDeleteAvatar":0,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldGetAttachment":0.004,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldPreGetAttachment":0.001,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldInitHooks":0.122,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldCountHooks":0.003,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldFetchAvatar":0.005,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldSyncAvatar":0.001,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldDeleteAvatar":0.001,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldPreGetAttachment":0.002,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldUpdateArgs":0.001,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldUpdateArgsStateless":0,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldNotUpdateArgs":0}} \ No newline at end of file diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index 28880e3..3989256 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'udx/wp-stateless-buddypress-addon', 'pretty_version' => 'dev-main', 'version' => 'dev-main', - 'reference' => '0e0ae44b5fb28e0fe83b1f0cb3dcdc5f6135b345', + 'reference' => '633e7979370833eda96fd523a8bdb5013386728e', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -13,7 +13,7 @@ 'udx/wp-stateless-buddypress-addon' => array( 'pretty_version' => 'dev-main', 'version' => 'dev-main', - 'reference' => '0e0ae44b5fb28e0fe83b1f0cb3dcdc5f6135b345', + 'reference' => '633e7979370833eda96fd523a8bdb5013386728e', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), diff --git a/wp-stateless-buddypress-addon.php b/wp-stateless-buddypress-addon.php index 5f68456..5dd856e 100644 --- a/wp-stateless-buddypress-addon.php +++ b/wp-stateless-buddypress-addon.php @@ -6,25 +6,25 @@ * Description: Provides compatibility between the BuddyPress and the WP-Stateless plugins. * Author: UDX * Version: 0.0.1 - * Text Domain: wpsbp + * Text Domain: wp-stateless-buddypress-addon * Author URI: https://udx.io - * License: MIT + * License: GPLv2 or later * - * Copyright 2023 UDX (email: info@udx.io) + * Copyright 2024 UDX (email: info@udx.io) */ -namespace WPSL\BuddyPress; +namespace SLCA\BuddyPress; add_action('plugins_loaded', function () { if (class_exists('wpCloud\StatelessMedia\Compatibility')) { - require_once 'vendor/autoload.php'; + require_once ( dirname( __FILE__ ) . '/vendor/autoload.php' ); // Load return new BuddyPress(); } add_filter('plugin_row_meta', function ($plugin_meta, $plugin_file, $_, $__) { if ($plugin_file !== join(DIRECTORY_SEPARATOR, [basename(__DIR__), basename(__FILE__)])) return $plugin_meta; - $plugin_meta[] = sprintf('%s', __('This plugin requires WP-Stateless plugin version 4.0.0 or greater to be installed and active.')); + $plugin_meta[] = sprintf('%s', __('This plugin requires WP-Stateless plugin version 3.4.0 or greater to be installed and active.', 'wp-stateless-buddypress-addon')); return $plugin_meta; }, 10, 4); }); From 0974f8d83917b8e8489e9ab0bfa26e4a4659407f Mon Sep 17 00:00:00 2001 From: balexey88 Date: Wed, 16 Oct 2024 23:11:25 +0300 Subject: [PATCH 2/3] Prepare for publishing --- readme.txt | 2 +- vendor/bin/.phpunit.result.cache | 2 +- vendor/composer/installed.php | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/readme.txt b/readme.txt index cc24f69..d527c2e 100644 --- a/readme.txt +++ b/readme.txt @@ -1,5 +1,5 @@ === WP-Stateless - BuddyPress Addon === -Contributors: usability_dynamics, andypotanin, ideric, maxim.peshkov, planvova, obolgun +Contributors: usability_dynamics, andypotanin, ideric, planvova, obolgun Donate link: https://udx.io Tags: buddypress, buddypress addon extension, google cloud storage, stateless, wp-stateless License: GPLv2 or later diff --git a/vendor/bin/.phpunit.result.cache b/vendor/bin/.phpunit.result.cache index 1fbb550..cf7da42 100644 --- a/vendor/bin/.phpunit.result.cache +++ b/vendor/bin/.phpunit.result.cache @@ -1 +1 @@ -{"version":1,"defects":{"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldInitModule":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldSkipCacheBusting":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldFetchAvatar":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldInitHooks":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldSyncAvatar":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldDeleteAvatar":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldGetAttachment":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldPreGetAttachment":4,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldCountHooks":4,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldFetchAvatar":4,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldDeleteAvatar":4,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldUpdateArgs":4},"times":{"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldInitModule":0.008,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldSkipCacheBusting":0,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldFetchAvatar":0.004,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldInitHooks":0.111,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldSyncAvatar":0.001,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldDeleteAvatar":0,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldGetAttachment":0.004,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldPreGetAttachment":0.001,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldInitHooks":0.122,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldCountHooks":0.003,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldFetchAvatar":0.005,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldSyncAvatar":0.001,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldDeleteAvatar":0.001,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldPreGetAttachment":0.002,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldUpdateArgs":0.001,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldUpdateArgsStateless":0,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldNotUpdateArgs":0}} \ No newline at end of file +{"version":1,"defects":{"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldInitModule":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldSkipCacheBusting":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldFetchAvatar":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldInitHooks":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldSyncAvatar":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldDeleteAvatar":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldGetAttachment":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldPreGetAttachment":4,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldCountHooks":4,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldFetchAvatar":4,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldDeleteAvatar":4,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldUpdateArgs":4},"times":{"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldInitModule":0.008,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldSkipCacheBusting":0,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldFetchAvatar":0.004,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldInitHooks":0.111,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldSyncAvatar":0.001,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldDeleteAvatar":0,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldGetAttachment":0.004,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldPreGetAttachment":0.001,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldInitHooks":0.118,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldCountHooks":0.003,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldFetchAvatar":0.005,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldSyncAvatar":0.001,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldDeleteAvatar":0.001,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldPreGetAttachment":0.002,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldUpdateArgs":0.001,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldUpdateArgsStateless":0,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldNotUpdateArgs":0}} \ No newline at end of file diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index 3989256..b80081a 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'udx/wp-stateless-buddypress-addon', 'pretty_version' => 'dev-main', 'version' => 'dev-main', - 'reference' => '633e7979370833eda96fd523a8bdb5013386728e', + 'reference' => '9430dd4a4332769175c598b978c392959cebeb9d', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -13,7 +13,7 @@ 'udx/wp-stateless-buddypress-addon' => array( 'pretty_version' => 'dev-main', 'version' => 'dev-main', - 'reference' => '633e7979370833eda96fd523a8bdb5013386728e', + 'reference' => '9430dd4a4332769175c598b978c392959cebeb9d', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), From a609f8069d78f89eda99035072201433af08c729 Mon Sep 17 00:00:00 2001 From: balexey88 Date: Wed, 16 Oct 2024 23:19:56 +0300 Subject: [PATCH 3/3] Prepare for publishing --- class-buddypress.php | 63 -------------------------------- tests/ClassBuddyPressTest.php | 15 +------- vendor/bin/.phpunit.result.cache | 2 +- vendor/composer/installed.php | 4 +- 4 files changed, 4 insertions(+), 80 deletions(-) diff --git a/class-buddypress.php b/class-buddypress.php index babd81f..2390c0b 100644 --- a/class-buddypress.php +++ b/class-buddypress.php @@ -28,10 +28,8 @@ public function module_init( $sm ) { add_filter('bp_core_avatar_folder_url', array($this, 'bp_core_avatar_folder_url'), 10, 4); add_filter('bp_core_avatar_folder_dir', array($this, 'bp_core_avatar_folder_dir'), 10, 4); - add_filter('stateless_skip_cache_busting', array($this, 'skip_cache_busting'), 20, 2); add_filter('sm:sync::syncArgs', array($this, 'sync_args'), 10, 4); add_filter('bp_core_pre_delete_existing_avatar', array($this, 'delete_existing_avatar'), 10, 2); - add_filter('bp_attachments_pre_get_attachment', array($this, 'bp_attachments_pre_get_attachment'), 10, 2); } /** @@ -94,67 +92,6 @@ public function delete_existing_avatar($return, $args) { return $return; } - /** - * Sync and return GCS url for group images. - * - * Used as CSS background-image. - * - * @param [type] $return - * @param [type] $r - * @return void - */ - public function bp_attachments_pre_get_attachment($return, $r) { - // Return if this is a recursive call. - if (!empty($r['recursive'])) { - return $return; - } - - try { - $debug_backtrace = debug_backtrace(false); - - // Making sure we only return GCS link if the type is url. - if (!empty($debug_backtrace[3]['args'][0]) && $debug_backtrace[3]['args'][0] == 'url') { - $r['recursive'] = true; - - $url = bp_attachments_get_attachment('url', $r); - $name = apply_filters('wp_stateless_file_name', $url, 0); - - $root_dir = ud_get_stateless_media()->get('sm.root_dir'); - $root_dir = apply_filters("wp_stateless_handle_root_dir", $root_dir); - $root_dir = trim($root_dir, '/ '); // Remove any forward slash and empty space. - - if (!empty($name) && $root_dir . "/" != $name) { - $full_path = bp_attachments_get_attachment(false, $r); - do_action('sm:sync::syncFile', $name, $full_path, false, array('ephemeral' => false)); - $return = ud_get_stateless_media()->get_gs_host() . '/' . $name; - } - } - } catch (\Throwable $th) { - } - return $return; - } - - /** - * Skip cache busting while Buddypress processes images. - * - * @param $return - * @param $filename - * @return mixed - */ - public function skip_cache_busting($return, $filename) { - $back_trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); - - foreach ($back_trace as $trace) { - if ( isset($trace['file']) && strpos($trace['file'], 'buddypress') !== false ) { - if ( isset($trace['function']) && $trace['function'] === 'sanitize_file_name' ) { - return $filename; - } - } - } - - return $return; - } - /** * Update args when uploading/syncing file to GCS. * diff --git a/tests/ClassBuddyPressTest.php b/tests/ClassBuddyPressTest.php index 8a39ceb..ba78486 100644 --- a/tests/ClassBuddyPressTest.php +++ b/tests/ClassBuddyPressTest.php @@ -72,8 +72,6 @@ public function testShouldInitHooks() { self::assertNotFalse( has_filter('bp_core_avatar_folder_url', [ $budypress, 'bp_core_avatar_folder_url' ]) ); self::assertNotFalse( has_filter('bp_core_avatar_folder_dir', [ $budypress, 'bp_core_avatar_folder_dir' ]) ); self::assertNotFalse( has_filter('bp_core_pre_delete_existing_avatar', [ $budypress, 'delete_existing_avatar' ]) ); - self::assertNotFalse( has_filter('bp_attachments_pre_get_attachment', [ $budypress, 'bp_attachments_pre_get_attachment' ]) ); - self::assertNotFalse( has_filter('stateless_skip_cache_busting', [ $budypress, 'skip_cache_busting' ]) ); self::assertNotFalse( has_filter('sm:sync::syncArgs', [ $budypress, 'sync_args' ]) ); } @@ -81,7 +79,7 @@ public function testShouldCountHooks() { $budypress = new BuddyPress(); Functions\expect('add_action')->times(2); - Functions\expect('add_filter')->times(6); + Functions\expect('add_filter')->times(4); $budypress->module_init([]); } @@ -102,17 +100,6 @@ public function testShouldDeleteAvatar() { $budypress->delete_existing_avatar(self::AVATAR_SRC_URL, self::TEST_BP_DATA); } - public function testShouldPreGetAttachment() { - $budypress = new BuddyPress(); - - Actions\expectDone('sm:sync::syncFile')->once(); - - $this->assertEquals( - self::AVATAR_DST_URL, - $budypress->bp_attachments_pre_get_attachment(self::AVATAR_DST_URL, self::TEST_BP_DATA), - ); - } - public function testShouldUpdateArgs() { $budypress = new BuddyPress(); diff --git a/vendor/bin/.phpunit.result.cache b/vendor/bin/.phpunit.result.cache index cf7da42..658d02c 100644 --- a/vendor/bin/.phpunit.result.cache +++ b/vendor/bin/.phpunit.result.cache @@ -1 +1 @@ -{"version":1,"defects":{"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldInitModule":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldSkipCacheBusting":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldFetchAvatar":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldInitHooks":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldSyncAvatar":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldDeleteAvatar":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldGetAttachment":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldPreGetAttachment":4,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldCountHooks":4,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldFetchAvatar":4,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldDeleteAvatar":4,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldUpdateArgs":4},"times":{"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldInitModule":0.008,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldSkipCacheBusting":0,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldFetchAvatar":0.004,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldInitHooks":0.111,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldSyncAvatar":0.001,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldDeleteAvatar":0,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldGetAttachment":0.004,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldPreGetAttachment":0.001,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldInitHooks":0.118,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldCountHooks":0.003,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldFetchAvatar":0.005,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldSyncAvatar":0.001,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldDeleteAvatar":0.001,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldPreGetAttachment":0.002,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldUpdateArgs":0.001,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldUpdateArgsStateless":0,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldNotUpdateArgs":0}} \ No newline at end of file +{"version":1,"defects":{"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldInitModule":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldSkipCacheBusting":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldFetchAvatar":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldInitHooks":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldSyncAvatar":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldDeleteAvatar":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldGetAttachment":4,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldPreGetAttachment":4,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldCountHooks":4,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldFetchAvatar":4,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldDeleteAvatar":4,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldUpdateArgs":4,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldPreGetAttachment":4},"times":{"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldInitModule":0.008,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldSkipCacheBusting":0,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldFetchAvatar":0.004,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldInitHooks":0.111,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldSyncAvatar":0.001,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldDeleteAvatar":0,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldGetAttachment":0.004,"WPSL\\BuddyPress\\ClassBuddyPressTest::testShouldPreGetAttachment":0.001,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldInitHooks":0.122,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldCountHooks":0.003,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldFetchAvatar":0.005,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldSyncAvatar":0.001,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldDeleteAvatar":0.001,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldPreGetAttachment":0.005,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldUpdateArgs":0.002,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldUpdateArgsStateless":0,"SLCA\\BuddyPress\\ClassBuddyPressTest::testShouldNotUpdateArgs":0}} \ No newline at end of file diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index b80081a..d0b3da9 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'udx/wp-stateless-buddypress-addon', 'pretty_version' => 'dev-main', 'version' => 'dev-main', - 'reference' => '9430dd4a4332769175c598b978c392959cebeb9d', + 'reference' => '0974f8d83917b8e8489e9ab0bfa26e4a4659407f', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -13,7 +13,7 @@ 'udx/wp-stateless-buddypress-addon' => array( 'pretty_version' => 'dev-main', 'version' => 'dev-main', - 'reference' => '9430dd4a4332769175c598b978c392959cebeb9d', + 'reference' => '0974f8d83917b8e8489e9ab0bfa26e4a4659407f', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(),