mirror of
https://github.com/hedgedoc/hedgedoc.git
synced 2025-05-14 07:04:45 -04:00
Fix security related problems (#1522)
* Remove unnecessary capture group from regex Signed-off-by: Tilman Vatteroth <git@tilmanvatteroth.de> * Rename component to make name more expressive Signed-off-by: Tilman Vatteroth <git@tilmanvatteroth.de> * Remove redundant expression Signed-off-by: Tilman Vatteroth <git@tilmanvatteroth.de> * Filter vbscript links Signed-off-by: Tilman Vatteroth <git@tilmanvatteroth.de> * Remove superfluous parameter Signed-off-by: Tilman Vatteroth <git@tilmanvatteroth.de> * Check if handler is set Signed-off-by: Tilman Vatteroth <git@tilmanvatteroth.de> * Fix doc Signed-off-by: Tilman Vatteroth <git@tilmanvatteroth.de>
This commit is contained in:
parent
0e512531a0
commit
87d6285da5
8 changed files with 17 additions and 11 deletions
|
@ -15,9 +15,12 @@ interface RouteParameters {
|
||||||
id: string
|
id: string
|
||||||
}
|
}
|
||||||
|
|
||||||
export const Redirector: React.FC = () => {
|
/**
|
||||||
|
* Redirects the user to the editor if the link is a root level direct link to a version 1 note.
|
||||||
|
*/
|
||||||
|
export const NoteDirectLinkRedirector: React.FC = () => {
|
||||||
const { id } = useParams<RouteParameters>()
|
const { id } = useParams<RouteParameters>()
|
||||||
const [error, setError] = useState<boolean | null>(null)
|
const [error, setError] = useState<boolean | undefined>(undefined)
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
getNote(id)
|
getNote(id)
|
||||||
|
@ -25,9 +28,9 @@ export const Redirector: React.FC = () => {
|
||||||
.catch(() => setError(true))
|
.catch(() => setError(true))
|
||||||
}, [id])
|
}, [id])
|
||||||
|
|
||||||
if (error) {
|
if (error === true) {
|
||||||
return <NotFoundErrorScreen />
|
return <NotFoundErrorScreen />
|
||||||
} else if (!error && error != null) {
|
} else if (error === false) {
|
||||||
return <Redirect to={`/n/${id}`} />
|
return <Redirect to={`/n/${id}`} />
|
||||||
} else {
|
} else {
|
||||||
return <span>Loading</span>
|
return <span>Loading</span>
|
|
@ -12,7 +12,7 @@ import { Logger } from '../../../../utils/logger'
|
||||||
type highlightJsImport = typeof import('../../../common/hljs/hljs')
|
type highlightJsImport = typeof import('../../../common/hljs/hljs')
|
||||||
|
|
||||||
const log = new Logger('Autocompletion > CodeBlock')
|
const log = new Logger('Autocompletion > CodeBlock')
|
||||||
const wordRegExp = /^```((\w|-|_|\+)*)$/
|
const wordRegExp = /^```((?:\w|-|_|\+)*)$/
|
||||||
let allSupportedLanguages: string[] = []
|
let allSupportedLanguages: string[] = []
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -8,7 +8,7 @@ import { Editor, Hint, Hints, Pos } from 'codemirror'
|
||||||
import { validAlertLevels } from '../../../markdown-renderer/markdown-it-plugins/alert-container'
|
import { validAlertLevels } from '../../../markdown-renderer/markdown-it-plugins/alert-container'
|
||||||
import { findWordAtCursor, Hinter } from './index'
|
import { findWordAtCursor, Hinter } from './index'
|
||||||
|
|
||||||
const wordRegExp = /^:::((\w|-|_|\+)*)$/
|
const wordRegExp = /^:::((?:\w|-|_|\+)*)$/
|
||||||
const spoilerSuggestion: Hint = {
|
const spoilerSuggestion: Hint = {
|
||||||
text: ':::spoiler Toggle label\nToggled content\n::: \n',
|
text: ':::spoiler Toggle label\nToggled content\n::: \n',
|
||||||
displayText: 'spoiler'
|
displayText: 'spoiler'
|
||||||
|
|
|
@ -36,7 +36,7 @@ export class LinkReplacer extends ComponentReplacer {
|
||||||
const url = node.attribs.href.trim()
|
const url = node.attribs.href.trim()
|
||||||
|
|
||||||
// eslint-disable-next-line no-script-url
|
// eslint-disable-next-line no-script-url
|
||||||
if (url.startsWith('data:') || url.startsWith('javascript:')) {
|
if (url.startsWith('data:') || url.startsWith('javascript:') || url.startsWith('vbscript:')) {
|
||||||
return <span>{node.attribs.href}</span>
|
return <span>{node.attribs.href}</span>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -96,7 +96,7 @@ export const buildTransformer = (
|
||||||
return convertNodeToReactElement(node, index)
|
return convertNodeToReactElement(node, index)
|
||||||
}
|
}
|
||||||
const nativeRenderer: NativeRenderer = () => renderNativeNode(node, key, transform)
|
const nativeRenderer: NativeRenderer = () => renderNativeNode(node, key, transform)
|
||||||
const subNodeTransform: SubNodeTransform = (subNode, subKey) => transform(subNode, subKey, transform)
|
const subNodeTransform: SubNodeTransform = (subNode, subKey) => transform(subNode, subKey)
|
||||||
|
|
||||||
const key = calculateKeyFromLineMarker(node, lineKeys) ?? (-index).toString()
|
const key = calculateKeyFromLineMarker(node, lineKeys) ?? (-index).toString()
|
||||||
const tryReplacement = findNodeReplacement(node, allReplacers, subNodeTransform, nativeRenderer)
|
const tryReplacement = findNodeReplacement(node, allReplacers, subNodeTransform, nativeRenderer)
|
||||||
|
|
|
@ -121,6 +121,9 @@ export abstract class WindowPostMessageCommunicator<
|
||||||
protected handleEvent(event: MessageEvent<PostMessage<RECEIVE_TYPE>>): boolean | undefined {
|
protected handleEvent(event: MessageEvent<PostMessage<RECEIVE_TYPE>>): boolean | undefined {
|
||||||
const data = event.data
|
const data = event.data
|
||||||
|
|
||||||
|
if (!(data.type in this.handlers)) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
const handler = this.handlers[data.type]
|
const handler = this.handlers[data.type]
|
||||||
if (!handler) {
|
if (!handler) {
|
||||||
return true
|
return true
|
||||||
|
|
|
@ -10,7 +10,7 @@ import { Provider } from 'react-redux'
|
||||||
import { BrowserRouter as Router, Redirect, Route, Switch } from 'react-router-dom'
|
import { BrowserRouter as Router, Redirect, Route, Switch } from 'react-router-dom'
|
||||||
import { ApplicationLoader } from './components/application-loader/application-loader'
|
import { ApplicationLoader } from './components/application-loader/application-loader'
|
||||||
import { NotFoundErrorScreen } from './components/common/routing/not-found-error-screen'
|
import { NotFoundErrorScreen } from './components/common/routing/not-found-error-screen'
|
||||||
import { Redirector } from './components/common/routing/redirector'
|
import { NoteDirectLinkRedirector } from './components/common/routing/note-direct-link-redirector'
|
||||||
import { ErrorBoundary } from './components/error-boundary/error-boundary'
|
import { ErrorBoundary } from './components/error-boundary/error-boundary'
|
||||||
import { HistoryPage } from './components/history-page/history-page'
|
import { HistoryPage } from './components/history-page/history-page'
|
||||||
import { IntroPage } from './components/intro-page/intro-page'
|
import { IntroPage } from './components/intro-page/intro-page'
|
||||||
|
@ -83,7 +83,7 @@ ReactDOM.render(
|
||||||
<DocumentReadOnlyPage />
|
<DocumentReadOnlyPage />
|
||||||
</Route>
|
</Route>
|
||||||
<Route path='/:id'>
|
<Route path='/:id'>
|
||||||
<Redirector />
|
<NoteDirectLinkRedirector />
|
||||||
</Route>
|
</Route>
|
||||||
<Route path='/'>
|
<Route path='/'>
|
||||||
<Redirect to='/intro' />
|
<Redirect to='/intro' />
|
||||||
|
|
|
@ -158,7 +158,7 @@ const generateNoteTitle = (frontmatter: NoteFrontmatter, firstHeading?: string)
|
||||||
) {
|
) {
|
||||||
return (frontmatter?.opengraph.get('title') ?? firstHeading ?? '').trim()
|
return (frontmatter?.opengraph.get('title') ?? firstHeading ?? '').trim()
|
||||||
} else {
|
} else {
|
||||||
return (firstHeading ?? firstHeading ?? '').trim()
|
return (firstHeading ?? '').trim()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue