Plugin Directory

Changeset 3680213


Ignore:
Timestamp:
09/03/2026 06:27:10 PM (7 weeks ago)
Author:
adamgreenwell
Message:

Deploy version 1.9.58

Location:
guard-dog/trunk
Files:
1 deleted
6 edited

Legend:

Unmodified
Added
Removed
  • guard-dog/trunk/guard-dog.php

    r3680105 r3680213  
    44 * Plugin URI: https://guarddog.cc/
    55 * Description: Security plugin for login protection, custom login URL, 2FA, and more.
    6  * Version: 1.9.57
     6 * Version: 1.9.58
    77 * Author: Adam Greenwell
    88 * Author URI: https://adamgreenwell.com
  • guard-dog/trunk/includes/class-guard-dog.php

    r3680105 r3680213  
    1616     * @var string
    1717     */
    18     public $version = '1.9.57';
     18    public $version = '1.9.58';
    1919
    2020    /**
  • guard-dog/trunk/includes/features/class-access-control.php

    r3680105 r3680213  
    724724        }
    725725
     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) {
    726777        // Determine IP version once
    727778        $ip_version = filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) ? 4 :
    … …  
    882933           
    883934            $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
    884944            $zeros = array_fill(0, $missing_parts, '0000');
    885945           
  • guard-dog/trunk/includes/features/class-password-policy.php

    r3680072 r3680213  
    2828
    2929    /**
     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    /**
    3043     * Constructor.
    3144     *
    … …  
    100113            // (priority 25), preserving the expiration-before-2FA ordering.
    101114            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);
    102120
    103121            // Handle inline password reset form
    … …  
    851869     * @return WP_User|WP_Error|null User object, error, or null.
    852870     */
     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
    853900    public function check_password_expiration_on_login($user, $username = '', $password = '') {
    854901        // Only act once the primary credential has actually been accepted. A failed
    … …  
    858905        }
    859906
    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) {
    864912            return $user;
    865913        }
    866914
    867915        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
    868927            // Password is expired - redirect to inline reset form instead of returning error
    869928
  • guard-dog/trunk/readme.txt

    r3680105 r3680213  
    55Tested up to: 7.1
    66Requires PHP: 8.1
    7 Stable tag: 1.9.57
     7Stable tag: 1.9.58
    88License: GPLv2 or later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
    … …  
    145145== Changelog ==
    146146
     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
    147152= 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 rule
     153* 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
    149154
    150155= 1.9.56 =
    151 * Fix logging out on sites using a custom login URL, which returned a blank page instead of completing the logout
    152 * Fix a custom login slug of "login" being mistaken for the default WordPress login page, so login URLs rewrite correctly
    153 * 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 step
     156* 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
    155160* Stop signing a user in when two-factor setup is required but no setup method is available
    156161* Keep internal security reports out of the released plugin package
    … …  
    407412== Upgrade Notice ==
    408413
     414= 1.9.58 =
     415Security 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
    409417= 1.9.57 =
    410 Fixes IPv6 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.
     418Fixes 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.
    411419
    412420= 1.9.56 =
  • guard-dog/trunk/vendor/composer/installed.php

    r3680105 r3680213  
    33namespace GuardDog\Vendor;
    44
    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)));
     5return 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.