Changeset 3680213
- Timestamp:
- 09/03/2026 06:27:10 PM (7 weeks ago)
- Location:
- guard-dog/trunk
- Files:
-
- 1 deleted
- 6 edited
-
guard-dog.php (modified) (1 diff)
-
includes/class-guard-dog.php (modified) (1 diff)
-
includes/features/class-access-control.php (modified) (2 diffs)
-
includes/features/class-password-policy.php (modified) (4 diffs)
-
includes/views/emails/test-template-override.php (deleted)
-
readme.txt (modified) (3 diffs)
-
vendor/composer/installed.php (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
guard-dog/trunk/guard-dog.php
r3680105 r3680213 4 4 * Plugin URI: https://guarddog.cc/ 5 5 * Description: Security plugin for login protection, custom login URL, 2FA, and more. 6 * Version: 1.9.5 76 * Version: 1.9.58 7 7 * Author: Adam Greenwell 8 8 * Author URI: https://adamgreenwell.com -
guard-dog/trunk/includes/class-guard-dog.php
r3680105 r3680213 16 16 * @var string 17 17 */ 18 public $version = '1.9.5 7';18 public $version = '1.9.58'; 19 19 20 20 /** -
guard-dog/trunk/includes/features/class-access-control.php
r3680105 r3680213 724 724 } 725 725 726 // A dual-stack server reports an ordinary IPv4 visitor as ::ffff:203.0.113.5, while 727 // administrators write rules as 203.0.113.5 or 203.0.113.0/24. Matching only the 728 // literal form let those visitors past every IPv4 rule, because the comparison below 729 // is version-gated and exact. Test every spelling of the same address instead. 730 foreach ($this->equivalent_ip_forms($ip) as $candidate) { 731 if ($this->matches_ip_list($candidate, $list)) { 732 return true; 733 } 734 } 735 736 return false; 737 } 738 739 /** 740 * Every spelling of one address that a rule might reasonably be written in. 741 * 742 * IPv4-mapped IPv6 and dotted-quad are the same host. Which one appears in 743 * REMOTE_ADDR depends on the server's stack, and which one appears in a rule depends 744 * on what the administrator typed, so the two sides frequently disagree. 745 * 746 * @since 1.9.58 747 * @param string $ip A validated IP address. 748 * @return string[] The address plus its equivalent notation, if one exists. 749 */ 750 private function equivalent_ip_forms($ip) { 751 $forms = [$ip]; 752 753 if (stripos($ip, '::ffff:') === 0) { 754 $mapped = substr($ip, 7); 755 if (filter_var($mapped, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { 756 $forms[] = $mapped; 757 } 758 } elseif (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { 759 $forms[] = '::ffff:' . $ip; 760 } 761 762 return $forms; 763 } 764 765 /** 766 * Match a single spelling of an address against the list. 767 * 768 * This is the original body of is_ip_in_list(); that method now calls it once per 769 * equivalent form of the address. 770 * 771 * @since 1.9.58 772 * @param string $ip The IP address to check. 773 * @param array $list An array of IP addresses or CIDR ranges. 774 * @return bool True if the IP matches an entry in the list, false otherwise. 775 */ 776 private function matches_ip_list($ip, $list) { 726 777 // Determine IP version once 727 778 $ip_version = filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) ? 4 : … … 882 933 883 934 $missing_parts = 8 - count($left_parts) - count($right_parts); 935 936 // "::" must stand for at least one omitted group. Without this guard an 937 // over-long address such as 1:2:3:4:5:6:7:8::9 drives $missing_parts negative 938 // and array_fill() raises a ValueError, which is a fatal rather than a 939 // non-match. Reject the address instead. 940 if ($missing_parts < 1) { 941 return false; 942 } 943 884 944 $zeros = array_fill(0, $missing_parts, '0000'); 885 945 -
guard-dog/trunk/includes/features/class-password-policy.php
r3680072 r3680213 28 28 29 29 /** 30 * ID of the user authenticated by an application password on this request, if any. 31 * 32 * Application passwords are separate credentials from the account password, so 33 * account-password expiration must not be applied to them. Recorded per user ID 34 * rather than as a boolean so that a later wp_signon() for a different user in the 35 * same request does not inherit the exemption. 36 * 37 * @var int 38 * @since 1.9.58 39 */ 40 private $application_password_user_id = 0; 41 42 /** 30 43 * Constructor. 31 44 * … … 100 113 // (priority 25), preserving the expiration-before-2FA ordering. 101 114 add_filter('authenticate', [$this, 'check_password_expiration_on_login'], 22, 3); 115 116 // Core fires this from within wp_authenticate_application_password(), which 117 // also runs on `authenticate` at priority 20 - so the flag is set before the 118 // expiration check above reads it. 119 add_action('application_password_did_authenticate', [$this, 'note_application_password_auth'], 10, 1); 102 120 103 121 // Handle inline password reset form … … 851 869 * @return WP_User|WP_Error|null User object, error, or null. 852 870 */ 871 /** 872 * Whether this request arrived over a transport that cannot follow an HTML redirect. 873 * 874 * REST and XML-RPC clients receive a response body, not a browser redirect, so the 875 * inline reset form is unreachable for them and the expiry check must refuse instead. 876 * 877 * Protected rather than inline so the branch is reachable from tests without 878 * define()-ing a constant, which cannot be undone and would leak into every later 879 * test in the process. 880 * 881 * @since 1.9.58 882 * @return bool True when the current request is a REST or XML-RPC request. 883 */ 884 protected function is_api_request() { 885 return (defined('REST_REQUEST') && REST_REQUEST) 886 || (defined('XMLRPC_REQUEST') && XMLRPC_REQUEST); 887 } 888 889 /** 890 * Record that an application password authenticated this request. 891 * 892 * @since 1.9.58 893 * @param WP_User $user The user the application password authenticated. 894 * @return void 895 */ 896 public function note_application_password_auth($user) { 897 $this->application_password_user_id = ($user instanceof WP_User) ? (int) $user->ID : 0; 898 } 899 853 900 public function check_password_expiration_on_login($user, $username = '', $password = '') { 854 901 // Only act once the primary credential has actually been accepted. A failed … … 858 905 } 859 906 860 // API transports cannot follow an HTML redirect, and application passwords 861 // authenticate on this same filter for XML-RPC. Those are separate credentials 862 // from the account password this policy governs, so leave them alone. 863 if ((defined('REST_REQUEST') && REST_REQUEST) || (defined('XMLRPC_REQUEST') && XMLRPC_REQUEST)) { 907 // An application password is a separate credential from the account password this 908 // policy governs, so an expired account password must neither block it nor be 909 // waived by it. Core fires application_password_did_authenticate from inside the 910 // priority-20 callback, so the flag is already set by the time this filter runs. 911 if ($this->application_password_user_id === (int) $user->ID) { 864 912 return $user; 865 913 } 866 914 867 915 if ($this->check_password_expiration($user->ID)) { 916 // An API client cannot follow the HTML redirect below. Refuse the request 917 // rather than return the user: exempting the whole transport would let an 918 // expired account password authenticate over XML-RPC, which is the one 919 // outcome this policy exists to prevent. 920 if ($this->is_api_request()) { 921 return new WP_Error( 922 'guard_dog_password_expired', 923 __('This account password has expired. Sign in through the site to set a new one.', 'guard-dog') 924 ); 925 } 926 868 927 // Password is expired - redirect to inline reset form instead of returning error 869 928 -
guard-dog/trunk/readme.txt
r3680105 r3680213 5 5 Tested up to: 7.1 6 6 Requires PHP: 8.1 7 Stable tag: 1.9.5 77 Stable tag: 1.9.58 8 8 License: GPLv2 or later 9 9 License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 145 145 == Changelog == 146 146 147 = 1.9.58 = 148 * Fix an expired account password being accepted over the XML-RPC and REST interfaces instead of being refused 149 * Fix IPv6 and IPv4 access rules not matching each other's address notation, so a rule written as 203.0.113.0/24 now also matches a visitor the server reports as ::ffff:203.0.113.5 150 * Reject malformed IPv6 addresses that could previously stop access-control checks with a fatal error 151 147 152 = 1.9.57 = 148 * Fix IPv6 blocking rules ignoring visitors whose address is reported in IPv4-mapped form, which let those visitors through every IPv6 range rule153 * Fix IPv6 access rules, both allow and block lists and at login as well as on every request, ignoring visitors whose address is reported in IPv4-mapped form 149 154 150 155 = 1.9.56 = 151 * Fix logging out on sites using a custom login URL, which returned a blank page instead of completing the logout152 * Fix a custom login slug of "login" being mistaken for the default WordPress login page, so login URLs rewrite correctly153 * Require the account password to be verified before the expired-password reset form is offered 154 * Require CAPTCHA on every login attempt, including attempts that present themselves as a two-factor step156 * Fix direct wp-login.php requests returning a blank page on sites using a custom login URL, so logout, password reset, registration and other allowed actions complete normally 157 * Fix custom login slugs that appear as text inside the site's own login URL (such as "login") being treated as already rewritten, which stopped those slugs taking effect 158 * Require the account password to be verified before the expired-password reset form is offered, and stop that redirect interrupting REST API and XML-RPC authentication, which those clients cannot follow 159 * Require a login attempt to prove it belongs to a pending two-factor step before it may skip the CAPTCHA; an attempt that merely claims to be one must now solve it 155 160 * Stop signing a user in when two-factor setup is required but no setup method is available 156 161 * Keep internal security reports out of the released plugin package … … 407 412 == Upgrade Notice == 408 413 414 = 1.9.58 = 415 Security fix. An expired account password could be accepted over XML-RPC and the REST API instead of being refused; it is now refused. Also completes the 1.9.57 access-rule fix, so IPv4 rules match visitors reported in IPv4-mapped form. Read the 1.9.57 note below before updating: your access rules may start matching visitors they did not match before. 416 409 417 = 1.9.57 = 410 Fixes IP v6 access rules silently failing to match visitors on dual-stack servers, where an ordinary IPv4 visitor is reported in IPv4-mapped form. If you rely on IPv6 range rules, they were not being applied to those visitors. No settings change, and no user who could sign in before will be locked out by this update.418 Fixes IP access rules silently failing to match visitors on dual-stack servers, where an ordinary IPv4 visitor is reported in IPv4-mapped form. Rules you already configured now apply to those visitors, in both directions: a blocklist range will begin blocking visitors it covers, and an allowlist range will begin admitting them. No settings change, but review your IP rules before updating if any of them are broad. 411 419 412 420 = 1.9.56 = -
guard-dog/trunk/vendor/composer/installed.php
r3680105 r3680213 3 3 namespace GuardDog\Vendor; 4 4 5 return array('root' => array('name' => 'adamgreenwell/guard-dog', 'pretty_version' => 'dev-main', 'version' => 'dev-main', 'reference' => ' aace27933a49d55b965ca42b9844fb07ee9e415c', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev' => \false), 'versions' => array('adamgreenwell/guard-dog' => array('pretty_version' => 'dev-main', 'version' => 'dev-main', 'reference' => 'aace27933a49d55b965ca42b9844fb07ee9e415c', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev_requirement' => \false), 'bacon/bacon-qr-code' => array('pretty_version' => 'v3.0.3', 'version' => '3.0.3.0', 'reference' => '36a1cb2b81493fa5b82e50bf8068bf84d1542563', 'type' => 'library', 'install_path' => __DIR__ . '/../bacon/bacon-qr-code', 'aliases' => array(), 'dev_requirement' => \false), 'brick/math' => array('pretty_version' => '0.13.1', 'version' => '0.13.1.0', 'reference' => 'fc7ed316430118cc7836bf45faff18d5dfc8de04', 'type' => 'library', 'install_path' => __DIR__ . '/../brick/math', 'aliases' => array(), 'dev_requirement' => \false), 'dasprid/enum' => array('pretty_version' => '1.0.7', 'version' => '1.0.7.0', 'reference' => 'b5874fa9ed0043116c72162ec7f4fb50e02e7cce', 'type' => 'library', 'install_path' => __DIR__ . '/../dasprid/enum', 'aliases' => array(), 'dev_requirement' => \false), 'doctrine/deprecations' => array('pretty_version' => '1.1.5', 'version' => '1.1.5.0', 'reference' => '459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38', 'type' => 'library', 'install_path' => __DIR__ . '/../doctrine/deprecations', 'aliases' => array(), 'dev_requirement' => \false), 'firebase/php-jwt' => array('pretty_version' => 'v7.0.5', 'version' => '7.0.5.0', 'reference' => '47ad26bab5e7c70ae8a6f08ed25ff83631121380', 'type' => 'library', 'install_path' => __DIR__ . '/../firebase/php-jwt', 'aliases' => array(), 'dev_requirement' => \false), 'guzzlehttp/guzzle' => array('pretty_version' => '7.10.0', 'version' => '7.10.0.0', 'reference' => 'b51ac707cfa420b7bfd4e4d5e510ba8008e822b4', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/guzzle', 'aliases' => array(), 'dev_requirement' => \false), 'guzzlehttp/promises' => array('pretty_version' => '2.3.0', 'version' => '2.3.0.0', 'reference' => '481557b130ef3790cf82b713667b43030dc9c957', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/promises', 'aliases' => array(), 'dev_requirement' => \false), 'guzzlehttp/psr7' => array('pretty_version' => '2.8.0', 'version' => '2.8.0.0', 'reference' => '21dc724a0583619cd1652f673303492272778051', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/psr7', 'aliases' => array(), 'dev_requirement' => \false), 'lcobucci/clock' => array('pretty_version' => '2.2.0', 'version' => '2.2.0.0', 'reference' => 'fb533e093fd61321bfcbac08b131ce805fe183d3', 'type' => 'library', 'install_path' => __DIR__ . '/../lcobucci/clock', 'aliases' => array(), 'dev_requirement' => \false), 'league/oauth2-client' => array('pretty_version' => '2.9.0', 'version' => '2.9.0.0', 'reference' => '26e8c5da4f3d78cede7021e09b1330a0fc093d5e', 'type' => 'library', 'install_path' => __DIR__ . '/../league/oauth2-client', 'aliases' => array(), 'dev_requirement' => \false), 'league/oauth2-google' => array('pretty_version' => '4.1.0', 'version' => '4.1.0.0', 'reference' => '8b9bb43740ac6d994aca881a35f7bacbe98c0ffb', 'type' => 'library', 'install_path' => __DIR__ . '/../league/oauth2-google', 'aliases' => array(), 'dev_requirement' => \false), 'paragonie/constant_time_encoding' => array('pretty_version' => 'v3.1.3', 'version' => '3.1.3.0', 'reference' => 'd5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77', 'type' => 'library', 'install_path' => __DIR__ . '/../paragonie/constant_time_encoding', 'aliases' => array(), 'dev_requirement' => \false), 'phpdocumentor/reflection-common' => array('pretty_version' => '2.2.0', 'version' => '2.2.0.0', 'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b', 'type' => 'library', 'install_path' => __DIR__ . '/../phpdocumentor/reflection-common', 'aliases' => array(), 'dev_requirement' => \false), 'phpdocumentor/reflection-docblock' => array('pretty_version' => '5.6.6', 'version' => '5.6.6.0', 'reference' => '5cee1d3dfc2d2aa6599834520911d246f656bcb8', 'type' => 'library', 'install_path' => __DIR__ . '/../phpdocumentor/reflection-docblock', 'aliases' => array(), 'dev_requirement' => \false), 'phpdocumentor/type-resolver' => array('pretty_version' => '1.12.0', 'version' => '1.12.0.0', 'reference' => '92a98ada2b93d9b201a613cb5a33584dde25f195', 'type' => 'library', 'install_path' => __DIR__ . '/../phpdocumentor/type-resolver', 'aliases' => array(), 'dev_requirement' => \false), 'phpstan/phpdoc-parser' => array('pretty_version' => '2.3.1', 'version' => '2.3.1.0', 'reference' => '16dbf9937da8d4528ceb2145c9c7c0bd29e26374', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpdoc-parser', 'aliases' => array(), 'dev_requirement' => \false), 'pragmarx/google2fa' => array('pretty_version' => 'v8.0.3', 'version' => '8.0.3.0', 'reference' => '6f8d87ebd5afbf7790bde1ffc7579c7c705e0fad', 'type' => 'library', 'install_path' => __DIR__ . '/../pragmarx/google2fa', 'aliases' => array(), 'dev_requirement' => \false), 'psr/clock' => array('pretty_version' => '1.0.0', 'version' => '1.0.0.0', 'reference' => 'e41a24703d4560fd0acb709162f73b8adfc3aa0d', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/clock', 'aliases' => array(), 'dev_requirement' => \false), 'psr/event-dispatcher' => array('pretty_version' => '1.0.0', 'version' => '1.0.0.0', 'reference' => 'dbefd12671e8a14ec7f180cab83036ed26714bb0', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/event-dispatcher', 'aliases' => array(), 'dev_requirement' => \false), 'psr/http-client' => array('pretty_version' => '1.0.3', 'version' => '1.0.3.0', 'reference' => 'bb5906edc1c324c9a05aa0873d40117941e5fa90', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-client', 'aliases' => array(), 'dev_requirement' => \false), 'psr/http-client-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.0')), 'psr/http-factory' => array('pretty_version' => '1.1.0', 'version' => '1.1.0.0', 'reference' => '2b4765fddfe3b508ac62f829e852b1501d3f6e8a', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-factory', 'aliases' => array(), 'dev_requirement' => \false), 'psr/http-factory-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.0')), 'psr/http-message' => array('pretty_version' => '2.0', 'version' => '2.0.0.0', 'reference' => '402d35bcb92c70c026d1a6a9883f06b2ead23d71', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-message', 'aliases' => array(), 'dev_requirement' => \false), 'psr/http-message-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.0')), 'psr/log' => array('pretty_version' => '3.0.2', 'version' => '3.0.2.0', 'reference' => 'f16e1d5863e37f8d8c2a01719f5b34baa2b714d3', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/log', 'aliases' => array(), 'dev_requirement' => \false), 'ralouphie/getallheaders' => array('pretty_version' => '3.0.3', 'version' => '3.0.3.0', 'reference' => '120b605dfeb996808c31b6477290a714d356e822', 'type' => 'library', 'install_path' => __DIR__ . '/../ralouphie/getallheaders', 'aliases' => array(), 'dev_requirement' => \false), 'spomky-labs/cbor-php' => array('pretty_version' => '3.2.2', 'version' => '3.2.2.0', 'reference' => '2a5fb86aacfe1004611370ead6caa2bfc88435d0', 'type' => 'library', 'install_path' => __DIR__ . '/../spomky-labs/cbor-php', 'aliases' => array(), 'dev_requirement' => \false), 'spomky-labs/pki-framework' => array('pretty_version' => '1.4.1', 'version' => '1.4.1.0', 'reference' => 'f0e9a548df4e3942886adc9b7830581a46334631', 'type' => 'library', 'install_path' => __DIR__ . '/../spomky-labs/pki-framework', 'aliases' => array(), 'dev_requirement' => \false), 'stella-maris/clock' => array('pretty_version' => '0.1.7', 'version' => '0.1.7.0', 'reference' => 'fa23ce16019289a18bb3446fdecd45befcdd94f8', 'type' => 'library', 'install_path' => __DIR__ . '/../stella-maris/clock', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/deprecation-contracts' => array('pretty_version' => 'v3.7.0', 'version' => '3.7.0.0', 'reference' => '50f59d1f3ca46d41ac911f97a78626b6756af35b', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-ctype' => array('pretty_version' => 'v1.37.0', 'version' => '1.37.0.0', 'reference' => '141046a8f9477948ff284fa65be2095baafb94f2', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-ctype', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-intl-grapheme' => array('pretty_version' => 'v1.37.0', 'version' => '1.37.0.0', 'reference' => '4864388bfbd3001ce88e234fab652acd91fdc57e', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-grapheme', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-intl-normalizer' => array('pretty_version' => 'v1.37.0', 'version' => '1.37.0.0', 'reference' => '3833d7255cc303546435cb650316bff708a1c75c', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-mbstring' => array('pretty_version' => 'v1.37.0', 'version' => '1.37.0.0', 'reference' => '6a21eb99c6973357967f6ce3708cd55a6bec6315', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-uuid' => array('pretty_version' => 'v1.33.0', 'version' => '1.33.0.0', 'reference' => '21533be36c24be3f4b1669c4725c7d1d2bab4ae2', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-uuid', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/property-access' => array('pretty_version' => 'v6.4.32', 'version' => '6.4.32.0', 'reference' => '6dfa655ac9e9860c05cabb287f34da86b18c237e', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/property-access', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/property-info' => array('pretty_version' => 'v6.4.32', 'version' => '6.4.32.0', 'reference' => '5dda35816740c390bf374897a018256c7ede7ecc', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/property-info', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/serializer' => array('pretty_version' => 'v6.4.32', 'version' => '6.4.32.0', 'reference' => '8e02b21b88a4978aad275f002f614ac9eb52469b', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/serializer', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/string' => array('pretty_version' => 'v6.4.39', 'version' => '6.4.39.0', 'reference' => '62e3c927de664edadb5bef260987eb047a17a113', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/string', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/uid' => array('pretty_version' => 'v6.4.32', 'version' => '6.4.32.0', 'reference' => '6b973c385f00341b246f697d82dc01a09107acdd', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/uid', 'aliases' => array(), 'dev_requirement' => \false), 'thenetworg/oauth2-azure' => array('pretty_version' => 'v2.2.3', 'version' => '2.2.3.0', 'reference' => '074b57e19f4aa9634d20b2e4eda909e1127e4e66', 'type' => 'library', 'install_path' => __DIR__ . '/../thenetworg/oauth2-azure', 'aliases' => array(), 'dev_requirement' => \false), 'web-auth/cose-lib' => array('pretty_version' => '4.5.0', 'version' => '4.5.0.0', 'reference' => '5adac6fe126994a3ee17ed9950efb4947ab132a9', 'type' => 'library', 'install_path' => __DIR__ . '/../web-auth/cose-lib', 'aliases' => array(), 'dev_requirement' => \false), 'web-auth/webauthn-lib' => array('pretty_version' => '4.9.2', 'version' => '4.9.2.0', 'reference' => '008b25171c27cf4813420d0de31cc059bcc71f1a', 'type' => 'library', 'install_path' => __DIR__ . '/../web-auth/webauthn-lib', 'aliases' => array(), 'dev_requirement' => \false), 'webmozart/assert' => array('pretty_version' => '1.12.1', 'version' => '1.12.1.0', 'reference' => '9be6926d8b485f55b9229203f962b51ed377ba68', 'type' => 'library', 'install_path' => __DIR__ . '/../webmozart/assert', 'aliases' => array(), 'dev_requirement' => \false)));5 return array('root' => array('name' => 'adamgreenwell/guard-dog', 'pretty_version' => 'dev-main', 'version' => 'dev-main', 'reference' => 'ed7c53cb36bde46842026a5236b1092c2797fe14', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev' => \false), 'versions' => array('adamgreenwell/guard-dog' => array('pretty_version' => 'dev-main', 'version' => 'dev-main', 'reference' => 'ed7c53cb36bde46842026a5236b1092c2797fe14', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev_requirement' => \false), 'bacon/bacon-qr-code' => array('pretty_version' => 'v3.0.3', 'version' => '3.0.3.0', 'reference' => '36a1cb2b81493fa5b82e50bf8068bf84d1542563', 'type' => 'library', 'install_path' => __DIR__ . '/../bacon/bacon-qr-code', 'aliases' => array(), 'dev_requirement' => \false), 'brick/math' => array('pretty_version' => '0.13.1', 'version' => '0.13.1.0', 'reference' => 'fc7ed316430118cc7836bf45faff18d5dfc8de04', 'type' => 'library', 'install_path' => __DIR__ . '/../brick/math', 'aliases' => array(), 'dev_requirement' => \false), 'dasprid/enum' => array('pretty_version' => '1.0.7', 'version' => '1.0.7.0', 'reference' => 'b5874fa9ed0043116c72162ec7f4fb50e02e7cce', 'type' => 'library', 'install_path' => __DIR__ . '/../dasprid/enum', 'aliases' => array(), 'dev_requirement' => \false), 'doctrine/deprecations' => array('pretty_version' => '1.1.5', 'version' => '1.1.5.0', 'reference' => '459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38', 'type' => 'library', 'install_path' => __DIR__ . '/../doctrine/deprecations', 'aliases' => array(), 'dev_requirement' => \false), 'firebase/php-jwt' => array('pretty_version' => 'v7.0.5', 'version' => '7.0.5.0', 'reference' => '47ad26bab5e7c70ae8a6f08ed25ff83631121380', 'type' => 'library', 'install_path' => __DIR__ . '/../firebase/php-jwt', 'aliases' => array(), 'dev_requirement' => \false), 'guzzlehttp/guzzle' => array('pretty_version' => '7.10.0', 'version' => '7.10.0.0', 'reference' => 'b51ac707cfa420b7bfd4e4d5e510ba8008e822b4', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/guzzle', 'aliases' => array(), 'dev_requirement' => \false), 'guzzlehttp/promises' => array('pretty_version' => '2.3.0', 'version' => '2.3.0.0', 'reference' => '481557b130ef3790cf82b713667b43030dc9c957', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/promises', 'aliases' => array(), 'dev_requirement' => \false), 'guzzlehttp/psr7' => array('pretty_version' => '2.8.0', 'version' => '2.8.0.0', 'reference' => '21dc724a0583619cd1652f673303492272778051', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/psr7', 'aliases' => array(), 'dev_requirement' => \false), 'lcobucci/clock' => array('pretty_version' => '2.2.0', 'version' => '2.2.0.0', 'reference' => 'fb533e093fd61321bfcbac08b131ce805fe183d3', 'type' => 'library', 'install_path' => __DIR__ . '/../lcobucci/clock', 'aliases' => array(), 'dev_requirement' => \false), 'league/oauth2-client' => array('pretty_version' => '2.9.0', 'version' => '2.9.0.0', 'reference' => '26e8c5da4f3d78cede7021e09b1330a0fc093d5e', 'type' => 'library', 'install_path' => __DIR__ . '/../league/oauth2-client', 'aliases' => array(), 'dev_requirement' => \false), 'league/oauth2-google' => array('pretty_version' => '4.1.0', 'version' => '4.1.0.0', 'reference' => '8b9bb43740ac6d994aca881a35f7bacbe98c0ffb', 'type' => 'library', 'install_path' => __DIR__ . '/../league/oauth2-google', 'aliases' => array(), 'dev_requirement' => \false), 'paragonie/constant_time_encoding' => array('pretty_version' => 'v3.1.3', 'version' => '3.1.3.0', 'reference' => 'd5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77', 'type' => 'library', 'install_path' => __DIR__ . '/../paragonie/constant_time_encoding', 'aliases' => array(), 'dev_requirement' => \false), 'phpdocumentor/reflection-common' => array('pretty_version' => '2.2.0', 'version' => '2.2.0.0', 'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b', 'type' => 'library', 'install_path' => __DIR__ . '/../phpdocumentor/reflection-common', 'aliases' => array(), 'dev_requirement' => \false), 'phpdocumentor/reflection-docblock' => array('pretty_version' => '5.6.6', 'version' => '5.6.6.0', 'reference' => '5cee1d3dfc2d2aa6599834520911d246f656bcb8', 'type' => 'library', 'install_path' => __DIR__ . '/../phpdocumentor/reflection-docblock', 'aliases' => array(), 'dev_requirement' => \false), 'phpdocumentor/type-resolver' => array('pretty_version' => '1.12.0', 'version' => '1.12.0.0', 'reference' => '92a98ada2b93d9b201a613cb5a33584dde25f195', 'type' => 'library', 'install_path' => __DIR__ . '/../phpdocumentor/type-resolver', 'aliases' => array(), 'dev_requirement' => \false), 'phpstan/phpdoc-parser' => array('pretty_version' => '2.3.1', 'version' => '2.3.1.0', 'reference' => '16dbf9937da8d4528ceb2145c9c7c0bd29e26374', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpdoc-parser', 'aliases' => array(), 'dev_requirement' => \false), 'pragmarx/google2fa' => array('pretty_version' => 'v8.0.3', 'version' => '8.0.3.0', 'reference' => '6f8d87ebd5afbf7790bde1ffc7579c7c705e0fad', 'type' => 'library', 'install_path' => __DIR__ . '/../pragmarx/google2fa', 'aliases' => array(), 'dev_requirement' => \false), 'psr/clock' => array('pretty_version' => '1.0.0', 'version' => '1.0.0.0', 'reference' => 'e41a24703d4560fd0acb709162f73b8adfc3aa0d', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/clock', 'aliases' => array(), 'dev_requirement' => \false), 'psr/event-dispatcher' => array('pretty_version' => '1.0.0', 'version' => '1.0.0.0', 'reference' => 'dbefd12671e8a14ec7f180cab83036ed26714bb0', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/event-dispatcher', 'aliases' => array(), 'dev_requirement' => \false), 'psr/http-client' => array('pretty_version' => '1.0.3', 'version' => '1.0.3.0', 'reference' => 'bb5906edc1c324c9a05aa0873d40117941e5fa90', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-client', 'aliases' => array(), 'dev_requirement' => \false), 'psr/http-client-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.0')), 'psr/http-factory' => array('pretty_version' => '1.1.0', 'version' => '1.1.0.0', 'reference' => '2b4765fddfe3b508ac62f829e852b1501d3f6e8a', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-factory', 'aliases' => array(), 'dev_requirement' => \false), 'psr/http-factory-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.0')), 'psr/http-message' => array('pretty_version' => '2.0', 'version' => '2.0.0.0', 'reference' => '402d35bcb92c70c026d1a6a9883f06b2ead23d71', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-message', 'aliases' => array(), 'dev_requirement' => \false), 'psr/http-message-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.0')), 'psr/log' => array('pretty_version' => '3.0.2', 'version' => '3.0.2.0', 'reference' => 'f16e1d5863e37f8d8c2a01719f5b34baa2b714d3', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/log', 'aliases' => array(), 'dev_requirement' => \false), 'ralouphie/getallheaders' => array('pretty_version' => '3.0.3', 'version' => '3.0.3.0', 'reference' => '120b605dfeb996808c31b6477290a714d356e822', 'type' => 'library', 'install_path' => __DIR__ . '/../ralouphie/getallheaders', 'aliases' => array(), 'dev_requirement' => \false), 'spomky-labs/cbor-php' => array('pretty_version' => '3.2.2', 'version' => '3.2.2.0', 'reference' => '2a5fb86aacfe1004611370ead6caa2bfc88435d0', 'type' => 'library', 'install_path' => __DIR__ . '/../spomky-labs/cbor-php', 'aliases' => array(), 'dev_requirement' => \false), 'spomky-labs/pki-framework' => array('pretty_version' => '1.4.1', 'version' => '1.4.1.0', 'reference' => 'f0e9a548df4e3942886adc9b7830581a46334631', 'type' => 'library', 'install_path' => __DIR__ . '/../spomky-labs/pki-framework', 'aliases' => array(), 'dev_requirement' => \false), 'stella-maris/clock' => array('pretty_version' => '0.1.7', 'version' => '0.1.7.0', 'reference' => 'fa23ce16019289a18bb3446fdecd45befcdd94f8', 'type' => 'library', 'install_path' => __DIR__ . '/../stella-maris/clock', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/deprecation-contracts' => array('pretty_version' => 'v3.7.0', 'version' => '3.7.0.0', 'reference' => '50f59d1f3ca46d41ac911f97a78626b6756af35b', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-ctype' => array('pretty_version' => 'v1.37.0', 'version' => '1.37.0.0', 'reference' => '141046a8f9477948ff284fa65be2095baafb94f2', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-ctype', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-intl-grapheme' => array('pretty_version' => 'v1.37.0', 'version' => '1.37.0.0', 'reference' => '4864388bfbd3001ce88e234fab652acd91fdc57e', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-grapheme', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-intl-normalizer' => array('pretty_version' => 'v1.37.0', 'version' => '1.37.0.0', 'reference' => '3833d7255cc303546435cb650316bff708a1c75c', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-mbstring' => array('pretty_version' => 'v1.37.0', 'version' => '1.37.0.0', 'reference' => '6a21eb99c6973357967f6ce3708cd55a6bec6315', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-uuid' => array('pretty_version' => 'v1.33.0', 'version' => '1.33.0.0', 'reference' => '21533be36c24be3f4b1669c4725c7d1d2bab4ae2', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-uuid', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/property-access' => array('pretty_version' => 'v6.4.32', 'version' => '6.4.32.0', 'reference' => '6dfa655ac9e9860c05cabb287f34da86b18c237e', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/property-access', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/property-info' => array('pretty_version' => 'v6.4.32', 'version' => '6.4.32.0', 'reference' => '5dda35816740c390bf374897a018256c7ede7ecc', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/property-info', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/serializer' => array('pretty_version' => 'v6.4.32', 'version' => '6.4.32.0', 'reference' => '8e02b21b88a4978aad275f002f614ac9eb52469b', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/serializer', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/string' => array('pretty_version' => 'v6.4.39', 'version' => '6.4.39.0', 'reference' => '62e3c927de664edadb5bef260987eb047a17a113', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/string', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/uid' => array('pretty_version' => 'v6.4.32', 'version' => '6.4.32.0', 'reference' => '6b973c385f00341b246f697d82dc01a09107acdd', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/uid', 'aliases' => array(), 'dev_requirement' => \false), 'thenetworg/oauth2-azure' => array('pretty_version' => 'v2.2.3', 'version' => '2.2.3.0', 'reference' => '074b57e19f4aa9634d20b2e4eda909e1127e4e66', 'type' => 'library', 'install_path' => __DIR__ . '/../thenetworg/oauth2-azure', 'aliases' => array(), 'dev_requirement' => \false), 'web-auth/cose-lib' => array('pretty_version' => '4.5.0', 'version' => '4.5.0.0', 'reference' => '5adac6fe126994a3ee17ed9950efb4947ab132a9', 'type' => 'library', 'install_path' => __DIR__ . '/../web-auth/cose-lib', 'aliases' => array(), 'dev_requirement' => \false), 'web-auth/webauthn-lib' => array('pretty_version' => '4.9.2', 'version' => '4.9.2.0', 'reference' => '008b25171c27cf4813420d0de31cc059bcc71f1a', 'type' => 'library', 'install_path' => __DIR__ . '/../web-auth/webauthn-lib', 'aliases' => array(), 'dev_requirement' => \false), 'webmozart/assert' => array('pretty_version' => '1.12.1', 'version' => '1.12.1.0', 'reference' => '9be6926d8b485f55b9229203f962b51ed377ba68', 'type' => 'library', 'install_path' => __DIR__ . '/../webmozart/assert', 'aliases' => array(), 'dev_requirement' => \false)));
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)