array( // action => array( limit, window_seconds ). 'login' => array( 'limit' => 5, 'window' => 60, ), 'register' => array( 'limit' => 3, 'window' => HOUR_IN_SECONDS, ), 'contact' => array( 'limit' => 5, 'window' => HOUR_IN_SECONDS, ), 'newsletter' => array( 'limit' => 3, 'window' => HOUR_IN_SECONDS, ), 'verify_resend' => array( 'limit' => 2, 'window' => HOUR_IN_SECONDS, ), ), 'verify_token_ttl' => DAY_IN_SECONDS, 'email_verify_required' => true, 'registration_enabled' => true, 'newsletter_autoload_threshold' => 1000, 'contact_topics' => array( 'bug', 'feature', 'data', 'other' ), 'username_min' => 5, 'username_max' => 15, 'password_min' => 8, ); /** * Filter the theme's security configuration. * * @param array $defaults Default configuration. */ return apply_filters( 'peptide_starter_security_config', $defaults ); } /** * Shortcut to read a single top-level config key. * * @param string $key Top-level key (e.g. 'verify_token_ttl'). * @param mixed $fallback Value returned when the key is missing. * @return mixed Configured value or $fallback. */ function peptide_starter_config_get( $key, $fallback = null ) { $config = peptide_starter_security_config(); return array_key_exists( $key, $config ) ? $config[ $key ] : $fallback; } /** * Read a rate limit tuple (limit, window) for a given action. * * @param string $action Action slug matching a key in rate_limits. * @return array { 'limit' => int, 'window' => int } with safe defaults. */ function peptide_starter_config_rate_limit( $action ) { $limits = peptide_starter_config_get( 'rate_limits', array() ); if ( isset( $limits[ $action ]['limit'], $limits[ $action ]['window'] ) ) { return array( 'limit' => (int) $limits[ $action ]['limit'], 'window' => (int) $limits[ $action ]['window'], ); } return array( 'limit' => 5, 'window' => HOUR_IN_SECONDS, ); }