Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Account for undocumented exception in Akismet::getIsSpam #31

Merged
merged 1 commit into from
Apr 20, 2020

Conversation

elliot-sawyer
Copy link

@elliot-sawyer elliot-sawyer commented Dec 20, 2019

https://github.com/tijsverkoyen/Akismet/blob/6f7987fe181fd0fddbc9832f2ddeaf088425c83f/Akismet.php#L367

Context

If the network fails to contact Akismet, it will throw an undocumented exception with a 400 response. This leaves the method in a state where it returns neither true nor false. If this occurrs, the AkismetField will return isSpam = false. This can be optionally configured to true instead by a developer.

This issue also occurs if any one of the mapping fields is used and marked as spam. The underlying module throws an exception in this case, and the module fails to account for it.

$this->isSpam = $api && $api->isSpam($content, $author, $email, $url);
} catch (Exception $e) {
//if the network response fails, it still needs to be true/false
$this->isSpam = (bool) $this->config()->is_spam_when_response_fails;

Choose a reason for hiding this comment

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

Do we want to do something with the exception, even if it's logging?

Copy link
Author

Choose a reason for hiding this comment

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

To be honest, I'm not too concerned with logging the error, I have other tools to capture that information. The current module doesn't handle exceptions at all, and I'd prefer to keep that as a separate feature if it's required.

This is causing production issues for several of our CWP clients and I'd appreciate a review and merge to fix this supported module. Thanks.

Choose a reason for hiding this comment

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

Can we just add a Injector::inst()->get(LoggerInterface::class)->error($e->getMessage()); rather than just swallowing it? If you're marking authentic comments as spam, I think you want some awareness of it.

Copy link
Author

Choose a reason for hiding this comment

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

The exception message only says "invalid" when caught. Is there anything else I should include with the message? I'm hesitant to include the actual values of the four checked fields, as it means logging some level of personal user information..

Copy link
Author

Choose a reason for hiding this comment

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

I'll append a string from the en.yml file containing a more specific reason.

Copy link

@unclecheese unclecheese Apr 20, 2020

Choose a reason for hiding this comment

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

If that's the case, then let's just provide some context in the error.

Injector::inst()->get(LoggerInterface::class)->error(sprintf(
  'Akismet marked content as spam due to network error. Response from service: %s',
  $e->getMessage()
));

No need to i18n an error message.

Copy link
Author

Choose a reason for hiding this comment

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

There's an existing i18n I've used instead. Squashed and pushed

$this->isSpam = $api && $api->isSpam($content, $author, $email, $url);
} catch (Exception $e) {
//if the network response fails, it still needs to be true/false
$this->isSpam = (bool) $this->config()->is_spam_when_response_fails;

Choose a reason for hiding this comment

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

Can we just add a Injector::inst()->get(LoggerInterface::class)->error($e->getMessage()); rather than just swallowing it? If you're marking authentic comments as spam, I think you want some awareness of it.

@unclecheese
Copy link

Just fix the linting error and we should be good to go.

Returns isSpam = false on network error, but can be config'ed to true

Log the reason for the failure
@elliot-sawyer
Copy link
Author

All sorted, thanks @unclecheese !

@unclecheese unclecheese merged commit ac053b5 into silverstripe:4 Apr 20, 2020
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants