このコミットが含まれているのは:
@@ -1,4 +1,5 @@
|
||||
import type { PostImportOrigin,
|
||||
PostImportExistingPost,
|
||||
PostImportResetSnapshot,
|
||||
PostImportRow,
|
||||
PostImportSession,
|
||||
@@ -200,6 +201,25 @@ const sanitiseResetSnapshot = (value: unknown): PostImportResetSnapshot | null =
|
||||
metadataUrl: value.metadataUrl as string | undefined }
|
||||
}
|
||||
|
||||
const sanitiseExistingPost = (value: unknown): PostImportExistingPost | undefined => {
|
||||
if (value == null)
|
||||
return undefined
|
||||
if (!(isPlainObject (value)))
|
||||
return undefined
|
||||
if (!(isPositiveInteger (value.id)))
|
||||
return undefined
|
||||
if (typeof value.title !== 'string' || typeof value.url !== 'string')
|
||||
return undefined
|
||||
if (value.thumbnailUrl != null && typeof value.thumbnailUrl !== 'string')
|
||||
return undefined
|
||||
|
||||
return {
|
||||
id: Number (value.id),
|
||||
title: value.title,
|
||||
url: value.url,
|
||||
thumbnailUrl: value.thumbnailUrl as string | undefined }
|
||||
}
|
||||
|
||||
|
||||
const sanitiseRow = (value: unknown): PostImportRow | null => {
|
||||
if (!(isPlainObject (value)))
|
||||
@@ -289,6 +309,7 @@ const sanitiseRow = (value: unknown): PostImportRow | null => {
|
||||
skipReason: value.skipReason ?? undefined,
|
||||
existingPostId:
|
||||
isPositiveInteger (value.existingPostId) ? Number (value.existingPostId) : undefined,
|
||||
existingPost: sanitiseExistingPost (value.existingPost),
|
||||
metadataUrl: typeof value.metadataUrl === 'string' ? value.metadataUrl : undefined,
|
||||
resetSnapshot,
|
||||
createdPostId:
|
||||
@@ -297,6 +318,26 @@ const sanitiseRow = (value: unknown): PostImportRow | null => {
|
||||
recoverable: value.recoverable === true ? true : undefined }
|
||||
}
|
||||
|
||||
const sanitiseSession = (value: unknown): PostImportSession | null => {
|
||||
if (!(isPlainObject (value)))
|
||||
return null
|
||||
if (value.version !== SESSION_VERSION || !(Array.isArray (value.rows)))
|
||||
return null
|
||||
if (typeof value.expiresAt !== 'string' || isExpiredSession (value.expiresAt))
|
||||
return null
|
||||
|
||||
const rows = value.rows.map (sanitiseRow)
|
||||
if (rows.some (row => row == null))
|
||||
return null
|
||||
|
||||
return {
|
||||
version: SESSION_VERSION,
|
||||
expiresAt: value.expiresAt,
|
||||
source: typeof value.source === 'string' ? value.source : '',
|
||||
rows: rows as PostImportRow[],
|
||||
repairMode: value.repairMode === 'failed' ? 'failed' : 'all' }
|
||||
}
|
||||
|
||||
|
||||
const isExpiredSession = (expiresAt: string): boolean => {
|
||||
const value = Date.parse (expiresAt)
|
||||
@@ -332,11 +373,7 @@ export const cleanupExpiredPostImportSessions = (
|
||||
|
||||
try
|
||||
{
|
||||
const value = JSON.parse (raw) as { expiresAt?: string
|
||||
rows?: unknown[] }
|
||||
if (typeof value.expiresAt !== 'string'
|
||||
|| isExpiredSession (value.expiresAt)
|
||||
|| !(Array.isArray (value.rows)))
|
||||
if (sanitiseSession (JSON.parse (raw)) == null)
|
||||
{
|
||||
sessionStorage.removeItem (key)
|
||||
--i
|
||||
@@ -422,25 +459,13 @@ export const loadPostImportSession = (
|
||||
|
||||
try
|
||||
{
|
||||
const value = JSON.parse (raw) as Partial<PostImportSession>
|
||||
if (value.version !== SESSION_VERSION || !(Array.isArray (value.rows)))
|
||||
return null
|
||||
if (typeof value.expiresAt !== 'string' || isExpiredSession (value.expiresAt))
|
||||
const session = sanitiseSession (JSON.parse (raw))
|
||||
if (session == null)
|
||||
{
|
||||
removeStorage (sessionKey (validatedId), onError)
|
||||
return null
|
||||
}
|
||||
|
||||
const rows = value.rows.map (sanitiseRow)
|
||||
if (rows.some (row => row == null))
|
||||
return null
|
||||
|
||||
return {
|
||||
version: SESSION_VERSION,
|
||||
expiresAt: value.expiresAt,
|
||||
source: typeof value.source === 'string' ? value.source : '',
|
||||
rows: rows as PostImportRow[],
|
||||
repairMode: value.repairMode === 'failed' ? 'failed' : 'all' }
|
||||
return session
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
新しい課題から参照
ユーザをブロックする