Plugin Directory

Changeset 3443097


Ignore:
Timestamp:
01/20/2026 09:48:16 AM (7 weeks ago)
Author:
mpol
Message:

Tag 4.1.0

Location:
la-sentinelle-antispam
Files:
2 deleted
21 edited
3 copied

Legend:

Unmodified
Added
Removed
  • la-sentinelle-antispam/tags/4.1.0/admin/lasent-settingspage-formupdate.php

    r3397125 r3443097  
    7979                    }
    8080
    81                     if (isset($_POST['la_sentinelle-webgl']) && $_POST['la_sentinelle-webgl'] === 'on') {
    82                         update_option( 'la_sentinelle-webgl', 'true', true );
    83                         $saved = true;
    84                     } else {
    85                         update_option( 'la_sentinelle-webgl', 'false', true );
    86                         $saved = true;
    87                     }
    88 
    8981                    break;
    9082
  • la-sentinelle-antispam/tags/4.1.0/admin/lasent-settingstab-spamfilters.php

    r3302815 r3443097  
    132132
    133133        <tr>
    134             <th scope="row"><label for="la_sentinelle-webgl"><?php esc_html_e('WebGL', 'la-sentinelle-antispam'); ?></label></th>
    135             <td>
    136                 <input <?php
    137                     if (get_option( 'la_sentinelle-webgl', 'false') === 'true') {
    138                         echo 'checked="checked"';
    139                     } ?>
    140                     type="checkbox" name="la_sentinelle-webgl" id="la_sentinelle-webgl">
    141                 <label for="la_sentinelle-webgl">
    142                     <?php esc_html_e('Use WebGL.', 'la-sentinelle-antispam'); ?> <?php esc_html_e('(Experimental)', 'la-sentinelle-antispam'); ?>
    143                 </label><br />
    144                 <span class="setting-description">
    145                     <?php
    146                     esc_html_e('This will add a WebGL test to the form. It is a way to check for a real browser with 3D and WebGL enabled. If it does not validate, the entry will be marked as spam.', 'la-sentinelle-antispam');
    147                     echo '<br />';
    148                     esc_html_e('This spamfilter is experimental, it is possible that you get false-positives in your spamfolder. If this is the case, you are advised to disable this WebGL filter and report this on the support forum.', 'la-sentinelle-antispam');
    149                     ?>
    150                 </span>
    151             </td>
    152         </tr>
    153 
    154         <tr>
    155134            <th colspan="2">
    156135                <p class="submit">
  • la-sentinelle-antispam/tags/4.1.0/forms/lasent-wordpress-comment-form.php

    r3116910 r3443097  
    129129            } else if ( $marker === 'ajax' ) {
    130130                update_comment_meta( $id, 'la_sentinelle_ajax', 'spam' );
    131             } else if ( $marker === 'webgl' ) {
    132                 update_comment_meta( $id, 'la_sentinelle_webgl', 'spam' );
    133131            }
    134132        }
     
    203201    $la_sentinelle_sfs      = get_comment_meta( $comment_id, 'la_sentinelle_sfs', true );
    204202    $la_sentinelle_ajax     = get_comment_meta( $comment_id, 'la_sentinelle_ajax', true );
    205     $la_sentinelle_webgl    = get_comment_meta( $comment_id, 'la_sentinelle_webgl', true );
    206 
    207     if ( $la_sentinelle_nonce === 'spam' || $la_sentinelle_honeypot === 'spam' || $la_sentinelle_timeout === 'spam' || $la_sentinelle_sfs === 'spam' || $la_sentinelle_ajax === 'spam' || $la_sentinelle_webgl === 'spam' ) {
     203
     204    if ( $la_sentinelle_nonce === 'spam' || $la_sentinelle_honeypot === 'spam' || $la_sentinelle_timeout === 'spam' || $la_sentinelle_sfs === 'spam' || $la_sentinelle_ajax === 'spam' ) {
    208205
    209206        $output .= '<div class="misc-pub-section misc-pub-la-sentinelle">
     
    231228                ';
    232229        }
    233         if ( $la_sentinelle_webgl === 'spam' ) {
    234             $output .= '<span>&bull; ' . esc_html__( 'Marked as spam by WebGL', 'la-sentinelle-antispam' ) . '</span><br />
    235                 ';
    236         }
    237230
    238231        $output .= '</div>
  • la-sentinelle-antispam/tags/4.1.0/functions/lasent-settings.php

    r3397125 r3443097  
    3131    register_setting( 'la_sentinelle_options', 'la_sentinelle-timeout',              'sanitize_text_field' ); // 'true'
    3232    register_setting( 'la_sentinelle_options', 'la_sentinelle-version',              'sanitize_text_field' ); // string
    33     register_setting( 'la_sentinelle_options', 'la_sentinelle-webgl',                'sanitize_text_field' ); // 'false'
    3433    register_setting( 'la_sentinelle_options', 'la_sentinelle-woo-registration',     'sanitize_text_field' ); // 'false'
    3534    register_setting( 'la_sentinelle_options', 'la_sentinelle-wpcomment',            'sanitize_text_field' ); // 'true'
     
    9897        update_option( 'la_sentinelle-timeout', 'true', true );
    9998    }
    100     if ( get_option('la_sentinelle-webgl', false) === false ) {
    101         update_option( 'la_sentinelle-webgl', 'false', true );
    102     }
    10399    if ( get_option('la_sentinelle-woo-registration', false) === false ) {
    104100        update_option( 'la_sentinelle-woo-registration', 'false', false );
  • la-sentinelle-antispam/tags/4.1.0/la-sentinelle.php

    r3397125 r3443097  
    44Plugin URI: https://timelord.nl
    55Description: Feel safe knowing that your website is safe from spam. La Sentinelle will guard your WordPress website against spam in a simple and effective way.
    6 Version: 4.0.4
     6Version: 4.1.0
    77Author: Marcel Pol
    88Author URI: https://timelord.nl
     
    1313
    1414
    15 Copyright 2018 - 2025  Marcel Pol  (marcel@timelord.nl)
     15Copyright 2018 - 2026  Marcel Pol  (marcel@timelord.nl)
    1616Copyright 2023         ntodo
    1717Copyright 2023         Barry / riceooks
     
    4242
    4343// Plugin Version
    44 define('LASENT_VER', '4.0.4');
     44define('LASENT_VER', '4.1.0');
    4545
    4646
     
    4848 * Todo:
    4949 *
     50 * - Whitelist IP addresses (https://wordpress.org/support/topic/site-lockout-2).
    5051 * - Support and test bbPress and BuddyPress.
    5152 * - Add manually moved slider for when spammers start using JavaScript (like Ali Express).
     
    8586require_once LASENT_DIR . '/spamfilters/lasent-stop-forum-spam.php';
    8687require_once LASENT_DIR . '/spamfilters/lasent-timeout.php';
    87 require_once LASENT_DIR . '/spamfilters/lasent-webgl.php';
    8888
    8989// Functions for the forms
  • la-sentinelle-antispam/tags/4.1.0/readme.txt

    r3436492 r3443097  
    44Requires at least: 4.1
    55Tested up to: 6.9
    6 Stable tag: 4.0.4
     6Stable tag: 4.1.0
    77License: GPLv2 or later
    88Requires PHP: 7.0
     
    144144== Changelog ==
    145145
     146= 4.1.0 =
     147* 2026-01-20
     148* Remove WebGL spamfilter, it's not reliable.
     149* Fix JavaScript error with Contact Form 7 refill.
     150
    146151= 4.0.4 =
    147152* 2025-11-17
    148 * Run JavaScript for ajax and weggl only if enabled.
     153* Run JavaScript for ajax and webgl only if enabled.
    149154* Set autoload explicitly for options.
    150155
  • la-sentinelle-antispam/tags/4.1.0/spamfilters/js/la-sentinelle-frontend.js

    r3397125 r3443097  
    33 *
    44
    5 Copyright 2018 - 2025  Marcel Pol  (email: marcel@timelord.nl)
     5Copyright 2018 - 2026  Marcel Pol  (email: marcel@timelord.nl)
    66
    77This program is free software; you can redistribute it and/or modify
     
    5555    var honeypot2 = la_sentinelle_frontend_script.honeypot2;
    5656
    57     var honeypot_val = parseInt( form.querySelector(`input.${honeypot}`).value, 10 );
    58     var honeypot2_val = parseInt( form.querySelector(`input.${honeypot2}`).value, 10 );
     57    var honeypot_val = parseInt( form.querySelector(`input.${honeypot}`)?.value, 10 );
     58    var honeypot2_val = parseInt( form.querySelector(`input.${honeypot2}`)?.value, 10 );
    5959
    6060    if ( ! isNaN( honeypot_val ) && (typeof honeypot_val != "undefined") && (typeof honeypot2_val != "undefined") ) {
     
    108108    var timeout2 = la_sentinelle_frontend_script.timeout2;
    109109
    110     var timer  = parseInt( form.querySelector(`input.${timeout}`).value, 10 );
    111     var timer2 = parseInt( form.querySelector(`input.${timeout2}`).value, 10 );
     110    var timer  = parseInt( form.querySelector(`input.${timeout}`)?.value, 10 );
     111    var timer2 = parseInt( form.querySelector(`input.${timeout2}`)?.value, 10 );
    112112
    113113    if ( ! isNaN( timer ) && ! isNaN( timer2 ) && (typeof timer != "undefined") && (typeof timer2 != "undefined") ) {
     
    165165    });
    166166});
    167 
    168 
    169 /*
    170  * Spamfilter with Canvas, Webgl and AJAX.
    171  *
    172  * @since 3.0.0
    173  */
    174 document.addEventListener("DOMContentLoaded", () => {
    175     document.querySelectorAll('form')?.forEach(function(form, index) {
    176 
    177         var webgl_enabled = la_sentinelle_frontend_script.webgl_enabled;
    178         if ( webgl_enabled !== 'true' ) {
    179             return;
    180         }
    181 
    182         la_sentinelle_canvas_webgl( form, index );
    183 
    184         // Hook into this.reset for Contact Form 7 refill.
    185         document.querySelector('form.wpcf7-form')?.addEventListener('reset', function() {
    186             var form = this;
    187             setTimeout(function() {
    188                 la_sentinelle_canvas_webgl( form, index );
    189             }, 500 );
    190         });
    191 
    192     });
    193 });
    194 
    195 function la_sentinelle_canvas_webgl( form, index ) {
    196 
    197     var canvas_element = document.createElement('canvas');
    198     canvas_element.id = 'canvas-' + index;
    199     canvas_element.width = 20;
    200     canvas_element.height = 20;
    201 
    202     var returnvalue = form.querySelector('div.la-sentinelle-container')?.appendChild( canvas_element );
    203 
    204     if ( typeof returnvalue === "undefined" ) {
    205         // No sentinelle in this form.
    206         // console.log( 'undefined' );
    207     } else {
    208         // console.log( 'defined' );
    209 
    210         var canvas = document.querySelector( '#canvas-' + index );
    211         var gl = canvas.getContext( 'webgl' );
    212 
    213         // Only continue if WebGL is available and working
    214         if (gl === null) {
    215             console.info( 'Unable to initialize WebGL. Your browser or machine may not support it.' );
    216             return;
    217         }
    218 
    219         const pixels = new Uint8Array(
    220             gl.drawingBufferWidth * gl.drawingBufferHeight * 4
    221         );
    222 
    223         var webgl  = la_sentinelle_frontend_script.webgl;
    224         var webgl_val = parseInt( form.querySelector(`input.${webgl}`).value, 10 );
    225 
    226         if ( (typeof webgl_val != 'undefined') ) {
    227             if ( webgl_val > 0 ) {
    228                 var honey = webgl_val;
    229             }
    230         }
    231 
    232         if ( (typeof honey !== 'undefined') && ( ! isNaN( honey ) ) ) {
    233             // only one decimal allowed.
    234             honey = ( honey / 10 );
    235             honey = Math.round( honey );
    236             honey = ( honey / 10 );
    237 
    238             /* Step2: Define the geometry and store it in buffer objects */
    239 
    240             var vertices = [-0.5, 0.5, -0.5, -0.5, 0.0, -0.5,];
    241 
    242             // Create a new buffer object
    243             var vertex_buffer = gl.createBuffer();
    244 
    245             // Bind an empty array buffer to it
    246             gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
    247 
    248             // Pass the vertices data to the buffer
    249             gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
    250 
    251             // Unbind the buffer
    252             gl.bindBuffer(gl.ARRAY_BUFFER, null);
    253 
    254             /* Step3: Create and compile Shader programs */
    255 
    256             // Vertex shader source code
    257             var vertCode =
    258             'attribute vec2 coordinates;' +
    259             'void main(void) {' + ' gl_Position = vec4(coordinates,0.0, 1.0);' + '}';
    260 
    261             //Create a vertex shader object
    262             var vertShader = gl.createShader(gl.VERTEX_SHADER);
    263 
    264             //Attach vertex shader source code
    265             gl.shaderSource(vertShader, vertCode);
    266 
    267             //Compile the vertex shader
    268             gl.compileShader(vertShader);
    269 
    270             //Fragment shader source code
    271             var fragCode = 'void main(void) {' + 'gl_FragColor = vec4(0.0, 0.0, 0.0, 0.1);' + '}';
    272 
    273             // Create fragment shader object
    274             var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
    275 
    276             // Attach fragment shader source code
    277             gl.shaderSource(fragShader, fragCode);
    278 
    279             // Compile the fragment shader
    280             gl.compileShader(fragShader);
    281 
    282             // Create a shader program object to store combined shader program
    283             var shaderProgram = gl.createProgram();
    284 
    285             // Attach a vertex shader
    286             gl.attachShader(shaderProgram, vertShader);
    287 
    288             // Attach a fragment shader
    289             gl.attachShader(shaderProgram, fragShader);
    290 
    291             // Link both programs
    292             gl.linkProgram(shaderProgram);
    293 
    294             // Use the combined shader program object
    295             gl.useProgram(shaderProgram);
    296 
    297             /* Step 4: Associate the shader programs to buffer objects */
    298 
    299             //Bind vertex buffer object
    300             gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
    301 
    302             //Get the attribute location
    303             var coord = gl.getAttribLocation(shaderProgram, "coordinates");
    304 
    305             //point an attribute to the currently bound VBO
    306             gl.vertexAttribPointer(coord, 2, gl.FLOAT, false, 0, 0);
    307 
    308             //Enable the attribute
    309             gl.enableVertexAttribArray(coord);
    310 
    311             /* Step5: Drawing the required object (triangle) */
    312 
    313             // Clear the canvas
    314             gl.clearColor(honey, honey, honey, 0.9);
    315 
    316             // Enable the depth test
    317             gl.enable(gl.DEPTH_TEST);
    318 
    319             // Clear the color buffer bit
    320             gl.clear(gl.COLOR_BUFFER_BIT);
    321 
    322             // Set the view port
    323             gl.viewport(0,0,canvas.width,canvas.height);
    324 
    325             // Draw the triangle
    326             gl.drawArrays(gl.TRIANGLES, 0, 3);
    327 
    328             gl.readPixels(
    329                 0,
    330                 0,
    331                 gl.drawingBufferWidth,
    332                 gl.drawingBufferHeight,
    333                 gl.RGBA,
    334                 gl.UNSIGNED_BYTE,
    335                 pixels
    336             ); // Uint8Array
    337 
    338             var webgl2_val = pixels[0];
    339             var webgl2_field  = la_sentinelle_frontend_script.webgl2;
    340             var webgl3_field  = la_sentinelle_frontend_script.webgl3;
    341             form.querySelector(`input.${webgl2_field}`).value = webgl2_val;
    342             var webgl3_val = form.querySelector(`input.${webgl3_field}`).value;
    343 
    344             // Set up data to send
    345             var ajaxurl  = la_sentinelle_frontend_script.ajaxurl;
    346             var data     = new URLSearchParams({
    347                 action: 'la_sentinelle_webgl',
    348                 webgl2: webgl2_val,
    349                 webgl3: webgl3_val
    350             });
    351 
    352             var request = new XMLHttpRequest();
    353 
    354             request.open('POST', ajaxurl, true);
    355             request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;');
    356             request.onload = function () {
    357                 response = this.response.trim();
    358                 if ( response === 'reported' ) { // We got what we wanted
    359                     //console.log( 'reported' );
    360                 } else {
    361                     //console.log( 'not reported' );
    362                 }
    363             };
    364             request.send(data);
    365 
    366         }
    367     }
    368 
    369 }
  • la-sentinelle-antispam/tags/4.1.0/spamfilters/lasent-ajax.php

    r3116910 r3443097  
    1717
    1818    $field_name2 = la_sentinelle_get_field_name( 'ajax2' );
    19     $field_name3 = la_sentinelle_get_field_name( 'ajax3' ); // there is no ajax(1), to keep it similar to webgl field order.
     19    $field_name3 = la_sentinelle_get_field_name( 'ajax3' ); // there is no ajax(1).
    2020    $field_id2 = la_sentinelle_get_field_id( $field_name2 );
    21     $field_id3 = la_sentinelle_get_field_id( $field_name3 ); // there is no ajax(1), to keep it similar to webgl field order.
     21    $field_id3 = la_sentinelle_get_field_id( $field_name3 ); // there is no ajax(1).
    2222    $honeypot_value = (int) get_option( 'la_sentinelle-honeypot_value', 15 );
    2323    $ajax3_value = sanitize_text_field( base64_encode( sanitize_text_field( $_SERVER['REMOTE_ADDR'] ) ) );
  • la-sentinelle-antispam/tags/4.1.0/spamfilters/lasent-check-spamfilters.php

    r3012996 r3443097  
    1919    la_sentinelle_check_timeout();
    2020    la_sentinelle_check_ajax();
    21     la_sentinelle_check_webgl();
    2221
    2322    // All filters are checked, now see if a check had a positive score.
  • la-sentinelle-antispam/tags/4.1.0/spamfilters/lasent-get-spamfilters.php

    r3397125 r3443097  
    3232        } else if ( $filter === 5 ) {
    3333            $output .= la_sentinelle_get_ajax();
    34         } else if ( $filter === 6 ) {
    35             $output .= la_sentinelle_get_webgl();
    3634        }
    3735    }
     
    6664        'timeout'   => la_sentinelle_get_field_name( 'timeout' ),
    6765        'timeout2'  => la_sentinelle_get_field_name( 'timeout2' ),
    68         'webgl'     => la_sentinelle_get_field_name( 'webgl' ),
    69         'webgl2'    => la_sentinelle_get_field_name( 'webgl2' ),
    70         'webgl3'    => la_sentinelle_get_field_name( 'webgl3' ),
    7166        'ajax_enabled' => get_option( 'la_sentinelle-ajax' ),
    72         'webgl_enabled' => get_option( 'la_sentinelle-webgl' ),
    7367
    7468    );
     
    10296        "timeout":  "<?php echo la_sentinelle_get_field_name( 'timeout' ); ?>",
    10397        "timeout2": "<?php echo la_sentinelle_get_field_name( 'timeout2' ); ?>",
    104         "webgl":    "<?php echo la_sentinelle_get_field_name( 'webgl' ); ?>",
    105         "webgl2":   "<?php echo la_sentinelle_get_field_name( 'webgl2' ); ?>",
    106         "webgl3":   "<?php echo la_sentinelle_get_field_name( 'webgl3' ); ?>",
    10798    };
    10899    </script>
  • la-sentinelle-antispam/tags/4.1.0/uninstall.php

    r3116910 r3443097  
    3535        'la_sentinelle-noptin',
    3636        'la_sentinelle-noptin_blocked',
    37         'la_sentinelle-webgl',
     37        'la_sentinelle-webgl', // deprecated since 4.1.0
    3838        'la_sentinelle-woo-registration',
    3939        'la_sentinelle-wpforms',
  • la-sentinelle-antispam/trunk/admin/lasent-settingspage-formupdate.php

    r3397125 r3443097  
    7979                    }
    8080
    81                     if (isset($_POST['la_sentinelle-webgl']) && $_POST['la_sentinelle-webgl'] === 'on') {
    82                         update_option( 'la_sentinelle-webgl', 'true', true );
    83                         $saved = true;
    84                     } else {
    85                         update_option( 'la_sentinelle-webgl', 'false', true );
    86                         $saved = true;
    87                     }
    88 
    8981                    break;
    9082
  • la-sentinelle-antispam/trunk/admin/lasent-settingstab-spamfilters.php

    r3302815 r3443097  
    132132
    133133        <tr>
    134             <th scope="row"><label for="la_sentinelle-webgl"><?php esc_html_e('WebGL', 'la-sentinelle-antispam'); ?></label></th>
    135             <td>
    136                 <input <?php
    137                     if (get_option( 'la_sentinelle-webgl', 'false') === 'true') {
    138                         echo 'checked="checked"';
    139                     } ?>
    140                     type="checkbox" name="la_sentinelle-webgl" id="la_sentinelle-webgl">
    141                 <label for="la_sentinelle-webgl">
    142                     <?php esc_html_e('Use WebGL.', 'la-sentinelle-antispam'); ?> <?php esc_html_e('(Experimental)', 'la-sentinelle-antispam'); ?>
    143                 </label><br />
    144                 <span class="setting-description">
    145                     <?php
    146                     esc_html_e('This will add a WebGL test to the form. It is a way to check for a real browser with 3D and WebGL enabled. If it does not validate, the entry will be marked as spam.', 'la-sentinelle-antispam');
    147                     echo '<br />';
    148                     esc_html_e('This spamfilter is experimental, it is possible that you get false-positives in your spamfolder. If this is the case, you are advised to disable this WebGL filter and report this on the support forum.', 'la-sentinelle-antispam');
    149                     ?>
    150                 </span>
    151             </td>
    152         </tr>
    153 
    154         <tr>
    155134            <th colspan="2">
    156135                <p class="submit">
  • la-sentinelle-antispam/trunk/forms/lasent-wordpress-comment-form.php

    r3116910 r3443097  
    129129            } else if ( $marker === 'ajax' ) {
    130130                update_comment_meta( $id, 'la_sentinelle_ajax', 'spam' );
    131             } else if ( $marker === 'webgl' ) {
    132                 update_comment_meta( $id, 'la_sentinelle_webgl', 'spam' );
    133131            }
    134132        }
     
    203201    $la_sentinelle_sfs      = get_comment_meta( $comment_id, 'la_sentinelle_sfs', true );
    204202    $la_sentinelle_ajax     = get_comment_meta( $comment_id, 'la_sentinelle_ajax', true );
    205     $la_sentinelle_webgl    = get_comment_meta( $comment_id, 'la_sentinelle_webgl', true );
    206 
    207     if ( $la_sentinelle_nonce === 'spam' || $la_sentinelle_honeypot === 'spam' || $la_sentinelle_timeout === 'spam' || $la_sentinelle_sfs === 'spam' || $la_sentinelle_ajax === 'spam' || $la_sentinelle_webgl === 'spam' ) {
     203
     204    if ( $la_sentinelle_nonce === 'spam' || $la_sentinelle_honeypot === 'spam' || $la_sentinelle_timeout === 'spam' || $la_sentinelle_sfs === 'spam' || $la_sentinelle_ajax === 'spam' ) {
    208205
    209206        $output .= '<div class="misc-pub-section misc-pub-la-sentinelle">
     
    231228                ';
    232229        }
    233         if ( $la_sentinelle_webgl === 'spam' ) {
    234             $output .= '<span>&bull; ' . esc_html__( 'Marked as spam by WebGL', 'la-sentinelle-antispam' ) . '</span><br />
    235                 ';
    236         }
    237230
    238231        $output .= '</div>
  • la-sentinelle-antispam/trunk/functions/lasent-settings.php

    r3397125 r3443097  
    3131    register_setting( 'la_sentinelle_options', 'la_sentinelle-timeout',              'sanitize_text_field' ); // 'true'
    3232    register_setting( 'la_sentinelle_options', 'la_sentinelle-version',              'sanitize_text_field' ); // string
    33     register_setting( 'la_sentinelle_options', 'la_sentinelle-webgl',                'sanitize_text_field' ); // 'false'
    3433    register_setting( 'la_sentinelle_options', 'la_sentinelle-woo-registration',     'sanitize_text_field' ); // 'false'
    3534    register_setting( 'la_sentinelle_options', 'la_sentinelle-wpcomment',            'sanitize_text_field' ); // 'true'
     
    9897        update_option( 'la_sentinelle-timeout', 'true', true );
    9998    }
    100     if ( get_option('la_sentinelle-webgl', false) === false ) {
    101         update_option( 'la_sentinelle-webgl', 'false', true );
    102     }
    10399    if ( get_option('la_sentinelle-woo-registration', false) === false ) {
    104100        update_option( 'la_sentinelle-woo-registration', 'false', false );
  • la-sentinelle-antispam/trunk/la-sentinelle.php

    r3397125 r3443097  
    44Plugin URI: https://timelord.nl
    55Description: Feel safe knowing that your website is safe from spam. La Sentinelle will guard your WordPress website against spam in a simple and effective way.
    6 Version: 4.0.4
     6Version: 4.1.0
    77Author: Marcel Pol
    88Author URI: https://timelord.nl
     
    1313
    1414
    15 Copyright 2018 - 2025  Marcel Pol  (marcel@timelord.nl)
     15Copyright 2018 - 2026  Marcel Pol  (marcel@timelord.nl)
    1616Copyright 2023         ntodo
    1717Copyright 2023         Barry / riceooks
     
    4242
    4343// Plugin Version
    44 define('LASENT_VER', '4.0.4');
     44define('LASENT_VER', '4.1.0');
    4545
    4646
     
    4848 * Todo:
    4949 *
     50 * - Whitelist IP addresses (https://wordpress.org/support/topic/site-lockout-2).
    5051 * - Support and test bbPress and BuddyPress.
    5152 * - Add manually moved slider for when spammers start using JavaScript (like Ali Express).
     
    8586require_once LASENT_DIR . '/spamfilters/lasent-stop-forum-spam.php';
    8687require_once LASENT_DIR . '/spamfilters/lasent-timeout.php';
    87 require_once LASENT_DIR . '/spamfilters/lasent-webgl.php';
    8888
    8989// Functions for the forms
  • la-sentinelle-antispam/trunk/readme.txt

    r3436492 r3443097  
    44Requires at least: 4.1
    55Tested up to: 6.9
    6 Stable tag: 4.0.4
     6Stable tag: 4.1.0
    77License: GPLv2 or later
    88Requires PHP: 7.0
     
    144144== Changelog ==
    145145
     146= 4.1.0 =
     147* 2026-01-20
     148* Remove WebGL spamfilter, it's not reliable.
     149* Fix JavaScript error with Contact Form 7 refill.
     150
    146151= 4.0.4 =
    147152* 2025-11-17
    148 * Run JavaScript for ajax and weggl only if enabled.
     153* Run JavaScript for ajax and webgl only if enabled.
    149154* Set autoload explicitly for options.
    150155
  • la-sentinelle-antispam/trunk/spamfilters/js/la-sentinelle-frontend.js

    r3397125 r3443097  
    33 *
    44
    5 Copyright 2018 - 2025  Marcel Pol  (email: marcel@timelord.nl)
     5Copyright 2018 - 2026  Marcel Pol  (email: marcel@timelord.nl)
    66
    77This program is free software; you can redistribute it and/or modify
     
    5555    var honeypot2 = la_sentinelle_frontend_script.honeypot2;
    5656
    57     var honeypot_val = parseInt( form.querySelector(`input.${honeypot}`).value, 10 );
    58     var honeypot2_val = parseInt( form.querySelector(`input.${honeypot2}`).value, 10 );
     57    var honeypot_val = parseInt( form.querySelector(`input.${honeypot}`)?.value, 10 );
     58    var honeypot2_val = parseInt( form.querySelector(`input.${honeypot2}`)?.value, 10 );
    5959
    6060    if ( ! isNaN( honeypot_val ) && (typeof honeypot_val != "undefined") && (typeof honeypot2_val != "undefined") ) {
     
    108108    var timeout2 = la_sentinelle_frontend_script.timeout2;
    109109
    110     var timer  = parseInt( form.querySelector(`input.${timeout}`).value, 10 );
    111     var timer2 = parseInt( form.querySelector(`input.${timeout2}`).value, 10 );
     110    var timer  = parseInt( form.querySelector(`input.${timeout}`)?.value, 10 );
     111    var timer2 = parseInt( form.querySelector(`input.${timeout2}`)?.value, 10 );
    112112
    113113    if ( ! isNaN( timer ) && ! isNaN( timer2 ) && (typeof timer != "undefined") && (typeof timer2 != "undefined") ) {
     
    165165    });
    166166});
    167 
    168 
    169 /*
    170  * Spamfilter with Canvas, Webgl and AJAX.
    171  *
    172  * @since 3.0.0
    173  */
    174 document.addEventListener("DOMContentLoaded", () => {
    175     document.querySelectorAll('form')?.forEach(function(form, index) {
    176 
    177         var webgl_enabled = la_sentinelle_frontend_script.webgl_enabled;
    178         if ( webgl_enabled !== 'true' ) {
    179             return;
    180         }
    181 
    182         la_sentinelle_canvas_webgl( form, index );
    183 
    184         // Hook into this.reset for Contact Form 7 refill.
    185         document.querySelector('form.wpcf7-form')?.addEventListener('reset', function() {
    186             var form = this;
    187             setTimeout(function() {
    188                 la_sentinelle_canvas_webgl( form, index );
    189             }, 500 );
    190         });
    191 
    192     });
    193 });
    194 
    195 function la_sentinelle_canvas_webgl( form, index ) {
    196 
    197     var canvas_element = document.createElement('canvas');
    198     canvas_element.id = 'canvas-' + index;
    199     canvas_element.width = 20;
    200     canvas_element.height = 20;
    201 
    202     var returnvalue = form.querySelector('div.la-sentinelle-container')?.appendChild( canvas_element );
    203 
    204     if ( typeof returnvalue === "undefined" ) {
    205         // No sentinelle in this form.
    206         // console.log( 'undefined' );
    207     } else {
    208         // console.log( 'defined' );
    209 
    210         var canvas = document.querySelector( '#canvas-' + index );
    211         var gl = canvas.getContext( 'webgl' );
    212 
    213         // Only continue if WebGL is available and working
    214         if (gl === null) {
    215             console.info( 'Unable to initialize WebGL. Your browser or machine may not support it.' );
    216             return;
    217         }
    218 
    219         const pixels = new Uint8Array(
    220             gl.drawingBufferWidth * gl.drawingBufferHeight * 4
    221         );
    222 
    223         var webgl  = la_sentinelle_frontend_script.webgl;
    224         var webgl_val = parseInt( form.querySelector(`input.${webgl}`).value, 10 );
    225 
    226         if ( (typeof webgl_val != 'undefined') ) {
    227             if ( webgl_val > 0 ) {
    228                 var honey = webgl_val;
    229             }
    230         }
    231 
    232         if ( (typeof honey !== 'undefined') && ( ! isNaN( honey ) ) ) {
    233             // only one decimal allowed.
    234             honey = ( honey / 10 );
    235             honey = Math.round( honey );
    236             honey = ( honey / 10 );
    237 
    238             /* Step2: Define the geometry and store it in buffer objects */
    239 
    240             var vertices = [-0.5, 0.5, -0.5, -0.5, 0.0, -0.5,];
    241 
    242             // Create a new buffer object
    243             var vertex_buffer = gl.createBuffer();
    244 
    245             // Bind an empty array buffer to it
    246             gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
    247 
    248             // Pass the vertices data to the buffer
    249             gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
    250 
    251             // Unbind the buffer
    252             gl.bindBuffer(gl.ARRAY_BUFFER, null);
    253 
    254             /* Step3: Create and compile Shader programs */
    255 
    256             // Vertex shader source code
    257             var vertCode =
    258             'attribute vec2 coordinates;' +
    259             'void main(void) {' + ' gl_Position = vec4(coordinates,0.0, 1.0);' + '}';
    260 
    261             //Create a vertex shader object
    262             var vertShader = gl.createShader(gl.VERTEX_SHADER);
    263 
    264             //Attach vertex shader source code
    265             gl.shaderSource(vertShader, vertCode);
    266 
    267             //Compile the vertex shader
    268             gl.compileShader(vertShader);
    269 
    270             //Fragment shader source code
    271             var fragCode = 'void main(void) {' + 'gl_FragColor = vec4(0.0, 0.0, 0.0, 0.1);' + '}';
    272 
    273             // Create fragment shader object
    274             var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
    275 
    276             // Attach fragment shader source code
    277             gl.shaderSource(fragShader, fragCode);
    278 
    279             // Compile the fragment shader
    280             gl.compileShader(fragShader);
    281 
    282             // Create a shader program object to store combined shader program
    283             var shaderProgram = gl.createProgram();
    284 
    285             // Attach a vertex shader
    286             gl.attachShader(shaderProgram, vertShader);
    287 
    288             // Attach a fragment shader
    289             gl.attachShader(shaderProgram, fragShader);
    290 
    291             // Link both programs
    292             gl.linkProgram(shaderProgram);
    293 
    294             // Use the combined shader program object
    295             gl.useProgram(shaderProgram);
    296 
    297             /* Step 4: Associate the shader programs to buffer objects */
    298 
    299             //Bind vertex buffer object
    300             gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer);
    301 
    302             //Get the attribute location
    303             var coord = gl.getAttribLocation(shaderProgram, "coordinates");
    304 
    305             //point an attribute to the currently bound VBO
    306             gl.vertexAttribPointer(coord, 2, gl.FLOAT, false, 0, 0);
    307 
    308             //Enable the attribute
    309             gl.enableVertexAttribArray(coord);
    310 
    311             /* Step5: Drawing the required object (triangle) */
    312 
    313             // Clear the canvas
    314             gl.clearColor(honey, honey, honey, 0.9);
    315 
    316             // Enable the depth test
    317             gl.enable(gl.DEPTH_TEST);
    318 
    319             // Clear the color buffer bit
    320             gl.clear(gl.COLOR_BUFFER_BIT);
    321 
    322             // Set the view port
    323             gl.viewport(0,0,canvas.width,canvas.height);
    324 
    325             // Draw the triangle
    326             gl.drawArrays(gl.TRIANGLES, 0, 3);
    327 
    328             gl.readPixels(
    329                 0,
    330                 0,
    331                 gl.drawingBufferWidth,
    332                 gl.drawingBufferHeight,
    333                 gl.RGBA,
    334                 gl.UNSIGNED_BYTE,
    335                 pixels
    336             ); // Uint8Array
    337 
    338             var webgl2_val = pixels[0];
    339             var webgl2_field  = la_sentinelle_frontend_script.webgl2;
    340             var webgl3_field  = la_sentinelle_frontend_script.webgl3;
    341             form.querySelector(`input.${webgl2_field}`).value = webgl2_val;
    342             var webgl3_val = form.querySelector(`input.${webgl3_field}`).value;
    343 
    344             // Set up data to send
    345             var ajaxurl  = la_sentinelle_frontend_script.ajaxurl;
    346             var data     = new URLSearchParams({
    347                 action: 'la_sentinelle_webgl',
    348                 webgl2: webgl2_val,
    349                 webgl3: webgl3_val
    350             });
    351 
    352             var request = new XMLHttpRequest();
    353 
    354             request.open('POST', ajaxurl, true);
    355             request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;');
    356             request.onload = function () {
    357                 response = this.response.trim();
    358                 if ( response === 'reported' ) { // We got what we wanted
    359                     //console.log( 'reported' );
    360                 } else {
    361                     //console.log( 'not reported' );
    362                 }
    363             };
    364             request.send(data);
    365 
    366         }
    367     }
    368 
    369 }
  • la-sentinelle-antispam/trunk/spamfilters/lasent-ajax.php

    r3116910 r3443097  
    1717
    1818    $field_name2 = la_sentinelle_get_field_name( 'ajax2' );
    19     $field_name3 = la_sentinelle_get_field_name( 'ajax3' ); // there is no ajax(1), to keep it similar to webgl field order.
     19    $field_name3 = la_sentinelle_get_field_name( 'ajax3' ); // there is no ajax(1).
    2020    $field_id2 = la_sentinelle_get_field_id( $field_name2 );
    21     $field_id3 = la_sentinelle_get_field_id( $field_name3 ); // there is no ajax(1), to keep it similar to webgl field order.
     21    $field_id3 = la_sentinelle_get_field_id( $field_name3 ); // there is no ajax(1).
    2222    $honeypot_value = (int) get_option( 'la_sentinelle-honeypot_value', 15 );
    2323    $ajax3_value = sanitize_text_field( base64_encode( sanitize_text_field( $_SERVER['REMOTE_ADDR'] ) ) );
  • la-sentinelle-antispam/trunk/spamfilters/lasent-check-spamfilters.php

    r3012996 r3443097  
    1919    la_sentinelle_check_timeout();
    2020    la_sentinelle_check_ajax();
    21     la_sentinelle_check_webgl();
    2221
    2322    // All filters are checked, now see if a check had a positive score.
  • la-sentinelle-antispam/trunk/spamfilters/lasent-get-spamfilters.php

    r3397125 r3443097  
    3232        } else if ( $filter === 5 ) {
    3333            $output .= la_sentinelle_get_ajax();
    34         } else if ( $filter === 6 ) {
    35             $output .= la_sentinelle_get_webgl();
    3634        }
    3735    }
     
    6664        'timeout'   => la_sentinelle_get_field_name( 'timeout' ),
    6765        'timeout2'  => la_sentinelle_get_field_name( 'timeout2' ),
    68         'webgl'     => la_sentinelle_get_field_name( 'webgl' ),
    69         'webgl2'    => la_sentinelle_get_field_name( 'webgl2' ),
    70         'webgl3'    => la_sentinelle_get_field_name( 'webgl3' ),
    7166        'ajax_enabled' => get_option( 'la_sentinelle-ajax' ),
    72         'webgl_enabled' => get_option( 'la_sentinelle-webgl' ),
    7367
    7468    );
     
    10296        "timeout":  "<?php echo la_sentinelle_get_field_name( 'timeout' ); ?>",
    10397        "timeout2": "<?php echo la_sentinelle_get_field_name( 'timeout2' ); ?>",
    104         "webgl":    "<?php echo la_sentinelle_get_field_name( 'webgl' ); ?>",
    105         "webgl2":   "<?php echo la_sentinelle_get_field_name( 'webgl2' ); ?>",
    106         "webgl3":   "<?php echo la_sentinelle_get_field_name( 'webgl3' ); ?>",
    10798    };
    10899    </script>
  • la-sentinelle-antispam/trunk/uninstall.php

    r3116910 r3443097  
    3535        'la_sentinelle-noptin',
    3636        'la_sentinelle-noptin_blocked',
    37         'la_sentinelle-webgl',
     37        'la_sentinelle-webgl', // deprecated since 4.1.0
    3838        'la_sentinelle-woo-registration',
    3939        'la_sentinelle-wpforms',
Note: See TracChangeset for help on using the changeset viewer.