Plugin Directory

Changeset 3063884


Ignore:
Timestamp:
04/03/2024 03:31:52 PM (21 months ago)
Author:
wfryan
Message:

7.11.5 - April 3, 2024

  • Fix: Revised the behavior of the reCAPTCHA verification to use the documented expiration period of the token and response to avoid sending verification requests too frequently, which could artificially lower scores in some circumstances
  • Fix: Addressed PHP 8 deprecation notices in the file differ used by file changed scan results
  • Fix: Reduced the frequency of Wordfence Central status update callbacks in sections of the scan that occur quickly in sequence
Location:
wordfence
Files:
130 added
130 deleted
32 edited
1 copied

Legend:

Unmodified
Added
Removed
  • wordfence/tags/7.11.5/languages/wordfence.pot

    r3049240 r3063884  
    33msgid ""
    44msgstr ""
    5 "Project-Id-Version: Wordfence Security 7.11.4\n"
    6 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wordfence-zip-0H0vQX4ZS\n"
     5"Project-Id-Version: Wordfence Security 7.11.5\n"
     6"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wordfence-zip-8lMCyXlaj\n"
    77"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
    88"Language-Team: LANGUAGE <[email protected]>\n"
     
    1010"Content-Type: text/plain; charset=UTF-8\n"
    1111"Content-Transfer-Encoding: 8bit\n"
    12 "POT-Creation-Date: 2024-03-11T15:22:25+00:00\n"
     12"POT-Creation-Date: 2024-04-03T15:14:56+00:00\n"
    1313"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    1414"X-Generator: WP-CLI 2.7.1\n"
     
    238238#: lib/menu_wordfence_central.php:56
    239239#: lib/wf503.php:390
    240 #: lib/wfCentralAPI.php:905
     240#: lib/wfCentralAPI.php:906
    241241#: lib/wfScanEngine.php:307
    242242#: lib/wfScanEngine.php:642
     
    464464#: lib/dashboard/widget_notifications.php:64
    465465#: lib/menu_wordfence_central.php:65
    466 #: lib/wfCentralAPI.php:897
     466#: lib/wfCentralAPI.php:898
    467467msgid "Disconnect This Site"
    468468msgstr ""
     
    23812381#: lib/menu_scanner.php:81
    23822382#: lib/menu_scanner_options.php:135
    2383 #: models/scanner/wfScanner.php:829
     2383#: models/scanner/wfScanner.php:848
    23842384msgid "Enable Premium Scan Signatures."
    23852385msgstr ""
     
    26522652#: lib/menu_tools_twoFactor.php:23
    26532653#: models/page/wfPage.php:117
    2654 #: modules/login-security/classes/controller/wordfencels.php:888
    2655 #: modules/login-security/classes/controller/wordfencels.php:889
     2654#: modules/login-security/classes/controller/wordfencels.php:902
     2655#: modules/login-security/classes/controller/wordfencels.php:903
    26562656msgid "Two-Factor Authentication"
    26572657msgstr ""
     
    28252825#: lib/menu_tools_diagnostic.php:428
    28262826#: lib/menu_tools_diagnostic.php:471
    2827 #: modules/login-security/classes/controller/users.php:538
     2827#: modules/login-security/classes/controller/users.php:542
    28282828#: modules/login-security/classes/controller/wordfencels.php:490
    28292829#: views/diagnostics/text.php:203
     
    28372837#: lib/menu_tools_diagnostic.php:430
    28382838#: lib/menu_tools_diagnostic.php:473
    2839 #: modules/login-security/classes/controller/users.php:547
     2839#: modules/login-security/classes/controller/users.php:551
    28402840#: modules/login-security/classes/controller/wordfencels.php:490
    28412841#: views/diagnostics/text.php:205
     
    40114011#: lib/wf503.php:385
    40124012#: lib/wfLockedOut.php:394
    4013 msgid "Wordfence is a security plugin installed on over 4 million WordPress sites. The owner of this site is using Wordfence to manage access to their site."
     4013msgid "Wordfence is a security plugin installed on over 5 million WordPress sites. The owner of this site is using Wordfence to manage access to their site."
    40144014msgstr ""
    40154015
     
    40894089
    40904090#: lib/wfAdminNoticeQueue.php:193
    4091 #: lib/wfCentralAPI.php:903
     4091#: lib/wfCentralAPI.php:904
    40924092#: lib/wfSupportController.php:433
    40934093#: lib/wordfenceClass.php:6303
     
    52675267msgstr ""
    52685268
    5269 #: lib/wfCentralAPI.php:890
     5269#: lib/wfCentralAPI.php:891
    52705270msgid "Your site is currently linked to Wordfence Central under a different site URL."
    52715271msgstr ""
    52725272
    5273 #: lib/wfCentralAPI.php:892
     5273#: lib/wfCentralAPI.php:893
    52745274msgid "This may cause duplicated scan issues if both sites are currently active and reporting and is generally caused by duplicating the database from one site to another (e.g., from a production site to staging). We recommend disconnecting this site only, which will leave the matching site still connected."
    52755275msgstr ""
    52765276
    5277 #: lib/wfCentralAPI.php:894
     5277#: lib/wfCentralAPI.php:895
    52785278msgid "If this is a single site with multiple domains or subdomains, you can dismiss this message."
    52795279msgstr ""
    52805280
    5281 #: lib/wfCentralAPI.php:900
     5281#: lib/wfCentralAPI.php:901
    52825282msgid "Disconnect All"
    52835283msgstr ""
     
    88628862#: lib/wordfenceClass.php:6335
    88638863#: modules/login-security/classes/controller/wordfencels.php:490
    8864 #: modules/login-security/classes/controller/wordfencels.php:855
     8864#: modules/login-security/classes/controller/wordfencels.php:869
    88658865#: modules/login-security/views/manage/grace-period.php:22
    88668866msgid "Locked Out"
     
    1031310313msgstr ""
    1031410314
    10315 #: models/scanner/wfScanner.php:116
     10315#: models/scanner/wfScanner.php:118
    1031610316msgid "Quick"
    1031710317msgstr ""
    1031810318
    10319 #: models/scanner/wfScanner.php:118
     10319#: models/scanner/wfScanner.php:120
    1032010320msgid "Limited"
    1032110321msgstr ""
    1032210322
    10323 #: models/scanner/wfScanner.php:120
     10323#: models/scanner/wfScanner.php:122
    1032410324#: views/scanner/scan-type.php:32
    1032510325msgid "High Sensitivity"
    1032610326msgstr ""
    1032710327
    10328 #: models/scanner/wfScanner.php:122
     10328#: models/scanner/wfScanner.php:124
    1032910329#: views/scanner/scan-scheduling.php:50
    1033010330msgid "Custom"
    1033110331msgstr ""
    1033210332
    10333 #: models/scanner/wfScanner.php:125
     10333#: models/scanner/wfScanner.php:127
    1033410334msgid "Standard"
    1033510335msgstr ""
    1033610336
    10337 #: models/scanner/wfScanner.php:139
     10337#: models/scanner/wfScanner.php:141
    1033810338msgid "Low resource utilization, limited detection capability"
    1033910339msgstr ""
    1034010340
    10341 #: models/scanner/wfScanner.php:141
     10341#: models/scanner/wfScanner.php:143
    1034210342msgid "Standard detection capability, chance of false positives"
    1034310343msgstr ""
    1034410344
    10345 #: models/scanner/wfScanner.php:143
     10345#: models/scanner/wfScanner.php:145
    1034610346msgid "Custom scan options selected"
    1034710347msgstr ""
    1034810348
    10349 #: models/scanner/wfScanner.php:146
     10349#: models/scanner/wfScanner.php:148
    1035010350msgid "Standard detection capability"
    1035110351msgstr ""
    1035210352
    10353 #: models/scanner/wfScanner.php:838
     10353#: models/scanner/wfScanner.php:857
    1035410354msgid "Enable Premium Reputation Checks."
    1035510355msgstr ""
    1035610356
    10357 #: models/scanner/wfScanner.php:846
     10357#: models/scanner/wfScanner.php:865
    1035810358msgid "Enable %d scan option."
    1035910359msgid_plural "Enable %d scan options."
     
    1036110361msgstr[1] ""
    1036210362
    10363 #: models/scanner/wfScanner.php:888
     10363#: models/scanner/wfScanner.php:907
    1036410364msgid "Enable scan option to check if this website is being \"Spamvertised\"."
    1036510365msgstr ""
    1036610366
    10367 #: models/scanner/wfScanner.php:889
     10367#: models/scanner/wfScanner.php:908
    1036810368msgid "Enable scan option to check if your website IP is generating spam."
    1036910369msgstr ""
    1037010370
    10371 #: models/scanner/wfScanner.php:890
     10371#: models/scanner/wfScanner.php:909
    1037210372msgid "Enable scan option to check if your website is on a domain blocklist."
    1037310373msgstr ""
    1037410374
    10375 #: models/scanner/wfScanner.php:994
     10375#: models/scanner/wfScanner.php:1013
    1037610376msgid "User defined scan pattern"
    1037710377msgstr ""
    1037810378
    1037910379#. translators: 1. Day of week. 2. Hour of day. 3. Localized date.
    10380 #: models/scanner/wfScanner.php:1272
     10380#: models/scanner/wfScanner.php:1291
    1038110381msgid "Scheduled time for day %s hour %s is: %s"
    1038210382msgstr ""
     
    1059810598msgstr ""
    1059910599
    10600 #: modules/login-security/classes/controller/users.php:517
     10600#: modules/login-security/classes/controller/users.php:521
    1060110601#: modules/login-security/classes/controller/wordfencels.php:486
    1060210602msgid "2FA Status"
    1060310603msgstr ""
    1060410604
    10605 #: modules/login-security/classes/controller/users.php:521
     10605#: modules/login-security/classes/controller/users.php:525
    1060610606msgid "Last Login"
    1060710607msgstr ""
    1060810608
    10609 #: modules/login-security/classes/controller/users.php:523
     10609#: modules/login-security/classes/controller/users.php:527
    1061010610msgid "Last CAPTCHA"
    1061110611msgstr ""
    1061210612
    10613 #: modules/login-security/classes/controller/users.php:533
     10613#: modules/login-security/classes/controller/users.php:537
    1061410614msgid "Not Allowed"
    1061510615msgstr ""
    1061610616
    10617 #: modules/login-security/classes/controller/users.php:541
     10617#: modules/login-security/classes/controller/users.php:545
    1061810618msgid "Inactive<small class=\"wfls-sub-status\">(Grace Period)</small>"
    1061910619msgstr ""
    1062010620
    10621 #: modules/login-security/classes/controller/users.php:544
     10621#: modules/login-security/classes/controller/users.php:548
    1062210622msgid "Locked Out<small class=\"wfls-sub-status\">(Grace Period Disabled)</small>"
    1062310623msgstr ""
    1062410624
    10625 #: modules/login-security/classes/controller/users.php:544
     10625#: modules/login-security/classes/controller/users.php:548
    1062610626msgid "Locked Out<small class=\"wfls-sub-status\">(Grace Period Exceeded)</small>"
    1062710627msgstr ""
    1062810628
    10629 #: modules/login-security/classes/controller/users.php:560
     10629#: modules/login-security/classes/controller/users.php:564
    1063010630msgid "(not required)"
    1063110631msgstr ""
    1063210632
    10633 #: modules/login-security/classes/controller/users.php:654
     10633#: modules/login-security/classes/controller/users.php:658
    1063410634msgid "Edit two-factor authentication for %s"
    1063510635msgstr ""
    1063610636
    10637 #: modules/login-security/classes/controller/users.php:654
     10637#: modules/login-security/classes/controller/users.php:658
    1063810638#: modules/login-security/views/settings/options.php:9
    1063910639msgid "2FA"
    1064010640msgstr ""
    1064110641
    10642 #: modules/login-security/classes/controller/users.php:665
     10642#: modules/login-security/classes/controller/users.php:669
    1064310643#: modules/login-security/views/settings/user-stats.php:25
    1064410644msgid "2FA Active"
    1064510645msgstr ""
    1064610646
    10647 #: modules/login-security/classes/controller/users.php:666
     10647#: modules/login-security/classes/controller/users.php:670
    1064810648#: modules/login-security/views/settings/user-stats.php:26
    1064910649msgid "2FA Inactive"
     
    1079310793msgstr ""
    1079410794
    10795 #: modules/login-security/classes/controller/wordfencels.php:671
     10795#: modules/login-security/classes/controller/wordfencels.php:645
     10796msgid "<strong>CAPTCHA EXPIRED</strong>: The CAPTCHA verification for this login attempt has expired. Please try again."
     10797msgstr ""
     10798
     10799#: modules/login-security/classes/controller/wordfencels.php:685
    1079610800msgid "Login Verification Required"
    1079710801msgstr ""
    1079810802
    10799 #: modules/login-security/classes/controller/wordfencels.php:676
     10803#: modules/login-security/classes/controller/wordfencels.php:690
    1080010804msgid "<strong>VERIFICATION REQUIRED</strong>: Additional verification is required for login. If there is a valid account for the provided login credentials, please check the email address associated with it for a verification link to continue logging in."
    1080110805msgstr ""
    1080210806
    10803 #: modules/login-security/classes/controller/wordfencels.php:692
     10807#: modules/login-security/classes/controller/wordfencels.php:706
    1080410808msgid "<strong>CODE INVALID</strong>: The 2FA code provided is either expired or invalid. Please try again."
    1080510809msgstr ""
    1080610810
    10807 #: modules/login-security/classes/controller/wordfencels.php:701
     10811#: modules/login-security/classes/controller/wordfencels.php:715
    1080810812msgid "<strong>CODE REQUIRED</strong>: Please enter your 2FA code immediately after your password in the same field."
    1080910813msgstr ""
    1081010814
    10811 #: modules/login-security/classes/controller/wordfencels.php:703
     10815#: modules/login-security/classes/controller/wordfencels.php:717
    1081210816msgid "<strong>CODE REQUIRED</strong>: Please provide your 2FA code when prompted."
    1081310817msgstr ""
    1081410818
    10815 #: modules/login-security/classes/controller/wordfencels.php:706
     10819#: modules/login-security/classes/controller/wordfencels.php:720
    1081610820msgid "<strong>LOGIN BLOCKED</strong>: 2FA is required to be active on your account. Please contact the site administrator."
    1081710821msgstr ""
    1081810822
    10819 #: modules/login-security/classes/controller/wordfencels.php:709
     10823#: modules/login-security/classes/controller/wordfencels.php:723
    1082010824msgid "You do not currently have two-factor authentication active on your account, which will be required beginning %s. <a href=\"%s\">Configure 2FA</a>"
    1082110825msgstr ""
    1082210826
    10823 #: modules/login-security/classes/controller/wordfencels.php:759
     10827#: modules/login-security/classes/controller/wordfencels.php:773
    1082410828msgid "Email verification succeeded. Please continue logging in."
    1082510829msgstr ""
    1082610830
    10827 #: modules/login-security/classes/controller/wordfencels.php:762
     10831#: modules/login-security/classes/controller/wordfencels.php:776
    1082810832msgid "Email verification invalid or expired. Please try again."
    1082910833msgstr ""
    1083010834
    10831 #: modules/login-security/classes/controller/wordfencels.php:816
    10832 #: modules/login-security/classes/controller/wordfencels.php:819
     10835#: modules/login-security/classes/controller/wordfencels.php:830
     10836#: modules/login-security/classes/controller/wordfencels.php:833
    1083310837msgid "Login Security"
    1083410838msgstr ""
    1083510839
    10836 #: modules/login-security/classes/controller/wordfencels.php:847
     10840#: modules/login-security/classes/controller/wordfencels.php:861
    1083710841#: modules/login-security/views/settings/options.php:23
    1083810842#: modules/login-security/views/settings/user-stats.php:33
     
    1084010844msgstr ""
    1084110845
    10842 #: modules/login-security/classes/controller/wordfencels.php:851
     10846#: modules/login-security/classes/controller/wordfencels.php:865
    1084310847#: modules/login-security/views/manage/grace-period.php:22
    1084410848#: modules/login-security/views/options/option-roles.php:57
     
    1084610850msgstr ""
    1084710851
    10848 #: modules/login-security/classes/controller/wordfencels.php:870
     10852#: modules/login-security/classes/controller/wordfencels.php:884
    1084910853msgid "Users without 2FA active (%s)"
    1085010854msgstr ""
    1085110855
    10852 #: modules/login-security/classes/controller/wordfencels.php:889
     10856#: modules/login-security/classes/controller/wordfencels.php:903
    1085310857msgid "Learn more<span class=\"wfls-hidden-xs\"> about Two-Factor Authentication</span>"
    1085410858msgstr ""
    1085510859
    10856 #: modules/login-security/classes/controller/wordfencels.php:898
     10860#: modules/login-security/classes/controller/wordfencels.php:912
    1085710861msgid "Settings"
    1085810862msgstr ""
    1085910863
    10860 #: modules/login-security/classes/controller/wordfencels.php:899
     10864#: modules/login-security/classes/controller/wordfencels.php:913
    1086110865msgid "Login Security Settings"
    1086210866msgstr ""
    1086310867
    10864 #: modules/login-security/classes/controller/wordfencels.php:899
     10868#: modules/login-security/classes/controller/wordfencels.php:913
    1086510869msgid "Learn more<span class=\"wfls-hidden-xs\"> about Login Security</span>"
    1086610870msgstr ""
    1086710871
    10868 #: modules/login-security/classes/controller/wordfencels.php:925
     10872#: modules/login-security/classes/controller/wordfencels.php:939
    1086910873msgid "<strong>REGISTRATION ATTEMPT BLOCKED</strong>: This site requires a security token created when the page loads for all registration attempts. Please ensure JavaScript is enabled and try again."
    1087010874msgstr ""
    1087110875
    10872 #: modules/login-security/classes/controller/wordfencels.php:932
     10876#: modules/login-security/classes/controller/wordfencels.php:946
    1087310877msgid "<strong>REGISTRATION ATTEMPT BLOCKED</strong>: The security token for the login attempt was invalid or expired. Please reload the page and try again."
    1087410878msgstr ""
    1087510879
    10876 #: modules/login-security/classes/controller/wordfencels.php:945
     10880#: modules/login-security/classes/controller/wordfencels.php:959
    1087710881msgid "<strong>REGISTRATION BLOCKED</strong>: The registration request was blocked because it was flagged as spam. Please try again or <a href=\"#\" class=\"wfls-registration-captcha-contact\" data-token=\"%s\">contact the site owner</a> for help."
    1087810882msgstr ""
    1087910883
    10880 #: modules/login-security/classes/controller/wordfencels.php:948
     10884#: modules/login-security/classes/controller/wordfencels.php:962
    1088110885msgid "<strong>REGISTRATION BLOCKED</strong>: The registration request was blocked because it was flagged as spam. Please try again or contact the site owner for help."
    1088210886msgstr ""
    1088310887
    10884 #: modules/login-security/classes/controller/wordfencels.php:1018
     10888#: modules/login-security/classes/controller/wordfencels.php:1032
    1088510889msgid "Wordfence 2FA"
    1088610890msgstr ""
  • wordfence/tags/7.11.5/lib/Diff/SequenceMatcher.php

    r2430969 r3063884  
    7575        'ignoreCase' => false
    7676    );
     77   
     78    private $matchingBlocks = null;
     79    private $opCodes = null;
     80    private $fullBCount = null;
    7781
    7882    /**
     
    680684        }
    681685
    682         if(count($a) == $count($b)) {
     686        if(count($a) == count($b)) {
    683687            return 0;
    684688        }
  • wordfence/tags/7.11.5/lib/wf503.php

    r2583566 r3063884  
    383383            <div class="about-text">
    384384                <h3 class="h4"><?php esc_html_e('About Wordfence', 'wordfence'); ?></h3>
    385                 <p><?php esc_html_e('Wordfence is a security plugin installed on over 4 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.', 'wordfence'); ?></p>
     385                <p><?php esc_html_e('Wordfence is a security plugin installed on over 5 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.', 'wordfence'); ?></p>
    386386                <p><?php esc_html_e('You can also read the documentation to learn about Wordfence\'s blocking tools, or visit wordfence.com to learn more about Wordfence.', 'wordfence'); ?></p>
    387387            </div>
  • wordfence/tags/7.11.5/lib/wfCentralAPI.php

    r3036535 r3063884  
    585585        try {
    586586            $response = $request->execute();
     587            wfConfig::set('lastScanStageStatusUpdate', time(), wfConfig::DONT_AUTOLOAD);
    587588            return $response;
    588589        }
  • wordfence/tags/7.11.5/lib/wfLockedOut.php

    r2583566 r3063884  
    392392        <div class="about-text">
    393393            <h3 class="h4"><?php esc_html_e('About Wordfence', 'wordfence'); ?></h3>
    394             <p><?php esc_html_e('Wordfence is a security plugin installed on over 4 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.', 'wordfence'); ?></p>
     394            <p><?php esc_html_e('Wordfence is a security plugin installed on over 5 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.', 'wordfence'); ?></p>
    395395            <p><?php esc_html_e('You can also read the documentation to learn about Wordfence\'s blocking tools, or visit wordfence.com to learn more about Wordfence.', 'wordfence'); ?></p>
    396396        </div>
  • wordfence/tags/7.11.5/models/scanner/wfScanner.php

    r3049240 r3063884  
    5656    const SUMMARY_SCANNED_USERS = 'scannedUsers';
    5757    const SUMMARY_SCANNED_URLS = 'scannedURLs';
     58   
     59    const CENTRAL_STAGE_UPDATE_THRESHOLD = 5;
    5860   
    5961    private $_scanType = false;
     
    688690    }
    689691   
     692    private function _shouldForceUpdate($stageID) {
     693        if ($stageID == wfScanner::STAGE_MALWARE_SCAN) {
     694            return true;
     695        }
     696        return false;
     697    }
     698   
    690699    /**
    691700     * Increments the stage started counter and marks it as running if not already in that state.
     
    705714        $runningStatus[$stageID]['started'] += 1;
    706715        wfConfig::set_ser('scanStageStatuses', $runningStatus, false, wfConfig::DONT_AUTOLOAD);
    707         if (wfCentral::isConnected()) {
     716        if (wfCentral::isConnected() && ($this->_shouldForceUpdate($stageID) || (time() - wfConfig::getInt('lastScanStageStatusUpdate', 0)) > self::CENTRAL_STAGE_UPDATE_THRESHOLD)) {
    708717            wfCentral::updateScanStatus($runningStatus);
    709718        }
     
    739748        wfConfig::set_ser('scanStageStatuses', $runningStatus, false, wfConfig::DONT_AUTOLOAD);
    740749        if (wfCentral::isConnected()) {
    741             wfCentral::updateScanStatus($runningStatus);
     750            $forceSend = true; //Force sending the last stage completion update even if the timing would otherwise prevent it
     751            foreach ($runningStatus as $stageID => $stage) {
     752                if ($runningStatus[$stageID]['finished'] < $runningStatus[$stageID]['expected']) {
     753                    $forceSend = false;
     754                    break;
     755                }
     756            }
     757           
     758            if ($forceSend || (time() - wfConfig::getInt('lastScanStageStatusUpdate', 0)) > self::CENTRAL_STAGE_UPDATE_THRESHOLD) {
     759                wfCentral::updateScanStatus($runningStatus);
     760            }
    742761        }
    743762
  • wordfence/tags/7.11.5/modules/login-security/classes/controller/captcha.php

    r3049240 r3063884  
    9999                $jsonResponse = wp_remote_retrieve_body($response);
    100100                $decoded = @json_decode($jsonResponse, true);
    101                 if (is_array($decoded) && isset($decoded['success']) && isset($decoded['score']) && isset($decoded['action'])) {
    102                     if ($decoded['success'] && $decoded['action'] == $action) {
    103                         return (float) $decoded['score'];
     101                if (is_array($decoded) && isset($decoded['success'])) {
     102                    if ($decoded['success']) {
     103                        if (isset($decoded['score']) && isset($decoded['action']) && $decoded['action'] == $action) {
     104                            return (float) $decoded['score'];
     105                        }
    104106                    }
    105107                    return false;
  • wordfence/tags/7.11.5/modules/login-security/classes/controller/users.php

    r3049240 r3063884  
    1515    const META_KEY_ALLOW_GRACE_PERIOD = 'wfls-allow-grace-period';
    1616    const META_KEY_VERIFICATION_TOKENS = 'wfls-verification-tokens';
     17    const META_KEY_CAPTCHA_SCORES = 'wfls-captcha-scores';
    1718    const VERIFICATION_TOKEN_BYTES = 64;
    1819    const VERIFICATION_TOKEN_LIMIT = 5; //Max number of concurrent tokens
    1920    const VERIFICATION_TOKEN_TRANSIENT_PREFIX = 'wfls_verify_';
     21    const CAPTCHA_SCORE_LIMIT = 2; //Max number of captcha scores cached
     22    const CAPTCHA_SCORE_TRANSIENT_PREFIX = 'wfls_captcha_';
     23    const CAPTCHA_SCORE_CACHE_DURATION = 60; //seconds
    2024    const LARGE_USER_BASE_THRESHOLD = 1000;
    2125    const TRUNCATED_ROLE_KEY = 1;
     
    949953        return $userId !== null && ($user === null || $userId === $user->ID);
    950954    }
     955   
     956    /**
     957     * Returns the key used to store a captcha score transient.
     958     *
     959     * @param string $hash
     960     * @return string
     961     */
     962    private function get_captcha_score_transient_key($hash) {
     963        return self::CAPTCHA_SCORE_TRANSIENT_PREFIX . $hash;
     964    }
     965   
     966    /**
     967     * Attempts to look up a stored captcha score for the given hash and user. If found, returns the score. If not,
     968     * returns null.
     969     *
     970     * @param string $hash
     971     * @param \WP_User $user
     972     * @return float|false
     973     */
     974    private function load_captcha_score($hash, $user) {
     975        $key = $this->get_captcha_score_transient_key($hash);
     976        $data = get_transient($key);
     977        if ($data === false) {
     978            return false;
     979        }
     980       
     981        if (!$user->exists() || $data['user'] !== $user->ID) {
     982            return false;
     983        }
     984       
     985        return floatval($data['score']);
     986    }
     987   
     988    /**
     989     * Deletes the stored captcha score if present for the given hash.
     990     *
     991     * @param string $hash
     992     */
     993    private function clear_captcha_score($token, $user) {
     994        $hash = $this->hash_captcha_token($token);
     995        $key = $this->get_captcha_score_transient_key($hash);
     996        delete_transient($key);
     997       
     998        $storedHashes = get_user_meta($user->ID, self::META_KEY_CAPTCHA_SCORES, true);
     999        $validHashes = array();
     1000        if (is_array($storedHashes)) {
     1001            foreach ($storedHashes as $hash) {
     1002                $storedScore = $this->load_captcha_score($hash, $user);
     1003                if ($storedScore !== false) {
     1004                    $validHashes[] = $hash;
     1005                }
     1006            }
     1007        }
     1008        $validHashes = array_slice($validHashes, 0, self::CAPTCHA_SCORE_LIMIT);
     1009        update_user_meta($user->ID, self::META_KEY_CAPTCHA_SCORES, $validHashes);
     1010    }
     1011   
     1012    /**
     1013     * Hashes the captcha token for storage.
     1014     *
     1015     * @param string $token
     1016     * @return string
     1017     */
     1018    private function hash_captcha_token($token) {
     1019        return wp_hash($token);
     1020    }
     1021   
     1022    /**
     1023     * Returns the cached score for the given captcha score and user if available. This action removes it from the cache
     1024     * since the intent is for it only to be used for the initial login request to validate credentials + the follow-up
     1025     * request either finalizing the login (no 2FA set) or with the 2FA token.
     1026     *
     1027     * $expired will be set to `true` if the reason for returning `false` is because the $token is recently expired. It
     1028     * will be false when the $token is either uncached or has been expired long enough to be removed from the internal
     1029     * list.
     1030     *
     1031     * @param string $token
     1032     * @param \WP_User $user
     1033     * @param bool $expired
     1034     * @return float|false
     1035     */
     1036    public function cached_captcha_score($token, $user, &$expired = false) {
     1037        $hash = $this->hash_captcha_token($token);
     1038        $score = $this->load_captcha_score($hash, $user);
     1039        if ($score === false) {
     1040            $storedHashes = get_user_meta($user->ID, self::META_KEY_CAPTCHA_SCORES, true);
     1041            if (is_array($storedHashes)) {
     1042                $expired = in_array($hash, $storedHashes);
     1043            }
     1044        }
     1045       
     1046        $this->clear_captcha_score($token, $user);
     1047        return $score;
     1048    }
     1049   
     1050    /**
     1051     * Caches the $token/$score pair for $user, automatically pruning its cached list to the maximum allowable count
     1052     *
     1053     * @param string $token
     1054     * @param float|false $score
     1055     * @param \WP_User $user
     1056     */
     1057    public function cache_captcha_score($token, $score, $user) {
     1058        if ($score === false) {
     1059            return;
     1060        }
     1061       
     1062        $storedHashes = get_user_meta($user->ID, self::META_KEY_CAPTCHA_SCORES, true);
     1063        $validHashes = array();
     1064        if (is_array($storedHashes)) {
     1065            foreach ($storedHashes as $hash) {
     1066                $storedScore = $this->load_captcha_score($hash, $user);
     1067                if ($storedScore !== false) {
     1068                    $validHashes[] = $hash;
     1069                }
     1070            }
     1071        }
     1072       
     1073        $hash = $this->hash_verification_token($token);
     1074        array_unshift($validHashes, $hash);
     1075        while (count($validHashes) > self::CAPTCHA_SCORE_LIMIT) {
     1076            $excessHash = array_pop($validHashes);
     1077            delete_transient($this->get_captcha_score_transient_key($excessHash));
     1078        }
     1079       
     1080        $key = $this->get_captcha_score_transient_key($hash);
     1081        set_transient($key, array('user' => $user->ID, 'score' => $score), self::CAPTCHA_SCORE_CACHE_DURATION);
     1082        update_user_meta($user->ID, self::META_KEY_CAPTCHA_SCORES, $validHashes);
     1083    }
    9511084
    9521085    public function get_user_count() {
  • wordfence/tags/7.11.5/modules/login-security/classes/controller/wordfencels.php

    r3049240 r3063884  
    636636            $score = false;
    637637            if ($requireCAPTCHA && !$performVerification) {
    638                 $score = Controller_CAPTCHA::shared()->score($token);
     638                $expired = false;
     639                if (is_object($user) && $user instanceof \WP_User) {
     640                    $score = Controller_Users::shared()->cached_captcha_score($token, $user, $expired);
     641                }
     642               
     643                if ($score === false) {
     644                    if ($expired) {
     645                        return new \WP_Error('wfls_captcha_expired', wp_kses(__('<strong>CAPTCHA EXPIRED</strong>: The CAPTCHA verification for this login attempt has expired. Please try again.', 'wordfence'), array('strong'=>array())));
     646                    }
     647                   
     648                    $score = Controller_CAPTCHA::shared()->score($token);
     649                   
     650                    if ($score !== false && is_object($user) && $user instanceof \WP_User) {
     651                        Controller_Users::shared()->cache_captcha_score($token, $score, $user);
     652                        Controller_Users::shared()->record_captcha_score($user, $score);
     653                    }
     654                }
     655               
    639656                if ($score === false && !Controller_CAPTCHA::shared()->test_mode()) { //An invalid token will require additional verification (if test mode is not active)
    640657                    $performVerification = true;
    641                 }
    642                 else if (is_object($user) && $user instanceof \WP_User) {
    643                     Controller_Users::shared()->record_captcha_score($user, $score);
    644658                }
    645659            }
  • wordfence/tags/7.11.5/modules/login-security/wordfence-login-security.php

    r3049240 r3063884  
    2727    define('WORDFENCE_LS_FROM_CORE', ($wfCoreActive && isset($wfCoreLoading) && $wfCoreLoading));
    2828   
    29     define('WORDFENCE_LS_VERSION', '1.1.10');
    30     define('WORDFENCE_LS_BUILD_NUMBER', '1710170544');
     29    define('WORDFENCE_LS_VERSION', '1.1.11');
     30    define('WORDFENCE_LS_BUILD_NUMBER', '1712157296');
    3131
    3232    define('WORDFENCE_LS_PLUGIN_BASENAME', plugin_basename(__FILE__));
  • wordfence/tags/7.11.5/readme.txt

    r3056308 r3063884  
    55Requires PHP: 5.5
    66Tested up to: 6.5
    7 Stable tag: 7.11.4
     7Stable tag: 7.11.5
    88License: GPLv3
    99License URI: https://www.gnu.org/licenses/gpl-3.0.html
     
    189189
    190190== Changelog ==
     191
     192= 7.11.5 - April 3, 2024 =
     193* Fix: Revised the behavior of the reCAPTCHA verification to use the documented expiration period of the token and response to avoid sending verification requests too frequently, which could artificially lower scores in some circumstances
     194* Fix: Addressed PHP 8 deprecation notices in the file differ used by file changed scan results
     195* Fix: Reduced the frequency of Wordfence Central status update callbacks in sections of the scan that occur quickly in sequence
    191196
    192197= 7.11.4 - March 11, 2024 =
  • wordfence/tags/7.11.5/vendor/wordfence/wf-waf/src/views/403-roadblock.php

    r2583566 r3063884  
    439439        <div class="about-text">
    440440            <h3 class="h4"><?php wfWAFI18n::esc_html_e('About Wordfence') ?></h3>
    441             <p><?php wfWAFI18n::esc_html_e('Wordfence is a security plugin installed on over 4 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.') ?></p>
     441            <p><?php wfWAFI18n::esc_html_e('Wordfence is a security plugin installed on over 5 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.') ?></p>
    442442            <p><?php wfWAFI18n::esc_html_e('You can also read the documentation to learn about Wordfence\'s blocking tools, or visit wordfence.com to learn more about Wordfence.') ?></p>
    443443        </div>
  • wordfence/tags/7.11.5/vendor/wordfence/wf-waf/src/views/403.php

    r2583566 r3063884  
    354354        <div class="about-text">
    355355            <h3 class="h4"><?php wfWAFI18n::esc_html_e('About Wordfence') ?></h3>
    356             <p><?php wfWAFI18n::esc_html_e('Wordfence is a security plugin installed on over 4 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.') ?></p>
     356            <p><?php wfWAFI18n::esc_html_e('Wordfence is a security plugin installed on over 5 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.') ?></p>
    357357            <p><?php wfWAFI18n::esc_html_e('You can also read the documentation to learn about Wordfence\'s blocking tools, or visit wordfence.com to learn more about Wordfence.') ?></p>
    358358        </div>
  • wordfence/tags/7.11.5/vendor/wordfence/wf-waf/src/views/503-lockout.php

    r2583566 r3063884  
    381381        <div class="about-text">
    382382            <h3 class="h4"><?php wfWAFI18n::esc_html_e('About Wordfence') ?></h3>
    383             <p><?php wfWAFI18n::esc_html_e('Wordfence is a security plugin installed on over 4 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.') ?></p>
     383            <p><?php wfWAFI18n::esc_html_e('Wordfence is a security plugin installed on over 5 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.') ?></p>
    384384            <p><?php wfWAFI18n::esc_html_e('You can also read the documentation to learn about Wordfence\'s blocking tools, or visit wordfence.com to learn more about Wordfence.') ?></p>
    385385        </div>
  • wordfence/tags/7.11.5/vendor/wordfence/wf-waf/src/views/503.php

    r2583566 r3063884  
    375375        <div class="about-text">
    376376            <h3 class="h4"><?php wfWAFI18n::esc_html_e('About Wordfence') ?></h3>
    377             <p><?php wfWAFI18n::esc_html_e('Wordfence is a security plugin installed on over 4 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.') ?></p>
     377            <p><?php wfWAFI18n::esc_html_e('Wordfence is a security plugin installed on over 5 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.') ?></p>
    378378            <p><?php wfWAFI18n::esc_html_e('You can also read the documentation to learn about Wordfence\'s blocking tools, or visit wordfence.com to learn more about Wordfence.') ?></p>
    379379        </div>
  • wordfence/tags/7.11.5/wordfence.php

    r3049240 r3063884  
    55Description: Wordfence Security - Anti-virus, Firewall and Malware Scan
    66Author: Wordfence
    7 Version: 7.11.4
     7Version: 7.11.5
    88Author URI: https://www.wordfence.com/
    99Text Domain: wordfence
     
    3939    exit;
    4040}
    41 define('WORDFENCE_VERSION', '7.11.4');
    42 define('WORDFENCE_BUILD_NUMBER', '1710170544');
     41define('WORDFENCE_VERSION', '7.11.5');
     42define('WORDFENCE_BUILD_NUMBER', '1712157296');
    4343define('WORDFENCE_BASENAME', function_exists('plugin_basename') ? plugin_basename(__FILE__) :
    4444    basename(dirname(__FILE__)) . '/' . basename(__FILE__));
  • wordfence/trunk/languages/wordfence.pot

    r3049240 r3063884  
    33msgid ""
    44msgstr ""
    5 "Project-Id-Version: Wordfence Security 7.11.4\n"
    6 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wordfence-zip-0H0vQX4ZS\n"
     5"Project-Id-Version: Wordfence Security 7.11.5\n"
     6"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wordfence-zip-8lMCyXlaj\n"
    77"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
    88"Language-Team: LANGUAGE <[email protected]>\n"
     
    1010"Content-Type: text/plain; charset=UTF-8\n"
    1111"Content-Transfer-Encoding: 8bit\n"
    12 "POT-Creation-Date: 2024-03-11T15:22:25+00:00\n"
     12"POT-Creation-Date: 2024-04-03T15:14:56+00:00\n"
    1313"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    1414"X-Generator: WP-CLI 2.7.1\n"
     
    238238#: lib/menu_wordfence_central.php:56
    239239#: lib/wf503.php:390
    240 #: lib/wfCentralAPI.php:905
     240#: lib/wfCentralAPI.php:906
    241241#: lib/wfScanEngine.php:307
    242242#: lib/wfScanEngine.php:642
     
    464464#: lib/dashboard/widget_notifications.php:64
    465465#: lib/menu_wordfence_central.php:65
    466 #: lib/wfCentralAPI.php:897
     466#: lib/wfCentralAPI.php:898
    467467msgid "Disconnect This Site"
    468468msgstr ""
     
    23812381#: lib/menu_scanner.php:81
    23822382#: lib/menu_scanner_options.php:135
    2383 #: models/scanner/wfScanner.php:829
     2383#: models/scanner/wfScanner.php:848
    23842384msgid "Enable Premium Scan Signatures."
    23852385msgstr ""
     
    26522652#: lib/menu_tools_twoFactor.php:23
    26532653#: models/page/wfPage.php:117
    2654 #: modules/login-security/classes/controller/wordfencels.php:888
    2655 #: modules/login-security/classes/controller/wordfencels.php:889
     2654#: modules/login-security/classes/controller/wordfencels.php:902
     2655#: modules/login-security/classes/controller/wordfencels.php:903
    26562656msgid "Two-Factor Authentication"
    26572657msgstr ""
     
    28252825#: lib/menu_tools_diagnostic.php:428
    28262826#: lib/menu_tools_diagnostic.php:471
    2827 #: modules/login-security/classes/controller/users.php:538
     2827#: modules/login-security/classes/controller/users.php:542
    28282828#: modules/login-security/classes/controller/wordfencels.php:490
    28292829#: views/diagnostics/text.php:203
     
    28372837#: lib/menu_tools_diagnostic.php:430
    28382838#: lib/menu_tools_diagnostic.php:473
    2839 #: modules/login-security/classes/controller/users.php:547
     2839#: modules/login-security/classes/controller/users.php:551
    28402840#: modules/login-security/classes/controller/wordfencels.php:490
    28412841#: views/diagnostics/text.php:205
     
    40114011#: lib/wf503.php:385
    40124012#: lib/wfLockedOut.php:394
    4013 msgid "Wordfence is a security plugin installed on over 4 million WordPress sites. The owner of this site is using Wordfence to manage access to their site."
     4013msgid "Wordfence is a security plugin installed on over 5 million WordPress sites. The owner of this site is using Wordfence to manage access to their site."
    40144014msgstr ""
    40154015
     
    40894089
    40904090#: lib/wfAdminNoticeQueue.php:193
    4091 #: lib/wfCentralAPI.php:903
     4091#: lib/wfCentralAPI.php:904
    40924092#: lib/wfSupportController.php:433
    40934093#: lib/wordfenceClass.php:6303
     
    52675267msgstr ""
    52685268
    5269 #: lib/wfCentralAPI.php:890
     5269#: lib/wfCentralAPI.php:891
    52705270msgid "Your site is currently linked to Wordfence Central under a different site URL."
    52715271msgstr ""
    52725272
    5273 #: lib/wfCentralAPI.php:892
     5273#: lib/wfCentralAPI.php:893
    52745274msgid "This may cause duplicated scan issues if both sites are currently active and reporting and is generally caused by duplicating the database from one site to another (e.g., from a production site to staging). We recommend disconnecting this site only, which will leave the matching site still connected."
    52755275msgstr ""
    52765276
    5277 #: lib/wfCentralAPI.php:894
     5277#: lib/wfCentralAPI.php:895
    52785278msgid "If this is a single site with multiple domains or subdomains, you can dismiss this message."
    52795279msgstr ""
    52805280
    5281 #: lib/wfCentralAPI.php:900
     5281#: lib/wfCentralAPI.php:901
    52825282msgid "Disconnect All"
    52835283msgstr ""
     
    88628862#: lib/wordfenceClass.php:6335
    88638863#: modules/login-security/classes/controller/wordfencels.php:490
    8864 #: modules/login-security/classes/controller/wordfencels.php:855
     8864#: modules/login-security/classes/controller/wordfencels.php:869
    88658865#: modules/login-security/views/manage/grace-period.php:22
    88668866msgid "Locked Out"
     
    1031310313msgstr ""
    1031410314
    10315 #: models/scanner/wfScanner.php:116
     10315#: models/scanner/wfScanner.php:118
    1031610316msgid "Quick"
    1031710317msgstr ""
    1031810318
    10319 #: models/scanner/wfScanner.php:118
     10319#: models/scanner/wfScanner.php:120
    1032010320msgid "Limited"
    1032110321msgstr ""
    1032210322
    10323 #: models/scanner/wfScanner.php:120
     10323#: models/scanner/wfScanner.php:122
    1032410324#: views/scanner/scan-type.php:32
    1032510325msgid "High Sensitivity"
    1032610326msgstr ""
    1032710327
    10328 #: models/scanner/wfScanner.php:122
     10328#: models/scanner/wfScanner.php:124
    1032910329#: views/scanner/scan-scheduling.php:50
    1033010330msgid "Custom"
    1033110331msgstr ""
    1033210332
    10333 #: models/scanner/wfScanner.php:125
     10333#: models/scanner/wfScanner.php:127
    1033410334msgid "Standard"
    1033510335msgstr ""
    1033610336
    10337 #: models/scanner/wfScanner.php:139
     10337#: models/scanner/wfScanner.php:141
    1033810338msgid "Low resource utilization, limited detection capability"
    1033910339msgstr ""
    1034010340
    10341 #: models/scanner/wfScanner.php:141
     10341#: models/scanner/wfScanner.php:143
    1034210342msgid "Standard detection capability, chance of false positives"
    1034310343msgstr ""
    1034410344
    10345 #: models/scanner/wfScanner.php:143
     10345#: models/scanner/wfScanner.php:145
    1034610346msgid "Custom scan options selected"
    1034710347msgstr ""
    1034810348
    10349 #: models/scanner/wfScanner.php:146
     10349#: models/scanner/wfScanner.php:148
    1035010350msgid "Standard detection capability"
    1035110351msgstr ""
    1035210352
    10353 #: models/scanner/wfScanner.php:838
     10353#: models/scanner/wfScanner.php:857
    1035410354msgid "Enable Premium Reputation Checks."
    1035510355msgstr ""
    1035610356
    10357 #: models/scanner/wfScanner.php:846
     10357#: models/scanner/wfScanner.php:865
    1035810358msgid "Enable %d scan option."
    1035910359msgid_plural "Enable %d scan options."
     
    1036110361msgstr[1] ""
    1036210362
    10363 #: models/scanner/wfScanner.php:888
     10363#: models/scanner/wfScanner.php:907
    1036410364msgid "Enable scan option to check if this website is being \"Spamvertised\"."
    1036510365msgstr ""
    1036610366
    10367 #: models/scanner/wfScanner.php:889
     10367#: models/scanner/wfScanner.php:908
    1036810368msgid "Enable scan option to check if your website IP is generating spam."
    1036910369msgstr ""
    1037010370
    10371 #: models/scanner/wfScanner.php:890
     10371#: models/scanner/wfScanner.php:909
    1037210372msgid "Enable scan option to check if your website is on a domain blocklist."
    1037310373msgstr ""
    1037410374
    10375 #: models/scanner/wfScanner.php:994
     10375#: models/scanner/wfScanner.php:1013
    1037610376msgid "User defined scan pattern"
    1037710377msgstr ""
    1037810378
    1037910379#. translators: 1. Day of week. 2. Hour of day. 3. Localized date.
    10380 #: models/scanner/wfScanner.php:1272
     10380#: models/scanner/wfScanner.php:1291
    1038110381msgid "Scheduled time for day %s hour %s is: %s"
    1038210382msgstr ""
     
    1059810598msgstr ""
    1059910599
    10600 #: modules/login-security/classes/controller/users.php:517
     10600#: modules/login-security/classes/controller/users.php:521
    1060110601#: modules/login-security/classes/controller/wordfencels.php:486
    1060210602msgid "2FA Status"
    1060310603msgstr ""
    1060410604
    10605 #: modules/login-security/classes/controller/users.php:521
     10605#: modules/login-security/classes/controller/users.php:525
    1060610606msgid "Last Login"
    1060710607msgstr ""
    1060810608
    10609 #: modules/login-security/classes/controller/users.php:523
     10609#: modules/login-security/classes/controller/users.php:527
    1061010610msgid "Last CAPTCHA"
    1061110611msgstr ""
    1061210612
    10613 #: modules/login-security/classes/controller/users.php:533
     10613#: modules/login-security/classes/controller/users.php:537
    1061410614msgid "Not Allowed"
    1061510615msgstr ""
    1061610616
    10617 #: modules/login-security/classes/controller/users.php:541
     10617#: modules/login-security/classes/controller/users.php:545
    1061810618msgid "Inactive<small class=\"wfls-sub-status\">(Grace Period)</small>"
    1061910619msgstr ""
    1062010620
    10621 #: modules/login-security/classes/controller/users.php:544
     10621#: modules/login-security/classes/controller/users.php:548
    1062210622msgid "Locked Out<small class=\"wfls-sub-status\">(Grace Period Disabled)</small>"
    1062310623msgstr ""
    1062410624
    10625 #: modules/login-security/classes/controller/users.php:544
     10625#: modules/login-security/classes/controller/users.php:548
    1062610626msgid "Locked Out<small class=\"wfls-sub-status\">(Grace Period Exceeded)</small>"
    1062710627msgstr ""
    1062810628
    10629 #: modules/login-security/classes/controller/users.php:560
     10629#: modules/login-security/classes/controller/users.php:564
    1063010630msgid "(not required)"
    1063110631msgstr ""
    1063210632
    10633 #: modules/login-security/classes/controller/users.php:654
     10633#: modules/login-security/classes/controller/users.php:658
    1063410634msgid "Edit two-factor authentication for %s"
    1063510635msgstr ""
    1063610636
    10637 #: modules/login-security/classes/controller/users.php:654
     10637#: modules/login-security/classes/controller/users.php:658
    1063810638#: modules/login-security/views/settings/options.php:9
    1063910639msgid "2FA"
    1064010640msgstr ""
    1064110641
    10642 #: modules/login-security/classes/controller/users.php:665
     10642#: modules/login-security/classes/controller/users.php:669
    1064310643#: modules/login-security/views/settings/user-stats.php:25
    1064410644msgid "2FA Active"
    1064510645msgstr ""
    1064610646
    10647 #: modules/login-security/classes/controller/users.php:666
     10647#: modules/login-security/classes/controller/users.php:670
    1064810648#: modules/login-security/views/settings/user-stats.php:26
    1064910649msgid "2FA Inactive"
     
    1079310793msgstr ""
    1079410794
    10795 #: modules/login-security/classes/controller/wordfencels.php:671
     10795#: modules/login-security/classes/controller/wordfencels.php:645
     10796msgid "<strong>CAPTCHA EXPIRED</strong>: The CAPTCHA verification for this login attempt has expired. Please try again."
     10797msgstr ""
     10798
     10799#: modules/login-security/classes/controller/wordfencels.php:685
    1079610800msgid "Login Verification Required"
    1079710801msgstr ""
    1079810802
    10799 #: modules/login-security/classes/controller/wordfencels.php:676
     10803#: modules/login-security/classes/controller/wordfencels.php:690
    1080010804msgid "<strong>VERIFICATION REQUIRED</strong>: Additional verification is required for login. If there is a valid account for the provided login credentials, please check the email address associated with it for a verification link to continue logging in."
    1080110805msgstr ""
    1080210806
    10803 #: modules/login-security/classes/controller/wordfencels.php:692
     10807#: modules/login-security/classes/controller/wordfencels.php:706
    1080410808msgid "<strong>CODE INVALID</strong>: The 2FA code provided is either expired or invalid. Please try again."
    1080510809msgstr ""
    1080610810
    10807 #: modules/login-security/classes/controller/wordfencels.php:701
     10811#: modules/login-security/classes/controller/wordfencels.php:715
    1080810812msgid "<strong>CODE REQUIRED</strong>: Please enter your 2FA code immediately after your password in the same field."
    1080910813msgstr ""
    1081010814
    10811 #: modules/login-security/classes/controller/wordfencels.php:703
     10815#: modules/login-security/classes/controller/wordfencels.php:717
    1081210816msgid "<strong>CODE REQUIRED</strong>: Please provide your 2FA code when prompted."
    1081310817msgstr ""
    1081410818
    10815 #: modules/login-security/classes/controller/wordfencels.php:706
     10819#: modules/login-security/classes/controller/wordfencels.php:720
    1081610820msgid "<strong>LOGIN BLOCKED</strong>: 2FA is required to be active on your account. Please contact the site administrator."
    1081710821msgstr ""
    1081810822
    10819 #: modules/login-security/classes/controller/wordfencels.php:709
     10823#: modules/login-security/classes/controller/wordfencels.php:723
    1082010824msgid "You do not currently have two-factor authentication active on your account, which will be required beginning %s. <a href=\"%s\">Configure 2FA</a>"
    1082110825msgstr ""
    1082210826
    10823 #: modules/login-security/classes/controller/wordfencels.php:759
     10827#: modules/login-security/classes/controller/wordfencels.php:773
    1082410828msgid "Email verification succeeded. Please continue logging in."
    1082510829msgstr ""
    1082610830
    10827 #: modules/login-security/classes/controller/wordfencels.php:762
     10831#: modules/login-security/classes/controller/wordfencels.php:776
    1082810832msgid "Email verification invalid or expired. Please try again."
    1082910833msgstr ""
    1083010834
    10831 #: modules/login-security/classes/controller/wordfencels.php:816
    10832 #: modules/login-security/classes/controller/wordfencels.php:819
     10835#: modules/login-security/classes/controller/wordfencels.php:830
     10836#: modules/login-security/classes/controller/wordfencels.php:833
    1083310837msgid "Login Security"
    1083410838msgstr ""
    1083510839
    10836 #: modules/login-security/classes/controller/wordfencels.php:847
     10840#: modules/login-security/classes/controller/wordfencels.php:861
    1083710841#: modules/login-security/views/settings/options.php:23
    1083810842#: modules/login-security/views/settings/user-stats.php:33
     
    1084010844msgstr ""
    1084110845
    10842 #: modules/login-security/classes/controller/wordfencels.php:851
     10846#: modules/login-security/classes/controller/wordfencels.php:865
    1084310847#: modules/login-security/views/manage/grace-period.php:22
    1084410848#: modules/login-security/views/options/option-roles.php:57
     
    1084610850msgstr ""
    1084710851
    10848 #: modules/login-security/classes/controller/wordfencels.php:870
     10852#: modules/login-security/classes/controller/wordfencels.php:884
    1084910853msgid "Users without 2FA active (%s)"
    1085010854msgstr ""
    1085110855
    10852 #: modules/login-security/classes/controller/wordfencels.php:889
     10856#: modules/login-security/classes/controller/wordfencels.php:903
    1085310857msgid "Learn more<span class=\"wfls-hidden-xs\"> about Two-Factor Authentication</span>"
    1085410858msgstr ""
    1085510859
    10856 #: modules/login-security/classes/controller/wordfencels.php:898
     10860#: modules/login-security/classes/controller/wordfencels.php:912
    1085710861msgid "Settings"
    1085810862msgstr ""
    1085910863
    10860 #: modules/login-security/classes/controller/wordfencels.php:899
     10864#: modules/login-security/classes/controller/wordfencels.php:913
    1086110865msgid "Login Security Settings"
    1086210866msgstr ""
    1086310867
    10864 #: modules/login-security/classes/controller/wordfencels.php:899
     10868#: modules/login-security/classes/controller/wordfencels.php:913
    1086510869msgid "Learn more<span class=\"wfls-hidden-xs\"> about Login Security</span>"
    1086610870msgstr ""
    1086710871
    10868 #: modules/login-security/classes/controller/wordfencels.php:925
     10872#: modules/login-security/classes/controller/wordfencels.php:939
    1086910873msgid "<strong>REGISTRATION ATTEMPT BLOCKED</strong>: This site requires a security token created when the page loads for all registration attempts. Please ensure JavaScript is enabled and try again."
    1087010874msgstr ""
    1087110875
    10872 #: modules/login-security/classes/controller/wordfencels.php:932
     10876#: modules/login-security/classes/controller/wordfencels.php:946
    1087310877msgid "<strong>REGISTRATION ATTEMPT BLOCKED</strong>: The security token for the login attempt was invalid or expired. Please reload the page and try again."
    1087410878msgstr ""
    1087510879
    10876 #: modules/login-security/classes/controller/wordfencels.php:945
     10880#: modules/login-security/classes/controller/wordfencels.php:959
    1087710881msgid "<strong>REGISTRATION BLOCKED</strong>: The registration request was blocked because it was flagged as spam. Please try again or <a href=\"#\" class=\"wfls-registration-captcha-contact\" data-token=\"%s\">contact the site owner</a> for help."
    1087810882msgstr ""
    1087910883
    10880 #: modules/login-security/classes/controller/wordfencels.php:948
     10884#: modules/login-security/classes/controller/wordfencels.php:962
    1088110885msgid "<strong>REGISTRATION BLOCKED</strong>: The registration request was blocked because it was flagged as spam. Please try again or contact the site owner for help."
    1088210886msgstr ""
    1088310887
    10884 #: modules/login-security/classes/controller/wordfencels.php:1018
     10888#: modules/login-security/classes/controller/wordfencels.php:1032
    1088510889msgid "Wordfence 2FA"
    1088610890msgstr ""
  • wordfence/trunk/lib/Diff/SequenceMatcher.php

    r2430969 r3063884  
    7575        'ignoreCase' => false
    7676    );
     77   
     78    private $matchingBlocks = null;
     79    private $opCodes = null;
     80    private $fullBCount = null;
    7781
    7882    /**
     
    680684        }
    681685
    682         if(count($a) == $count($b)) {
     686        if(count($a) == count($b)) {
    683687            return 0;
    684688        }
  • wordfence/trunk/lib/wf503.php

    r2583566 r3063884  
    383383            <div class="about-text">
    384384                <h3 class="h4"><?php esc_html_e('About Wordfence', 'wordfence'); ?></h3>
    385                 <p><?php esc_html_e('Wordfence is a security plugin installed on over 4 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.', 'wordfence'); ?></p>
     385                <p><?php esc_html_e('Wordfence is a security plugin installed on over 5 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.', 'wordfence'); ?></p>
    386386                <p><?php esc_html_e('You can also read the documentation to learn about Wordfence\'s blocking tools, or visit wordfence.com to learn more about Wordfence.', 'wordfence'); ?></p>
    387387            </div>
  • wordfence/trunk/lib/wfCentralAPI.php

    r3036535 r3063884  
    585585        try {
    586586            $response = $request->execute();
     587            wfConfig::set('lastScanStageStatusUpdate', time(), wfConfig::DONT_AUTOLOAD);
    587588            return $response;
    588589        }
  • wordfence/trunk/lib/wfLockedOut.php

    r2583566 r3063884  
    392392        <div class="about-text">
    393393            <h3 class="h4"><?php esc_html_e('About Wordfence', 'wordfence'); ?></h3>
    394             <p><?php esc_html_e('Wordfence is a security plugin installed on over 4 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.', 'wordfence'); ?></p>
     394            <p><?php esc_html_e('Wordfence is a security plugin installed on over 5 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.', 'wordfence'); ?></p>
    395395            <p><?php esc_html_e('You can also read the documentation to learn about Wordfence\'s blocking tools, or visit wordfence.com to learn more about Wordfence.', 'wordfence'); ?></p>
    396396        </div>
  • wordfence/trunk/models/scanner/wfScanner.php

    r3049240 r3063884  
    5656    const SUMMARY_SCANNED_USERS = 'scannedUsers';
    5757    const SUMMARY_SCANNED_URLS = 'scannedURLs';
     58   
     59    const CENTRAL_STAGE_UPDATE_THRESHOLD = 5;
    5860   
    5961    private $_scanType = false;
     
    688690    }
    689691   
     692    private function _shouldForceUpdate($stageID) {
     693        if ($stageID == wfScanner::STAGE_MALWARE_SCAN) {
     694            return true;
     695        }
     696        return false;
     697    }
     698   
    690699    /**
    691700     * Increments the stage started counter and marks it as running if not already in that state.
     
    705714        $runningStatus[$stageID]['started'] += 1;
    706715        wfConfig::set_ser('scanStageStatuses', $runningStatus, false, wfConfig::DONT_AUTOLOAD);
    707         if (wfCentral::isConnected()) {
     716        if (wfCentral::isConnected() && ($this->_shouldForceUpdate($stageID) || (time() - wfConfig::getInt('lastScanStageStatusUpdate', 0)) > self::CENTRAL_STAGE_UPDATE_THRESHOLD)) {
    708717            wfCentral::updateScanStatus($runningStatus);
    709718        }
     
    739748        wfConfig::set_ser('scanStageStatuses', $runningStatus, false, wfConfig::DONT_AUTOLOAD);
    740749        if (wfCentral::isConnected()) {
    741             wfCentral::updateScanStatus($runningStatus);
     750            $forceSend = true; //Force sending the last stage completion update even if the timing would otherwise prevent it
     751            foreach ($runningStatus as $stageID => $stage) {
     752                if ($runningStatus[$stageID]['finished'] < $runningStatus[$stageID]['expected']) {
     753                    $forceSend = false;
     754                    break;
     755                }
     756            }
     757           
     758            if ($forceSend || (time() - wfConfig::getInt('lastScanStageStatusUpdate', 0)) > self::CENTRAL_STAGE_UPDATE_THRESHOLD) {
     759                wfCentral::updateScanStatus($runningStatus);
     760            }
    742761        }
    743762
  • wordfence/trunk/modules/login-security/classes/controller/captcha.php

    r3049240 r3063884  
    9999                $jsonResponse = wp_remote_retrieve_body($response);
    100100                $decoded = @json_decode($jsonResponse, true);
    101                 if (is_array($decoded) && isset($decoded['success']) && isset($decoded['score']) && isset($decoded['action'])) {
    102                     if ($decoded['success'] && $decoded['action'] == $action) {
    103                         return (float) $decoded['score'];
     101                if (is_array($decoded) && isset($decoded['success'])) {
     102                    if ($decoded['success']) {
     103                        if (isset($decoded['score']) && isset($decoded['action']) && $decoded['action'] == $action) {
     104                            return (float) $decoded['score'];
     105                        }
    104106                    }
    105107                    return false;
  • wordfence/trunk/modules/login-security/classes/controller/users.php

    r3049240 r3063884  
    1515    const META_KEY_ALLOW_GRACE_PERIOD = 'wfls-allow-grace-period';
    1616    const META_KEY_VERIFICATION_TOKENS = 'wfls-verification-tokens';
     17    const META_KEY_CAPTCHA_SCORES = 'wfls-captcha-scores';
    1718    const VERIFICATION_TOKEN_BYTES = 64;
    1819    const VERIFICATION_TOKEN_LIMIT = 5; //Max number of concurrent tokens
    1920    const VERIFICATION_TOKEN_TRANSIENT_PREFIX = 'wfls_verify_';
     21    const CAPTCHA_SCORE_LIMIT = 2; //Max number of captcha scores cached
     22    const CAPTCHA_SCORE_TRANSIENT_PREFIX = 'wfls_captcha_';
     23    const CAPTCHA_SCORE_CACHE_DURATION = 60; //seconds
    2024    const LARGE_USER_BASE_THRESHOLD = 1000;
    2125    const TRUNCATED_ROLE_KEY = 1;
     
    949953        return $userId !== null && ($user === null || $userId === $user->ID);
    950954    }
     955   
     956    /**
     957     * Returns the key used to store a captcha score transient.
     958     *
     959     * @param string $hash
     960     * @return string
     961     */
     962    private function get_captcha_score_transient_key($hash) {
     963        return self::CAPTCHA_SCORE_TRANSIENT_PREFIX . $hash;
     964    }
     965   
     966    /**
     967     * Attempts to look up a stored captcha score for the given hash and user. If found, returns the score. If not,
     968     * returns null.
     969     *
     970     * @param string $hash
     971     * @param \WP_User $user
     972     * @return float|false
     973     */
     974    private function load_captcha_score($hash, $user) {
     975        $key = $this->get_captcha_score_transient_key($hash);
     976        $data = get_transient($key);
     977        if ($data === false) {
     978            return false;
     979        }
     980       
     981        if (!$user->exists() || $data['user'] !== $user->ID) {
     982            return false;
     983        }
     984       
     985        return floatval($data['score']);
     986    }
     987   
     988    /**
     989     * Deletes the stored captcha score if present for the given hash.
     990     *
     991     * @param string $hash
     992     */
     993    private function clear_captcha_score($token, $user) {
     994        $hash = $this->hash_captcha_token($token);
     995        $key = $this->get_captcha_score_transient_key($hash);
     996        delete_transient($key);
     997       
     998        $storedHashes = get_user_meta($user->ID, self::META_KEY_CAPTCHA_SCORES, true);
     999        $validHashes = array();
     1000        if (is_array($storedHashes)) {
     1001            foreach ($storedHashes as $hash) {
     1002                $storedScore = $this->load_captcha_score($hash, $user);
     1003                if ($storedScore !== false) {
     1004                    $validHashes[] = $hash;
     1005                }
     1006            }
     1007        }
     1008        $validHashes = array_slice($validHashes, 0, self::CAPTCHA_SCORE_LIMIT);
     1009        update_user_meta($user->ID, self::META_KEY_CAPTCHA_SCORES, $validHashes);
     1010    }
     1011   
     1012    /**
     1013     * Hashes the captcha token for storage.
     1014     *
     1015     * @param string $token
     1016     * @return string
     1017     */
     1018    private function hash_captcha_token($token) {
     1019        return wp_hash($token);
     1020    }
     1021   
     1022    /**
     1023     * Returns the cached score for the given captcha score and user if available. This action removes it from the cache
     1024     * since the intent is for it only to be used for the initial login request to validate credentials + the follow-up
     1025     * request either finalizing the login (no 2FA set) or with the 2FA token.
     1026     *
     1027     * $expired will be set to `true` if the reason for returning `false` is because the $token is recently expired. It
     1028     * will be false when the $token is either uncached or has been expired long enough to be removed from the internal
     1029     * list.
     1030     *
     1031     * @param string $token
     1032     * @param \WP_User $user
     1033     * @param bool $expired
     1034     * @return float|false
     1035     */
     1036    public function cached_captcha_score($token, $user, &$expired = false) {
     1037        $hash = $this->hash_captcha_token($token);
     1038        $score = $this->load_captcha_score($hash, $user);
     1039        if ($score === false) {
     1040            $storedHashes = get_user_meta($user->ID, self::META_KEY_CAPTCHA_SCORES, true);
     1041            if (is_array($storedHashes)) {
     1042                $expired = in_array($hash, $storedHashes);
     1043            }
     1044        }
     1045       
     1046        $this->clear_captcha_score($token, $user);
     1047        return $score;
     1048    }
     1049   
     1050    /**
     1051     * Caches the $token/$score pair for $user, automatically pruning its cached list to the maximum allowable count
     1052     *
     1053     * @param string $token
     1054     * @param float|false $score
     1055     * @param \WP_User $user
     1056     */
     1057    public function cache_captcha_score($token, $score, $user) {
     1058        if ($score === false) {
     1059            return;
     1060        }
     1061       
     1062        $storedHashes = get_user_meta($user->ID, self::META_KEY_CAPTCHA_SCORES, true);
     1063        $validHashes = array();
     1064        if (is_array($storedHashes)) {
     1065            foreach ($storedHashes as $hash) {
     1066                $storedScore = $this->load_captcha_score($hash, $user);
     1067                if ($storedScore !== false) {
     1068                    $validHashes[] = $hash;
     1069                }
     1070            }
     1071        }
     1072       
     1073        $hash = $this->hash_verification_token($token);
     1074        array_unshift($validHashes, $hash);
     1075        while (count($validHashes) > self::CAPTCHA_SCORE_LIMIT) {
     1076            $excessHash = array_pop($validHashes);
     1077            delete_transient($this->get_captcha_score_transient_key($excessHash));
     1078        }
     1079       
     1080        $key = $this->get_captcha_score_transient_key($hash);
     1081        set_transient($key, array('user' => $user->ID, 'score' => $score), self::CAPTCHA_SCORE_CACHE_DURATION);
     1082        update_user_meta($user->ID, self::META_KEY_CAPTCHA_SCORES, $validHashes);
     1083    }
    9511084
    9521085    public function get_user_count() {
  • wordfence/trunk/modules/login-security/classes/controller/wordfencels.php

    r3049240 r3063884  
    636636            $score = false;
    637637            if ($requireCAPTCHA && !$performVerification) {
    638                 $score = Controller_CAPTCHA::shared()->score($token);
     638                $expired = false;
     639                if (is_object($user) && $user instanceof \WP_User) {
     640                    $score = Controller_Users::shared()->cached_captcha_score($token, $user, $expired);
     641                }
     642               
     643                if ($score === false) {
     644                    if ($expired) {
     645                        return new \WP_Error('wfls_captcha_expired', wp_kses(__('<strong>CAPTCHA EXPIRED</strong>: The CAPTCHA verification for this login attempt has expired. Please try again.', 'wordfence'), array('strong'=>array())));
     646                    }
     647                   
     648                    $score = Controller_CAPTCHA::shared()->score($token);
     649                   
     650                    if ($score !== false && is_object($user) && $user instanceof \WP_User) {
     651                        Controller_Users::shared()->cache_captcha_score($token, $score, $user);
     652                        Controller_Users::shared()->record_captcha_score($user, $score);
     653                    }
     654                }
     655               
    639656                if ($score === false && !Controller_CAPTCHA::shared()->test_mode()) { //An invalid token will require additional verification (if test mode is not active)
    640657                    $performVerification = true;
    641                 }
    642                 else if (is_object($user) && $user instanceof \WP_User) {
    643                     Controller_Users::shared()->record_captcha_score($user, $score);
    644658                }
    645659            }
  • wordfence/trunk/modules/login-security/wordfence-login-security.php

    r3049240 r3063884  
    2727    define('WORDFENCE_LS_FROM_CORE', ($wfCoreActive && isset($wfCoreLoading) && $wfCoreLoading));
    2828   
    29     define('WORDFENCE_LS_VERSION', '1.1.10');
    30     define('WORDFENCE_LS_BUILD_NUMBER', '1710170544');
     29    define('WORDFENCE_LS_VERSION', '1.1.11');
     30    define('WORDFENCE_LS_BUILD_NUMBER', '1712157296');
    3131
    3232    define('WORDFENCE_LS_PLUGIN_BASENAME', plugin_basename(__FILE__));
  • wordfence/trunk/readme.txt

    r3056308 r3063884  
    189189
    190190== Changelog ==
     191
     192= 7.11.5 - April 3, 2024 =
     193* Fix: Revised the behavior of the reCAPTCHA verification to use the documented expiration period of the token and response to avoid sending verification requests too frequently, which could artificially lower scores in some circumstances
     194* Fix: Addressed PHP 8 deprecation notices in the file differ used by file changed scan results
     195* Fix: Reduced the frequency of Wordfence Central status update callbacks in sections of the scan that occur quickly in sequence
    191196
    192197= 7.11.4 - March 11, 2024 =
  • wordfence/trunk/vendor/wordfence/wf-waf/src/views/403-roadblock.php

    r2583566 r3063884  
    439439        <div class="about-text">
    440440            <h3 class="h4"><?php wfWAFI18n::esc_html_e('About Wordfence') ?></h3>
    441             <p><?php wfWAFI18n::esc_html_e('Wordfence is a security plugin installed on over 4 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.') ?></p>
     441            <p><?php wfWAFI18n::esc_html_e('Wordfence is a security plugin installed on over 5 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.') ?></p>
    442442            <p><?php wfWAFI18n::esc_html_e('You can also read the documentation to learn about Wordfence\'s blocking tools, or visit wordfence.com to learn more about Wordfence.') ?></p>
    443443        </div>
  • wordfence/trunk/vendor/wordfence/wf-waf/src/views/403.php

    r2583566 r3063884  
    354354        <div class="about-text">
    355355            <h3 class="h4"><?php wfWAFI18n::esc_html_e('About Wordfence') ?></h3>
    356             <p><?php wfWAFI18n::esc_html_e('Wordfence is a security plugin installed on over 4 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.') ?></p>
     356            <p><?php wfWAFI18n::esc_html_e('Wordfence is a security plugin installed on over 5 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.') ?></p>
    357357            <p><?php wfWAFI18n::esc_html_e('You can also read the documentation to learn about Wordfence\'s blocking tools, or visit wordfence.com to learn more about Wordfence.') ?></p>
    358358        </div>
  • wordfence/trunk/vendor/wordfence/wf-waf/src/views/503-lockout.php

    r2583566 r3063884  
    381381        <div class="about-text">
    382382            <h3 class="h4"><?php wfWAFI18n::esc_html_e('About Wordfence') ?></h3>
    383             <p><?php wfWAFI18n::esc_html_e('Wordfence is a security plugin installed on over 4 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.') ?></p>
     383            <p><?php wfWAFI18n::esc_html_e('Wordfence is a security plugin installed on over 5 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.') ?></p>
    384384            <p><?php wfWAFI18n::esc_html_e('You can also read the documentation to learn about Wordfence\'s blocking tools, or visit wordfence.com to learn more about Wordfence.') ?></p>
    385385        </div>
  • wordfence/trunk/vendor/wordfence/wf-waf/src/views/503.php

    r2583566 r3063884  
    375375        <div class="about-text">
    376376            <h3 class="h4"><?php wfWAFI18n::esc_html_e('About Wordfence') ?></h3>
    377             <p><?php wfWAFI18n::esc_html_e('Wordfence is a security plugin installed on over 4 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.') ?></p>
     377            <p><?php wfWAFI18n::esc_html_e('Wordfence is a security plugin installed on over 5 million WordPress sites. The owner of this site is using Wordfence to manage access to their site.') ?></p>
    378378            <p><?php wfWAFI18n::esc_html_e('You can also read the documentation to learn about Wordfence\'s blocking tools, or visit wordfence.com to learn more about Wordfence.') ?></p>
    379379        </div>
  • wordfence/trunk/wordfence.php

    r3049240 r3063884  
    55Description: Wordfence Security - Anti-virus, Firewall and Malware Scan
    66Author: Wordfence
    7 Version: 7.11.4
     7Version: 7.11.5
    88Author URI: https://www.wordfence.com/
    99Text Domain: wordfence
     
    3939    exit;
    4040}
    41 define('WORDFENCE_VERSION', '7.11.4');
    42 define('WORDFENCE_BUILD_NUMBER', '1710170544');
     41define('WORDFENCE_VERSION', '7.11.5');
     42define('WORDFENCE_BUILD_NUMBER', '1712157296');
    4343define('WORDFENCE_BASENAME', function_exists('plugin_basename') ? plugin_basename(__FILE__) :
    4444    basename(dirname(__FILE__)) . '/' . basename(__FILE__));
Note: See TracChangeset for help on using the changeset viewer.