docbrown/app/models
Derek Crosson ae27d15be7
Prevent whitespace unicode characters from being used in article title and tag (#14909)
* test: whitespace unicode characters cannot be used as titles or tags

* feat: add localized error message

* refactor: use localized error message

* fix: whitespace unicode characters cannot be used as titles or tags

* chore: fix locale after merge

* refactor: fix indentation

* Fix spelling of prohibited in method names

Additionally, rubocop removed a redundant user_id validation since
Article belongs to user.

* Fix spelling

Missed one method call on the same line (fixed the first of two
instances needing changes)

* add failing test cases

The reorganization to remove let was due to a limit on nesting rspec
contexts (it inside context inside describe inside describe when
trying to use different titles in let blocks in contexts)

The first test was clarified (the "U+202D" string that looks like the
code for a unicode point is valid, but the character \u202d is
expected to be invalid

The remaining two tests are based on the feedback I'd given in the PR,
failing because we don't assert title is present after removing
unicode whitespace, and we don't actually set the title (gsub is
non-destructive, returning a value).

* Set title to sanitized title

contains_prohibitied_unicode_characters? was using == (which is not a
good match for strings to regexes), use =~ instead

Change invalid example characters in titles from \u202d (bidi override) to
\u200a (hair space)

Assert that the empty title is blank and can't be blank (even though
it contains no prohibitd characters after replacement)

* change the definition of prohibited characters

From the description, it looks like "unicode space characters" was the
desired rejection set. It was unclear what the existing regex was
matching on (I couldn't get the expected examples to match correctly).

Given the intent, I select "unicode space property, except the ascii
space character", which may _also_ be incorrect but passed the tests.

* Remove now-invalid expectation for presence of user id

Since this was redundant (belongs_to user), we no longer will validate
presence of user id, and we should not test for it.

* Only reject bidirectional text controls

The original issue pointed to the BIDI controls as problematic.

While they called out other "whitespace" characters, as we accept a
wider range of input languages, the need to handle non-printing
punctuation (for example a group separating space for some asian
languages).

It's possible a wider list of characters should be added - if that's
the case I suggest this regex and the sanitization be moved to a
standalone class, and each of the recommendations in
https://www.w3.org/TR/unicode-xml/#Charlist be checked for
applicability.

* Check for blank title after sanitizing disallowed characters

Since validate_title modifies the title, and doesn't set error
messages on the model itself, check for non-empty title _after_
potentially removing any disallowed characters.

* Remove invalid characters before validation

Remove the validate_title and contains_prohibited_characters methods,
and center all logic on the remove prohibitied unicode characters
method.

Remove unneeded and unused arguments (input string is always title,
replacement is always removal/empty string).

* handle case when validating null title

If the title's nil, we don't want to call match? since it will fail.

Title will sometimes be nil when validating.

Co-authored-by: Ben Halpern <bendhalpern@gmail.com>
Co-authored-by: Dan Uber <dan@forem.com>
2022-01-03 09:37:03 -05:00
..
ahoy Favoring delete_all on user relationships (#15443) 2021-11-23 11:50:12 -05:00
articles Rubocop: Move from OpenStruct to Struct in Organization (#9431) 2020-07-30 21:04:05 +07:00
concerns Remove CustomProfileField (#14286) 2021-07-22 10:05:39 +07:00
liquid_tags [deploy] Add role and docs for user subscription liquid tag (#9170) 2020-07-08 14:07:53 -04:00
settings Put back default community name. (#15777) 2021-12-14 13:48:38 -07:00
users Favoring delete_all on user relationships (#15443) 2021-11-23 11:50:12 -05:00
ab_experiment.rb Configurable weighted feed strategy (#15240) 2021-11-29 10:46:56 -05:00
admin_menu.rb Remove webhooks and related code (#15827) 2021-12-28 10:56:37 +07:00
announcement.rb Add Polymorphism to Broadcasts (Part 1) (#9231) [deploy] 2020-07-13 09:36:19 -06:00
api_secret.rb Favoring delete_all on user relationships (#15443) 2021-11-23 11:50:12 -05:00
application_record.rb Remove txn from with_statement_timeout block (#15088) 2021-10-15 14:53:35 -04:00
article.rb Prevent whitespace unicode characters from being used in article title and tag (#14909) 2022-01-03 09:37:03 -05:00
audit_log.rb Favoring constant over magic string (#15852) 2021-12-27 11:31:29 -05:00
badge.rb Refactor cache purging (#12811) 2021-03-02 10:09:05 -05:00
badge_achievement.rb Extracting container for allowed tags & attrs (#15338) 2021-12-16 12:24:45 -05:00
banished_user.rb
broadcast.rb Fix Rails/HasManyOrHasOneDependent for Broadcast and Collection (#9662) 2020-08-07 14:27:24 -04:00
campaign.rb Refactoring to consolidate logic (#15851) 2021-12-29 11:08:04 -05:00
collection.rb Fix Rails/HasManyOrHasOneDependent for Broadcast and Collection (#9662) 2020-08-07 14:27:24 -04:00
comment.rb Refactoring Spam Handler (#15412) 2021-11-30 12:45:12 -05:00
config.rb
consumer_app.rb ForemMobile namespaced functions (#15212) 2021-11-23 15:25:29 -06:00
creator_setting.rb Creator Onboarding: Creator Setup View (#14728) 2021-11-01 15:50:08 -04:00
credit.rb Favor repurposing existing scope (#15914) 2022-01-03 09:30:34 -05:00
data_update_script.rb Navigation Items and Role access for Data Update Scripts (#12292) 2021-02-09 17:41:14 +02:00
device.rb Spelling (#15702) 2021-12-07 06:59:10 -07:00
discussion_lock.rb Favoring dependent: :delete_all over :destroy (#15442) 2021-11-24 13:56:16 -05:00
display_ad.rb Extracting container for allowed tags & attrs (#15338) 2021-12-16 12:24:45 -05:00
display_ad_event.rb Favoring delete_all on user relationships (#15443) 2021-11-23 11:50:12 -05:00
email_authorization.rb Refactor Admin Member Detail view - Tools section (#14283) 2021-08-17 18:55:53 +02:00
email_message.rb Delete old retained emails after certain period (#14949) 2021-10-12 16:27:13 -04:00
feedback_message.rb Refactor Admin Member Detail view - Tools section (#14283) 2021-08-17 18:55:53 +02:00
follow.rb ✂✂✂ Remove Connect (#14734) 2021-11-18 08:21:00 -06:00
forem_instance.rb Fix Forem Ownership Field (#14730) 2021-09-16 06:56:59 -04:00
github_issue.rb If there is no body of the linked issue or PR, don't render markdown (#14804) 2021-09-28 09:20:49 -05:00
github_repo.rb Refactor cache purging (#12811) 2021-03-02 10:09:05 -05:00
html_variant.rb Strip surrounding whitespace from HTMLVariant name (#15776) 2021-12-14 14:42:06 -05:00
html_variant_success.rb [deploy] Add relations and foreign keys between HtmlVariant related models (#9846) 2020-08-18 11:33:38 -04:00
html_variant_trial.rb [deploy] Add relations and foreign keys between HtmlVariant related models (#9846) 2020-08-18 11:33:38 -04:00
identity.rb Favoring delete_all on user relationships (#15443) 2021-11-23 11:50:12 -05:00
invitation.rb [deploy] Invite users to join and create password (#9294) 2020-07-15 11:37:19 -04:00
listing.rb ✂✂✂ Remove Connect (#14734) 2021-11-18 08:21:00 -06:00
listing_category.rb [deploy] Manage listing categories in dashboard (#10506) 2020-10-02 11:05:09 -04:00
mention.rb Favoring dependent: :delete_all over :destroy (#15442) 2021-11-24 13:56:16 -05:00
mod.rb
moderator_action.rb [deploy] Moderator and admin actions log (#6797) 2020-03-26 16:59:24 -05:00
navigation_link.rb Remove redundant freeze calls (#14596) 2021-08-26 10:01:08 -04:00
note.rb Favoring delete_all on user relationships (#15443) 2021-11-23 11:50:12 -05:00
notification.rb Favoring delete_all on user relationships (#15443) 2021-11-23 11:50:12 -05:00
notification_subscription.rb Favoring dependent: :delete_all over :destroy (#15442) 2021-11-24 13:56:16 -05:00
organization.rb Extracting cross-model uniqueness validator (#15640) 2021-12-06 17:07:47 -05:00
organization_membership.rb Refactoring to use scope (#15625) 2021-12-01 13:14:40 -05:00
overview.rb Add admin overview page (#12726) 2021-03-01 18:59:05 -06:00
page.rb Extracting cross-model uniqueness validator (#15640) 2021-12-06 17:07:47 -05:00
page_view.rb Favoring dependent: :delete_all over :destroy (#15442) 2021-11-24 13:56:16 -05:00
permission.rb
pinned_article.rb Pin posts to feed (#13807) 2021-06-04 10:54:53 +02:00
podcast.rb Extracting cross-model uniqueness validator (#15640) 2021-12-06 17:07:47 -05:00
podcast_episode.rb Various cleanups (#14616) 2021-08-31 09:17:24 +07:00
podcast_episode_appearance.rb Favoring delete_all on user relationships (#15443) 2021-11-23 11:50:12 -05:00
podcast_ownership.rb Favoring delete_all on user relationships (#15443) 2021-11-23 11:50:12 -05:00
poll.rb Refactoring poll/vote/skip logic (#15441) 2021-11-29 10:52:32 -05:00
poll_option.rb Favoring dependent: :delete_all over :destroy (#15442) 2021-11-24 13:56:16 -05:00
poll_skip.rb Refactoring poll/vote/skip logic (#15441) 2021-11-29 10:52:32 -05:00
poll_vote.rb Refactoring poll/vote/skip logic (#15441) 2021-11-29 10:52:32 -05:00
privileged_reaction.rb [deploy] New Feature: Mod Actions Panel (#7777) 2020-06-08 13:24:18 -04:00
profile.rb Favoring delete_all on user relationships (#15443) 2021-11-23 11:50:12 -05:00
profile_field.rb Remove check_box type from profile fields (#14832) 2021-09-30 13:27:39 -04:00
profile_field_group.rb [deploy] /profile/settings page rendering (Ridhwana/Michael) (#10733) 2020-10-20 09:18:13 -04:00
profile_pin.rb Favoring dependent: :delete_all over :destroy (#15442) 2021-11-24 13:56:16 -05:00
rating_vote.rb role deprecation cleanup (#15717) 2021-12-09 15:27:45 -06:00
reaction.rb Remove reactions to a user when deleting the user (#15724) 2021-12-10 11:24:23 -06:00
response_template.rb Deprecating User#trusted in favor of User#trusted? (#15639) 2021-12-02 08:54:58 -05:00
role.rb ✂✂✂ Remove Connect (#14734) 2021-11-18 08:21:00 -06:00
secret.rb [deploy] Feature: Setup Admin Area to Update Vault Secrets (#8935) 2020-06-29 15:08:09 -05:00
sponsorship.rb Only permit valid class names as sponsorable type (#14387) 2021-11-05 12:25:35 -05:00
tag.rb Prevent whitespace unicode characters from being used in article title and tag (#14909) 2022-01-03 09:37:03 -05:00
tag_adjustment.rb Refactoring questions asked of user (#15762) 2021-12-21 12:45:12 -05:00
timeframe.rb Remove timeframer from app/labor (#11782) 2020-12-08 12:52:33 +07:00
tool.rb
tweet.rb RFC 190: Forem Creator Signup Page (#13875) 2021-08-24 10:33:26 +02:00
user.rb Remove webhooks and related code (#15827) 2021-12-28 10:56:37 +07:00
user_block.rb Fix and refactor hide user content (#12307) 2021-01-18 11:08:23 -05:00
user_role.rb [Search 2.0] Users (#13453) 2021-04-24 19:06:06 +02:00
user_subscription.rb Rename MarkdownParser to MarkdownProcessor::Parser (#12248) 2021-01-13 10:39:13 -05:00
welcome.rb
welcome_notification.rb Add Polymorphism to Broadcasts (Part 1) (#9231) [deploy] 2020-07-13 09:36:19 -06:00