From b28382655858098e72d04f40f8d88db4c4a8e8b9 Mon Sep 17 00:00:00 2001 From: Jonathan Champ Date: Fri, 27 Feb 2026 17:35:53 +0100 Subject: [PATCH 01/10] ci: check against PHPCompatibilityWP; set runtime config --- .github/workflows/wp-plugin-ci-full.yml | 3 ++- .github/workflows/wp-plugin-ci.yml | 3 ++- composer.json | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/wp-plugin-ci-full.yml b/.github/workflows/wp-plugin-ci-full.yml index 844ec48..53adb54 100644 --- a/.github/workflows/wp-plugin-ci-full.yml +++ b/.github/workflows/wp-plugin-ci-full.yml @@ -27,7 +27,8 @@ jobs: - name: Run PHPCS on all files run: | - vendor/bin/phpcs -q -n --ignore=vendor --standard=WordPress --report=checkstyle $GITHUB_WORKSPACE | cs2pr + vendor/bin/phpcs -q -n --ignore=vendor --standard=WordPress --runtime-set text_domain shibboleth --report=checkstyle $GITHUB_WORKSPACE | cs2pr + vendor/bin/phpcs -q -n --ignore=vendor --standard=PHPCompatibilityWP --runtime-set testVersion 5.6- --runtime-set minimum_supported_wp_version 4.0 --report=checkstyle $GITHUB_WORKSPACE | cs2pr - name: Run plugin check uses: wordpress/plugin-check-action@v1 diff --git a/.github/workflows/wp-plugin-ci.yml b/.github/workflows/wp-plugin-ci.yml index 1a6ef20..8a479d7 100644 --- a/.github/workflows/wp-plugin-ci.yml +++ b/.github/workflows/wp-plugin-ci.yml @@ -32,4 +32,5 @@ jobs: run: | touch $GITHUB_WORKSPACE/tmp.php export CHANGED_FILES=$(git diff --name-only --diff-filter=AM remotes/origin/${{ github.base_ref }} | tr '\n' ' ') - vendor/bin/phpcs -q -n --ignore=vendor --standard=WordPress --report=checkstyle $GITHUB_WORKSPACE/tmp.php $(echo $CHANGED_FILES) | cs2pr + vendor/bin/phpcs -q -n --ignore=vendor --standard=WordPress --runtime-set text_domain shibboleth --report=checkstyle $GITHUB_WORKSPACE/tmp.php $(echo $CHANGED_FILES) | cs2pr + vendor/bin/phpcs -q -n --ignore=vendor --standard=PHPCompatibilityWP --runtime-set testVersion 5.6- --runtime-set minimum_supported_wp_version 4.0 --report=checkstyle $GITHUB_WORKSPACE/tmp.php $(echo $CHANGED_FILES) | cs2pr diff --git a/composer.json b/composer.json index 9071c4f..3dfaf9b 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,6 @@ { "name": "michaelryanmcneill/shibboleth", + "type": "wordpress-plugin", "description": "Shibboleth plugin for WordPress", "homepage": "https://github.com/michaelryanmcneill/shibboleth", "license": "Apache-2.0", @@ -8,7 +9,8 @@ }, "require": {}, "require-dev" : { - "wp-coding-standards/wpcs": "@stable" + "wp-coding-standards/wpcs": "@stable", + "phpcompatibility/phpcompatibility-wp": "@stable" }, "config": { "allow-plugins": { From 8372a67b4e27930592ff314933e35be5ec57ecc8 Mon Sep 17 00:00:00 2001 From: Jonathan Champ Date: Fri, 27 Feb 2026 18:52:14 +0100 Subject: [PATCH 02/10] ci: add eslint fixes; move phpcs settings to .phpcs.xml --- .eslintrc | 3 + .github/workflows/wp-plugin-ci-full.yml | 3 +- .github/workflows/wp-plugin-ci.yml | 3 +- .phpcs.xml | 91 +++++++++++++++++++++++++ assets/js/shibboleth_login_form.js | 44 ++++++------ package.json | 6 ++ 6 files changed, 123 insertions(+), 27 deletions(-) create mode 100644 .phpcs.xml create mode 100644 package.json diff --git a/.eslintrc b/.eslintrc index 719db17..3aa4ad3 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,3 +1,6 @@ { + "env" : { + "jquery": true + }, "extends": [ "plugin:@wordpress/eslint-plugin/recommended" ] } diff --git a/.github/workflows/wp-plugin-ci-full.yml b/.github/workflows/wp-plugin-ci-full.yml index 53adb54..b0af41a 100644 --- a/.github/workflows/wp-plugin-ci-full.yml +++ b/.github/workflows/wp-plugin-ci-full.yml @@ -27,8 +27,7 @@ jobs: - name: Run PHPCS on all files run: | - vendor/bin/phpcs -q -n --ignore=vendor --standard=WordPress --runtime-set text_domain shibboleth --report=checkstyle $GITHUB_WORKSPACE | cs2pr - vendor/bin/phpcs -q -n --ignore=vendor --standard=PHPCompatibilityWP --runtime-set testVersion 5.6- --runtime-set minimum_supported_wp_version 4.0 --report=checkstyle $GITHUB_WORKSPACE | cs2pr + vendor/bin/phpcs -q -n --report=checkstyle $GITHUB_WORKSPACE | cs2pr - name: Run plugin check uses: wordpress/plugin-check-action@v1 diff --git a/.github/workflows/wp-plugin-ci.yml b/.github/workflows/wp-plugin-ci.yml index 8a479d7..5cc25ad 100644 --- a/.github/workflows/wp-plugin-ci.yml +++ b/.github/workflows/wp-plugin-ci.yml @@ -32,5 +32,4 @@ jobs: run: | touch $GITHUB_WORKSPACE/tmp.php export CHANGED_FILES=$(git diff --name-only --diff-filter=AM remotes/origin/${{ github.base_ref }} | tr '\n' ' ') - vendor/bin/phpcs -q -n --ignore=vendor --standard=WordPress --runtime-set text_domain shibboleth --report=checkstyle $GITHUB_WORKSPACE/tmp.php $(echo $CHANGED_FILES) | cs2pr - vendor/bin/phpcs -q -n --ignore=vendor --standard=PHPCompatibilityWP --runtime-set testVersion 5.6- --runtime-set minimum_supported_wp_version 4.0 --report=checkstyle $GITHUB_WORKSPACE/tmp.php $(echo $CHANGED_FILES) | cs2pr + vendor/bin/phpcs -q -n --report=checkstyle $GITHUB_WORKSPACE/tmp.php $(echo $CHANGED_FILES) | cs2pr diff --git a/.phpcs.xml b/.phpcs.xml new file mode 100644 index 0000000..6c6117c --- /dev/null +++ b/.phpcs.xml @@ -0,0 +1,91 @@ + + + + + . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /vendor/* + + + /node_modules/* + diff --git a/assets/js/shibboleth_login_form.js b/assets/js/shibboleth_login_form.js index 476302a..b795e7e 100644 --- a/assets/js/shibboleth_login_form.js +++ b/assets/js/shibboleth_login_form.js @@ -2,30 +2,28 @@ * Originally from Automattic's Jetpack SSO module (v5.3) * * @see https://github.com/Automattic/jetpack/blob/5.3/modules/sso/jetpack-sso-login.js. - * @package shibboleth + * @package */ -jQuery( document ).ready( - function ( $ ) { - const body = $( 'body' ), - ssoWrap = $( '.shibboleth-wrap' ), - loginForm = $( '#loginform' ), - overflow = $( '
' ); +jQuery(document).ready(function ($) { + const body = $('body'), + ssoWrap = $('.shibboleth-wrap'), + loginForm = $('#loginform'), + overflow = $('
'); - // The overflow div is a poor man's clearfloat. We reposition the remember me - // checkbox and the submit button within that to clear the float on the - // remember me checkbox. This is important since we're positioning the SSO - // UI under the submit button. - // - // @TODO: Remove this approach once core ticket 28528 is in and we have more actions in wp-login.php. - // See - https://core.trac.wordpress.org/ticket/28528. - loginForm.append( overflow ); - overflow.append( $( 'p.forgetmenot' ), $( 'p.submit' ) ); + // The overflow div is a poor man's clearfloat. We reposition the remember me + // checkbox and the submit button within that to clear the float on the + // remember me checkbox. This is important since we're positioning the SSO + // UI under the submit button. + // + // @TODO: Remove this approach once core ticket 28528 is in and we have more actions in wp-login.php. + // See - https://core.trac.wordpress.org/ticket/28528. + loginForm.append(overflow); + overflow.append($('p.forgetmenot'), $('p.submit')); - // We reposition the SSO UI at the bottom of the login form which - // fixes a tab order issue. Then we override any styles for absolute - // positioning of the SSO UI. - loginForm.append( ssoWrap ); - body.addClass( 'shibboleth-repositioned' ); - } -); + // We reposition the SSO UI at the bottom of the login form which + // fixes a tab order issue. Then we override any styles for absolute + // positioning of the SSO UI. + loginForm.append(ssoWrap); + body.addClass('shibboleth-repositioned'); +}); diff --git a/package.json b/package.json new file mode 100644 index 0000000..e468dc6 --- /dev/null +++ b/package.json @@ -0,0 +1,6 @@ +{ + "devDependencies": { + "@wordpress/eslint-plugin": "^24.2.0", + "eslint": "^8.57.1" + } +} From 9897cf56431105ef074eea65291ec209a57a611d Mon Sep 17 00:00:00 2001 From: Jonathan Champ Date: Sat, 28 Feb 2026 12:38:24 +0100 Subject: [PATCH 03/10] ci: ignore phpcs hidden file --- .github/workflows/wp-plugin-ci-full.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/wp-plugin-ci-full.yml b/.github/workflows/wp-plugin-ci-full.yml index b0af41a..c215b45 100644 --- a/.github/workflows/wp-plugin-ci-full.yml +++ b/.github/workflows/wp-plugin-ci-full.yml @@ -33,4 +33,4 @@ jobs: uses: wordpress/plugin-check-action@v1 with: exclude-directories: '.github' - exclude-files: '.eslintrc' + exclude-files: '.eslintrc,.phpcs.xml' From 2b82597996a9e2bbf246b8e781bfab8dc57fe819 Mon Sep 17 00:00:00 2001 From: Jonathan Champ Date: Sat, 28 Feb 2026 13:47:51 +0100 Subject: [PATCH 04/10] phpcs: ruleset can be streamlined thanks to modern WordPress ruleset --- .phpcs.xml | 26 ++------------------------ 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/.phpcs.xml b/.phpcs.xml index 6c6117c..4189fd8 100644 --- a/.phpcs.xml +++ b/.phpcs.xml @@ -25,32 +25,17 @@ - - - - - - - - - - - - - - + - - - + @@ -62,13 +47,6 @@ - - - - - - - From a2849122759839b23e094a093e2297529990464f Mon Sep 17 00:00:00 2001 From: Jonathan Champ Date: Sat, 28 Feb 2026 14:20:48 +0100 Subject: [PATCH 05/10] ci: .distignore makes releases easier --- .distignore | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .distignore diff --git a/.distignore b/.distignore new file mode 100644 index 0000000..092cb31 --- /dev/null +++ b/.distignore @@ -0,0 +1,12 @@ +# Files that should not be copied to SVN. +.distignore +.eslintrc +.git/ +.github +.phpcs.xml +composer.json +composer.lock +node_modules/ +package.json +package-lock.json +vendor/ From a9833182219d87fa1276f6d58fe7ba3904d7e5e1 Mon Sep 17 00:00:00 2001 From: Jonathan Champ Date: Sat, 28 Feb 2026 14:20:48 +0100 Subject: [PATCH 06/10] ci: add .distignore to hidden file exclude; now phpcs.xml is not hidden --- .distignore | 2 +- .github/workflows/wp-plugin-ci-full.yml | 2 +- .phpcs.xml => phpcs.xml | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename .phpcs.xml => phpcs.xml (100%) diff --git a/.distignore b/.distignore index 092cb31..888155c 100644 --- a/.distignore +++ b/.distignore @@ -3,10 +3,10 @@ .eslintrc .git/ .github -.phpcs.xml composer.json composer.lock node_modules/ package.json package-lock.json +phpcs.xml vendor/ diff --git a/.github/workflows/wp-plugin-ci-full.yml b/.github/workflows/wp-plugin-ci-full.yml index c215b45..87c2449 100644 --- a/.github/workflows/wp-plugin-ci-full.yml +++ b/.github/workflows/wp-plugin-ci-full.yml @@ -33,4 +33,4 @@ jobs: uses: wordpress/plugin-check-action@v1 with: exclude-directories: '.github' - exclude-files: '.eslintrc,.phpcs.xml' + exclude-files: '.distignore,.eslintrc' diff --git a/.phpcs.xml b/phpcs.xml similarity index 100% rename from .phpcs.xml rename to phpcs.xml From 32177d14f9efbced177c4803af5a2b3117517782 Mon Sep 17 00:00:00 2001 From: Jonathan Champ Date: Sat, 28 Feb 2026 14:44:03 +0100 Subject: [PATCH 07/10] ci: instead of ignoring specific hidden files, use wp dist-archive --- .github/workflows/wp-plugin-ci-full.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/wp-plugin-ci-full.yml b/.github/workflows/wp-plugin-ci-full.yml index 87c2449..dfcc7e9 100644 --- a/.github/workflows/wp-plugin-ci-full.yml +++ b/.github/workflows/wp-plugin-ci-full.yml @@ -20,7 +20,7 @@ jobs: with: php-version: '8.1' coverage: none - tools: cs2pr + tools: cs2pr, wp-cli - name: Install Composer dependencies uses: ramsey/composer-install@v3 @@ -29,8 +29,16 @@ jobs: run: | vendor/bin/phpcs -q -n --report=checkstyle $GITHUB_WORKSPACE | cs2pr + - name: Install latest version of dist-archive-command + run: wp package install wp-cli/dist-archive-command:@stable + + - name: Build plugin + run: | + wp dist-archive . ./shibboleth.zip + mkdir tmp-build + unzip shibboleth.zip -d tmp-build + - name: Run plugin check uses: wordpress/plugin-check-action@v1 with: - exclude-directories: '.github' - exclude-files: '.distignore,.eslintrc' + build-dir: './tmp-build/shibboleth' From e73f85a9f12f298e5b7a89fdc668c60ae44bdaa4 Mon Sep 17 00:00:00 2001 From: Jonathan Champ Date: Sat, 28 Feb 2026 15:01:34 +0100 Subject: [PATCH 08/10] ci: use dist-archive v3.1.0 until wp-cli 2.13/3.0 is released --- .github/workflows/wp-plugin-ci-full.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/wp-plugin-ci-full.yml b/.github/workflows/wp-plugin-ci-full.yml index dfcc7e9..c328d22 100644 --- a/.github/workflows/wp-plugin-ci-full.yml +++ b/.github/workflows/wp-plugin-ci-full.yml @@ -30,7 +30,7 @@ jobs: vendor/bin/phpcs -q -n --report=checkstyle $GITHUB_WORKSPACE | cs2pr - name: Install latest version of dist-archive-command - run: wp package install wp-cli/dist-archive-command:@stable + run: wp package install wp-cli/dist-archive-command:v3.1.0 - name: Build plugin run: | From d58de8ed4c60c7aaf075f99a543b5047d488dc52 Mon Sep 17 00:00:00 2001 From: Jonathan Champ Date: Sat, 28 Feb 2026 15:25:46 +0100 Subject: [PATCH 09/10] ci: add GitHub README.md to .distignore --- .distignore | 1 + assets/css/shibboleth_login_form.css | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.distignore b/.distignore index 888155c..e6dfb0b 100644 --- a/.distignore +++ b/.distignore @@ -9,4 +9,5 @@ node_modules/ package.json package-lock.json phpcs.xml +README.md vendor/ diff --git a/assets/css/shibboleth_login_form.css b/assets/css/shibboleth_login_form.css index 99a8d14..92e9aa8 100644 --- a/assets/css/shibboleth_login_form.css +++ b/assets/css/shibboleth_login_form.css @@ -20,7 +20,7 @@ .shibboleth-wrap { position: absolute; - bottom: 20px; + bottom: 20px; padding: 0 24px; margin-left: -24px; margin-right: -24px; @@ -29,7 +29,7 @@ .shibboleth-repositioned .shibboleth-wrap { position: relative; - bottom: auto; + bottom: auto; padding: 0; margin-top: 16px; margin-left: 0; @@ -38,7 +38,7 @@ .shibboleth-form-display .shibboleth-wrap { position: relative; - bottom: auto; + bottom: auto; padding: 0; margin-top: 0; margin-left: 0; @@ -81,8 +81,8 @@ content: ''; height: 1px; position: absolute; - left: 0; - top: 50%; + left: 0; + top: 50%; width: 100%; } .shibboleth-or span { From 575201707d03a6eac38080e7463c4129eefba066 Mon Sep 17 00:00:00 2001 From: Jonathan Champ Date: Sat, 28 Feb 2026 16:24:13 +0100 Subject: [PATCH 10/10] cleanup: icon.png stopped being used just before 2.0 --- icon.png | Bin 3572 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 icon.png diff --git a/icon.png b/icon.png deleted file mode 100644 index 5bd629c172474057773726b6c3428da689bbc315..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3572 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