@@ -10,30 +10,39 @@ import {
1010 Addon ,
1111 suggestedEditorConfig ,
1212 visitElements ,
13- watchSize
13+ watchSize ,
1414} from "../core" ;
1515import { cm_t } from "../core/type" ;
1616import {
1717 registerFolder ,
1818 breakMark ,
1919 FolderFunc ,
20- RequestRangeResult
20+ RequestRangeResult ,
2121} from "./fold" ;
2222import "./read-link" ;
2323
2424/********************************************************************************** */
2525/**
2626 * Before folding HTML, check its security and avoid XSS attack! Returns true if safe.
2727 */
28- export type CheckerFunc = ( html : string , pos : Position , cm : cm_t ) => boolean ;
28+ export type CheckerFunc = ( html : string ) => boolean ;
2929
30- export var defaultChecker : CheckerFunc = html => {
30+ // export type CheckerFunc = (html: string, pos: Position, cm: cm_t) => boolean;
31+ export var defaultChecker : CheckerFunc = ( html ) => {
3132 // TODO: read https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
3233
33- if ( / ^ < (?: b r ) / i. test ( html ) ) return false ; // check first element...
34- if ( / < (?: s c r i p t | s t y l e | l i n k | m e t a ) / i. test ( html ) ) return false ; // don't allow some tags
35- if ( / \s o n \w + \s * = / i. test ( html ) ) return false ; // don't allow `onclick=` etc.
36- if ( / s r c \s * = \s * [ " ' ] ? j a v a s c r i p t : / i. test ( html ) ) return false ; // don't allow `src="javascript:` etc.
34+ if ( / ^ < (?: b r ) / i. test ( html ) ) {
35+ return false ; // check first element...
36+ }
37+ if ( / < (?: s c r i p t | s t y l e | l i n k | m e t a | o b j e c t | e m b e d | i f r a m e ) / i. test ( html ) ) {
38+ return false ; // don't allow some tags
39+ }
40+ if ( / \s o n \w + \s * = / i. test ( html ) ) {
41+ return false ; // don't allow `onclick=` etc.
42+ }
43+ if ( / ( s r c | b a c k g r o u n d | h r e f ) \s * = \s * [ " ' ] ? j a v a s c r i p t : / i. test ( html ) ) {
44+ return false ; // don't allow `src="javascript:` etc.
45+ }
3746 return true ;
3847} ;
3948
@@ -89,11 +98,12 @@ export var defaultRenderer: RendererFunc = (
8998 }
9099
91100 var innerHTML = html . slice ( startCh , endCh ) ;
92- if ( innerHTML ) ans . innerHTML = innerHTML ;
101+ if ( innerHTML ) {
102+ ans . innerHTML = innerHTML ;
103+ }
93104
94105 // resolve relative URLs and change default behavoirs
95-
96- visitElements ( [ ans ] , el => {
106+ visitElements ( [ ans ] , ( el ) => {
97107 const tagName = el . tagName . toLowerCase ( ) ;
98108
99109 if ( tagName === "a" ) {
@@ -106,7 +116,7 @@ export var defaultRenderer: RendererFunc = (
106116 const urlAttrs : string [ ] = {
107117 a : [ "href" ] ,
108118 img : [ "src" ] ,
109- iframe : [ "src" ]
119+ iframe : [ "src" ] ,
110120 } [ tagName ] ;
111121
112122 if ( urlAttrs ) {
@@ -167,7 +177,7 @@ export const HTMLFolder: FolderFunc = (stream, token) => {
167177 var addon = getAddon ( cm ) ;
168178 var html : string = cm . getRange ( from , to ) ;
169179
170- if ( ! addon . checker ( html , from , cm ) ) return null ; // security check
180+ if ( ! addon . checker ( html ) ) return null ; // security check
171181
172182 // security check pass!
173183
@@ -204,7 +214,7 @@ export const defaultOption: Options = {
204214 checker : defaultChecker ,
205215 renderer : defaultRenderer ,
206216 stubText : "<HTML>" ,
207- isolatedTagName : / ^ (?: d i v | p r e | f o r m | t a b l e | i f r a m e | u l | o l | i n p u t | t e x t a r e a | p | s u m m a r y | a ) $ / i
217+ isolatedTagName : / ^ (?: d i v | p r e | f o r m | t a b l e | i f r a m e | u l | o l | i n p u t | t e x t a r e a | p | s u m m a r y | a ) $ / i,
208218} ;
209219
210220export const suggestedOption : Partial < Options > = { } ;
@@ -228,7 +238,7 @@ declare global {
228238
229239suggestedEditorConfig . hmdFoldHTML = suggestedOption ;
230240
231- CodeMirror . defineOption ( "hmdFoldHTML" , defaultOption , function (
241+ CodeMirror . defineOption ( "hmdFoldHTML" , defaultOption , function (
232242 cm : cm_t ,
233243 newVal : OptionValueType
234244) {
@@ -286,7 +296,6 @@ export class FoldHTML implements Addon.Addon, Options {
286296 inlineMode ?: boolean
287297 ) : CodeMirror . TextMarker {
288298 const cm = this . cm ;
289-
290299 var stub = this . makeStub ( ) ;
291300 var el = this . renderer ( html , from , cm ) ;
292301 var breakFn = ( ) => breakMark ( cm , marker ) ;
@@ -313,7 +322,7 @@ export class FoldHTML implements Addon.Addon, Options {
313322 /** If element size changed, we notify CodeMirror */
314323 var watcher = watchSize ( el , ( w , h ) => {
315324 const computedStyle = getComputedStyle ( el ) ;
316- const getStyle = name => computedStyle . getPropertyValue ( name ) ;
325+ const getStyle = ( name ) => computedStyle . getPropertyValue ( name ) ;
317326
318327 var floating =
319328 w < 10 ||
@@ -343,7 +352,7 @@ export class FoldHTML implements Addon.Addon, Options {
343352 above : false ,
344353 coverGutter : false ,
345354 noHScroll : false ,
346- showIfHidden : false
355+ showIfHidden : false ,
347356 } ) ;
348357
349358 let highlightON = ( ) => ( stub . className = stubClassHighlight ) ;
@@ -367,7 +376,7 @@ export class FoldHTML implements Addon.Addon, Options {
367376 }
368377
369378 marker = cm . markText ( from , to , {
370- replacedWith
379+ replacedWith,
371380 } ) ;
372381
373382 return marker ;
0 commit comments