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:
Tilman Vatteroth 2021-10-01 22:51:57 +02:00 committed by GitHub
parent 0e512531a0
commit 87d6285da5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 17 additions and 11 deletions

View file

@ -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>

View file

@ -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[] = []
/** /**

View file

@ -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'

View file

@ -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>
} }

View file

@ -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)

View file

@ -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

View file

@ -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' />

View file

@ -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()
} }
} }