chore: port sql-regex-escape to backend-rs

This commit is contained in:
naskya 2024-05-24 08:54:40 +09:00
parent ee33337a3f
commit 1df3680842
No known key found for this signature in database
GPG key ID: 712D413B3A9FED5C
5 changed files with 13 additions and 6 deletions

View file

@ -232,6 +232,7 @@ export function extractHost(uri: string): string
export function toPuny(host: string): string export function toPuny(host: string): string
export function isUnicodeEmoji(s: string): boolean export function isUnicodeEmoji(s: string): boolean
export function sqlLikeEscape(src: string): string export function sqlLikeEscape(src: string): string
export function sqlRegexEscape(src: string): string
export function safeForSql(src: string): boolean export function safeForSql(src: string): boolean
/** Convert milliseconds to a human readable string */ /** Convert milliseconds to a human readable string */
export function formatMilliseconds(milliseconds: number): string export function formatMilliseconds(milliseconds: number): string

View file

@ -310,7 +310,7 @@ if (!nativeBinding) {
throw new Error(`Failed to load native binding`) throw new Error(`Failed to load native binding`)
} }
const { SECOND, MINUTE, HOUR, DAY, USER_ONLINE_THRESHOLD, USER_ACTIVE_THRESHOLD, FILE_TYPE_BROWSERSAFE, loadEnv, loadConfig, stringToAcct, acctToString, greet, initializeRustLogger, showServerInfo, isBlockedServer, isSilencedServer, isAllowedServer, checkWordMute, getFullApAccount, isSelfHost, isSameOrigin, extractHost, toPuny, isUnicodeEmoji, sqlLikeEscape, safeForSql, formatMilliseconds, getImageSizeFromUrl, getNoteSummary, isQuote, isSafeUrl, latestVersion, toMastodonId, fromMastodonId, fetchMeta, metaToPugArgs, nyaify, hashPassword, verifyPassword, isOldPasswordAlgorithm, decodeReaction, countReactions, toDbReaction, removeOldAttestationChallenges, cpuInfo, cpuUsage, memoryUsage, storageUsage, AntennaSrc, DriveFileUsageHint, MutedNoteReason, NoteVisibility, NotificationType, PageVisibility, PollNoteVisibility, RelayStatus, UserEmojiModPerm, UserProfileFfvisibility, UserProfileMutingNotificationTypes, updateAntennasOnNewNote, fetchNodeinfo, nodeinfo_2_1, nodeinfo_2_0, Protocol, Inbound, Outbound, watchNote, unwatchNote, PushNotificationKind, sendPushNotification, publishToChannelStream, ChatEvent, publishToChatStream, ChatIndexEvent, publishToChatIndexStream, publishToBroadcastStream, publishToGroupChatStream, publishToModerationStream, getTimestamp, genId, genIdAt, generateSecureRandomString, generateUserToken } = nativeBinding const { SECOND, MINUTE, HOUR, DAY, USER_ONLINE_THRESHOLD, USER_ACTIVE_THRESHOLD, FILE_TYPE_BROWSERSAFE, loadEnv, loadConfig, stringToAcct, acctToString, greet, initializeRustLogger, showServerInfo, isBlockedServer, isSilencedServer, isAllowedServer, checkWordMute, getFullApAccount, isSelfHost, isSameOrigin, extractHost, toPuny, isUnicodeEmoji, sqlLikeEscape, sqlRegexEscape, safeForSql, formatMilliseconds, getImageSizeFromUrl, getNoteSummary, isQuote, isSafeUrl, latestVersion, toMastodonId, fromMastodonId, fetchMeta, metaToPugArgs, nyaify, hashPassword, verifyPassword, isOldPasswordAlgorithm, decodeReaction, countReactions, toDbReaction, removeOldAttestationChallenges, cpuInfo, cpuUsage, memoryUsage, storageUsage, AntennaSrc, DriveFileUsageHint, MutedNoteReason, NoteVisibility, NotificationType, PageVisibility, PollNoteVisibility, RelayStatus, UserEmojiModPerm, UserProfileFfvisibility, UserProfileMutingNotificationTypes, updateAntennasOnNewNote, fetchNodeinfo, nodeinfo_2_1, nodeinfo_2_0, Protocol, Inbound, Outbound, watchNote, unwatchNote, PushNotificationKind, sendPushNotification, publishToChannelStream, ChatEvent, publishToChatStream, ChatIndexEvent, publishToChatIndexStream, publishToBroadcastStream, publishToGroupChatStream, publishToModerationStream, getTimestamp, genId, genIdAt, generateSecureRandomString, generateUserToken } = nativeBinding
module.exports.SECOND = SECOND module.exports.SECOND = SECOND
module.exports.MINUTE = MINUTE module.exports.MINUTE = MINUTE
@ -337,6 +337,7 @@ module.exports.extractHost = extractHost
module.exports.toPuny = toPuny module.exports.toPuny = toPuny
module.exports.isUnicodeEmoji = isUnicodeEmoji module.exports.isUnicodeEmoji = isUnicodeEmoji
module.exports.sqlLikeEscape = sqlLikeEscape module.exports.sqlLikeEscape = sqlLikeEscape
module.exports.sqlRegexEscape = sqlRegexEscape
module.exports.safeForSql = safeForSql module.exports.safeForSql = safeForSql
module.exports.formatMilliseconds = formatMilliseconds module.exports.formatMilliseconds = formatMilliseconds
module.exports.getImageSizeFromUrl = getImageSizeFromUrl module.exports.getImageSizeFromUrl = getImageSizeFromUrl

View file

@ -1,8 +1,17 @@
use once_cell::sync::Lazy;
use regex::Regex;
#[crate::export] #[crate::export]
pub fn sql_like_escape(src: &str) -> String { pub fn sql_like_escape(src: &str) -> String {
src.replace('%', r"\%").replace('_', r"\_") src.replace('%', r"\%").replace('_', r"\_")
} }
#[crate::export]
pub fn sql_regex_escape(src: &str) -> String {
static RE: Lazy<Regex> = Lazy::new(|| Regex::new(r"[!$()*+.:<=>?\[\]\^{|}-]").unwrap());
RE.replace_all(src, r"\$1").to_string()
}
#[crate::export] #[crate::export]
pub fn safe_for_sql(src: &str) -> bool { pub fn safe_for_sql(src: &str) -> bool {
!src.contains([ !src.contains([

View file

@ -1,3 +0,0 @@
export function sqlRegexEscape(s: string) {
return s.replace(/([!$()*+.:<=>?[\\\]^{|}-])/g, "\\$1");
}

View file

@ -3,8 +3,7 @@ import {
type SelectQueryBuilder, type SelectQueryBuilder,
type WhereExpressionBuilder, type WhereExpressionBuilder,
} from "typeorm"; } from "typeorm";
import { sqlLikeEscape } from "backend-rs"; import { sqlLikeEscape, sqlRegexEscape } from "backend-rs";
import { sqlRegexEscape } from "@/misc/sql-regex-escape.js";
import { import {
Followings, Followings,
NoteFavorites, NoteFavorites,