Skip to content

Antispam improvements#2285

Merged
Crabcyborg merged 87 commits into
masterfrom
antispam-improvements
May 9, 2025
Merged

Antispam improvements#2285
Crabcyborg merged 87 commits into
masterfrom
antispam-improvements

Conversation

@truongwp
Copy link
Copy Markdown
Contributor

@truongwp truongwp commented Mar 26, 2025

Related issue: https://github.com/Strategy11/formidable-pro/issues/5675

Handoff: https://linear.app/strategy11/document/feature-handoff-3f2e6a1df62b

  • Honeypot improvements
  • Add stopforumspam API
  • Add WordPress spam comments check
  • Block list check
  • Usage tracking
  • Unit tests

@truongwp truongwp marked this pull request as ready for review April 22, 2025 16:03
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 22, 2025

Walkthrough

This update introduces a comprehensive overhaul of the spam prevention system. It adds new controller and model classes for centralized and extensible spam detection, including denylist and StopForumSpam integration. The honeypot mechanism is refactored for improved hiding and dynamic field handling. Related settings, views, tests, and static denylist data files are updated or added to support these features.

Changes

File(s) Change Summary
classes/controllers/FrmAntiSpamController.php, classes/models/FrmSpamCheck.php, classes/models/FrmSpamCheckDenylist.php, classes/models/FrmSpamCheckWPDisallowedWords.php, classes/models/FrmSpamCheckStopForumSpam.php, classes/models/FrmSpamCheckUseWPComments.php Introduced new classes for centralized, extensible spam detection logic, including denylist, StopForumSpam, and WordPress disallowed words integration.
classes/controllers/FrmFormsController.php, classes/helpers/FrmFormsHelper.php, classes/models/FrmHoneypot.php, classes/views/frm-forms/spam-settings/stopforumspam.php, classes/views/frm-settings/captcha/captcha.php Updated form controller, helper, honeypot logic, and views to support new spam settings, honeypot rendering, and StopForumSpam integration.
classes/helpers/FrmAppHelper.php Changed generate_new_key method visibility from private to public.
classes/models/FrmEntryValidate.php Refactored spam checking to use new controller and models, updated method visibility, and improved spam message handling.
classes/models/FrmSettings.php, classes/models/FrmUsage.php, classes/models/FrmValidate.php Added new spam-related settings, updated default options, and adjusted option handling for global/form context.
css/custom_theme.css.php, js/formidable.js Removed legacy honeypot hiding CSS and JS logic; updated honeypot field selectors in JS.
classes/views/frm-forms/spam-settings/honeypot.php Deleted legacy honeypot spam settings view.
denylist/domain-partial.txt, denylist/ip.txt Added large static denylist files for domains and IPs.
tests/phpunit/misc/test_FrmHoneypot.php, tests/phpunit/misc/test_FrmSpamCheckWPDisallowedWords.php, tests/phpunit/misc/test_FrmSpamCheckDenylist.php, tests/phpunit/misc/denylist-email-contain.txt, tests/phpunit/misc/denylist-ip.txt Added and updated tests for honeypot, denylist, and disallowed words spam checks, including new test data files.
tests/phpunit/fields/test_FrmFieldValidate.php Removed obsolete blacklist check tests.
tests/phpunit/base/frm_factory.php Updated default test URL value.
tests/cypress/e2e/Entries/EntriesPageDataValidations.cy.js Updated Cypress tests to exclude honeypot fields from entry typing.
stubs.php Added stub class for FrmProFormState to support API detection logic.
classes/views/frm-entries/new.php Minor whitespace cleanup.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant Form
    participant FrmAntiSpamController
    participant FrmSpamCheckDenylist
    participant FrmSpamCheckWPDisallowedWords
    participant FrmSpamCheckStopForumSpam
    participant FrmSpamCheckUseWPComments

    User->>Form: Submit entry
    Form->>FrmAntiSpamController: is_spam(values)
    FrmAntiSpamController->>FrmSpamCheckWPDisallowedWords: is_spam(values)
    alt Disallowed words detected
        FrmSpamCheckWPDisallowedWords-->>FrmAntiSpamController: spam message
        FrmAntiSpamController-->>Form: spam message
    else No disallowed words
        FrmAntiSpamController->>FrmSpamCheckDenylist: is_spam(values)
        alt Denylist match
            FrmSpamCheckDenylist-->>FrmAntiSpamController: spam message
            FrmAntiSpamController-->>Form: spam message
        else No denylist match
            FrmAntiSpamController->>FrmSpamCheckStopForumSpam: is_spam(values)
            alt StopForumSpam match
                FrmSpamCheckStopForumSpam-->>FrmAntiSpamController: spam message
                FrmAntiSpamController-->>Form: spam message
            else No StopForumSpam match
                FrmAntiSpamController->>FrmSpamCheckUseWPComments: is_spam(values)
                alt WP Comments match
                    FrmSpamCheckUseWPComments-->>FrmAntiSpamController: spam message
                    FrmAntiSpamController-->>Form: spam message
                else No spam detected
                    FrmAntiSpamController-->>Form: false
                end
            end
        end
    end
    Form-->>User: Show result (spam message or success)
Loading

Suggested labels

action: needs qa

Suggested reviewers

  • Crabcyborg
✨ Finishing Touches
  • 📝 Generate Docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 17

🧹 Nitpick comments (16)
classes/models/FrmSpamCheck.php (2)

11-13: Remove commented-out debugging code.

There's a commented-out error_log statement that should be removed. Leaving debugging code in production, even if commented out, can lead to confusion for other developers.

-		$this->posted_fields = FrmField::get_all_for_form( $values['form_id'] );
-//		error_log( print_r( $this->posted_fields, true ) );
+		$this->posted_fields = FrmField::get_all_for_form( $values['form_id'] );

34-48: Add documentation for placeholder methods.

These placeholder methods lack documentation explaining their purpose and expected implementation by subclasses. Consider adding PHPDoc blocks to clarify their intended use, return values, and parameters (if any).

For example:

+	/**
+	 * Check if any of the submitted values contain spam words.
+	 *
+	 * @return bool True if spam words are found.
+	 */
	protected function check_whole_values_contain_spam_words() {

	}
classes/views/frm-settings/captcha/captcha.php (2)

117-122: Consider adding a tooltip explaining WordPress spam comments check.

While the option label is clear, users might benefit from a tooltip explaining how WordPress spam comments data is used for detection, similar to what you've done with the honeypot option.

 	<label for="frm-wp-spam-check">
 		<input type="checkbox" id="frm-wp-spam-check" name="frm_wp_spam_check" value="1" <?php checked( $frm_settings->wp_spam_check, 1 ); ?> />
 		<?php esc_html_e( 'Use WordPress spam comments to check entries for spam', 'formidable' ); ?>
+		<?php FrmAppHelper::tooltip_icon( __( 'This will check submission data against WordPress comment spam history to identify known spammers by their IP address, email, or URL.', 'formidable' ), array( 'data-container' => 'body' ) ); ?>
 	</label>

132-138: Consider adding examples in tooltip for whitelist/blacklist format.

The current tooltip mentions "Each word or regex is on one line" but users might benefit from examples of valid entries.

 	<label for="frm-whitelist">
 		<?php esc_html_e( 'Custom whitelist words', 'formidable' ); ?>
-		<?php FrmAppHelper::tooltip_icon( __( 'Each word or regex is on one line.', 'formidable' ), array( 'data-container' => 'body' ) ); ?>
+		<?php FrmAppHelper::tooltip_icon( __( 'Each word or regex is on one line. Examples: spam-word, /pattern\d+/, domain\.com', 'formidable' ), array( 'data-container' => 'body' ) ); ?>
 	</label>
 	<textarea id="frm-whitelist" name="frm_whitelist"><?php echo esc_textarea( $frm_settings->whitelist ); ?></textarea>
classes/models/FrmSpamCheckUseWPComments.php (1)

15-19: Consider case-insensitive email matching.

Email comparisons are currently case-sensitive, but email addresses are typically case-insensitive. This could allow spammers to bypass detection by changing the case of an email.

foreach ( $item_meta as $value ) {
-	if ( $value === $comment->comment_author_email || $value === $comment->comment_author_url ) {
+	// Email addresses should be compared case-insensitively
+	if ( 
+		( is_string($value) && strtolower($value) === strtolower($comment->comment_author_email) ) || 
+		$value === $comment->comment_author_url
+	) {
		return true;
	}
}
classes/models/FrmSpamCheckStopforumspam.php (1)

47-49: Brittle XML parsing – use a proper parser

Relying on two strpos() checks will miss results if the XML changes order/whitespace.
Parsing with simplexml_load_string() (already bundled with PHP) is safer and only a few lines.

classes/controllers/FrmAntiSpamController.php (1)

56-59: Super‑fluous isset() – simplify (Psalm notice)

preg_match_all() always sets index 0, so isset() is redundant.

-		return isset( $matches[0] ) ? $matches[0] : array();
+		return $matches[0];
🧰 Tools
🪛 GitHub Check: PHPStan

[failure] 59-59:
Offset 0 on array{array<int, string>} in isset() always exists and is not nullable.

classes/models/FrmSpamCheckBlacklist.php (1)

50-58: get_blacklist_ip() – return structure diverges from consumer

Consumers expect 'files' and 'custom' keys. Good.
Add a filter hook (frm_blacklist_ip) now (marked TODO) to let site owners extend/override without editing the plugin.

classes/models/FrmBlacklistSpamCheck.php (1)

61-97: Heavy file I/O on every submission
Opening and iterating large blacklist files on every request will hurt performance under load. Consider:

  • Caching parsed files in a static property or a transient.
  • Using SplFileObject with setFlags( SPL_FILE_OBJECT_SKIP_EMPTY ) to avoid manual trimming.

This is optional but will noticeably reduce CPU and disk reads on busy sites.

classes/models/FrmStopforumspam.php (2)

70-73: Simplify preg_match_all result handling & tighten regex

preg_match_all() always creates $matches[0]; the isset() guard is redundant and PHPStan flags it. Also, the pattern can be made more robust.

-		preg_match_all( '/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+/i', $str, $matches );
-		return isset( $matches[0] ) ? $matches[0] : array();
+		preg_match_all( '/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/i', $str, $matches );
+		return $matches[0];
🧰 Tools
🪛 GitHub Check: PHPStan

[failure] 72-72:
Offset 0 on array{array<int, string>} in isset() always exists and is not nullable.


75-81: Dead code: add_email_to_request() is never called
The helper duplicates work already done by extract_emails_from_string() and can be safely removed to reduce maintenance overhead.

classes/models/FrmEntryValidate.php (3)

38-51: Avoid duplicate DB query by passing $posted_fields
$posted_fields is already calculated a few lines above; forwarding it prevents an extra get_fields_to_validate() call inside spam_check().

-			self::spam_check( $exclude, $values, $errors );
+			self::spam_check( $exclude, $values, $errors, $posted_fields );

442-442: Extraneous semicolon
Double semicolons are harmless but noisy.

-		$check = new FrmBlacklistSpamCheck( $values['form_id'] );;
+		$check = new FrmBlacklistSpamCheck( $values['form_id'] );

385-410: Unused helper methods can be removed
is_stopforumspam_spam() and is_wp_comment_spam() are no longer referenced now that FrmAntiSpamController centralises the checks. Removing them will cut dead code and lower cognitive load.

🧰 Tools
🪛 GitHub Check: Psalm

[failure] 397-397: PossiblyInvalidIterator
classes/models/FrmEntryValidate.php:397:13: PossiblyInvalidIterator: Cannot iterate over int (see https://psalm.dev/165)

classes/models/FrmHoneypot.php (2)

199-212: Minor: unneeded array walk and double sanitisation

get_honeypot_field_value() pulls the entire item_meta array from the request, only to access one index.
If the request payload is large, this copies more data than necessary.
Since the value is never echoed without escaping, applying sanitize_text_field here as well would harden against edge‑case injection when other hooks inspect $this->fields.

-		return isset( $item_meta[ $field_id ] ) ? $item_meta[ $field_id ] : '';
+		return isset( $item_meta[ $field_id ] ) ? sanitize_text_field( $item_meta[ $field_id ] ) : '';

This is a low‑impact nitpick; feel free to skip if the parent validator already sanitises.


27-30: is_enabled() could be in the parent or removed

The private static is_enabled() is only used by maybe_print_honeypot_js().
If the parent already exposes is_option_on() (instance) or similar logic, consider reusing it instead of duplicating the “read settings → return flag” pattern.

Not blocking, but centralising the “is honeypot active?” check reduces future divergence.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between bf58e14 and 912073c.

📒 Files selected for processing (24)
  • blacklist/domain-partial.txt (1 hunks)
  • blacklist/ip.txt (1 hunks)
  • classes/controllers/FrmAntiSpamController.php (1 hunks)
  • classes/controllers/FrmFormsController.php (2 hunks)
  • classes/controllers/FrmSettingsController.php (1 hunks)
  • classes/helpers/FrmAppHelper.php (1 hunks)
  • classes/helpers/FrmFormsHelper.php (1 hunks)
  • classes/models/FrmBlacklistSpamCheck.php (1 hunks)
  • classes/models/FrmEntryValidate.php (5 hunks)
  • classes/models/FrmHoneypot.php (4 hunks)
  • classes/models/FrmSettings.php (3 hunks)
  • classes/models/FrmSpamCheck.php (1 hunks)
  • classes/models/FrmSpamCheckBlacklist.php (1 hunks)
  • classes/models/FrmSpamCheckStopforumspam.php (1 hunks)
  • classes/models/FrmSpamCheckUseWPComments.php (1 hunks)
  • classes/models/FrmSpamCheckWPDisallowedWords.php (1 hunks)
  • classes/models/FrmStopforumspam.php (1 hunks)
  • classes/models/FrmUsage.php (2 hunks)
  • classes/models/FrmValidate.php (2 hunks)
  • classes/views/frm-entries/form.php (0 hunks)
  • classes/views/frm-entries/new.php (1 hunks)
  • classes/views/frm-forms/spam-settings/stopforumspam.php (1 hunks)
  • classes/views/frm-settings/captcha/captcha.php (1 hunks)
  • css/custom_theme.css.php (0 hunks)
💤 Files with no reviewable changes (2)
  • classes/views/frm-entries/form.php
  • css/custom_theme.css.php
🧰 Additional context used
🧬 Code Graph Analysis (9)
classes/views/frm-entries/new.php (1)
classes/controllers/FrmFormsController.php (1)
  • message_placement (2976-2992)
classes/controllers/FrmFormsController.php (2)
classes/helpers/FrmAppHelper.php (3)
  • FrmAppHelper (6-4462)
  • plugin_path (58-60)
  • is_admin (454-462)
classes/models/FrmHoneypot.php (2)
  • FrmHoneypot (6-244)
  • maybe_print_honeypot_js (101-127)
classes/models/FrmSpamCheck.php (1)
classes/models/FrmField.php (2)
  • FrmField (6-1501)
  • get_all_for_form (889-928)
classes/controllers/FrmAntiSpamController.php (5)
classes/models/FrmSpamCheckStopforumspam.php (2)
  • FrmSpamCheckStopforumspam (3-50)
  • check (5-29)
classes/models/FrmSpamCheckUseWPComments.php (2)
  • FrmSpamCheckUseWPComments (3-29)
  • check (5-23)
classes/models/FrmSpamCheckWPDisallowedWords.php (2)
  • FrmSpamCheckWPDisallowedWords (3-53)
  • check (5-20)
classes/models/FrmBlacklistSpamCheck.php (1)
  • FrmBlacklistSpamCheck (3-176)
classes/helpers/FrmAppHelper.php (2)
  • FrmAppHelper (6-4462)
  • maybe_json_encode (3278-3283)
classes/models/FrmStopforumspam.php (2)
classes/models/FrmValidate.php (5)
  • FrmValidate (6-66)
  • get_option_key (65-65)
  • validate (58-58)
  • is_option_on (44-53)
  • get_form (34-39)
classes/helpers/FrmAppHelper.php (2)
  • FrmAppHelper (6-4462)
  • get_ip_address (526-547)
classes/models/FrmSpamCheckBlacklist.php (6)
classes/models/FrmSpamCheck.php (5)
  • FrmSpamCheck (3-49)
  • __construct (9-13)
  • is_enabled (30-32)
  • check (28-28)
  • is_spam (15-21)
classes/models/FrmSpamCheckWPDisallowedWords.php (2)
  • is_enabled (50-52)
  • check (5-20)
classes/models/FrmSpamCheckStopforumspam.php (2)
  • is_enabled (31-34)
  • check (5-29)
classes/models/FrmSpamCheckUseWPComments.php (2)
  • is_enabled (25-28)
  • check (5-23)
classes/helpers/FrmAppHelper.php (3)
  • FrmAppHelper (6-4462)
  • maybe_json_encode (3278-3283)
  • get_ip_address (526-547)
classes/controllers/FrmAntiSpamController.php (3)
  • is_spam (13-18)
  • FrmAntiSpamController (3-70)
  • get_whitelist_ip (67-69)
classes/models/FrmValidate.php (3)
classes/models/FrmStopforumspam.php (1)
  • get_option_key (9-11)
classes/models/FrmHoneypot.php (1)
  • get_option_key (23-25)
classes/helpers/FrmAppHelper.php (1)
  • FrmAppHelper (6-4462)
classes/views/frm-settings/captcha/captcha.php (1)
classes/helpers/FrmAppHelper.php (4)
  • checked (2089-2093)
  • FrmAppHelper (6-4462)
  • tooltip_icon (4388-4400)
  • esc_textarea (2186-2198)
classes/models/FrmEntryValidate.php (5)
classes/controllers/FrmAntiSpamController.php (5)
  • FrmAntiSpamController (3-70)
  • get_spam_message (46-48)
  • is_spam (13-18)
  • is_stopforumspam_spam (20-23)
  • is_wp_comment_spam (25-28)
classes/models/FrmStopforumspam.php (5)
  • is_spam (33-57)
  • FrmStopforumspam (3-86)
  • set_values (20-22)
  • set_posted_fields (24-26)
  • validate (13-18)
classes/models/FrmBlacklistSpamCheck.php (3)
  • set_values (7-9)
  • validate (44-100)
  • FrmBlacklistSpamCheck (3-176)
classes/helpers/FrmAppHelper.php (3)
  • FrmAppHelper (6-4462)
  • get_ip_address (526-547)
  • array_flatten (2152-2165)
classes/models/FrmSpamCheckUseWPComments.php (1)
  • check (5-23)
🪛 GitHub Check: Psalm
classes/models/FrmSpamCheckUseWPComments.php

[failure] 10-10: PossiblyInvalidIterator
classes/models/FrmSpamCheckUseWPComments.php:10:13: PossiblyInvalidIterator: Cannot iterate over int (see https://psalm.dev/165)

classes/models/FrmSpamCheckStopforumspam.php

[failure] 20-20: UndefinedMethod
classes/models/FrmSpamCheckStopforumspam.php:20:13: UndefinedMethod: Method FrmAntiSpamController::extract_emails_from_string does not exist (see https://psalm.dev/022)

classes/controllers/FrmAntiSpamController.php

[failure] 21-21: TooManyArguments
classes/controllers/FrmAntiSpamController.php:21:17: TooManyArguments: Too many arguments for FrmSpamCheckStopforumspam::__construct - expecting 1 but saw 2 (see https://psalm.dev/026)


[failure] 26-26: TooManyArguments
classes/controllers/FrmAntiSpamController.php:26:17: TooManyArguments: Too many arguments for FrmSpamCheckUseWPComments::__construct - expecting 1 but saw 2 (see https://psalm.dev/026)


[failure] 31-31: TooManyArguments
classes/controllers/FrmAntiSpamController.php:31:17: TooManyArguments: Too many arguments for FrmSpamCheckWPDisallowedWords::__construct - expecting 1 but saw 2 (see https://psalm.dev/026)

classes/models/FrmSpamCheckBlacklist.php

[failure] 18-18: TooManyArguments
classes/models/FrmSpamCheckBlacklist.php:18:3: TooManyArguments: Too many arguments for FrmSpamCheck::__construct - expecting 1 but saw 2 (see https://psalm.dev/026)

classes/models/FrmBlacklistSpamCheck.php

[failure] 129-129: DeprecatedFunction
classes/models/FrmBlacklistSpamCheck.php:129:10: DeprecatedFunction: The function wp_blacklist_check has been marked as deprecated (see https://psalm.dev/201)

classes/models/FrmEntryValidate.php

[failure] 317-317: InvalidParamDefault
classes/models/FrmEntryValidate.php:317:12: InvalidParamDefault: Default value type false for argument 4 of method FrmEntryValidate::spam_check does not match the given type array<array-key, mixed> (see https://psalm.dev/062)


[failure] 397-397: PossiblyInvalidIterator
classes/models/FrmEntryValidate.php:397:13: PossiblyInvalidIterator: Cannot iterate over int (see https://psalm.dev/165)

classes/models/FrmSpamCheckWPDisallowedWords.php

[failure] 47-47: DeprecatedFunction
classes/models/FrmSpamCheckWPDisallowedWords.php:47:10: DeprecatedFunction: The function wp_blacklist_check has been marked as deprecated (see https://psalm.dev/201)

🪛 GitHub Check: PHPStan
classes/models/FrmSpamCheckStopforumspam.php

[failure] 20-20:
Call to an undefined static method FrmAntiSpamController::extract_emails_from_string().

classes/controllers/FrmAntiSpamController.php

[failure] 21-21:
Class FrmSpamCheckStopforumspam constructor invoked with 2 parameters, 1 required.


[failure] 26-26:
Class FrmSpamCheckUseWPComments constructor invoked with 2 parameters, 1 required.


[failure] 31-31:
Class FrmSpamCheckWPDisallowedWords constructor invoked with 2 parameters, 1 required.


[failure] 59-59:
Offset 0 on array{array<int, string>} in isset() always exists and is not nullable.

classes/models/FrmStopforumspam.php

[failure] 72-72:
Offset 0 on array{array<int, string>} in isset() always exists and is not nullable.

classes/models/FrmSpamCheckBlacklist.php

[failure] 18-18:
Method FrmSpamCheck::__construct() invoked with 2 parameters, 1 required.

classes/models/FrmEntryValidate.php

[failure] 319-319:
Default value of the parameter #4 $posted_fields (false) of method FrmEntryValidate::spam_check() is incompatible with type array.

🪛 GitHub Actions: Psalm Code Analysis
classes/controllers/FrmAntiSpamController.php

[error] 21-21: Psalm: Too many arguments for FrmSpamCheckStopforumspam::__construct - expecting 1 but saw 2 (see https://psalm.dev/026)

🪛 LanguageTool
blacklist/domain-partial.txt

[typographical] ~19-~19: Twee of meer opeenvolgende punten; 1 of 3 is gebruikelijk.
Context: ...ine.info -spin -tw.biz -tw.info -tw.org ..mediabey.com .00860.net .0amail.top .0px...

(DOUBLE_PUNCTUATION)


[misspelling] ~28-~28: ‘tk’ zou fout kunnen zijn. Misschien bedoelt u: “t.k.”
Context: ...om .101livemail.top .10mail.org .10mail.tk .1146.info .163.com.com .1900.io .1amai...

(NL_SIMPLE_REPLACE_TK)


[style] ~35-~35: Netter is om het uit te schrijven.
Context: ....1bayandiyarbakiresc.xyz .1website.net .1x.biz .2012moviedownloadfree.com .24space...

(_10X)


[style] ~59-~59: Netter is om het uit te schrijven.
Context: ... .8358699.com .86kk.net .882113322.com .8x.biz .9227xpj.com .92gmail.com .992459.c...

(_10X)


[uncategorized] ~84-~84: Juist is: “eens”.
Context: ...waw.pl .akk.ro .aktifbil.com .alcaldede.es .alexander-skarsgard.net .alexhaleighga...

(KIJK_ES_PREMIUM)


[misspelling] ~327-~327: ‘iki’ zou fout kunnen zijn. Misschien bedoelt u: “ik”
Context: ...msq0.com .cn.pn .co.at.pn .co.cc .co.kr.iki.kr .co.kr.lbe.kr .co.uk.pn .coarco.com....

(NL_SIMPLE_REPLACE_IKI)


[misspelling] ~347-~347: ‘config’ zou fout kunnen zijn. Misschien bedoelt u: “configuratie”
Context: ...iting.com .comrugvvokrug.ru .conf.work .config.work .consored.com .construtrabajo.com ...

(NL_SIMPLE_REPLACE_CONFIG)


[misspelling] ~514-~514: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...xpertadvisormt4ea.com .externalizare-it.pw .extra-breast.info .extra-penis-enlarge...

(NL_SIMPLE_REPLACE_PW)


[misspelling] ~640-~640: Gram hoort afgekort te worden als ‘g’, groeten kun je beter voluit schrijven.
Context: ...ts.top .goverloe.com .gowactivator.com .gr.vu .gr8domain.biz .grammi.sg .green-cof...

(NL_SIMPLE_REPLACE_GR)


[misspelling] ~653-~653: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...ineranker.online .gsasearchengineranker.pw .gsasearchengineranker.site .gsasearche...

(NL_SIMPLE_REPLACE_PW)


[style] ~660-~660: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...xyz .gsasearchenginerankerdiscount.com .gsasearchenginerankersocialser.com .gsaserlist.com .gsaverifiedlist.do...

(ERG_LANG_WOORD)


[misspelling] ~729-~729: ‘iki’ zou fout kunnen zijn. Misschien bedoelt u: “ik”
Context: ...giveaways.xyz .ihappytime.com .ihc.xyz .iki.kr .ilink.website .ilyushu.com .imagens...

(NL_SIMPLE_REPLACE_IKI)


[uncategorized] ~929-~929: Dit lijkt niet correct te zijn.
Context: ....makingdomes.com .maleenhancement.club .malsers.com .manidn.com .mantly.com .mantul.xyz...

(IETS_KLEINS)


[misspelling] ~1022-~1022: ‘iki’ zou fout kunnen zijn. Misschien bedoelt u: “ik”
Context: ...waw.pl .neonfringe.com .nesine.fun .net.iki.kr .netbreeze.site .netmail.tk .newfish...

(NL_SIMPLE_REPLACE_IKI)


[misspelling] ~1024-~1024: ‘tk’ zou fout kunnen zijn. Misschien bedoelt u: “t.k.”
Context: ...un .net.iki.kr .netbreeze.site .netmail.tk .newfishingaccessories.com .newpopularw...

(NL_SIMPLE_REPLACE_TK)


[misspelling] ~1148-~1148: ‘pp’ zou fout kunnen zijn. Misschien bedoelt u: “p.p.”
Context: ....powds.com .poy.kr .pozycjonowanie8.pl .pp.ua .ppc-e.com .ppoet.com .prclosing.inf...

(NL_SIMPLE_REPLACE_PP)


[misspelling] ~1169-~1169: ‘pp’ zou fout kunnen zijn. Misschien bedoelt u: “p.p.”
Context: ...esde.com .prowebmail.online .pryaniki68.pp.ru .ps4.rocks .ptmm.com .publicidadedig...

(NL_SIMPLE_REPLACE_PP)


[misspelling] ~1190-~1190: Verwacht werd “voorbedachten rade”, “te rade” of mogelijk “raden”.
Context: ...uickmail.pl .quixyl.com .qwertylock.com .rade.waw.pl .radi6.com .radities.com .ragnor...

(VOORBEDACHTEN_RADE)


[style] ~1314-~1314: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...n.com .snz873.com .socialrpmailing.com .socialsergsasearchengineranker.com .softhandscream.com .softtoiletpape...

(ERG_LANG_WOORD)


[misspelling] ~1405-~1405: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...m .toshikokaori.xyz .totozyn.com .tpost.pw .tr.vu .tradingcogroup.ir .traduzioni-i...

(NL_SIMPLE_REPLACE_PW)


[misspelling] ~1414-~1414: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...ellerapp.click .trendesmail.com .tricks.pw .trillania.com .trinityanokamn.org .tru...

(NL_SIMPLE_REPLACE_PW)


[misspelling] ~1526-~1526: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...ilm1.site .webmailmeta.site .webmailpro.pw .webolowitz.com .webproton.site .webvan...

(NL_SIMPLE_REPLACE_PW)


[misspelling] ~1586-~1586: ‘tk’ zou fout kunnen zijn. Misschien bedoelt u: “t.k.”
Context: ....yandexx.info .yankeeroo.com .yertxenor.tk .yffk.xyz .ylfpay.cn .ylixo.com .yohana...

(NL_SIMPLE_REPLACE_TK)


[uncategorized] ~1623-~1623: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...electricscooter.com 1bayandiyarbakiresc.xyz 1win- 1xbet- 2012-2016.ru 2018.top 21ja...

(PUNT_GEEN_HL)


[uncategorized] ~1628-~1628: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...in- 1xbet- 2012-2016.ru 2018.top 21jack.club 24hstyle.shop 2605mails 26forex 2escort...

(PUNT_GEEN_HL)


[uncategorized] ~1629-~1629: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...2-2016.ru 2018.top 21jack.club 24hstyle.shop 2605mails 26forex 2escortdiyarbakir2.xy...

(PUNT_GEEN_HL)


[uncategorized] ~1635-~1635: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ... 360ezzz.com 389production.com 4evrmail.shop 567map.xyz 777- 888-spin 9o9pkbwg.buzz ...

(PUNT_GEEN_HL)


[uncategorized] ~1636-~1636: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ... 389production.com 4evrmail.shop 567map.xyz 777- 888-spin 9o9pkbwg.buzz 9xkb675g.bu...

(PUNT_GEEN_HL)


[uncategorized] ~1639-~1639: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ....shop 567map.xyz 777- 888-spin 9o9pkbwg.buzz 9xkb675g.buzz a4ktube.com acceder-dispo...

(PUNT_GEEN_HL)


[uncategorized] ~1640-~1640: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...yz 777- 888-spin 9o9pkbwg.buzz 9xkb675g.buzz a4ktube.com acceder-dispositivonovob.co...

(PUNT_GEEN_HL)


[uncategorized] ~1650-~1650: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ... affordablespecs.online ago12z7v9lo9a0f.lol air-max air-maxs airj0 airjordan airjor...

(PUNT_GEEN_HL)


[style] ~1661-~1661: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...allmail.gdn alxmedia.online amoriza.net angelamcreynoldsrealestateagentedmondok.com angelamcreynoldsrealestateagentokla...

(ERG_LANG_WOORD)


[style] ~1662-~1662: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...lamcreynoldsrealestateagentedmondok.com angelamcreynoldsrealestateagentoklahomacityok.com angelawalkerrealestateagentfortwort...

(ERG_LANG_WOORD)


[style] ~1663-~1663: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...ynoldsrealestateagentoklahomacityok.com angelawalkerrealestateagentfortworthtx.com angeliita.com anill.cz antiqueresto...

(ERG_LANG_WOORD)


[uncategorized] ~1666-~1666: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...gentfortworthtx.com angeliita.com anill.cz antiquerestorationwork.com aonwin.info ...

(PUNT_GEEN_HL)


[uncategorized] ~1673-~1673: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...cssupplies.club archaemedia.net argotel.ru article.banditim.com articles.vip asdgr...

(PUNT_GEEN_HL)


[uncategorized] ~1688-~1688: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...is ativosdepapelnfe.org atlanta-webmail.top augmax.com australia-travel.news autode...

(PUNT_GEEN_HL)


[uncategorized] ~1723-~1723: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...tmail.eu bestmassagechair.org bestn4box.ru bestpaydayloansonline.us.com betterbusi...

(PUNT_GEEN_HL)


[uncategorized] ~1733-~1733: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...aryoption bioisdlibneoc.com bishop-knot.xyz bl228.net blastzane.com blatnet.com blo...

(PUNT_GEEN_HL)


[uncategorized] ~1738-~1738: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...om blatnet.com blogingmail.com blogrtui.ru blurelizer.com blurmailbox.com bola389....

(PUNT_GEEN_HL)


[uncategorized] ~1746-~1746: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...m bolmail.top bonanovamedicaa.com bonio.cz boofx.com boostsale.live boringverse.co...

(PUNT_GEEN_HL)


[uncategorized] ~1757-~1757: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...rd.net browndecorationlights.com btcptc.co burberryoutlet businessessay.online bus...

(PUNT_GEEN_HL)


[misspelling] ~1802-~1802: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...ags.com cheaplouisvuit cheapmailhosting.pw cheapnike cheapoakley cheapoutlet cheap...

(NL_SIMPLE_REPLACE_PW)


[style] ~1816-~1816: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...eearringsbracelets.com christianloubout christinedangrealestateagenthendersonnv.com christinedangrealestateagentlasvega...

(ERG_LANG_WOORD)


[style] ~1817-~1817: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...stinedangrealestateagenthendersonnv.com christinedangrealestateagentlasvegasnv.com christinedangrealestateagentnorthla...

(ERG_LANG_WOORD)


[style] ~1818-~1818: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...istinedangrealestateagentlasvegasnv.com christinedangrealestateagentnorthlasvegasnv.com clashatclintonemail.com cleivleblea...

(ERG_LANG_WOORD)


[misspelling] ~1841-~1841: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...decorations.com corine.top corsairsmail.pw cosmicbridge.site cosmiccircuit.store c...

(NL_SIMPLE_REPLACE_PW)


[uncategorized] ~1858-~1858: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...omketodiet.kitchen cuteboyo.com cvmania.pl cyber-host.pl daphneandersonrealestatea...

(PUNT_GEEN_HL)


[uncategorized] ~1859-~1859: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...chen cuteboyo.com cvmania.pl cyber-host.pl daphneandersonrealestateagentchulavista...

(PUNT_GEEN_HL)


[style] ~1859-~1859: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...n cuteboyo.com cvmania.pl cyber-host.pl daphneandersonrealestateagentchulavistaca.com daphneandersonrealestateagentsandie...

(ERG_LANG_WOORD)


[style] ~1860-~1860: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...andersonrealestateagentchulavistaca.com daphneandersonrealestateagentsandiegoca.com das-marketingbuero.de debbiesisnero...

(ERG_LANG_WOORD)


[uncategorized] ~1862-~1862: Het woord na ‘de’ is onverwacht. Misschien zou het niet ‘de’, maar ‘het’, ‘dat’ of ‘dit’ moeten zijn.
Context: ...eagentsandiegoca.com das-marketingbuero.de debbiesisnerosdenkrealestateagentalbuquerquenm.com debbiesisnerosdenkrealestateagentlo...

(DE_ONVERWACHT)


[style] ~1863-~1863: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...rosdenkrealestateagentalbuquerquenm.com debbiesisnerosdenkrealestateagentloslunasnm.com debbiesisnerosdenkrealestateagentri...

(ERG_LANG_WOORD)


[style] ~1864-~1864: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...snerosdenkrealestateagentloslunasnm.com debbiesisnerosdenkrealestateagentrioranchonm.com debbiesisnerosdenkrealestateagentsa...

(ERG_LANG_WOORD)


[style] ~1865-~1865: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...nerosdenkrealestateagentrioranchonm.com debbiesisnerosdenkrealestateagentsantafenm.com definedgame.com delhinightqueen.com...

(ERG_LANG_WOORD)


[style] ~1869-~1869: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...ame.com delhinightqueen.com delinda.top deniseclemensrealestateagentelkgroveca.com deniseclemensrealestateagentfolsomc...

(ERG_LANG_WOORD)


[style] ~1870-~1870: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...iseclemensrealestateagentelkgroveca.com deniseclemensrealestateagentfolsomca.com deniseclemensrealestateagentranchoc...

(ERG_LANG_WOORD)


[style] ~1871-~1871: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...eniseclemensrealestateagentfolsomca.com deniseclemensrealestateagentranchocordovaca.com deniseclemensrealestateagentsacrame...

(ERG_LANG_WOORD)


[style] ~1872-~1872: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...emensrealestateagentranchocordovaca.com deniseclemensrealestateagentsacramentoca.com denver-pop3.top dev256.xyz device-s...

(ERG_LANG_WOORD)


[style] ~1878-~1878: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...-new-auth.com dewabanget.com dezrus.com dianegaliciarealestateagentkatytx.com diflucan4all.top dinamuradrealestat...

(ERG_LANG_WOORD)


[uncategorized] ~1880-~1880: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...arealestateagentkatytx.com diflucan4all.top dinamuradrealestateagentchandleraz.com ...

(PUNT_GEEN_HL)


[style] ~1880-~1880: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...lestateagentkatytx.com diflucan4all.top dinamuradrealestateagentchandleraz.com dinamuradrealestateagentglendaleaz....

(ERG_LANG_WOORD)


[style] ~1881-~1881: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... dinamuradrealestateagentchandleraz.com dinamuradrealestateagentglendaleaz.com dinamuradrealestateagentphoenixaz.c...

(ERG_LANG_WOORD)


[style] ~1882-~1882: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... dinamuradrealestateagentglendaleaz.com dinamuradrealestateagentphoenixaz.com dinamuradrealestateagentscottdaleaz...

(ERG_LANG_WOORD)


[style] ~1883-~1883: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...m dinamuradrealestateagentphoenixaz.com dinamuradrealestateagentscottdaleaz.com disciplinethecity.sg discoplus.ca d...

(ERG_LANG_WOORD)


[uncategorized] ~1885-~1885: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...eagentscottdaleaz.com disciplinethecity.sg discoplus.ca diten.cz diyarbakirescleve...

(PUNT_GEEN_HL)


[uncategorized] ~1886-~1886: Vergeet de punt niet als het een afkorting is: “ca.” Schrijf het liever voluit.
Context: ...leaz.com disciplinethecity.sg discoplus.ca diten.cz diyarbakiresclevel5.xyz diyarb...

(AFKO_PUNT)


[uncategorized] ~1887-~1887: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...disciplinethecity.sg discoplus.ca diten.cz diyarbakiresclevel5.xyz diyarbakirescof...

(PUNT_GEEN_HL)


[uncategorized] ~1910-~1910: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...er downloadism.top dragonmoney dravizor.ru drawnoutalot.com dreamcoffeehouse.ir dr...

(PUNT_GEEN_HL)


[uncategorized] ~1912-~1912: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...or.ru drawnoutalot.com dreamcoffeehouse.ir drferril.com drferriltreatmentplans.com...

(PUNT_GEEN_HL)


[misspelling] ~1917-~1917: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ... drupaler.org duanbimgroup.com dukamail.pw dummyfox.com duniaangka.com duno.org dy...

(NL_SIMPLE_REPLACE_PW)


[uncategorized] ~1938-~1938: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...vatestrategies.club elfseo.com emailbiz.co emailnameref.com emaily.us emeyle.com e...

(PUNT_GEEN_HL)


[uncategorized] ~1943-~1943: Het woord na ‘de’ is onverwacht. Misschien zou het niet ‘de’, maar ‘het’, ‘dat’ of ‘dit’ moeten zijn.
Context: ...om emissoes2022fiscal.org emsland-gruop.de eshreky.com estabbi.com estaxy.com estoque-mega...

(DE_ONVERWACHT)


[uncategorized] ~1966-~1966: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...lick federalcash federalloan feelstudio.ru festivalday.click fetely.click filegear...

(PUNT_GEEN_HL)


[uncategorized] ~1969-~1969: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...tivalday.click fetely.click filegear-sg.me findermaoil.online findingperry.com fir...

(PUNT_GEEN_HL)


[uncategorized] ~1972-~1972: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...oil.online findingperry.com firmen-news.at firstaidkit.services fiverek.pl flatole...

(PUNT_GEEN_HL)


[uncategorized] ~1974-~1974: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...en-news.at firstaidkit.services fiverek.pl flatoledtvs.com flexbud224.pl flipflopp...

(PUNT_GEEN_HL)


[uncategorized] ~1994-~1994: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ....com frienced.com fruitingbodymushrooms.online funnetwork.xyz funny3delements.com funn...

(PUNT_GEEN_HL)


[uncategorized] ~2015-~2015: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...on.com germanytrips24.shop get-bitcoins.club get-bitcoins.online getcaper.click getg...

(PUNT_GEEN_HL)


[uncategorized] ~2016-~2016: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...s24.shop get-bitcoins.club get-bitcoins.online getcaper.click getgambol.click gethike....

(PUNT_GEEN_HL)


[style] ~2023-~2023: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...lick getsupprts.click giantthink.online gilliancunninghamrealestateagentallentx.com gilliancunninghamrealestateagentcar...

(ERG_LANG_WOORD)


[style] ~2024-~2024: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...iancunninghamrealestateagentallentx.com gilliancunninghamrealestateagentcarrolltontx.com gilliancunninghamrealestateagentdal...

(ERG_LANG_WOORD)


[style] ~2025-~2025: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...nninghamrealestateagentcarrolltontx.com gilliancunninghamrealestateagentdallastx.com gilliancunninghamrealestateagentfri...

(ERG_LANG_WOORD)


[style] ~2026-~2026: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...ancunninghamrealestateagentdallastx.com gilliancunninghamrealestateagentfriscotx.com giveblood.bar glamforo.com glassess...

(ERG_LANG_WOORD)


[uncategorized] ~2041-~2041: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ....net gmailrasta.net gmailssdf.com gmeil.me gmxx.uno goaglie.com goinglownow.com go...

(PUNT_GEEN_HL)


[uncategorized] ~2053-~2053: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...earchengineranker gsasearchengineranker.xyz gsaser.ir gsaser.world gsaverifiedlist....

(PUNT_GEEN_HL)


[uncategorized] ~2054-~2054: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ranker gsasearchengineranker.xyz gsaser.ir gsaser.world gsaverifiedlist.download g...

(PUNT_GEEN_HL)


[uncategorized] ~2059-~2059: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...load gsavps.xyz guccioutlet gull-minnow.top h2oserver.tk haftacmtsescort.xyz hakiki...

(PUNT_GEEN_HL)


[misspelling] ~2060-~2060: ‘tk’ zou fout kunnen zijn. Misschien bedoelt u: “t.k.”
Context: ...z guccioutlet gull-minnow.top h2oserver.tk haftacmtsescort.xyz hakikidiyarbakiresc...

(NL_SIMPLE_REPLACE_TK)


[uncategorized] ~2062-~2062: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...tacmtsescort.xyz hakikidiyarbakirescort.xyz hammerhandz.com hamsterbreeeding.com ha...

(PUNT_GEEN_HL)


[uncategorized] ~2075-~2075: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...hellohappy2.com hensailor.xyz herbhouse.ir hermesbirkin0.com hexagonaldrawings hoc...

(PUNT_GEEN_HL)


[uncategorized] ~2096-~2096: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...om indiatravel.network indiaurbanportal.in info-binance.net infopostmail.com infor...

(PUNT_GEEN_HL)


[uncategorized] ~2109-~2109: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...om itchydog.online itemxyz.com j-walker.jp jak-z-bajki.pw jakosc-styl-klasa.pw jam...

(PUNT_GEEN_HL)


[misspelling] ~2110-~2110: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...ine itemxyz.com j-walker.jp jak-z-bajki.pw jakosc-styl-klasa.pw jam4d.online jamik...

(NL_SIMPLE_REPLACE_PW)


[misspelling] ~2111-~2111: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...ker.jp jak-z-bajki.pw jakosc-styl-klasa.pw jam4d.online jamikait.cf japantravel.ne...

(NL_SIMPLE_REPLACE_PW)


[uncategorized] ~2112-~2112: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...k-z-bajki.pw jakosc-styl-klasa.pw jam4d.online jamikait.cf japantravel.network jennife...

(PUNT_GEEN_HL)


[uncategorized] ~2113-~2113: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...osc-styl-klasa.pw jam4d.online jamikait.cf japantravel.network jenniferlawrence.uk...

(PUNT_GEEN_HL)


[style] ~2120-~2120: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...m jokeray.com joyrideday.com jpsale.com judyvesselsrealestateagentdallastx.com judyvesselsrealestateagentgarlandtx...

(ERG_LANG_WOORD)


[style] ~2121-~2121: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... judyvesselsrealestateagentdallastx.com judyvesselsrealestateagentgarlandtx.com judyvesselsrealestateagentmckinneyt...

(ERG_LANG_WOORD)


[style] ~2122-~2122: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...judyvesselsrealestateagentgarlandtx.com judyvesselsrealestateagentmckinneytx.com judyvesselsrealestateagentplanotx.c...

(ERG_LANG_WOORD)


[style] ~2123-~2123: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...udyvesselsrealestateagentmckinneytx.com judyvesselsrealestateagentplanotx.com junkcarsfloridamiami.com k8xp.com k...

(ERG_LANG_WOORD)


[uncategorized] ~2135-~2135: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...nhyenvillas.com kiesag.xyz kinogokinogo.ru kinogoru.ru kipolongsleeve.com klassikp...

(PUNT_GEEN_HL)


[uncategorized] ~2136-~2136: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...com kiesag.xyz kinogokinogo.ru kinogoru.ru kipolongsleeve.com klassikpath.com krea...

(PUNT_GEEN_HL)


[uncategorized] ~2144-~2144: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...lunch.lady-and-lunch.xyz lady-and-lunch.xyz lagunahomestudio.store lakemneadows.com...

(PUNT_GEEN_HL)


[uncategorized] ~2147-~2147: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...omestudio.store lakemneadows.com larond.cz laskarauto.com latestconsolegames.com l...

(PUNT_GEEN_HL)


[uncategorized] ~2153-~2153: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...es.com lemurshappy.org letslovethoughts.ir lilo.org linkbuilding live-media.fr liv...

(PUNT_GEEN_HL)


[uncategorized] ~2156-~2156: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ...hts.ir lilo.org linkbuilding live-media.fr livelo-newsletter.xyz liveset lloydsban...

(AFKO_PUNT)


[uncategorized] ~2157-~2157: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...uilding live-media.fr livelo-newsletter.xyz liveset lloydsbank.device-prevention-sa...

(PUNT_GEEN_HL)


[uncategorized] ~2179-~2179: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...p lvoutlet m8sbeingm8s.com magic-garden.fun mai1www mail-ireland.com mail-jim mail....

(PUNT_GEEN_HL)


[uncategorized] ~2211-~2211: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ltopp.space mailtracenet.space mailtune.ir mailusaweb.space mailwebsites.space mai...

(PUNT_GEEN_HL)


[style] ~2221-~2221: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...com malin44.com.pl mariachisuroeste.com mariecharlesrealestateagentcorpuschristitx.com mariecharlesrealestateagenthoustont...

(ERG_LANG_WOORD)


[style] ~2222-~2222: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...arlesrealestateagentcorpuschristitx.com mariecharlesrealestateagenthoustontx.com mariecharlesrealestateagenthumbletx...

(ERG_LANG_WOORD)


[style] ~2223-~2223: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...ariecharlesrealestateagenthoustontx.com mariecharlesrealestateagenthumbletx.com mariewallacerealestateagentfolsomca...

(ERG_LANG_WOORD)


[style] ~2224-~2224: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...mariecharlesrealestateagenthumbletx.com mariewallacerealestateagentfolsomca.com marketingsolutions.info marksypark....

(ERG_LANG_WOORD)


[uncategorized] ~2231-~2231: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ived.com martinandgang.com marver-coats.xyz marvsz.com mastermethodguide.us mazovia...

(PUNT_GEEN_HL)


[uncategorized] ~2245-~2245: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ....net meidiee.life memberty.com mensorda.ru menterprise.app merkez34.com meupd.com ...

(PUNT_GEEN_HL)


[uncategorized] ~2249-~2249: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...e.app merkez34.com meupd.com miami-mail.top microsoft-office.live microsoft-office....

(PUNT_GEEN_HL)


[uncategorized] ~2250-~2250: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...upd.com miami-mail.top microsoft-office.live microsoft-office.live mikeandertonreale...

(PUNT_GEEN_HL)


[uncategorized] ~2251-~2251: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ... microsoft-office.live microsoft-office.live mikeandertonrealestateagentmodestoca.co...

(PUNT_GEEN_HL)


[style] ~2251-~2251: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...osoft-office.live microsoft-office.live mikeandertonrealestateagentmodestoca.com mikinibikini.com mikirslot.co mikir...

(ERG_LANG_WOORD)


[uncategorized] ~2254-~2254: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...odestoca.com mikinibikini.com mikirslot.co mikirslot.com mikirslot.net miktyk mild...

(PUNT_GEEN_HL)


[uncategorized] ~2259-~2259: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...kirslot.net miktyk mildslot.cc mildslot.co mildslot.com mildslot.me mildslot.xyz m...

(PUNT_GEEN_HL)


[uncategorized] ~2261-~2261: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ot.cc mildslot.co mildslot.com mildslot.me mildslot.xyz mileselectricvehicles.com ...

(PUNT_GEEN_HL)


[uncategorized] ~2275-~2275: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ntreal5.top mortaji.us movenpickwaverly.vn movietv4u.com mulberryonline muscle-bui...

(PUNT_GEEN_HL)


[uncategorized] ~2278-~2278: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...tv4u.com mulberryonline muscle-building.club musclejapancars.com mustdoindubai.com m...

(PUNT_GEEN_HL)


[uncategorized] ~2290-~2290: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...diyarescortbul.xyz neonfringe.com nerio.cz newfishingaccessories.com newpopularwat...

(PUNT_GEEN_HL)


[uncategorized] ~2297-~2297: Vergeet de punt niet als het een afkorting is: “ir.” Schrijf het liever voluit.
Context: ...newtonstores.com newyorkmetro5.top nex4.ir next4.ir nicewoodenbaskets.com nikefree...

(AFKO_PUNT)


[uncategorized] ~2298-~2298: Vergeet de punt niet als het een afkorting is: “ir.” Schrijf het liever voluit.
Context: ...res.com newyorkmetro5.top nex4.ir next4.ir nicewoodenbaskets.com nikefreerun ninin...

(AFKO_PUNT)


[style] ~2303-~2303: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... nininini.buzz nmail.work nonton389.com norahoguerealestateagentbrokenarrowok.com norahoguerealestateagenttulsaok.com...

(ERG_LANG_WOORD)


[style] ~2304-~2304: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...rahoguerealestateagentbrokenarrowok.com norahoguerealestateagenttulsaok.com novodigs.com nullcafe.com numelabs....

(ERG_LANG_WOORD)


[uncategorized] ~2318-~2318: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ....com ofisdiyaresc200.xyz ofisdiyaresc3e.xyz okasa.pl olddog.care oldoutnewin.com on...

(PUNT_GEEN_HL)


[uncategorized] ~2319-~2319: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...iyaresc200.xyz ofisdiyaresc3e.xyz okasa.pl olddog.care oldoutnewin.com onetab.fr o...

(PUNT_GEEN_HL)


[uncategorized] ~2322-~2322: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ...a.pl olddog.care oldoutnewin.com onetab.fr onewebmail.top onhaxx.me online-geld on...

(AFKO_PUNT)


[uncategorized] ~2324-~2324: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...win.com onetab.fr onewebmail.top onhaxx.me online-geld onlinecasino onlinejp onlin...

(PUNT_GEEN_HL)


[uncategorized] ~2328-~2328: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ld onlinecasino onlinejp onlinepaidjobs.me onlinepharmacy onlmktng.life opbeingop....

(PUNT_GEEN_HL)


[style] ~2345-~2345: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...irproducts.com palmgardenshopvillas.com pamrankinrealestateagentcarlsbadca.com pamrankinrealestateagentescondidoca...

(ERG_LANG_WOORD)


[style] ~2346-~2346: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... pamrankinrealestateagentcarlsbadca.com pamrankinrealestateagentescondidoca.com pamrankinrealestateagentoceansideca...

(ERG_LANG_WOORD)


[style] ~2347-~2347: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...pamrankinrealestateagentescondidoca.com pamrankinrealestateagentoceansideca.com pamrankinrealestateagentsandiegoca....

(ERG_LANG_WOORD)


[style] ~2348-~2348: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...pamrankinrealestateagentoceansideca.com pamrankinrealestateagentsandiegoca.com pamrankinrealestateagentsanmarcosca...

(ERG_LANG_WOORD)


[style] ~2349-~2349: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... pamrankinrealestateagentsandiegoca.com pamrankinrealestateagentsanmarcosca.com pamrankinrealestateagentvistaca.com...

(ERG_LANG_WOORD)


[style] ~2350-~2350: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...pamrankinrealestateagentsanmarcosca.com pamrankinrealestateagentvistaca.com pancingqueen.com paris-gmail.top pa...

(ERG_LANG_WOORD)


[uncategorized] ~2353-~2353: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...istaca.com pancingqueen.com paris-gmail.top parkhyatt-phuquoc.vn parkwaymanufacturi...

(PUNT_GEEN_HL)


[uncategorized] ~2354-~2354: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...n.com paris-gmail.top parkhyatt-phuquoc.vn parkwaymanufacturing.net patmorganreale...

(PUNT_GEEN_HL)


[style] ~2355-~2355: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...att-phuquoc.vn parkwaymanufacturing.net patmorganrealestateagentgarlandtx.com patriciayoungrealestateagentdentont...

(ERG_LANG_WOORD)


[style] ~2356-~2356: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...t patmorganrealestateagentgarlandtx.com patriciayoungrealestateagentdentontx.com pawtrim.shop payday-loan paydaycash...

(ERG_LANG_WOORD)


[uncategorized] ~2362-~2362: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...n paydaycash paydayloan pdf-nfe-digital.xyz pdkiblasdmc92.com pediyarescsca.xyz per...

(PUNT_GEEN_HL)


[uncategorized] ~2366-~2366: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...performicsde.com pertomdiyarbakirescort.xyz philippinestravel.network phonezip pine...

(PUNT_GEEN_HL)


[uncategorized] ~2370-~2370: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...rk phonezip pine-and-onyx pine-and-onyx.xyz pinupcasino plasticvouchercards.com pla...

(PUNT_GEEN_HL)


[uncategorized] ~2374-~2374: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ...ouchercards.com playmovies.stream ploki.fr ploooop.com poderfeminino.me pointbuysy...

(AFKO_PUNT)


[uncategorized] ~2376-~2376: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ream ploki.fr ploooop.com poderfeminino.me pointbuysys.com poisedtoshrike.com poke...

(PUNT_GEEN_HL)


[uncategorized] ~2382-~2382: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...d.com ponpesnuridinidris.com pop3boston.top popautomated.com popularde.top portable...

(PUNT_GEEN_HL)


[uncategorized] ~2386-~2386: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ....top portablespeaker.club portail-malin.fr portonomer.com postbinance.net powersho...

(AFKO_PUNT)


[uncategorized] ~2393-~2393: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ...prayforgem.com prehers.com premium-mail.fr primesempresbuscando.org printemailtext...

(AFKO_PUNT)


[uncategorized] ~2408-~2408: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ushmail.fun pushpophop.com pystyportfel.pl pzdiyarsescortbul.xyz qqaonwin quantumn...

(PUNT_GEEN_HL)


[style] ~2415-~2415: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...meme.com qwertylock.com r2mcreation.com rachelegriegorealestateagentsantafenm.com radities.com ragnortheblue.com raja...

(ERG_LANG_WOORD)


[uncategorized] ~2443-~2443: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...xyz ropainterior-ck.com rospotrebnadzor.ru rowrowleft.com rta.cat rupayamail.com r...

(PUNT_GEEN_HL)


[uncategorized] ~2454-~2454: Het woord na ‘de’ is onverwacht. Misschien zou het niet ‘de’, maar ‘het’, ‘dat’ of ‘dit’ moeten zijn.
Context: ...diyarescort21.xyz samedayloan sanaglobe.de sancto.xyz sanjose33.com saudidiving.com savin...

(DE_ONVERWACHT)


[uncategorized] ~2464-~2464: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ...kmail.com scoldly.com sd-152415.dedibox.fr sd-152424.dedibox.fr searchenginerank s...

(AFKO_PUNT)


[uncategorized] ~2465-~2465: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ... sd-152415.dedibox.fr sd-152424.dedibox.fr searchenginerank seattle-mail1.top seco...

(AFKO_PUNT)


[style] ~2486-~2486: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... shavers.hair shavers.plus shavers.skin sheripatmanrealestateagentfortworthtx.com shoesjp.com shopjp.org shoppingdigi...

(ERG_LANG_WOORD)


[uncategorized] ~2496-~2496: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...impleklean skad-tabletki-na-odchudzanie.top skywardhub.online smartinvestment.homes...

(PUNT_GEEN_HL)


[uncategorized] ~2502-~2502: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...fttoiletpaper.com solarchargecontroller.club solarinverter.club solarpowered.online ...

(PUNT_GEEN_HL)


[uncategorized] ~2509-~2509: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...allads.com spinrewriter.app spotifygold.ir spuramexico2012.net staffingzone.xyz st...

(PUNT_GEEN_HL)


[uncategorized] ~2512-~2512: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...12.net staffingzone.xyz stars-and-glory.top stopstress.shop storejp straightenersau...

(PUNT_GEEN_HL)


[style] ~2519-~2519: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... successmarketplace.com sunglassescheap sunnipouncilrealestateagentedmondok.com sunnipouncilrealestateagentoklahoma...

(ERG_LANG_WOORD)


[style] ~2520-~2520: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...sunnipouncilrealestateagentedmondok.com sunnipouncilrealestateagentoklahomacityok.com sunnyvale33.com supportapp.click su...

(ERG_LANG_WOORD)


[style] ~2532-~2532: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...adalafil take-ur-vites.org talatalk.com tamaradorrisrealestateagentcarmichaelca.com tamaradorrisrealestateagentelkgrove...

(ERG_LANG_WOORD)


[style] ~2533-~2533: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...radorrisrealestateagentcarmichaelca.com tamaradorrisrealestateagentelkgroveca.com tamaradorrisrealestateagentfolsomca...

(ERG_LANG_WOORD)


[style] ~2534-~2534: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...maradorrisrealestateagentelkgroveca.com tamaradorrisrealestateagentfolsomca.com tamaradorrisrealestateagentsacramen...

(ERG_LANG_WOORD)


[style] ~2535-~2535: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...tamaradorrisrealestateagentfolsomca.com tamaradorrisrealestateagentsacramentoca.com tastyarabicacoffee.com tavon.xyz te...

(ERG_LANG_WOORD)


[misspelling] ~2544-~2544: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ... tenofovir terriblecoffee.org texanmail.pw th-vision.net thailandmovers.com thawki...

(NL_SIMPLE_REPLACE_PW)


[uncategorized] ~2551-~2551: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...tter.online thecaper.click thedailygood.ir thedrywallclub.com thegambol.click theh...

(PUNT_GEEN_HL)


[uncategorized] ~2562-~2562: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...tillacts.com tlienodclgoqlclt.com tmweb.ru tobu-wedding.com toddard.com tomekamosl...

(PUNT_GEEN_HL)


[style] ~2564-~2564: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...m tmweb.ru tobu-wedding.com toddard.com tomekamosleyrealestateagentcedarhilltx.com tomekamosleyrealestateagentdesototx...

(ERG_LANG_WOORD)


[style] ~2565-~2565: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...ekamosleyrealestateagentcedarhilltx.com tomekamosleyrealestateagentdesototx.com tomekamosleyrealestateagentlancaste...

(ERG_LANG_WOORD)


[style] ~2566-~2566: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...tomekamosleyrealestateagentdesototx.com tomekamosleyrealestateagentlancastertx.com top1-casino.site topgun.fit topping...

(ERG_LANG_WOORD)


[uncategorized] ~2568-~2568: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...lestateagentlancastertx.com top1-casino.site topgun.fit toppinggoods.com topstream10...

(PUNT_GEEN_HL)


[style] ~2572-~2572: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...ggoods.com topstream10.com topxxx69.com tracyfigueroarealestateagentsacramentoca.com tradingcogroup.ir travel-e-store.co...

(ERG_LANG_WOORD)


[uncategorized] ~2574-~2574: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ateagentsacramentoca.com tradingcogroup.ir travel-e-store.com travellerapp.click t...

(PUNT_GEEN_HL)


[uncategorized] ~2586-~2586: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ick tubered69.com tvtap.fun tw1owebmail.top twowebmail.top twoxxx.top ufficialeairm...

(PUNT_GEEN_HL)


[misspelling] ~2610-~2610: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...tacadostanley.com variots.com vblogmail.pw vcams.info veinflower.xyz vet33.com via...

(NL_SIMPLE_REPLACE_PW)


[uncategorized] ~2617-~2617: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...gra visagency.online vitobase.com vlspm.ga vocalmajoritynow.com vosos.xyz vuitton ...

(PUNT_GEEN_HL)


[uncategorized] ~2661-~2661: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...bananaulx.com yenidiyarbakir2ofisescort.xyz yenidiyaresc76.xyz yenidiyarescucuzbyn0...

(PUNT_GEEN_HL)


[uncategorized] ~2679-~2679: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...about.com zt.co.uk zuperious.club zzuma.ru

(PUNT_GEEN_HL)

🪛 GitHub Check: Spell Check with Typos
blacklist/domain-partial.txt

[warning] 125-125:
"pn" should be "on".


[warning] 128-128:
"pn" should be "on".


[warning] 166-166:
"benj" should be "binge".


[warning] 254-254:
"pn" should be "on".


[warning] 285-285:
"pn" should be "on".


[warning] 324-324:
"pn" should be "on".


[warning] 325-325:
"pn" should be "on".


[warning] 329-329:
"pn" should be "on".


[warning] 338-338:
"pn" should be "on".


[warning] 382-382:
"pn" should be "on".

🪛 GitHub Actions: Typo Checks
blacklist/domain-partial.txt

[error] 125-125: pn should be on


[error] 128-128: pn should be on


[error] 166-166: benj should be binge


[error] 254-254: pn should be on


[error] 285-285: pn should be on


[error] 324-324: pn should be on


[error] 325-325: pn should be on


[error] 329-329: pn should be on


[error] 338-338: pn should be on


[error] 382-382: pn should be on


[error] 578-578: pn should be on


[error] 616-616: boxs should be box or boxes


[error] 635-635: goood should be good


[error] 643-643: coffe should be coffee


[error] 764-764: pn should be on


[error] 792-792: pn should be on


[error] 1082-1082: oueue should be queue


[error] 1090-1090: oyu should be you


[error] 1191-1191: rade should be read, raid, or rate


[error] 1434-1434: ue should be use or due


[error] 1438-1438: pn should be on


[error] 1453-1453: pn should be on


[error] 1542-1542: wil should be will or well


[error] 1693-1693: awsome should be awesome


[error] 1943-1943: gruop should be group


[error] 1984-1984: fre should be free


[error] 2111-2111: styl should be style

🔇 Additional comments (23)
blacklist/ip.txt (1)

1-51: Comprehensive IP blacklist for improved spam protection

This new file contains 51 well-formatted IP addresses and network ranges in CIDR notation that will be used to block known spam sources. The IP ranges appear to be properly formatted with appropriate network prefixes.

classes/helpers/FrmAppHelper.php (1)

2393-2404: Access modifier change to support antispam system

The generate_new_key() method has been changed from private to public to allow it to be utilized by other components, particularly the new antispam features. This change properly supports the dynamic key generation needed for honeypot implementation and other security measures.

blacklist/domain-partial.txt (2)

1-2679: Well-structured comprehensive domain blacklist for spam detection.

This is a well-organized resource file containing patterns of suspicious and spam-associated domains. The list includes gambling sites, pharmaceuticals, scams, disposable email providers, and other domains commonly used for spam.

The structure supports both exact domain matching and partial/suffix matching with leading periods, which is an effective approach for domain filtering.

🧰 Tools
🪛 LanguageTool

[typographical] ~19-~19: Twee of meer opeenvolgende punten; 1 of 3 is gebruikelijk.
Context: ...ine.info -spin -tw.biz -tw.info -tw.org ..mediabey.com .00860.net .0amail.top .0px...

(DOUBLE_PUNCTUATION)


[misspelling] ~28-~28: ‘tk’ zou fout kunnen zijn. Misschien bedoelt u: “t.k.”
Context: ...om .101livemail.top .10mail.org .10mail.tk .1146.info .163.com.com .1900.io .1amai...

(NL_SIMPLE_REPLACE_TK)


[style] ~35-~35: Netter is om het uit te schrijven.
Context: ....1bayandiyarbakiresc.xyz .1website.net .1x.biz .2012moviedownloadfree.com .24space...

(_10X)


[style] ~59-~59: Netter is om het uit te schrijven.
Context: ... .8358699.com .86kk.net .882113322.com .8x.biz .9227xpj.com .92gmail.com .992459.c...

(_10X)


[uncategorized] ~84-~84: Juist is: “eens”.
Context: ...waw.pl .akk.ro .aktifbil.com .alcaldede.es .alexander-skarsgard.net .alexhaleighga...

(KIJK_ES_PREMIUM)


[misspelling] ~327-~327: ‘iki’ zou fout kunnen zijn. Misschien bedoelt u: “ik”
Context: ...msq0.com .cn.pn .co.at.pn .co.cc .co.kr.iki.kr .co.kr.lbe.kr .co.uk.pn .coarco.com....

(NL_SIMPLE_REPLACE_IKI)


[misspelling] ~347-~347: ‘config’ zou fout kunnen zijn. Misschien bedoelt u: “configuratie”
Context: ...iting.com .comrugvvokrug.ru .conf.work .config.work .consored.com .construtrabajo.com ...

(NL_SIMPLE_REPLACE_CONFIG)


[misspelling] ~514-~514: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...xpertadvisormt4ea.com .externalizare-it.pw .extra-breast.info .extra-penis-enlarge...

(NL_SIMPLE_REPLACE_PW)


[misspelling] ~640-~640: Gram hoort afgekort te worden als ‘g’, groeten kun je beter voluit schrijven.
Context: ...ts.top .goverloe.com .gowactivator.com .gr.vu .gr8domain.biz .grammi.sg .green-cof...

(NL_SIMPLE_REPLACE_GR)


[misspelling] ~653-~653: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...ineranker.online .gsasearchengineranker.pw .gsasearchengineranker.site .gsasearche...

(NL_SIMPLE_REPLACE_PW)


[style] ~660-~660: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...xyz .gsasearchenginerankerdiscount.com .gsasearchenginerankersocialser.com .gsaserlist.com .gsaverifiedlist.do...

(ERG_LANG_WOORD)


[misspelling] ~729-~729: ‘iki’ zou fout kunnen zijn. Misschien bedoelt u: “ik”
Context: ...giveaways.xyz .ihappytime.com .ihc.xyz .iki.kr .ilink.website .ilyushu.com .imagens...

(NL_SIMPLE_REPLACE_IKI)


[uncategorized] ~929-~929: Dit lijkt niet correct te zijn.
Context: ....makingdomes.com .maleenhancement.club .malsers.com .manidn.com .mantly.com .mantul.xyz...

(IETS_KLEINS)


[misspelling] ~1022-~1022: ‘iki’ zou fout kunnen zijn. Misschien bedoelt u: “ik”
Context: ...waw.pl .neonfringe.com .nesine.fun .net.iki.kr .netbreeze.site .netmail.tk .newfish...

(NL_SIMPLE_REPLACE_IKI)


[misspelling] ~1024-~1024: ‘tk’ zou fout kunnen zijn. Misschien bedoelt u: “t.k.”
Context: ...un .net.iki.kr .netbreeze.site .netmail.tk .newfishingaccessories.com .newpopularw...

(NL_SIMPLE_REPLACE_TK)


[misspelling] ~1148-~1148: ‘pp’ zou fout kunnen zijn. Misschien bedoelt u: “p.p.”
Context: ....powds.com .poy.kr .pozycjonowanie8.pl .pp.ua .ppc-e.com .ppoet.com .prclosing.inf...

(NL_SIMPLE_REPLACE_PP)


[misspelling] ~1169-~1169: ‘pp’ zou fout kunnen zijn. Misschien bedoelt u: “p.p.”
Context: ...esde.com .prowebmail.online .pryaniki68.pp.ru .ps4.rocks .ptmm.com .publicidadedig...

(NL_SIMPLE_REPLACE_PP)


[misspelling] ~1190-~1190: Verwacht werd “voorbedachten rade”, “te rade” of mogelijk “raden”.
Context: ...uickmail.pl .quixyl.com .qwertylock.com .rade.waw.pl .radi6.com .radities.com .ragnor...

(VOORBEDACHTEN_RADE)


[style] ~1314-~1314: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...n.com .snz873.com .socialrpmailing.com .socialsergsasearchengineranker.com .softhandscream.com .softtoiletpape...

(ERG_LANG_WOORD)


[misspelling] ~1405-~1405: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...m .toshikokaori.xyz .totozyn.com .tpost.pw .tr.vu .tradingcogroup.ir .traduzioni-i...

(NL_SIMPLE_REPLACE_PW)


[misspelling] ~1414-~1414: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...ellerapp.click .trendesmail.com .tricks.pw .trillania.com .trinityanokamn.org .tru...

(NL_SIMPLE_REPLACE_PW)


[misspelling] ~1526-~1526: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...ilm1.site .webmailmeta.site .webmailpro.pw .webolowitz.com .webproton.site .webvan...

(NL_SIMPLE_REPLACE_PW)


[misspelling] ~1586-~1586: ‘tk’ zou fout kunnen zijn. Misschien bedoelt u: “t.k.”
Context: ....yandexx.info .yankeeroo.com .yertxenor.tk .yffk.xyz .ylfpay.cn .ylixo.com .yohana...

(NL_SIMPLE_REPLACE_TK)


[uncategorized] ~1623-~1623: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...electricscooter.com 1bayandiyarbakiresc.xyz 1win- 1xbet- 2012-2016.ru 2018.top 21ja...

(PUNT_GEEN_HL)


[uncategorized] ~1628-~1628: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...in- 1xbet- 2012-2016.ru 2018.top 21jack.club 24hstyle.shop 2605mails 26forex 2escort...

(PUNT_GEEN_HL)


[uncategorized] ~1629-~1629: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...2-2016.ru 2018.top 21jack.club 24hstyle.shop 2605mails 26forex 2escortdiyarbakir2.xy...

(PUNT_GEEN_HL)


[uncategorized] ~1635-~1635: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ... 360ezzz.com 389production.com 4evrmail.shop 567map.xyz 777- 888-spin 9o9pkbwg.buzz ...

(PUNT_GEEN_HL)


[uncategorized] ~1636-~1636: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ... 389production.com 4evrmail.shop 567map.xyz 777- 888-spin 9o9pkbwg.buzz 9xkb675g.bu...

(PUNT_GEEN_HL)


[uncategorized] ~1639-~1639: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ....shop 567map.xyz 777- 888-spin 9o9pkbwg.buzz 9xkb675g.buzz a4ktube.com acceder-dispo...

(PUNT_GEEN_HL)


[uncategorized] ~1640-~1640: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...yz 777- 888-spin 9o9pkbwg.buzz 9xkb675g.buzz a4ktube.com acceder-dispositivonovob.co...

(PUNT_GEEN_HL)


[uncategorized] ~1650-~1650: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ... affordablespecs.online ago12z7v9lo9a0f.lol air-max air-maxs airj0 airjordan airjor...

(PUNT_GEEN_HL)


[style] ~1661-~1661: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...allmail.gdn alxmedia.online amoriza.net angelamcreynoldsrealestateagentedmondok.com angelamcreynoldsrealestateagentokla...

(ERG_LANG_WOORD)


[style] ~1662-~1662: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...lamcreynoldsrealestateagentedmondok.com angelamcreynoldsrealestateagentoklahomacityok.com angelawalkerrealestateagentfortwort...

(ERG_LANG_WOORD)


[style] ~1663-~1663: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...ynoldsrealestateagentoklahomacityok.com angelawalkerrealestateagentfortworthtx.com angeliita.com anill.cz antiqueresto...

(ERG_LANG_WOORD)


[uncategorized] ~1666-~1666: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...gentfortworthtx.com angeliita.com anill.cz antiquerestorationwork.com aonwin.info ...

(PUNT_GEEN_HL)


[uncategorized] ~1673-~1673: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...cssupplies.club archaemedia.net argotel.ru article.banditim.com articles.vip asdgr...

(PUNT_GEEN_HL)


[uncategorized] ~1688-~1688: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...is ativosdepapelnfe.org atlanta-webmail.top augmax.com australia-travel.news autode...

(PUNT_GEEN_HL)


[uncategorized] ~1723-~1723: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...tmail.eu bestmassagechair.org bestn4box.ru bestpaydayloansonline.us.com betterbusi...

(PUNT_GEEN_HL)


[uncategorized] ~1733-~1733: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...aryoption bioisdlibneoc.com bishop-knot.xyz bl228.net blastzane.com blatnet.com blo...

(PUNT_GEEN_HL)


[uncategorized] ~1738-~1738: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...om blatnet.com blogingmail.com blogrtui.ru blurelizer.com blurmailbox.com bola389....

(PUNT_GEEN_HL)


[uncategorized] ~1746-~1746: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...m bolmail.top bonanovamedicaa.com bonio.cz boofx.com boostsale.live boringverse.co...

(PUNT_GEEN_HL)


[uncategorized] ~1757-~1757: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...rd.net browndecorationlights.com btcptc.co burberryoutlet businessessay.online bus...

(PUNT_GEEN_HL)


[misspelling] ~1802-~1802: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...ags.com cheaplouisvuit cheapmailhosting.pw cheapnike cheapoakley cheapoutlet cheap...

(NL_SIMPLE_REPLACE_PW)


[style] ~1816-~1816: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...eearringsbracelets.com christianloubout christinedangrealestateagenthendersonnv.com christinedangrealestateagentlasvega...

(ERG_LANG_WOORD)


[style] ~1817-~1817: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...stinedangrealestateagenthendersonnv.com christinedangrealestateagentlasvegasnv.com christinedangrealestateagentnorthla...

(ERG_LANG_WOORD)


[style] ~1818-~1818: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...istinedangrealestateagentlasvegasnv.com christinedangrealestateagentnorthlasvegasnv.com clashatclintonemail.com cleivleblea...

(ERG_LANG_WOORD)


[misspelling] ~1841-~1841: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...decorations.com corine.top corsairsmail.pw cosmicbridge.site cosmiccircuit.store c...

(NL_SIMPLE_REPLACE_PW)


[uncategorized] ~1858-~1858: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...omketodiet.kitchen cuteboyo.com cvmania.pl cyber-host.pl daphneandersonrealestatea...

(PUNT_GEEN_HL)


[uncategorized] ~1859-~1859: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...chen cuteboyo.com cvmania.pl cyber-host.pl daphneandersonrealestateagentchulavista...

(PUNT_GEEN_HL)


[style] ~1859-~1859: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...n cuteboyo.com cvmania.pl cyber-host.pl daphneandersonrealestateagentchulavistaca.com daphneandersonrealestateagentsandie...

(ERG_LANG_WOORD)


[style] ~1860-~1860: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...andersonrealestateagentchulavistaca.com daphneandersonrealestateagentsandiegoca.com das-marketingbuero.de debbiesisnero...

(ERG_LANG_WOORD)


[uncategorized] ~1862-~1862: Het woord na ‘de’ is onverwacht. Misschien zou het niet ‘de’, maar ‘het’, ‘dat’ of ‘dit’ moeten zijn.
Context: ...eagentsandiegoca.com das-marketingbuero.de debbiesisnerosdenkrealestateagentalbuquerquenm.com debbiesisnerosdenkrealestateagentlo...

(DE_ONVERWACHT)


[style] ~1863-~1863: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...rosdenkrealestateagentalbuquerquenm.com debbiesisnerosdenkrealestateagentloslunasnm.com debbiesisnerosdenkrealestateagentri...

(ERG_LANG_WOORD)


[style] ~1864-~1864: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...snerosdenkrealestateagentloslunasnm.com debbiesisnerosdenkrealestateagentrioranchonm.com debbiesisnerosdenkrealestateagentsa...

(ERG_LANG_WOORD)


[style] ~1865-~1865: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...nerosdenkrealestateagentrioranchonm.com debbiesisnerosdenkrealestateagentsantafenm.com definedgame.com delhinightqueen.com...

(ERG_LANG_WOORD)


[style] ~1869-~1869: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...ame.com delhinightqueen.com delinda.top deniseclemensrealestateagentelkgroveca.com deniseclemensrealestateagentfolsomc...

(ERG_LANG_WOORD)


[style] ~1870-~1870: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...iseclemensrealestateagentelkgroveca.com deniseclemensrealestateagentfolsomca.com deniseclemensrealestateagentranchoc...

(ERG_LANG_WOORD)


[style] ~1871-~1871: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...eniseclemensrealestateagentfolsomca.com deniseclemensrealestateagentranchocordovaca.com deniseclemensrealestateagentsacrame...

(ERG_LANG_WOORD)


[style] ~1872-~1872: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...emensrealestateagentranchocordovaca.com deniseclemensrealestateagentsacramentoca.com denver-pop3.top dev256.xyz device-s...

(ERG_LANG_WOORD)


[style] ~1878-~1878: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...-new-auth.com dewabanget.com dezrus.com dianegaliciarealestateagentkatytx.com diflucan4all.top dinamuradrealestat...

(ERG_LANG_WOORD)


[uncategorized] ~1880-~1880: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...arealestateagentkatytx.com diflucan4all.top dinamuradrealestateagentchandleraz.com ...

(PUNT_GEEN_HL)


[style] ~1880-~1880: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...lestateagentkatytx.com diflucan4all.top dinamuradrealestateagentchandleraz.com dinamuradrealestateagentglendaleaz....

(ERG_LANG_WOORD)


[style] ~1881-~1881: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... dinamuradrealestateagentchandleraz.com dinamuradrealestateagentglendaleaz.com dinamuradrealestateagentphoenixaz.c...

(ERG_LANG_WOORD)


[style] ~1882-~1882: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... dinamuradrealestateagentglendaleaz.com dinamuradrealestateagentphoenixaz.com dinamuradrealestateagentscottdaleaz...

(ERG_LANG_WOORD)


[style] ~1883-~1883: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...m dinamuradrealestateagentphoenixaz.com dinamuradrealestateagentscottdaleaz.com disciplinethecity.sg discoplus.ca d...

(ERG_LANG_WOORD)


[uncategorized] ~1885-~1885: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...eagentscottdaleaz.com disciplinethecity.sg discoplus.ca diten.cz diyarbakirescleve...

(PUNT_GEEN_HL)


[uncategorized] ~1886-~1886: Vergeet de punt niet als het een afkorting is: “ca.” Schrijf het liever voluit.
Context: ...leaz.com disciplinethecity.sg discoplus.ca diten.cz diyarbakiresclevel5.xyz diyarb...

(AFKO_PUNT)


[uncategorized] ~1887-~1887: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...disciplinethecity.sg discoplus.ca diten.cz diyarbakiresclevel5.xyz diyarbakirescof...

(PUNT_GEEN_HL)


[uncategorized] ~1910-~1910: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...er downloadism.top dragonmoney dravizor.ru drawnoutalot.com dreamcoffeehouse.ir dr...

(PUNT_GEEN_HL)


[uncategorized] ~1912-~1912: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...or.ru drawnoutalot.com dreamcoffeehouse.ir drferril.com drferriltreatmentplans.com...

(PUNT_GEEN_HL)


[misspelling] ~1917-~1917: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ... drupaler.org duanbimgroup.com dukamail.pw dummyfox.com duniaangka.com duno.org dy...

(NL_SIMPLE_REPLACE_PW)


[uncategorized] ~1938-~1938: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...vatestrategies.club elfseo.com emailbiz.co emailnameref.com emaily.us emeyle.com e...

(PUNT_GEEN_HL)


[uncategorized] ~1943-~1943: Het woord na ‘de’ is onverwacht. Misschien zou het niet ‘de’, maar ‘het’, ‘dat’ of ‘dit’ moeten zijn.
Context: ...om emissoes2022fiscal.org emsland-gruop.de eshreky.com estabbi.com estaxy.com estoque-mega...

(DE_ONVERWACHT)


[uncategorized] ~1966-~1966: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...lick federalcash federalloan feelstudio.ru festivalday.click fetely.click filegear...

(PUNT_GEEN_HL)


[uncategorized] ~1969-~1969: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...tivalday.click fetely.click filegear-sg.me findermaoil.online findingperry.com fir...

(PUNT_GEEN_HL)


[uncategorized] ~1972-~1972: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...oil.online findingperry.com firmen-news.at firstaidkit.services fiverek.pl flatole...

(PUNT_GEEN_HL)


[uncategorized] ~1974-~1974: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...en-news.at firstaidkit.services fiverek.pl flatoledtvs.com flexbud224.pl flipflopp...

(PUNT_GEEN_HL)


[uncategorized] ~1994-~1994: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ....com frienced.com fruitingbodymushrooms.online funnetwork.xyz funny3delements.com funn...

(PUNT_GEEN_HL)


[uncategorized] ~2015-~2015: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...on.com germanytrips24.shop get-bitcoins.club get-bitcoins.online getcaper.click getg...

(PUNT_GEEN_HL)


[uncategorized] ~2016-~2016: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...s24.shop get-bitcoins.club get-bitcoins.online getcaper.click getgambol.click gethike....

(PUNT_GEEN_HL)


[style] ~2023-~2023: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...lick getsupprts.click giantthink.online gilliancunninghamrealestateagentallentx.com gilliancunninghamrealestateagentcar...

(ERG_LANG_WOORD)


[style] ~2024-~2024: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...iancunninghamrealestateagentallentx.com gilliancunninghamrealestateagentcarrolltontx.com gilliancunninghamrealestateagentdal...

(ERG_LANG_WOORD)


[style] ~2025-~2025: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...nninghamrealestateagentcarrolltontx.com gilliancunninghamrealestateagentdallastx.com gilliancunninghamrealestateagentfri...

(ERG_LANG_WOORD)


[style] ~2026-~2026: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...ancunninghamrealestateagentdallastx.com gilliancunninghamrealestateagentfriscotx.com giveblood.bar glamforo.com glassess...

(ERG_LANG_WOORD)


[uncategorized] ~2041-~2041: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ....net gmailrasta.net gmailssdf.com gmeil.me gmxx.uno goaglie.com goinglownow.com go...

(PUNT_GEEN_HL)


[uncategorized] ~2053-~2053: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...earchengineranker gsasearchengineranker.xyz gsaser.ir gsaser.world gsaverifiedlist....

(PUNT_GEEN_HL)


[uncategorized] ~2054-~2054: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ranker gsasearchengineranker.xyz gsaser.ir gsaser.world gsaverifiedlist.download g...

(PUNT_GEEN_HL)


[uncategorized] ~2059-~2059: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...load gsavps.xyz guccioutlet gull-minnow.top h2oserver.tk haftacmtsescort.xyz hakiki...

(PUNT_GEEN_HL)


[misspelling] ~2060-~2060: ‘tk’ zou fout kunnen zijn. Misschien bedoelt u: “t.k.”
Context: ...z guccioutlet gull-minnow.top h2oserver.tk haftacmtsescort.xyz hakikidiyarbakiresc...

(NL_SIMPLE_REPLACE_TK)


[uncategorized] ~2062-~2062: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...tacmtsescort.xyz hakikidiyarbakirescort.xyz hammerhandz.com hamsterbreeeding.com ha...

(PUNT_GEEN_HL)


[uncategorized] ~2075-~2075: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...hellohappy2.com hensailor.xyz herbhouse.ir hermesbirkin0.com hexagonaldrawings hoc...

(PUNT_GEEN_HL)


[uncategorized] ~2096-~2096: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...om indiatravel.network indiaurbanportal.in info-binance.net infopostmail.com infor...

(PUNT_GEEN_HL)


[uncategorized] ~2109-~2109: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...om itchydog.online itemxyz.com j-walker.jp jak-z-bajki.pw jakosc-styl-klasa.pw jam...

(PUNT_GEEN_HL)


[misspelling] ~2110-~2110: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...ine itemxyz.com j-walker.jp jak-z-bajki.pw jakosc-styl-klasa.pw jam4d.online jamik...

(NL_SIMPLE_REPLACE_PW)


[misspelling] ~2111-~2111: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...ker.jp jak-z-bajki.pw jakosc-styl-klasa.pw jam4d.online jamikait.cf japantravel.ne...

(NL_SIMPLE_REPLACE_PW)


[uncategorized] ~2112-~2112: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...k-z-bajki.pw jakosc-styl-klasa.pw jam4d.online jamikait.cf japantravel.network jennife...

(PUNT_GEEN_HL)


[uncategorized] ~2113-~2113: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...osc-styl-klasa.pw jam4d.online jamikait.cf japantravel.network jenniferlawrence.uk...

(PUNT_GEEN_HL)


[style] ~2120-~2120: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...m jokeray.com joyrideday.com jpsale.com judyvesselsrealestateagentdallastx.com judyvesselsrealestateagentgarlandtx...

(ERG_LANG_WOORD)


[style] ~2121-~2121: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... judyvesselsrealestateagentdallastx.com judyvesselsrealestateagentgarlandtx.com judyvesselsrealestateagentmckinneyt...

(ERG_LANG_WOORD)


[style] ~2122-~2122: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...judyvesselsrealestateagentgarlandtx.com judyvesselsrealestateagentmckinneytx.com judyvesselsrealestateagentplanotx.c...

(ERG_LANG_WOORD)


[style] ~2123-~2123: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...udyvesselsrealestateagentmckinneytx.com judyvesselsrealestateagentplanotx.com junkcarsfloridamiami.com k8xp.com k...

(ERG_LANG_WOORD)


[uncategorized] ~2135-~2135: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...nhyenvillas.com kiesag.xyz kinogokinogo.ru kinogoru.ru kipolongsleeve.com klassikp...

(PUNT_GEEN_HL)


[uncategorized] ~2136-~2136: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...com kiesag.xyz kinogokinogo.ru kinogoru.ru kipolongsleeve.com klassikpath.com krea...

(PUNT_GEEN_HL)


[uncategorized] ~2144-~2144: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...lunch.lady-and-lunch.xyz lady-and-lunch.xyz lagunahomestudio.store lakemneadows.com...

(PUNT_GEEN_HL)


[uncategorized] ~2147-~2147: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...omestudio.store lakemneadows.com larond.cz laskarauto.com latestconsolegames.com l...

(PUNT_GEEN_HL)


[uncategorized] ~2153-~2153: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...es.com lemurshappy.org letslovethoughts.ir lilo.org linkbuilding live-media.fr liv...

(PUNT_GEEN_HL)


[uncategorized] ~2156-~2156: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ...hts.ir lilo.org linkbuilding live-media.fr livelo-newsletter.xyz liveset lloydsban...

(AFKO_PUNT)


[uncategorized] ~2157-~2157: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...uilding live-media.fr livelo-newsletter.xyz liveset lloydsbank.device-prevention-sa...

(PUNT_GEEN_HL)


[uncategorized] ~2179-~2179: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...p lvoutlet m8sbeingm8s.com magic-garden.fun mai1www mail-ireland.com mail-jim mail....

(PUNT_GEEN_HL)


[uncategorized] ~2211-~2211: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ltopp.space mailtracenet.space mailtune.ir mailusaweb.space mailwebsites.space mai...

(PUNT_GEEN_HL)


[style] ~2221-~2221: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...com malin44.com.pl mariachisuroeste.com mariecharlesrealestateagentcorpuschristitx.com mariecharlesrealestateagenthoustont...

(ERG_LANG_WOORD)


[style] ~2222-~2222: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...arlesrealestateagentcorpuschristitx.com mariecharlesrealestateagenthoustontx.com mariecharlesrealestateagenthumbletx...

(ERG_LANG_WOORD)


[style] ~2223-~2223: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...ariecharlesrealestateagenthoustontx.com mariecharlesrealestateagenthumbletx.com mariewallacerealestateagentfolsomca...

(ERG_LANG_WOORD)


[style] ~2224-~2224: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...mariecharlesrealestateagenthumbletx.com mariewallacerealestateagentfolsomca.com marketingsolutions.info marksypark....

(ERG_LANG_WOORD)


[uncategorized] ~2231-~2231: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ived.com martinandgang.com marver-coats.xyz marvsz.com mastermethodguide.us mazovia...

(PUNT_GEEN_HL)


[uncategorized] ~2245-~2245: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ....net meidiee.life memberty.com mensorda.ru menterprise.app merkez34.com meupd.com ...

(PUNT_GEEN_HL)


[uncategorized] ~2249-~2249: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...e.app merkez34.com meupd.com miami-mail.top microsoft-office.live microsoft-office....

(PUNT_GEEN_HL)


[uncategorized] ~2250-~2250: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...upd.com miami-mail.top microsoft-office.live microsoft-office.live mikeandertonreale...

(PUNT_GEEN_HL)


[uncategorized] ~2251-~2251: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ... microsoft-office.live microsoft-office.live mikeandertonrealestateagentmodestoca.co...

(PUNT_GEEN_HL)


[style] ~2251-~2251: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...osoft-office.live microsoft-office.live mikeandertonrealestateagentmodestoca.com mikinibikini.com mikirslot.co mikir...

(ERG_LANG_WOORD)


[uncategorized] ~2254-~2254: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...odestoca.com mikinibikini.com mikirslot.co mikirslot.com mikirslot.net miktyk mild...

(PUNT_GEEN_HL)


[uncategorized] ~2259-~2259: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...kirslot.net miktyk mildslot.cc mildslot.co mildslot.com mildslot.me mildslot.xyz m...

(PUNT_GEEN_HL)


[uncategorized] ~2261-~2261: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ot.cc mildslot.co mildslot.com mildslot.me mildslot.xyz mileselectricvehicles.com ...

(PUNT_GEEN_HL)


[uncategorized] ~2275-~2275: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ntreal5.top mortaji.us movenpickwaverly.vn movietv4u.com mulberryonline muscle-bui...

(PUNT_GEEN_HL)


[uncategorized] ~2278-~2278: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...tv4u.com mulberryonline muscle-building.club musclejapancars.com mustdoindubai.com m...

(PUNT_GEEN_HL)


[uncategorized] ~2290-~2290: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...diyarescortbul.xyz neonfringe.com nerio.cz newfishingaccessories.com newpopularwat...

(PUNT_GEEN_HL)


[uncategorized] ~2297-~2297: Vergeet de punt niet als het een afkorting is: “ir.” Schrijf het liever voluit.
Context: ...newtonstores.com newyorkmetro5.top nex4.ir next4.ir nicewoodenbaskets.com nikefree...

(AFKO_PUNT)


[uncategorized] ~2298-~2298: Vergeet de punt niet als het een afkorting is: “ir.” Schrijf het liever voluit.
Context: ...res.com newyorkmetro5.top nex4.ir next4.ir nicewoodenbaskets.com nikefreerun ninin...

(AFKO_PUNT)


[style] ~2303-~2303: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... nininini.buzz nmail.work nonton389.com norahoguerealestateagentbrokenarrowok.com norahoguerealestateagenttulsaok.com...

(ERG_LANG_WOORD)


[style] ~2304-~2304: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...rahoguerealestateagentbrokenarrowok.com norahoguerealestateagenttulsaok.com novodigs.com nullcafe.com numelabs....

(ERG_LANG_WOORD)


[uncategorized] ~2318-~2318: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ....com ofisdiyaresc200.xyz ofisdiyaresc3e.xyz okasa.pl olddog.care oldoutnewin.com on...

(PUNT_GEEN_HL)


[uncategorized] ~2319-~2319: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...iyaresc200.xyz ofisdiyaresc3e.xyz okasa.pl olddog.care oldoutnewin.com onetab.fr o...

(PUNT_GEEN_HL)


[uncategorized] ~2322-~2322: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ...a.pl olddog.care oldoutnewin.com onetab.fr onewebmail.top onhaxx.me online-geld on...

(AFKO_PUNT)


[uncategorized] ~2324-~2324: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...win.com onetab.fr onewebmail.top onhaxx.me online-geld onlinecasino onlinejp onlin...

(PUNT_GEEN_HL)


[uncategorized] ~2328-~2328: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ld onlinecasino onlinejp onlinepaidjobs.me onlinepharmacy onlmktng.life opbeingop....

(PUNT_GEEN_HL)


[style] ~2345-~2345: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...irproducts.com palmgardenshopvillas.com pamrankinrealestateagentcarlsbadca.com pamrankinrealestateagentescondidoca...

(ERG_LANG_WOORD)


[style] ~2346-~2346: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... pamrankinrealestateagentcarlsbadca.com pamrankinrealestateagentescondidoca.com pamrankinrealestateagentoceansideca...

(ERG_LANG_WOORD)


[style] ~2347-~2347: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...pamrankinrealestateagentescondidoca.com pamrankinrealestateagentoceansideca.com pamrankinrealestateagentsandiegoca....

(ERG_LANG_WOORD)


[style] ~2348-~2348: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...pamrankinrealestateagentoceansideca.com pamrankinrealestateagentsandiegoca.com pamrankinrealestateagentsanmarcosca...

(ERG_LANG_WOORD)


[style] ~2349-~2349: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... pamrankinrealestateagentsandiegoca.com pamrankinrealestateagentsanmarcosca.com pamrankinrealestateagentvistaca.com...

(ERG_LANG_WOORD)


[style] ~2350-~2350: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...pamrankinrealestateagentsanmarcosca.com pamrankinrealestateagentvistaca.com pancingqueen.com paris-gmail.top pa...

(ERG_LANG_WOORD)


[uncategorized] ~2353-~2353: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...istaca.com pancingqueen.com paris-gmail.top parkhyatt-phuquoc.vn parkwaymanufacturi...

(PUNT_GEEN_HL)


[uncategorized] ~2354-~2354: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...n.com paris-gmail.top parkhyatt-phuquoc.vn parkwaymanufacturing.net patmorganreale...

(PUNT_GEEN_HL)


[style] ~2355-~2355: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...att-phuquoc.vn parkwaymanufacturing.net patmorganrealestateagentgarlandtx.com patriciayoungrealestateagentdentont...

(ERG_LANG_WOORD)


[style] ~2356-~2356: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...t patmorganrealestateagentgarlandtx.com patriciayoungrealestateagentdentontx.com pawtrim.shop payday-loan paydaycash...

(ERG_LANG_WOORD)


[uncategorized] ~2362-~2362: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...n paydaycash paydayloan pdf-nfe-digital.xyz pdkiblasdmc92.com pediyarescsca.xyz per...

(PUNT_GEEN_HL)


[uncategorized] ~2366-~2366: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...performicsde.com pertomdiyarbakirescort.xyz philippinestravel.network phonezip pine...

(PUNT_GEEN_HL)


[uncategorized] ~2370-~2370: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...rk phonezip pine-and-onyx pine-and-onyx.xyz pinupcasino plasticvouchercards.com pla...

(PUNT_GEEN_HL)


[uncategorized] ~2374-~2374: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ...ouchercards.com playmovies.stream ploki.fr ploooop.com poderfeminino.me pointbuysy...

(AFKO_PUNT)


[uncategorized] ~2376-~2376: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ream ploki.fr ploooop.com poderfeminino.me pointbuysys.com poisedtoshrike.com poke...

(PUNT_GEEN_HL)


[uncategorized] ~2382-~2382: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...d.com ponpesnuridinidris.com pop3boston.top popautomated.com popularde.top portable...

(PUNT_GEEN_HL)


[uncategorized] ~2386-~2386: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ....top portablespeaker.club portail-malin.fr portonomer.com postbinance.net powersho...

(AFKO_PUNT)


[uncategorized] ~2393-~2393: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ...prayforgem.com prehers.com premium-mail.fr primesempresbuscando.org printemailtext...

(AFKO_PUNT)


[uncategorized] ~2408-~2408: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ushmail.fun pushpophop.com pystyportfel.pl pzdiyarsescortbul.xyz qqaonwin quantumn...

(PUNT_GEEN_HL)


[style] ~2415-~2415: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...meme.com qwertylock.com r2mcreation.com rachelegriegorealestateagentsantafenm.com radities.com ragnortheblue.com raja...

(ERG_LANG_WOORD)


[uncategorized] ~2443-~2443: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...xyz ropainterior-ck.com rospotrebnadzor.ru rowrowleft.com rta.cat rupayamail.com r...

(PUNT_GEEN_HL)


[uncategorized] ~2454-~2454: Het woord na ‘de’ is onverwacht. Misschien zou het niet ‘de’, maar ‘het’, ‘dat’ of ‘dit’ moeten zijn.
Context: ...diyarescort21.xyz samedayloan sanaglobe.de sancto.xyz sanjose33.com saudidiving.com savin...

(DE_ONVERWACHT)


[uncategorized] ~2464-~2464: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ...kmail.com scoldly.com sd-152415.dedibox.fr sd-152424.dedibox.fr searchenginerank s...

(AFKO_PUNT)


[uncategorized] ~2465-~2465: Vergeet de punt niet als het een afkorting is: “fr.” Schrijf het liever voluit.
Context: ... sd-152415.dedibox.fr sd-152424.dedibox.fr searchenginerank seattle-mail1.top seco...

(AFKO_PUNT)


[style] ~2486-~2486: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... shavers.hair shavers.plus shavers.skin sheripatmanrealestateagentfortworthtx.com shoesjp.com shopjp.org shoppingdigi...

(ERG_LANG_WOORD)


[uncategorized] ~2496-~2496: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...impleklean skad-tabletki-na-odchudzanie.top skywardhub.online smartinvestment.homes...

(PUNT_GEEN_HL)


[uncategorized] ~2502-~2502: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...fttoiletpaper.com solarchargecontroller.club solarinverter.club solarpowered.online ...

(PUNT_GEEN_HL)


[uncategorized] ~2509-~2509: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...allads.com spinrewriter.app spotifygold.ir spuramexico2012.net staffingzone.xyz st...

(PUNT_GEEN_HL)


[uncategorized] ~2512-~2512: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...12.net staffingzone.xyz stars-and-glory.top stopstress.shop storejp straightenersau...

(PUNT_GEEN_HL)


[style] ~2519-~2519: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ... successmarketplace.com sunglassescheap sunnipouncilrealestateagentedmondok.com sunnipouncilrealestateagentoklahoma...

(ERG_LANG_WOORD)


[style] ~2520-~2520: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...sunnipouncilrealestateagentedmondok.com sunnipouncilrealestateagentoklahomacityok.com sunnyvale33.com supportapp.click su...

(ERG_LANG_WOORD)


[style] ~2532-~2532: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...adalafil take-ur-vites.org talatalk.com tamaradorrisrealestateagentcarmichaelca.com tamaradorrisrealestateagentelkgrove...

(ERG_LANG_WOORD)


[style] ~2533-~2533: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...radorrisrealestateagentcarmichaelca.com tamaradorrisrealestateagentelkgroveca.com tamaradorrisrealestateagentfolsomca...

(ERG_LANG_WOORD)


[style] ~2534-~2534: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...maradorrisrealestateagentelkgroveca.com tamaradorrisrealestateagentfolsomca.com tamaradorrisrealestateagentsacramen...

(ERG_LANG_WOORD)


[style] ~2535-~2535: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...tamaradorrisrealestateagentfolsomca.com tamaradorrisrealestateagentsacramentoca.com tastyarabicacoffee.com tavon.xyz te...

(ERG_LANG_WOORD)


[misspelling] ~2544-~2544: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ... tenofovir terriblecoffee.org texanmail.pw th-vision.net thailandmovers.com thawki...

(NL_SIMPLE_REPLACE_PW)


[uncategorized] ~2551-~2551: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...tter.online thecaper.click thedailygood.ir thedrywallclub.com thegambol.click theh...

(PUNT_GEEN_HL)


[uncategorized] ~2562-~2562: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...tillacts.com tlienodclgoqlclt.com tmweb.ru tobu-wedding.com toddard.com tomekamosl...

(PUNT_GEEN_HL)


[style] ~2564-~2564: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...m tmweb.ru tobu-wedding.com toddard.com tomekamosleyrealestateagentcedarhilltx.com tomekamosleyrealestateagentdesototx...

(ERG_LANG_WOORD)


[style] ~2565-~2565: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...ekamosleyrealestateagentcedarhilltx.com tomekamosleyrealestateagentdesototx.com tomekamosleyrealestateagentlancaste...

(ERG_LANG_WOORD)


[style] ~2566-~2566: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...tomekamosleyrealestateagentdesototx.com tomekamosleyrealestateagentlancastertx.com top1-casino.site topgun.fit topping...

(ERG_LANG_WOORD)


[uncategorized] ~2568-~2568: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...lestateagentlancastertx.com top1-casino.site topgun.fit toppinggoods.com topstream10...

(PUNT_GEEN_HL)


[style] ~2572-~2572: Lange woorden kunnen een tekst lastig leesbaar maken. Wellicht kan het iets eenvoudiger?
Context: ...ggoods.com topstream10.com topxxx69.com tracyfigueroarealestateagentsacramentoca.com tradingcogroup.ir travel-e-store.co...

(ERG_LANG_WOORD)


[uncategorized] ~2574-~2574: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ateagentsacramentoca.com tradingcogroup.ir travel-e-store.com travellerapp.click t...

(PUNT_GEEN_HL)


[uncategorized] ~2586-~2586: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...ick tubered69.com tvtap.fun tw1owebmail.top twowebmail.top twoxxx.top ufficialeairm...

(PUNT_GEEN_HL)


[misspelling] ~2610-~2610: ‘pw’ zou fout kunnen zijn. Misschien bedoelt u: “p.w.”
Context: ...tacadostanley.com variots.com vblogmail.pw vcams.info veinflower.xyz vet33.com via...

(NL_SIMPLE_REPLACE_PW)


[uncategorized] ~2617-~2617: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...gra visagency.online vitobase.com vlspm.ga vocalmajoritynow.com vosos.xyz vuitton ...

(PUNT_GEEN_HL)


[uncategorized] ~2661-~2661: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...bananaulx.com yenidiyarbakir2ofisescort.xyz yenidiyaresc76.xyz yenidiyarescucuzbyn0...

(PUNT_GEEN_HL)


[uncategorized] ~2679-~2679: Na een zinsovergang horen een spatie en een hoofdletter.
Context: ...about.com zt.co.uk zuperious.club zzuma.ru

(PUNT_GEEN_HL)

🪛 GitHub Check: Spell Check with Typos

[warning] 125-125:
"pn" should be "on".


[warning] 128-128:
"pn" should be "on".


[warning] 166-166:
"benj" should be "binge".


[warning] 254-254:
"pn" should be "on".


[warning] 285-285:
"pn" should be "on".


[warning] 324-324:
"pn" should be "on".


[warning] 325-325:
"pn" should be "on".


[warning] 329-329:
"pn" should be "on".


[warning] 338-338:
"pn" should be "on".


[warning] 382-382:
"pn" should be "on".

🪛 GitHub Actions: Typo Checks

[error] 125-125: pn should be on


[error] 128-128: pn should be on


[error] 166-166: benj should be binge


[error] 254-254: pn should be on


[error] 285-285: pn should be on


[error] 324-324: pn should be on


[error] 325-325: pn should be on


[error] 329-329: pn should be on


[error] 338-338: pn should be on


[error] 382-382: pn should be on


[error] 578-578: pn should be on


[error] 616-616: boxs should be box or boxes


[error] 635-635: goood should be good


[error] 643-643: coffe should be coffee


[error] 764-764: pn should be on


[error] 792-792: pn should be on


[error] 1082-1082: oueue should be queue


[error] 1090-1090: oyu should be you


[error] 1191-1191: rade should be read, raid, or rate


[error] 1434-1434: ue should be use or due


[error] 1438-1438: pn should be on


[error] 1453-1453: pn should be on


[error] 1542-1542: wil should be will or well


[error] 1693-1693: awsome should be awesome


[error] 1943-1943: gruop should be group


[error] 1984-1984: fre should be free


[error] 2111-2111: styl should be style


125-125:

Details

✅ Verification successful

Address pipeline failures for domain typos.

Several domain entries were flagged in pipeline checks as potential typos (e.g., .pn domains). While most appear to be intentional TLDs commonly used in spam domains, you might want to verify these specific entries to ensure they're correctly formatted.

Also applies to: 254-254, 285-285, 324-324, 325-325, 329-329, 338-338, 382-382, 578-578


🏁 Script executed:

#!/bin/bash
# Check if the flagged TLDs are valid
echo "Checking validity of flagged TLDs..."
echo "pn TLD info:"
whois .pn | grep "Domain" | head -5
echo "-----"
echo "tk TLD info:"
whois .tk | grep "Domain" | head -5

Length of output: 435


🏁 Script executed:

#!/bin/bash
# Verify that flagged TLDs are listed in IANA's official TLD registry
curl -s https://data.iana.org/TLD/tlds-alpha-by-domain.txt | grep -E '^(PN|TK|PW)$' || echo "One or more TLDs not found"

Length of output: 94


Pipeline typo flags are false positives: flagged TLDs are valid
Verified via IANA’s official TLD registry that PN, PW, and TK are all registered top‑level domains. You can safely ignore the pipeline warnings for these entries.

🧰 Tools
🪛 GitHub Check: Spell Check with Typos

[warning] 125-125:
"pn" should be "on".

🪛 GitHub Actions: Typo Checks

[error] 125-125: pn should be on

classes/models/FrmSpamCheck.php (1)

3-49: Well-designed abstract class for spam detection.

The class provides a solid foundation for implementing various spam detection strategies. It follows good OOP principles with an abstract base class and clear extension points. The public API is simple and focused, while the implementation details are left to subclasses.

classes/controllers/FrmSettingsController.php (1)

78-83: Improved tab label clarity for expanded spam functionality.

Changing the tab name from "Captcha" to "Captcha/Spam" better reflects the expanded scope of this settings section, which now includes various spam prevention features beyond just CAPTCHA.

This is a good UI improvement that helps users understand the purpose of this settings tab.

classes/controllers/FrmFormsController.php (2)

1495-1496: Shifted spam protection from honeypot to StopForumSpam API

This change replaces the honeypot spam settings view with the StopForumSpam settings view, reflecting a strategic change in the default anti-spam approach. This aligns with the PR's goal of enhancing spam prevention through multiple methods.


3163-3165: Added honeypot JavaScript for front-end forms

This enhancement ensures that the honeypot JavaScript is output on the front end (non-admin area), which properly hides honeypot fields from legitimate users while keeping them visible to bots. Good implementation of the conditional check.

classes/helpers/FrmFormsHelper.php (1)

397-397: Changed default anti-spam protection from honeypot to StopForumSpam

The default options now include StopForumSpam integration (disabled by default with value 0) instead of the honeypot technique. This shifts the spam prevention strategy toward API-based validation while requiring explicit user opt-in.

classes/views/frm-forms/spam-settings/stopforumspam.php (1)

1-13: Well-implemented StopForumSpam API settings UI

This new file provides a clean, informative UI for enabling the StopForumSpam integration. The tooltip properly informs users about what data is sent to the external API (IP, email, name), helping them make an informed decision about enabling this feature.

classes/models/FrmUsage.php (2)

221-221: Added honeypot to global settings tracking

Tracking honeypot usage at the global settings level aligns with the architectural shift where honeypot functionality is now managed more globally rather than per-form.


308-308: Replaced honeypot with StopForumSpam in form-level tracking

The form-level usage tracking now includes StopForumSpam instead of honeypot, which matches the new per-form opt-in approach for StopForumSpam API integration. This change ensures accurate usage statistics.

classes/views/frm-settings/captcha/captcha.php (3)

107-108: Good separation of concerns with a dedicated Spam section.

The section header clearly separates the spam prevention options from captcha settings, making the settings organization more intuitive.


109-115: The honeypot implementation includes good user guidance.

The use of a tooltip with the honeypot option helps administrators understand what a honeypot is and how it works for spam prevention, including potential limitations with autocomplete.


124-130: Properly escaped textarea content using appropriate helper.

The use of esc_textarea() correctly escapes the blacklist content for secure display in the textarea.

classes/models/FrmSpamCheckUseWPComments.php (1)

25-28: LGTM! Proper implementation of the is_enabled method.

The method correctly checks for the presence of the wp_spam_check setting in the global settings.

classes/models/FrmValidate.php (2)

18-22: Good documentation for the new option_type property.

The property is well-documented with the appropriate PHPDoc format, including the @SInCE tag for version tracking.


44-53: Clean implementation of option type checking.

The enhanced is_option_on() method now supports both global and form-specific settings, maintaining backward compatibility while adding new functionality. The code is clear and well-structured.

classes/models/FrmSettings.php (3)

94-100: Good addition of new spam-related properties.

The new properties for honeypot, WordPress spam check, blacklist, and whitelist are appropriately added to support the enhanced spam detection features.


174-177: Sensible default values for spam settings.

The default values are well-chosen: honeypot enabled by default (better security out-of-the-box), WordPress spam check disabled (opt-in for performance reasons), and empty strings for blacklist/whitelist.


416-429: Complete integration with checkbox settings.

The spam-related checkbox settings are properly integrated into the existing checkbox processing logic, ensuring they're correctly saved when updated through the settings form.

classes/models/FrmSpamCheckWPDisallowedWords.php (1)

42-48: Deprecation fallback is fine – but suppress the notice properly

wp_blacklist_check() is deprecated, yet still used as a fallback. Add _deprecated_function() after the call only when running on WP ≥ 5.5 to silence the Psalm warning without affecting behaviour.

🧰 Tools
🪛 GitHub Check: Psalm

[failure] 47-47: DeprecatedFunction
classes/models/FrmSpamCheckWPDisallowedWords.php:47:10: DeprecatedFunction: The function wp_blacklist_check has been marked as deprecated (see https://psalm.dev/201)

classes/models/FrmHoneypot.php (1)

176-185: Potential collision when multiple forms share identical highest field IDs

get_honeypot_field_id() always returns max_id + 1 based only on the fields present in the current form.
Imagine two different forms on the same page, both whose highest real field ID is 123.
Each form will produce a honeypot field with ID 124, resulting in duplicate HTML IDs (#frm_field_124_container) and identical selectors in $frm_vars['honeypot_selectors'], which in turn yields invalid duplicated markup.

A lightweight fix is to include the form‑ID in the generated honeypot field ID (or key) to guarantee uniqueness across multiple forms on the same page.

-		return $max + 1;
+		return (int) $this->form_id . ( $max + 1 );

Alternatively, append "_hp" suffix to the HTML id/selector, decoupling it from the numeric value.

Would you like me to supply a patch that covers both render & validate paths?

Comment thread classes/views/frm-entries/new.php Outdated
Comment thread classes/models/FrmSpamCheckUseWPComments.php
Comment thread classes/models/FrmSpamCheckStopforumspam.php Outdated
Comment thread classes/models/FrmSpamCheckStopforumspam.php Outdated
Comment thread classes/controllers/FrmAntiSpamController.php Outdated
Comment thread classes/models/FrmBlacklistSpamCheck.php Outdated
Comment thread classes/models/FrmBlacklistSpamCheck.php Outdated
Comment thread classes/models/FrmStopforumspam.php Outdated
Comment thread classes/models/FrmEntryValidate.php Outdated
Comment thread classes/models/FrmHoneypot.php
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (4)
classes/models/FrmSpamCheckBlacklist.php (3)

190-196: ⚠️ Potential issue

Incorrect callback-argument packing causes undefined index.

The single_line_check_ip() function expects $args['ip'], but you're passing a nested array which will cause an undefined index error.

-			$is_spam = $this->read_lines_and_check( $file, array( $this, 'single_line_check_ip' ), array( compact( 'ip' ) ) );
+			$is_spam = $this->read_lines_and_check( $file, array( $this, 'single_line_check_ip' ), compact( 'ip' ) );

30-36: ⚠️ Potential issue

Key name mismatch will cause lookup failure.

The array is initialized with field_type but later code in get_field_ids_to_check() expects fields. This will cause the blacklist to silently fail when field filtering is attempted.

-				'field_type'   => array(),
+				'fields'       => array(),

156-164: ⚠️ Potential issue

Logic inversion will skip every check.

The conditional logic in the field checking is inverted. When $field_ids_to_check is false (meaning no filtering required), all fields should be checked, not skipped.

-					if ( false === $field_ids_to_check || in_array( $sub_key, $field_ids_to_check, true ) ) {
-						continue;
-					}
+					if ( false !== $field_ids_to_check && ! in_array( $sub_key, $field_ids_to_check, true ) ) {
+						continue;
+					}

And also make the same change for the non-repeater branch:

-			} elseif ( false === $field_ids_to_check || in_array( $key, $field_ids_to_check, true ) ) {
-				$values_to_check[] = is_array( $value ) ? implode( ' ', $value ) : $value;
+			} elseif ( false === $field_ids_to_check || in_array( $key, $field_ids_to_check, true ) ) {
+				$values_to_check[] = is_array( $value ) ? implode( ' ', $value ) : $value;
classes/models/FrmEntryValidate.php (1)

319-319: ⚠️ Potential issue

Parameter default violates declared type.

The $posted_fields parameter defaults to false which conflicts with the expected array type and triggers static analysis errors.

-public static function spam_check( $exclude, $values, &$errors, $posted_fields = false ) {
+public static function spam_check( $exclude, $values, &$errors, $posted_fields = array() ) {
🧰 Tools
🪛 GitHub Check: PHPStan

[failure] 319-319:
Default value of the parameter #4 $posted_fields (false) of method FrmEntryValidate::spam_check() is incompatible with type array.

🧹 Nitpick comments (5)
classes/controllers/FrmAntiSpamController.php (3)

54-58: Fix the isset() check to prevent static analysis warning.

The current implementation of extract_emails_from_values() triggers a static analysis warning because isset($matches[0]) always evaluates to true when $matches is defined with the structure from preg_match_all().

-		return isset( $matches[0] ) ? $matches[0] : array();
+		return !empty( $matches[0] ) ? $matches[0] : array();
🧰 Tools
🪛 GitHub Check: PHPStan

[failure] 57-57:
Offset 0 on array{array<int, string>} in isset() always exists and is not nullable.


34-37: Double semicolon in the code.

There's a typo in line 36 with a double semicolon at the end of the statement.

-		return $spam_check->is_spam();;
+		return $spam_check->is_spam();

65-67: Consider expanding the whitelist IP logic.

The whitelist IP implementation is minimal. Consider adding support for reading from settings or making it more robust by supporting CIDR notation like the blacklist implementation does.

classes/models/FrmSpamCheckBlacklist.php (1)

203-206: Consider improving CIDR IP range checking.

The current IP check implementation only handles exact matches and a very simplistic form of CIDR notation. A more robust implementation would actually calculate if an IP falls within a CIDR range.

You could add a method like:

private function is_ip_in_cidr($ip, $cidr) {
    // Split CIDR notation
    list($subnet, $mask) = explode('/', $cidr);
    
    // Convert to binary and apply mask
    $ip_binary = ip2long($ip);
    $subnet_binary = ip2long($subnet);
    $mask_binary = -1 << (32 - $mask);
    
    // Check if IP is in subnet
    return ($ip_binary & $mask_binary) === ($subnet_binary & $mask_binary);
}

Then update single_line_check_ip() to use this method when a CIDR format is detected.

classes/models/FrmEntryValidate.php (1)

407-410: Double semicolon in blacklist_check method.

There's an extra semicolon at the end of line 407.

-		$check = new FrmBlacklistSpamCheck( $values['form_id'] );;
+		$check = new FrmBlacklistSpamCheck( $values['form_id'] );
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 912073c and 68e977d.

⛔ Files ignored due to path filters (1)
  • _typos.toml is excluded by !**/*.toml
📒 Files selected for processing (4)
  • classes/controllers/FrmAntiSpamController.php (1 hunks)
  • classes/models/FrmEntryValidate.php (4 hunks)
  • classes/models/FrmSpamCheck.php (1 hunks)
  • classes/models/FrmSpamCheckBlacklist.php (1 hunks)
🧰 Additional context used
🪛 GitHub Check: PHPStan
classes/controllers/FrmAntiSpamController.php

[failure] 57-57:
Offset 0 on array{array<int, string>} in isset() always exists and is not nullable.

classes/models/FrmEntryValidate.php

[failure] 319-319:
Default value of the parameter #4 $posted_fields (false) of method FrmEntryValidate::spam_check() is incompatible with type array.

🪛 GitHub Check: Psalm
classes/models/FrmEntryValidate.php

[failure] 317-317: InvalidParamDefault
classes/models/FrmEntryValidate.php:317:12: InvalidParamDefault: Default value type false for argument 4 of method FrmEntryValidate::spam_check does not match the given type array<array-key, mixed> (see https://psalm.dev/062)

🔇 Additional comments (6)
classes/models/FrmSpamCheck.php (1)

1-32: Well-designed abstract base class for spam detection.

This abstract class provides a clean foundation for implementing various spam check strategies. It follows good OOP principles with a clear separation of responsibilities and a well-defined interface.

classes/controllers/FrmAntiSpamController.php (2)

12-17: Good implementation of centralized spam checking.

The is_spam() method effectively centralizes different spam detection strategies with short-circuit evaluation for better performance.


44-46: Localization considerations for spam message.

The spam message is correctly localized, making it easy to translate.

classes/models/FrmSpamCheckBlacklist.php (1)

54-60: Good logical structure in the check method.

The method first checks IP-based blacklisting and then falls back to content checks, which is efficient and logical.

classes/models/FrmEntryValidate.php (2)

330-333: Good integration with the new spam controller.

The usage of FrmAntiSpamController::is_spam() and FrmAntiSpamController::get_spam_message() centralizes the spam detection logic and makes the code more maintainable.


497-500: Good design decision to make helper methods public.

Changing the visibility of helper methods from private to public improves code reusability and supports external usage, which is a good design decision.

Comment thread classes/models/FrmSpamCheckBlacklist.php Outdated
Comment thread classes/models/FrmSpamCheckBlacklist.php Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
classes/models/FrmEntryValidate.php (1)

319-319: ⚠️ Potential issue

Fix parameter type mismatch in spam_check method.

The $posted_fields parameter has a default value of false but is documented as an array, causing static analysis tools to report an error.

-public static function spam_check( $exclude, $values, &$errors, $posted_fields = false ) {
+public static function spam_check( $exclude, $values, &$errors, $posted_fields = array() ) {

This change ensures that the default value matches the expected type in the documentation.

🧰 Tools
🪛 GitHub Check: PHPStan

[failure] 319-319:
Default value of the parameter #4 $posted_fields (false) of method FrmEntryValidate::spam_check() is incompatible with type array.

🧹 Nitpick comments (7)
classes/controllers/FrmAntiSpamController.php (3)

54-58: Improve email extraction regex and error handling.

The current email regex pattern is simple but may not capture all valid email formats, and the array index check could be improved.

public static function extract_emails_from_values( $values ) {
	$values = FrmAppHelper::maybe_json_encode( $values );
-	preg_match_all( '/[\._a-zA-Z0-9-]+@[\._a-zA-Z0-9-]+/i', $values, $matches );
-	return isset( $matches[0] ) ? $matches[0] : array();
+	preg_match_all( '/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/i', $values, $matches );
+	return empty( $matches[0] ) ? array() : $matches[0];
}

The improved regex pattern better matches standard email formats with domains, and empty() is more appropriate than isset() since we're checking if the array has values.

🧰 Tools
🪛 GitHub Check: PHPStan

[failure] 57-57:
Offset 0 on array{array<int, string>} in isset() always exists and is not nullable.


65-67: Consider enhancing the whitelist IP implementation.

The current whitelist IP implementation is minimal and doesn't account for common local development scenarios.

public static function get_whitelist_ip() {
-	return array( '', '127.0.0.1' );
+	return apply_filters(
+		'frm_whitelist_ip',
+		array( '', '127.0.0.1', '::1', '192.168.0.1', '10.0.0.1' )
+	);
}

This change adds more common local IP addresses and provides a filter for developers to customize the whitelist.


13-16: Consider adding logging for spam detections.

The centralized spam detection doesn't include any logging, which could be useful for troubleshooting and monitoring.

You might want to add logging to identify which spam check is triggering. For example:

public static function is_spam( $values ) {
+	$is_spam = false;
+	$spam_source = '';
+	
+	if ( self::contains_wp_disallowed_words( $values ) ) {
+		$is_spam = true;
+		$spam_source = 'wp_disallowed_words';
+	} elseif ( self::is_blacklist_spam( $values ) ) {
+		$is_spam = true;
+		$spam_source = 'blacklist';
+	} elseif ( self::is_stopforumspam_spam( $values ) ) {
+		$is_spam = true;
+		$spam_source = 'stopforumspam';
+	} elseif ( self::is_wp_comment_spam( $values ) ) {
+		$is_spam = true;
+		$spam_source = 'wp_comments';
+	}
+	
+	if ( $is_spam && defined( 'WP_DEBUG' ) && WP_DEBUG ) {
+		// phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log
+		error_log( 'Formidable Forms spam detected via: ' . $spam_source );
+	}
+	
+	return $is_spam;
-	return self::contains_wp_disallowed_words( $values ) ||
-		self::is_blacklist_spam( $values ) ||
-		self::is_stopforumspam_spam( $values ) ||
-		self::is_wp_comment_spam( $values );
}
tests/phpunit/misc/test_FrmSpamCheckWPDisallowedWords.php (2)

34-37: Improve test robustness by handling edge cases better.

The current test skips if the WordPress blacklist check fails, which might mask real issues.

$wp_test = $this->run_private_method( array( 'FrmEntryValidate', 'check_disallowed_words' ), array( 'Author', 'author@gmail.com', '', $blocked, $ip, FrmAppHelper::get_server_value( 'HTTP_USER_AGENT' ) ) );
if ( ! $wp_test ) {
-	$this->markTestSkipped( 'WordPress blacklist check is failing in some cases' );
+	$this->markTestIncomplete( 'WordPress disallowed words check failed, possibly due to environment configuration or WordPress version. Check: ' . $blocked );
}

Using markTestIncomplete() provides more context and clarity that this is an expected limitation rather than just skipping.


57-61: Enhance the WordPress version compatibility helper.

The method for determining the disallowed words option name relies on checking if the option exists, which could have edge cases.

private function get_disallowed_option_name() {
-	$keys = get_option( 'disallowed_keys' );
-	// Fallback for WP < 5.5.
-	return false === $keys ? 'blacklist_keys' : 'disallowed_keys';
+	global $wp_version;
+	
+	// WordPress 5.5+ uses 'disallowed_keys', earlier versions use 'blacklist_keys'
+	if ( version_compare( $wp_version, '5.5', '>=' ) ) {
+		return 'disallowed_keys';
+	}
+	
+	return 'blacklist_keys';
}

This approach is more reliable as it directly checks the WordPress version rather than depending on the existence of an option.

classes/models/FrmEntryValidate.php (2)

331-332: Fix comment formatting issue.

The inline TODO comment after the statement is causing a PHPCS warning.

elseif ( FrmAntiSpamController::is_spam( $values ) ) {
-	$errors['spam'] = $spam_msg; // TODO: maybe restore old blacklist spam message.
+	// TODO: maybe restore old blacklist spam message.
+	$errors['spam'] = $spam_msg;
}

This change moves the TODO comment to its own line before the statement, which follows the coding standards.

🧰 Tools
🪛 GitHub Actions: Inspections

[error] 332-332: PHPCS: Comments may not appear after statements (Squiz.Commenting.PostStatementComment.Found)


406-408: Consider logging when spam is detected via the blacklist check.

The blacklist check code now simply calls the controller methods, but it doesn't provide any information about which specific rule triggered the spam detection.

public static function blacklist_check( $values ) {
-	return FrmAntiSpamController::contains_wp_disallowed_words( $values ) || FrmAntiSpamController::is_blacklist_spam( $values );
+	$is_wp_disallowed = FrmAntiSpamController::contains_wp_disallowed_words( $values );
+	$is_blacklist_spam = FrmAntiSpamController::is_blacklist_spam( $values );
+	
+	if ( $is_wp_disallowed || $is_blacklist_spam ) {
+		do_action( 'frm_spam_detected', array(
+			'wp_disallowed' => $is_wp_disallowed,
+			'blacklist' => $is_blacklist_spam,
+			'values' => $values,
+		));
+	}
+	
+	return $is_wp_disallowed || $is_blacklist_spam;
}

This change adds a hook that other code can use to respond when spam is detected, while maintaining backward compatibility.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between edd53ee and b10602a.

📒 Files selected for processing (8)
  • classes/controllers/FrmAntiSpamController.php (1 hunks)
  • classes/models/FrmEntryValidate.php (4 hunks)
  • classes/models/FrmSpamCheck.php (1 hunks)
  • classes/models/FrmSpamCheckBlacklist.php (1 hunks)
  • classes/models/FrmSpamCheckStopforumspam.php (1 hunks)
  • tests/phpunit/fields/test_FrmFieldValidate.php (0 hunks)
  • tests/phpunit/misc/test_FrmSpamCheckBlacklist.php (1 hunks)
  • tests/phpunit/misc/test_FrmSpamCheckWPDisallowedWords.php (1 hunks)
💤 Files with no reviewable changes (1)
  • tests/phpunit/fields/test_FrmFieldValidate.php
🚧 Files skipped from review as they are similar to previous changes (3)
  • classes/models/FrmSpamCheck.php
  • classes/models/FrmSpamCheckStopforumspam.php
  • classes/models/FrmSpamCheckBlacklist.php
🧰 Additional context used
🧬 Code Graph Analysis (1)
classes/controllers/FrmAntiSpamController.php (6)
classes/models/FrmEntryValidate.php (1)
  • spam_check (319-342)
classes/models/FrmSpamCheckStopforumspam.php (1)
  • FrmSpamCheckStopforumspam (3-50)
classes/models/FrmSpamCheckUseWPComments.php (1)
  • FrmSpamCheckUseWPComments (3-29)
classes/models/FrmSpamCheckWPDisallowedWords.php (1)
  • FrmSpamCheckWPDisallowedWords (3-53)
classes/models/FrmSpamCheckBlacklist.php (1)
  • FrmSpamCheckBlacklist (3-237)
classes/helpers/FrmAppHelper.php (2)
  • FrmAppHelper (6-4462)
  • maybe_json_encode (3278-3283)
🪛 GitHub Actions: PHPUnit
tests/phpunit/misc/test_FrmSpamCheckBlacklist.php

[error] 14-14: PHP Fatal error: syntax error, unexpected '}' causing test suite to fail during PHPUnit run.

🪛 GitHub Actions: Inspections
tests/phpunit/misc/test_FrmSpamCheckBlacklist.php

[error] 7-7: PHPCS: There should be no space between the array opener and closer for an empty array. Found: multiple new lines (NormalizedArrays.Arrays.ArrayBraceSpacing.EmptyArraySpacing)


[error] 12-12: PHPCS: Equals sign not aligned with surrounding assignments; expected 5 spaces but found 1 space (Generic.Formatting.MultipleStatementAlignment.NotSameWarning)


[error] 14-14: PHPCS: PHP syntax error: syntax error, unexpected token "}" (Generic.PHP.Syntax.PHPSyntax)

classes/models/FrmEntryValidate.php

[error] 332-332: PHPCS: Comments may not appear after statements (Squiz.Commenting.PostStatementComment.Found)

🪛 GitHub Check: PHPStan
classes/controllers/FrmAntiSpamController.php

[failure] 57-57:
Offset 0 on array{array<int, string>} in isset() always exists and is not nullable.

classes/models/FrmEntryValidate.php

[failure] 319-319:
Default value of the parameter #4 $posted_fields (false) of method FrmEntryValidate::spam_check() is incompatible with type array.

🪛 GitHub Check: Psalm
classes/models/FrmEntryValidate.php

[failure] 317-317: InvalidParamDefault
classes/models/FrmEntryValidate.php:317:12: InvalidParamDefault: Default value type false for argument 4 of method FrmEntryValidate::spam_check does not match the given type array<array-key, mixed> (see https://psalm.dev/062)

🪛 GitHub Actions: Psalm Code Analysis
classes/models/FrmEntryValidate.php

[error] 317-317: Psalm error: InvalidParamDefault - Default value type false for argument 4 of method FrmEntryValidate::spam_check does not match the given type array<array-key, mixed>.

⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Cypress

Comment thread tests/phpunit/misc/test_FrmSpamCheckBlacklist.php Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

♻️ Duplicate comments (5)
classes/models/FrmSpamCheckBlacklist.php (5)

33-38: ⚠️ Potential issue

Fix field key name mismatch causing lookup failure

There's a key name inconsistency in the blacklist array definition. You're using 'field_type' here, but later in the code (line 192-194) you're trying to access it using $field_ids_to_check. This mismatch causes the blacklist silently failing to select any fields.

-				'field_type'   => array(),
+				'fields'       => array(),
🧰 Tools
🪛 GitHub Actions: Inspections

[error] 33-241: 9 errors including array double arrow alignment issues, missing end comment for long condition, and comments appearing after statements.


192-195: ⚠️ Potential issue

Logic inversion skips every check in repeater fields

The current condition continues (skips processing) when $field_ids_to_check is false or when the field ID is in the list, which is the opposite of what's needed. If no field filter is supplied, all values should be checked, not skipped.

-					if ( false === $field_ids_to_check || in_array( $sub_key, $field_ids_to_check, true ) ) {
-						continue;
-					}
+					if ( false !== $field_ids_to_check && ! in_array( $sub_key, $field_ids_to_check, true ) ) {
+						continue;
+					}

230-230: ⚠️ Potential issue

Incorrect callback-argument packing causes undefined index

The current code wraps the IP argument in an extra array, causing single_line_check_ip() to receive an unexpected argument structure. It's looking for $args['ip'] but will get a nested array instead.

-			$is_spam = $this->read_lines_and_check( $file, array( $this, 'single_line_check_ip' ), array( compact( 'ip' ) ) );
+			$is_spam = $this->read_lines_and_check( $file, array( $this, 'single_line_check_ip' ), compact( 'ip' ) );

111-112: ⚠️ Potential issue

Inconsistent key name in fill_default_blacklist_data method

The default blacklist data uses field_type but earlier issues showed we need fields. This should be consistent.

-				'field_type'    => array(),
+				'fields'        => array(),

198-200: ⚠️ Potential issue

Logic inversion skips every check in regular fields

Similar to the previous issue with repeater fields, the condition for regular fields also has inverted logic that causes the blacklist check to skip every field.

-			} elseif ( false === $field_ids_to_check || in_array( $key, $field_ids_to_check, true ) ) {
-				$values_to_check[] = is_array( $value ) ? implode( ' ', $value ) : $value;
-			}
+			} elseif ( false === $field_ids_to_check || in_array( $key, $field_ids_to_check, true ) ) {
+				$values_to_check[] = is_array( $value ) ? implode( ' ', $value ) : $value;
+			}

I notice the logic for regular fields (shown above) doesn't have the same issue as with repeater fields. This is inconsistent - either both should check or both should skip based on the same condition.

🧹 Nitpick comments (6)
classes/models/FrmSpamCheckBlacklist.php (5)

30-31: Implement the TODO comment for the filter

You have a TODO comment about adding a filter for blacklist data, but the filter is actually implemented at line 48. The comment should be removed.

-		// TODO: add the filter.

48-48: Update filter hook name to match class name

The filter hook frm_blacklist_data doesn't match the class name or the module function. Consider using a more specific name like frm_spam_blacklist_data.

-		return apply_filters( 'frm_blacklist_data', $blacklist_data );
+		return apply_filters( 'frm_spam_blacklist_data', $blacklist_data, $this->values );

105-115: Add whitelist to default blacklist data

The whitelist property is set in check_values() but not included in the default blacklist data, which could cause issues if it's referenced before being set.

		$blacklist = wp_parse_args(
			$blacklist,
			array(
				'file'          => '',
				'words'         => array(),
				'field_type'    => array(),
				'compare'       => self::COMPARE_CONTAINS,
				'extract_value' => '',
+				'whitelist'     => array(),
			)
		);

1-3: Add class documentation

This class lacks proper PHPDoc documentation. Adding documentation would improve maintainability and provide clarity about the class's purpose and behavior.

 <?php

+/**
+ * Class for spam checking using blacklists.
+ *
+ * This class handles spam detection by comparing form values against blacklisted words
+ * and checking the submitter's IP against blacklisted IPs.
+ *
+ * @since x.x
+ */
 class FrmSpamCheckBlacklist extends FrmSpamCheck {

241-242: Improve IP check with CIDR format support

The current IP check has basic support for IP ranges in "x.x.x.x/y" format, but it doesn't actually perform CIDR subnet checks. It only checks if an IP starts with the same pattern.

-	private function single_line_check_ip( $line, $args ) {
-		$ip = $args['ip'];
-		return $ip === $line || 0 === strpos( $ip . '/', $line ); // Maybe IP in line is x.x.x.x/12 format.
-	}
+	private function single_line_check_ip( $line, $args ) {
+		$ip = $args['ip'];
+		// Exact match
+		if ( $ip === $line ) {
+			return true;
+		}
+		
+		// CIDR format check
+		if ( strpos( $line, '/' ) !== false ) {
+			list( $subnet, $mask ) = explode( '/', $line );
+			if ( is_numeric( $mask ) ) {
+				$ip_long = ip2long( $ip );
+				$subnet_long = ip2long( $subnet );
+				$mask_long = ~( ( 1 << ( 32 - $mask ) ) - 1 );
+				return ( $ip_long & $mask_long ) === ( $subnet_long & $mask_long );
+			}
+		}
+		
+		return false;
+	}
tests/phpunit/misc/test_FrmSpamCheckBlacklist.php (1)

21-21: Fix PHP coding standards issue with return type declaration

There should be no space before the colon in a return type declaration.

-	public function setUp() : void {
+	public function setUp(): void {
🧰 Tools
🪛 GitHub Actions: Inspections

[error] 21-236: 25 coding standard errors including spacing before colon in return type, alignment issues with equals signs and array double arrows, and missing commas after last array items in multi-line arrays.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b10602a and a7a2f39.

📒 Files selected for processing (3)
  • classes/models/FrmSpamCheckBlacklist.php (1 hunks)
  • tests/phpunit/misc/blacklist-email-contain.txt (1 hunks)
  • tests/phpunit/misc/test_FrmSpamCheckBlacklist.php (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • tests/phpunit/misc/blacklist-email-contain.txt
🧰 Additional context used
🪛 GitHub Actions: Inspections
classes/models/FrmSpamCheckBlacklist.php

[error] 33-241: 9 errors including array double arrow alignment issues, missing end comment for long condition, and comments appearing after statements.

tests/phpunit/misc/test_FrmSpamCheckBlacklist.php

[error] 21-236: 25 coding standard errors including spacing before colon in return type, alignment issues with equals signs and array double arrows, and missing commas after last array items in multi-line arrays.

⏰ Context from checks skipped due to timeout of 90000ms (3)
  • GitHub Check: PHP 8 tests in WP trunk
  • GitHub Check: Cypress
  • GitHub Check: PHP 7.4 tests in WP trunk
🔇 Additional comments (2)
tests/phpunit/misc/test_FrmSpamCheckBlacklist.php (2)

165-174: Ensure test coverage for field type changes

The test verifies that blacklist_with_name only returns values from name fields, but this depends on the get_field_ids_to_check method properly interpreting the field type.

If you change from field_type to fields in the main class, ensure these tests account for that change.


237-237:

Details

✅ Verification successful

Test blacklist file path may not exist

The test uses a file path (__DIR__ . '/blacklist-email-contain.txt') that may not exist in the repository. This could cause test failures.


🏁 Script executed:

#!/bin/bash
# Check if the blacklist test file exists
if [ -f "tests/phpunit/misc/blacklist-email-contain.txt" ]; then
  echo "✅ Test blacklist file exists"
  cat "tests/phpunit/misc/blacklist-email-contain.txt"
else
  echo "❌ Test blacklist file does not exist at tests/phpunit/misc/blacklist-email-contain.txt"
  # Search for any *.txt files in the test directory that might be used instead
  echo "Searching for potential alternative test files:"
  find tests/phpunit/misc -name "*.txt" -type f
fi

Length of output: 197


Test blacklist file path is valid
The file tests/phpunit/misc/blacklist-email-contain.txt exists and contains the expected entries (wordpress, plugin), so no change is needed.

Comment thread tests/phpunit/misc/test_FrmSpamCheckBlacklist.php Outdated
Comment thread tests/phpunit/misc/test_FrmSpamCheckBlacklist.php Outdated
Comment thread tests/phpunit/misc/test_FrmSpamCheckBlacklist.php Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (1)
classes/models/FrmHoneypot.php (1)

101-127: 🛠️ Refactor suggestion

Avoid optional-chaining for wider browser support & improve CSS escaping.

The JavaScript in maybe_print_honeypot_js() uses the optional-chaining operator (?.) which isn't supported in older browsers that WordPress may still support. Also, using esc_js() with document.createTextNode() causes unnecessary double-escaping.

-					document.currentScript?.remove();
+					if ( document.currentScript ) {
+						document.currentScript.parentNode.removeChild( document.currentScript );
+					}

-					style.appendChild( document.createTextNode( '%s' ) );
+					style.appendChild( document.createTextNode( %s ) );

-			</script>",
-			esc_js( $styles )
+			</script>",
+			wp_json_encode( $styles )
🧹 Nitpick comments (4)
classes/models/FrmSpamCheckWPDisallowedWords.php (2)

5-27: Implementation looks good but consider adding entry validation.

The check() method is well-structured, collecting all necessary data before passing it to WordPress's disallowed words check.

Consider adding a validation check before accessing $this->values to ensure it's properly set and is an array, which would make the code more robust.

 public function check() {
 	$mod_keys = trim( $this->get_disallowed_words() );
 	if ( empty( $mod_keys ) ) {
 		return false;
 	}
 
+	if ( empty( $this->values ) || ! is_array( $this->values ) ) {
+		return false;
+	}
 	$values  = $this->values;
 	$content = FrmEntriesHelper::entry_array_to_string( $values );

57-59: Consider updating filter name to use more inclusive terminology.

The filter name frm_check_blacklist uses deprecated terminology that doesn't align with the rest of the codebase's move to "disallowed words".

Consider adding a new filter with updated terminology while maintaining backward compatibility:

 protected function is_enabled() {
-	return apply_filters( 'frm_check_blacklist', true, $this->values );
+	$enabled = apply_filters( 'frm_check_blacklist', true, $this->values );
+	// New filter name with more inclusive terminology
+	return apply_filters( 'frm_check_disallowed_words', $enabled, $this->values );
 }
classes/models/FrmHoneypot.php (2)

27-30: Clean implementation of settings check.

The is_enabled() method provides a clear way to check if the honeypot feature is enabled globally. Consider adding a return type hint for improved code clarity: private static function is_enabled(): bool.


219-243: Consider deprecating the class-based approach.

Since you've implemented a new container-based approach for hiding honeypot fields, the class-based methods (generate_class_name() and get_honeypot_class_name()) appear to be unused in the new implementation. Consider deprecating these methods or adding a comment explaining their continued relevance.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a7a2f39 and 4597c3d.

📒 Files selected for processing (9)
  • classes/models/FrmEntryValidate.php (5 hunks)
  • classes/models/FrmHoneypot.php (4 hunks)
  • classes/models/FrmSettings.php (3 hunks)
  • classes/models/FrmSpamCheckBlacklist.php (1 hunks)
  • classes/models/FrmSpamCheckStopforumspam.php (1 hunks)
  • classes/models/FrmSpamCheckUseWPComments.php (1 hunks)
  • classes/models/FrmSpamCheckWPDisallowedWords.php (1 hunks)
  • tests/phpunit/misc/test_FrmHoneypot.php (2 hunks)
  • tests/phpunit/misc/test_FrmSpamCheckBlacklist.php (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (7)
  • classes/models/FrmSpamCheckUseWPComments.php
  • classes/models/FrmSettings.php
  • tests/phpunit/misc/test_FrmHoneypot.php
  • classes/models/FrmSpamCheckStopforumspam.php
  • classes/models/FrmSpamCheckBlacklist.php
  • classes/models/FrmEntryValidate.php
  • tests/phpunit/misc/test_FrmSpamCheckBlacklist.php
🧰 Additional context used
🧬 Code Graph Analysis (1)
classes/models/FrmHoneypot.php (3)
classes/models/FrmValidate.php (3)
  • __construct (27-29)
  • get_option_key (65-65)
  • get_form (34-39)
classes/models/FrmField.php (2)
  • FrmField (6-1501)
  • get_all_for_form (889-928)
classes/helpers/FrmAppHelper.php (5)
  • FrmAppHelper (6-4462)
  • get_settings (172-182)
  • array_to_html_params (1324-1333)
  • generate_new_key (2398-2404)
  • get_simple_request (681-714)
🪛 GitHub Check: Psalm
classes/models/FrmSpamCheckWPDisallowedWords.php

[failure] 54-54: DeprecatedFunction
classes/models/FrmSpamCheckWPDisallowedWords.php:54:10: DeprecatedFunction: The function wp_blacklist_check has been marked as deprecated (see https://psalm.dev/201)

🪛 GitHub Actions: Psalm Code Analysis
classes/models/FrmSpamCheckWPDisallowedWords.php

[error] 54-54: Psalm DeprecatedFunction: The function wp_blacklist_check has been marked as deprecated (see https://psalm.dev/201)

⏰ Context from checks skipped due to timeout of 90000ms (3)
  • GitHub Check: PHP 8 tests in WP trunk
  • GitHub Check: PHP 7.4 tests in WP trunk
  • GitHub Check: Cypress
🔇 Additional comments (11)
classes/models/FrmSpamCheckWPDisallowedWords.php (2)

34-42: Good backward compatibility implementation for disallowed words.

The implementation properly handles both WordPress 5.5+ with disallowed_keys and older versions with blacklist_keys.


49-55:

Details

✅ Verification successful

Function compatibility is correct but uses deprecated code.

The method correctly provides backward compatibility, but note that wp_blacklist_check() is deprecated as flagged by static analysis tools.

While the code includes the appropriate phpcs comment to ignore the deprecation warning, we should check how long this compatibility layer will be needed. Consider running:

If the minimum supported WordPress version is 5.5 or higher, you could simplify this code to only use wp_check_comment_disallowed_list().


🏁 Script executed:

#!/bin/bash
# Check minimum supported WordPress version for this plugin
grep -r "MINIMUM_WP_VERSION" --include="*.php" .

Length of output: 48


Let’s look for the declared WP requirement in your plugin headers or docs:


🏁 Script executed:

#!/bin/bash
# Search for minimum WP version in plugin readme or headers
rg -i "Requires at least" -n .
rg -i "Tested up to" -n .

Length of output: 133


Retain fallback for WP ≤5.4 compatibility

Since your plugin’s “Requires at least” is set to 5.2, the wp_blacklist_check() call is still required for sites running WP 5.2–5.4. No changes are needed now. If you decide to bump your minimum supported WordPress version to 5.5 or higher, you can simplify this method to always call wp_check_comment_disallowed_list() and remove the deprecated fallback.

🧰 Tools
🪛 GitHub Check: Psalm

[failure] 54-54: DeprecatedFunction
classes/models/FrmSpamCheckWPDisallowedWords.php:54:10: DeprecatedFunction: The function wp_blacklist_check has been marked as deprecated (see https://psalm.dev/201)

🪛 GitHub Actions: Psalm Code Analysis

[error] 54-54: Psalm DeprecatedFunction: The function wp_blacklist_check has been marked as deprecated (see https://psalm.dev/201)

classes/models/FrmHoneypot.php (9)

8-18: Good implementation of class properties and constructor.

The constructor is well-designed, taking an optional $fields parameter and defaulting to fetching all fields if not provided. This makes the class more flexible and testable. Good use of parent constructor call and field initialization.


47-52: Good approach to honeypot spam detection.

The implementation checks both legacy and new honeypot mechanisms, ensuring backward compatibility while introducing more robust detection. The dynamic field ID approach makes the honeypot harder for bots to detect.


54-67: Well-documented filter with improved context.

Good job updating the filter documentation to reflect the new fields parameter. The filter now provides more context to developers who might want to customize the honeypot behavior.


94-95: Improved method signature for better flexibility.

The updated maybe_render_field() method now accepts an optional fields parameter, which aligns with the constructor's signature and improves reusability.


139-158: Improved honeypot field implementation with dynamic IDs.

The honeypot field implementation has been significantly improved:

  1. Dynamic field ID generation makes it harder for bots to detect
  2. Proper container tracking for CSS hiding
  3. Well-structured HTML with appropriate escaping
  4. Good use of helper methods for parameter generation

This approach is much more robust than the previous static implementation.


162-169: Good implementation of global tracking for honeypot selectors.

Using the global $frm_vars to track honeypot selectors is a clean approach for collecting elements that need CSS hiding, which will be applied by the maybe_print_honeypot_js() method.


187-189: Good use of random key generation.

Using FrmAppHelper::generate_new_key() to create random keys for honeypot fields makes them less predictable and improves spam detection.


198-212: Secure retrieval of honeypot field values.

The method properly uses FrmAppHelper::get_simple_request() to safely retrieve form data and includes appropriate validation checks before accessing array elements. Good defensive programming by checking if the item_meta is an array.


176-185:

Details

✅ Verification successful

Smart approach to generate unique field IDs.

Generating a field ID that's one greater than the maximum existing field ID is a clever way to ensure uniqueness. However, this approach might have edge cases if field IDs aren't sequential or if another process modifies fields concurrently.

Consider verifying that this approach works in all scenarios:


🏁 Script executed:

#!/bin/bash
# Find if there are any other places in the code that might be generating field IDs
# that could conflict with this approach
rg "field.*id.*\+\s*\d+" --type php

Length of output: 322


get_honeypot_field_id() ID generation is safe and well-covered by tests

I searched the codebase and only found one other “+ 1” usage in your PHPUnit test (verifying this method) and a non-conflicting field_order + 2 elsewhere. There are no other competing ID generators that could collide. The existing unit test in tests/phpunit/misc/test_FrmHoneypot.php confirms the logic.

No changes needed here.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (1)
classes/models/FrmHoneypot.php (1)

135-147: 🛠️ Refactor suggestion

Fix browser compatibility issue with optional chaining

The JavaScript uses the optional chaining operator (?.), which isn't supported in older browsers like IE11 or older Android WebViews that WordPress still supports.

printf(
    "<script>
        ( function() {
            const style = document.createElement( 'style' );
            style.appendChild( document.createTextNode( '%s' ) );
            document.head.appendChild( style );
-           document.currentScript?.remove();
+           if ( document.currentScript ) {
+               document.currentScript.parentNode.removeChild( document.currentScript );
+           }
        } )();
    </script>",
    esc_js( $css )
);

Additionally, consider using wp_json_encode() instead of esc_js() to avoid double-escaping:

printf(
    "<script>
        ( function() {
            const style = document.createElement( 'style' );
-           style.appendChild( document.createTextNode( '%s' ) );
+           style.appendChild( document.createTextNode( %s ) );
            document.head.appendChild( style );
            if ( document.currentScript ) {
                document.currentScript.parentNode.removeChild( document.currentScript );
            }
        } )();
    </script>",
-   esc_js( $css )
+   wp_json_encode( $css )
);
🧹 Nitpick comments (4)
classes/models/FrmHoneypot.php (4)

223-236: Consider optimizing honeypot field ID generation

The current implementation iterates through all form fields to find the maximum field ID and increments it. This could be inefficient for forms with many fields.

Consider using a database query to find the maximum field ID directly, especially for large forms:

private function get_honeypot_field_id() {
    global $wpdb;
    
    // Get the max ID directly from the database
    $max_id = $wpdb->get_var(
        $wpdb->prepare(
            "SELECT MAX(id) FROM {$wpdb->prefix}frm_fields WHERE form_id = %d",
            $this->form_id
        )
    );
    
    return (int) $max_id + 1;
}

This would be more efficient for forms with a large number of fields.


8-25: Update version placeholders in docblocks

Several docblocks use @since x.x which should be replaced with actual version numbers before release.

Replace all instances of @since x.x with the actual version number for the release (e.g., @since 5.0).


249-263: Strengthen input validation in get_honeypot_field_value()

The method properly checks if $item_meta is an array, but consider adding additional validation.

private function get_honeypot_field_value( $field_id ) {
    $item_meta = FrmAppHelper::get_simple_request(
        array(
            'param'   => 'item_meta',
            'default' => array(),
            'type'    => 'post',
        )
    );

    if ( ! $item_meta || ! is_array( $item_meta ) ) {
        return '';
    }

-   return isset( $item_meta[ $field_id ] ) ? $item_meta[ $field_id ] : '';
+   return isset( $item_meta[ $field_id ] ) ? sanitize_text_field( $item_meta[ $field_id ] ) : '';
}

This ensures any returned value is properly sanitized before being used elsewhere.


153-157: Consider updating form_is_loaded_by_api() usage and comments

The method makes an external call to FrmFormsHelper::form_is_loaded_by_api() with a descriptive comment, but the relationship could be clearer.

Add a comment linking to the form_is_loaded_by_api() implementation or consider adding a local static method if this check is specific to honeypot functionality.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c52efad and 8875269.

📒 Files selected for processing (2)
  • classes/helpers/FrmFormsHelper.php (2 hunks)
  • classes/models/FrmHoneypot.php (4 hunks)
🧰 Additional context used
🪛 GitHub Actions: Inspections
classes/models/FrmHoneypot.php

[error] 160-160: WordPress.Security.EscapeOutput.OutputNotEscaped: All output should be run through an escaping function, found '$css'.

🪛 GitHub Check: Psalm
classes/helpers/FrmFormsHelper.php

[failure] 1885-1885: UndefinedClass
classes/helpers/FrmFormsHelper.php:1885:11: UndefinedClass: Class, interface or enum named FrmProFormState does not exist (see https://psalm.dev/019)

🪛 GitHub Check: PHPStan
classes/helpers/FrmFormsHelper.php

[failure] 1885-1885:
Call to static method get_from_request() on an unknown class FrmProFormState.

🪛 GitHub Actions: Psalm Code Analysis
classes/helpers/FrmFormsHelper.php

[error] 1885-1885: Psalm: UndefinedClass - Class, interface or enum named FrmProFormState does not exist (see https://psalm.dev/019)

⏰ Context from checks skipped due to timeout of 90000ms (4)
  • GitHub Check: PHP 8 tests in WP trunk
  • GitHub Check: Run PHP Syntax inspection (8.3)
  • GitHub Check: PHP 7.4 tests in WP trunk
  • GitHub Check: Cypress
🔇 Additional comments (1)
classes/helpers/FrmFormsHelper.php (1)

396-398: Verify impact of switching default anti-spam option

The default options now include 'stopforumspam' => 0 instead of the previous honeypot option. This represents a shift in the default anti-spam strategy.

Make sure this change won't affect existing forms that rely on the honeypot functionality. Consider if a migration path is needed for existing forms, or if the global honeypot setting will ensure backward compatibility.

Comment thread classes/helpers/FrmFormsHelper.php
Comment thread classes/models/FrmHoneypot.php
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

♻️ Duplicate comments (1)
tests/phpunit/misc/test_FrmSpamCheckDenylist.php (1)

30-32: 🛠️ Refactor suggestion

Consider making the test more self-contained by creating the text field explicitly.

The test fixture relies on an implicit text field created when the form is created. This approach is fragile as it depends on implementation details of form creation that could change.

-$fields              = FrmField::getAll( array( 'form_id' => $this->form_id ) );
-$this->text_field_id = $fields[0]->id;
+$this->text_field_id = $this->factory->field->create(
+    array(
+        'type'    => 'text',
+        'form_id' => $this->form_id,
+    )
+);
🧹 Nitpick comments (3)
tests/phpunit/misc/test_FrmSpamCheckDenylist.php (3)

101-148: Add documentation to describe test coverage.

This test method verifies the field filtering logic, but lacks documentation explaining its purpose and the scenarios being tested.

/**
+ * Test that field IDs are correctly filtered based on denylist configuration.
+ * 
+ * Covers multiple scenarios:
+ * - No field type restrictions (all fields)
+ * - Skipping specific field types
+ * - Including only specific field types
+ */
public function test_get_field_ids_to_check() {

150-214: Add documentation to describe test coverage.

Similar to the previous method, adding documentation would improve clarity.

/**
+ * Test that form values are correctly extracted based on denylist configuration.
+ * 
+ * Covers multiple scenarios:
+ * - Values from all fields
+ * - Values from specific field types
+ * - Values extracted using custom extraction functions
+ */
public function test_get_values_to_check() {

302-304: Consider using the built-in PHP Unit mocking utilities.

Using direct assignment to $_SERVER['REMOTE_ADDR'] for mocking is fragile. Consider using PHPUnit's environment and server variable mocking facilities instead.

-$current_ip = $_SERVER['REMOTE_ADDR'];
-
-// Mock IP address.
-$_SERVER['REMOTE_ADDR'] = '192.168.1.1';
+// Save current environment
+$original_server = $_SERVER;
+
+// Mock IP address using PHPUnit
+$this->setServerVariable('REMOTE_ADDR', '192.168.1.1');

And for the reset at the end of the method:

-// Reset the IP address.
-$_SERVER['REMOTE_ADDR'] = $current_ip;
+// Restore original environment
+$_SERVER = $original_server;
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8875269 and 1706f1c.

📒 Files selected for processing (2)
  • classes/models/FrmSpamCheckDenylist.php (1 hunks)
  • tests/phpunit/misc/test_FrmSpamCheckDenylist.php (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • classes/models/FrmSpamCheckDenylist.php
⏰ Context from checks skipped due to timeout of 90000ms (3)
  • GitHub Check: Cypress
  • GitHub Check: PHP 7.4 tests in WP trunk
  • GitHub Check: PHP 8 tests in WP trunk
🔇 Additional comments (1)
tests/phpunit/misc/test_FrmSpamCheckDenylist.php (1)

333-333:

Details

❌ Incorrect review comment

Re-enable an important test assertion.

The code reviewer previously found a commented-out assertion related to CIDR matching. Your implementation now tests this functionality, so uncomment the assertion to verify it works correctly.


🏁 Script executed:

#!/bin/bash
# Look for any commented assertions related to IP CIDR matching
rg -n "//\s*\$this->assertTrue" tests/phpunit/misc/test_FrmSpamCheckDenylist.php
rg -n "//\s*\$this->assert" tests/phpunit/misc/test_FrmSpamCheckDenylist.php

Length of output: 159


🏁 Script executed:

#!/bin/bash
# Search for commented-out PHPUnit assertions using `#`
rg -n '^\s*#.*\$this->assert' tests/phpunit/misc/test_FrmSpamCheckDenylist.php

# Search for commented-out PHPUnit assertions inside block comments `/* ... */`
rg -n '/\*.*\$this->assert' tests/phpunit/misc/test_FrmSpamCheckDenylist.php

Length of output: 159


No commented-out CIDR assertion found – suggestion not applicable.

I searched for any commented PHPUnit assertions (//, #, or /* … */) in tests/phpunit/misc/test_FrmSpamCheckDenylist.php and found none. The test only contains the active:

$this->assertTrue( $this->run_private_method( array( $this->spam_check, 'check_ip' ) ) );

There is no hidden or commented CIDR-matching assertion to re-enable. You can safely ignore this review comment.

Likely an incorrect or invalid review comment.

Comment thread tests/phpunit/misc/test_FrmSpamCheckDenylist.php
Comment thread tests/phpunit/misc/test_FrmSpamCheckDenylist.php
Comment thread tests/phpunit/misc/test_FrmSpamCheckDenylist.php
Comment thread tests/phpunit/misc/test_FrmSpamCheckDenylist.php
@truongwp
Copy link
Copy Markdown
Contributor Author

truongwp commented May 8, 2025

@Crabcyborg I completed everything. Please test again.

Now denylist array supports skip and skip_field_types. I changed field_type to field_types.

Comment thread classes/models/FrmHoneypot.php Outdated
Comment thread classes/models/FrmHoneypot.php
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (2)
classes/models/FrmHoneypot.php (2)

142-142: Fix browser compatibility issue with optional chaining.

The optional chaining operator (?.) isn't supported in older browsers like IE11 or older Android WebViews that WordPress claims to support. This was flagged in a previous review but hasn't been addressed.

-					document.currentScript?.remove();
+					if (document.currentScript) {
+						document.currentScript.parentNode.removeChild(document.currentScript);
+					}

160-160: Use esc_html instead of esc_attr for CSS output.

For CSS output in style tags, esc_html() is the appropriate escaping function to use, not esc_attr(). This was flagged in a previous review comment.

-			echo '<style>' . esc_attr( $css ) . '</style>';
+			echo '<style>' . esc_html( $css ) . '</style>';
🧹 Nitpick comments (5)
classes/models/FrmHoneypot.php (5)

145-145: Consider using wp_json_encode for safer escaping.

Using esc_js() with document.createTextNode() creates double-escaping issues. Consider using wp_json_encode() instead for better handling of CSS strings.

-			esc_js( $css )
+			wp_json_encode( $css )

And also:

-					style.appendChild( document.createTextNode( '%s' ) );
+					style.appendChild( document.createTextNode( %s ) );

250-256: Consider using FrmAppHelper::get_param instead of get_simple_request.

For consistency with other code in the file (like line 97), consider using FrmAppHelper::get_param for retrieving the item_meta parameter.

-		$item_meta = FrmAppHelper::get_simple_request(
-			array(
-				'param'   => 'item_meta',
-				'default' => array(),
-				'type'    => 'post',
-			)
-		);
+		$item_meta = FrmAppHelper::get_param('item_meta', array(), 'post', 'wp_kses_post');

114-119: Consider moving the honeypot field position.

As mentioned in a previous review comment (line 114), the honeypot field is currently positioned after the submit button, which might be less effective at fooling spam bots. Consider injecting it somewhere among other form fields for better camouflage.


175-177: Consider enhancing honeypot effectiveness with randomized styling.

The current CSS approach uses a consistent pattern for hiding honeypot fields. Advanced bots might detect this pattern over time. Consider adding slight variations to the CSS properties or selectors to make detection more difficult.

return sprintf(
-	'%s {visibility:hidden;overflow:hidden;width:0;height:0;position:absolute;}',
+	'%s {visibility:hidden;overflow:hidden;width:%dpx;height:%dpx;position:absolute;opacity:0.01;}',
	implode( ',', $frm_vars['honeypot_selectors'] ),
+	rand(0, 1),
+	rand(0, 1)
);

8-25: Complete the version number in the @SInCE tags.

The @since x.x tags should be updated with the actual version number when this code will be released.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 085afb5 and 04932ce.

⛔ Files ignored due to path filters (1)
  • psalm.xml is excluded by !**/*.xml
📒 Files selected for processing (1)
  • classes/models/FrmHoneypot.php (4 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (3)
  • GitHub Check: Cypress
  • GitHub Check: PHP 7.4 tests in WP trunk
  • GitHub Check: PHP 8 tests in WP trunk
🔇 Additional comments (1)
classes/models/FrmHoneypot.php (1)

223-236: Good job addressing the null iterator issue.

You've properly addressed the previously identified issue by ensuring $fields is always an array before iteration.

Comment thread classes/views/frm-forms/spam-settings/stopforumspam.php Outdated
@Crabcyborg
Copy link
Copy Markdown
Contributor

@truongwp A unit test is also breaking.

Screen Shot 2025-05-08 at 4 41 15 PM

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
tests/cypress/e2e/Entries/EntriesPageDataValidations.cy.js (1)

99-99: Appropriate selector update to exclude honeypot fields

The selector has been correctly updated to exclude honeypot fields (.frm_verify) when typing text during the test. This ensures that the test properly simulates legitimate user behavior by not filling in the honeypot fields that would trigger spam detection.

Consider adding a brief comment explaining the purpose of excluding .frm_verify fields for future developers:

- cy.get('[id^="field_"]:not(.frm_verify)').filter('input, textarea').type("Entry is stored");
+ // Exclude honeypot fields (.frm_verify) to prevent triggering spam detection
+ cy.get('[id^="field_"]:not(.frm_verify)').filter('input, textarea').type("Entry is stored");
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 04932ce and d052044.

📒 Files selected for processing (1)
  • tests/cypress/e2e/Entries/EntriesPageDataValidations.cy.js (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (2)
  • GitHub Check: PHP 7.4 tests in WP trunk
  • GitHub Check: Cypress

@Crabcyborg
Copy link
Copy Markdown
Contributor

Crabcyborg commented May 8, 2025

Also @truongwp I got the e2e tests passing on master. So all new tests failing are because of changes in this branch.

I pushed some fixes here so it should just be the HTML validation issue left (#2285 (comment)).

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (2)
classes/models/FrmHoneypot.php (2)

143-147: ⚠️ Potential issue

Fix browser compatibility issue with optional chaining

The optional chaining operator (?.) is not supported in older browsers that WordPress aims to support. This was previously flagged in code reviews but remains unaddressed.

Replace the optional chaining with a more compatible approach:

-					document.currentScript?.remove();
+					if ( document.currentScript ) {
+						document.currentScript.parentNode.removeChild( document.currentScript );
+					}

Additionally, consider using wp_json_encode() instead of esc_js() to avoid potential double-escaping of content:

-					style.appendChild( document.createTextNode( '%s' ) );
+					style.appendChild( document.createTextNode( %s ) );
...
-			esc_js( $css )
+			wp_json_encode( $css )

33-39: 🛠️ Refactor suggestion

Ensure fields property always returns an array

The get_fields() method is correctly implemented, but the PHPDoc indicates it returns an array while there's no guarantee FrmField::get_all_for_form() will always return an array. You're checking for null arrays later in get_honeypot_field_id(), but it would be better to ensure get_fields() always returns an array.

protected function get_fields() {
	if ( is_null( $this->fields ) ) {
		$this->fields = FrmField::get_all_for_form( $this->form_id, '', 'include' );
+		if ( ! is_array( $this->fields ) ) {
+			$this->fields = array();
+		}
	}

	return $this->fields;
}
🧹 Nitpick comments (4)
classes/models/FrmHoneypot.php (4)

48-51: Add PHPDoc to the is_enabled() method

This new method lacks PHPDoc documentation. Maintain consistency with the rest of the codebase by adding appropriate documentation.

+/**
+ * Checks if honeypot is enabled in global settings.
+ *
+ * @since x.x
+ *
+ * @return bool True if honeypot is enabled.
+ */
private static function is_enabled() {
	$frm_settings = FrmAppHelper::get_settings();
	return $frm_settings->honeypot;
}

100-107: Consider bypassing honeypot for logged-in users with form entry permissions

Based on the PR objectives, there was a discussion about allowing trusted users to bypass spam checks. Consider adding a permission check for logged-in users with the ability to create entries.

private function check_honeypot_filter() {
	$form = $this->get_form();
+	// Skip honeypot check for users who can create entries
+	if ( is_user_logged_in() && current_user_can( 'frm_create_entries' ) ) {
+		return false;
+	}
	return apply_filters( 'frm_run_honeypot', true, compact( 'form' ) );
}

227-240: Consider adding a comment explaining honeypot field ID generation

The method for generating honeypot field IDs is good but could benefit from a clear explanation of the strategy used.

/**
+ * Generate a unique ID for the honeypot field by finding the highest field ID and adding 1.
+ * This ensures the honeypot field ID won't conflict with existing fields.
+ *
+ * @since x.x
+ *
+ * @return int A unique field ID for the honeypot field
+ */
private function get_honeypot_field_id() {
	$max    = 0;
	$fields = $this->get_fields();
	if ( ! is_array( $fields ) ) {
		$fields = array();
	}
	foreach ( $fields as $field ) {
		if ( $field->id > $max ) {
			$max = $field->id;
		}
		unset( $field );
	}
	return $max + 1;
}

253-267: Add validation for array key type in get_honeypot_field_value

The method uses array access with $field_id directly without verifying it's an appropriate key type.

private function get_honeypot_field_value( $field_id ) {
+	// Ensure field_id is a valid array key
+	if ( ! is_scalar( $field_id ) ) {
+		return '';
+	}
+
	$item_meta = FrmAppHelper::get_simple_request(
		array(
			'param'   => 'item_meta',
			'default' => array(),
			'type'    => 'post',
		)
	);

	if ( ! $item_meta || ! is_array( $item_meta ) ) {
		return '';
	}

	return isset( $item_meta[ $field_id ] ) ? $item_meta[ $field_id ] : '';
}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a9be6ff and 276bc20.

📒 Files selected for processing (7)
  • classes/models/FrmHoneypot.php (4 hunks)
  • classes/models/FrmSpamCheck.php (1 hunks)
  • classes/models/FrmSpamCheckDenylist.php (1 hunks)
  • classes/models/FrmSpamCheckUseWPComments.php (1 hunks)
  • classes/models/FrmSpamCheckWPDisallowedWords.php (1 hunks)
  • classes/models/FrmUsage.php (2 hunks)
  • classes/views/frm-forms/spam-settings/stopforumspam.php (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (6)
  • classes/models/FrmSpamCheckUseWPComments.php
  • classes/views/frm-forms/spam-settings/stopforumspam.php
  • classes/models/FrmUsage.php
  • classes/models/FrmSpamCheck.php
  • classes/models/FrmSpamCheckWPDisallowedWords.php
  • classes/models/FrmSpamCheckDenylist.php
⏰ Context from checks skipped due to timeout of 90000ms (3)
  • GitHub Check: Cypress
  • GitHub Check: PHP 8 tests in WP trunk
  • GitHub Check: PHP 7.4 tests in WP trunk
🔇 Additional comments (3)
classes/models/FrmHoneypot.php (3)

180-181: LGTM: CSS syntax error has been fixed

The previous review identified a syntax error in the CSS where a semicolon was missing. This has been correctly fixed in this implementation.


195-216: Verify the position of the honeypot field

According to the review comments, there was a discussion about the position of the honeypot field on the page. This implementation still appears to place it after the submit button (based on how it's rendered separately).

Could you verify if there's a better place to inject the honeypot field in the form layout to make it less conspicuous? The previous discussion suggested placing it as the first field or randomly between fields.


164-164: 🛠️ Refactor suggestion

Properly escape CSS output to preserve CSS syntax

While you've added esc_html() to address the security concern from a previous review, this can break valid CSS. Use WordPress's escape function designed specifically for inline CSS.

-			echo '<style>' . esc_html( $css ) . '</style>';
+			echo '<style>' . wp_strip_all_tags( $css ) . '</style>';

This will strip HTML tags while preserving valid CSS syntax, which is safer than using esc_html() that could escape characters needed for CSS.

Likely an incorrect or invalid review comment.

Copy link
Copy Markdown
Contributor

@Crabcyborg Crabcyborg left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you @truongwp!

I'll go ahead and merge this now.

I think it's good to go. If anything else comes up, feel free to make a new PR.

🚀

@Crabcyborg Crabcyborg merged commit a7f4f00 into master May 9, 2025
16 checks passed
@Crabcyborg Crabcyborg deleted the antispam-improvements branch May 9, 2025 11:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants