diff --git a/src/features/jobs-moderation/job-mod-helpers.ts b/src/features/jobs-moderation/job-mod-helpers.ts index 6d32e315..028163f3 100644 --- a/src/features/jobs-moderation/job-mod-helpers.ts +++ b/src/features/jobs-moderation/job-mod-helpers.ts @@ -29,6 +29,7 @@ import { PostFailures, PostType, PostFailureLinkRequired, + PostFailureInsecureLinks, CircumventedRules, } from "../../types/jobs-moderation.js"; @@ -54,6 +55,10 @@ export const failedTooLong = (e: PostFailures): e is PostFailureTooLong => export const failedLinkRequired = ( e: PostFailures, ): e is PostFailureLinkRequired => e.type === POST_FAILURE_REASONS.linkRequired; +export const failedInsecureLinks = ( + e: PostFailures, +): e is PostFailureInsecureLinks => + e.type === POST_FAILURE_REASONS.insecureLinks; export const failedTooManyLines = ( e: PostFailures, ): e is PostFailureTooManyLines => e.type === POST_FAILURE_REASONS.tooManyLines; diff --git a/src/features/jobs-moderation/validate.ts b/src/features/jobs-moderation/validate.ts index aa1e0704..51c09d52 100644 --- a/src/features/jobs-moderation/validate.ts +++ b/src/features/jobs-moderation/validate.ts @@ -17,6 +17,7 @@ const validate = (posts: ReturnType, message: Message) => { errors.push(...participation(posts, message)); errors.push(...formatting(posts, message)); errors.push(...links(posts, message)); + errors.push(...insecureLinks(posts, message)); return errors; }; export default validate; @@ -113,3 +114,13 @@ export const links: JobPostValidator = (posts) => { return errors; }; +const insecureUrlRegex = /\bhttp:\/\/[^\s"'<>]+/gi; +export const insecureLinks: JobPostValidator = (posts, message) => { + const insecureUrls = message.content.match(insecureUrlRegex); + const errors: PostFailures[] = []; + if (!insecureUrls) return errors; + + errors.push({ type: POST_FAILURE_REASONS.insecureLinks }); + + return errors; +}; diff --git a/src/features/jobs-moderation/validation-messages.ts b/src/features/jobs-moderation/validation-messages.ts index 3e42bff6..02e2ca0f 100644 --- a/src/features/jobs-moderation/validation-messages.ts +++ b/src/features/jobs-moderation/validation-messages.ts @@ -17,6 +17,7 @@ import { failedTooLong, failedTooManyGaps, failedLinkRequired, + failedInsecureLinks, } from "./job-mod-helpers.js"; const ValidationMessages = { @@ -30,6 +31,8 @@ const ValidationMessages = { [POST_FAILURE_REASONS.tooLong]: (e: PostFailureTooLong) => `Your post is too long, please shorten it by ${e.overage} characters.`, [POST_FAILURE_REASONS.linkRequired]: `Hiring posts must include a link, either to the company website or a page to apply for the job. Make sure it includes \`https://\` so Discord makes it clickable.`, + [POST_FAILURE_REASONS.insecureLinks]: + "Your post contains insecure links (http://). Please use secure links (https://) instead.", [POST_FAILURE_REASONS.tooManyLines]: (e: PostFailureTooManyLines) => `Your post has too many lines, please shorten it by ${e.overage} lines.`, [POST_FAILURE_REASONS.tooManyGaps]: @@ -41,6 +44,9 @@ const ValidationMessages = { }; export const getValidationMessage = (reason: PostFailures): string => { + if (failedInsecureLinks(reason)) { + return ValidationMessages[reason.type]; + } if (failedCircumventedRules(reason)) { return ValidationMessages[reason.type](reason); } diff --git a/src/types/jobs-moderation.ts b/src/types/jobs-moderation.ts index 340030ae..128016a6 100644 --- a/src/types/jobs-moderation.ts +++ b/src/types/jobs-moderation.ts @@ -29,6 +29,7 @@ export const enum POST_FAILURE_REASONS { tooFrequent = "tooFrequent", replyOrMention = "replyOrMention", circumventedRules = "circumventedRules", + insecureLinks = "insecureLinks", // invalidContact = 'invalidContact', // unknownLocation = 'unknownLocation', // invalidPostType = 'invalidPostType', @@ -68,6 +69,9 @@ export interface PostFailureTooFrequent { export interface PostFailureReplyOrMention { type: POST_FAILURE_REASONS.replyOrMention; } +export interface PostFailureInsecureLinks { + type: POST_FAILURE_REASONS.insecureLinks; +} export type PostFailures = | CircumventedRules | PostFailureMissingType @@ -78,4 +82,5 @@ export type PostFailures = | PostFailureTooLong | PostFailureTooManyLines | PostFailureTooManyGaps - | PostFailureTooManyEmojis; + | PostFailureTooManyEmojis + | PostFailureInsecureLinks;