@@ -21,6 +21,7 @@ import { MatrixEvent } from "matrix-js-sdk/src/models/event";
21
21
import { renderToStaticMarkup } from "react-dom/server" ;
22
22
import { EventType , MsgType } from "matrix-js-sdk/src/@types/event" ;
23
23
import { logger } from "matrix-js-sdk/src/logger" ;
24
+ import escapeHtml from "escape-html" ;
24
25
25
26
import Exporter from "./Exporter" ;
26
27
import { mediaFromMxc } from "../../customisations/Media" ;
@@ -97,28 +98,36 @@ export default class HTMLExporter extends Exporter {
97
98
const exporter = this . room . client . getSafeUserId ( ) ;
98
99
const exporterName = this . room . getMember ( exporter ) ?. rawDisplayName ;
99
100
const topic = this . room . currentState . getStateEvents ( EventType . RoomTopic , "" ) ?. getContent ( ) ?. topic || "" ;
100
- const createdText = _t ( "%(creatorName)s created this room." , {
101
- creatorName,
102
- } ) ;
103
101
104
- const exportedText = renderToStaticMarkup (
102
+ const safeCreatedText = escapeHtml (
103
+ _t ( "%(creatorName)s created this room." , {
104
+ creatorName,
105
+ } ) ,
106
+ ) ;
107
+ const safeExporter = escapeHtml ( exporter ) ;
108
+ const safeRoomName = escapeHtml ( this . room . name ) ;
109
+ const safeTopic = escapeHtml ( topic ) ;
110
+ const safeExportedText = renderToStaticMarkup (
105
111
< p >
106
112
{ _t (
107
113
"This is the start of export of <roomName/>. Exported by <exporterDetails/> at %(exportDate)s." ,
108
114
{
109
115
exportDate,
110
116
} ,
111
117
{
112
- roomName : ( ) => < b > { this . room . name } </ b > ,
118
+ roomName : ( ) => < b > { safeRoomName } </ b > ,
113
119
exporterDetails : ( ) => (
114
- < a href = { `https://matrix.to/#/${ exporter } ` } target = "_blank" rel = "noopener noreferrer" >
120
+ < a
121
+ href = { `https://matrix.to/#/${ encodeURIComponent ( exporter ) } ` }
122
+ target = "_blank"
123
+ rel = "noopener noreferrer"
124
+ >
115
125
{ exporterName ? (
116
126
< >
117
- < b > { exporterName } </ b >
118
- { " (" + exporter + ")" }
127
+ < b > { escapeHtml ( exporterName ) } </ b > I { " (" + safeExporter + ")" }
119
128
</ >
120
129
) : (
121
- < b > { exporter } </ b >
130
+ < b > { safeExporter } </ b >
122
131
) }
123
132
</ a >
124
133
) ,
@@ -127,7 +136,7 @@ export default class HTMLExporter extends Exporter {
127
136
</ p > ,
128
137
) ;
129
138
130
- const topicText = topic ? _t ( "Topic: %(topic)s" , { topic } ) : "" ;
139
+ const safeTopicText = topic ? _t ( "Topic: %(topic)s" , { topic : safeTopic } ) : "" ;
131
140
const previousMessagesLink = renderToStaticMarkup (
132
141
currentPage !== 0 ? (
133
142
< div style = { { textAlign : "center" } } >
@@ -183,12 +192,12 @@ export default class HTMLExporter extends Exporter {
183
192
<div
184
193
dir="auto"
185
194
class="mx_RoomHeader_nametext"
186
- title="${ this . room . name } "
195
+ title="${ safeRoomName } "
187
196
>
188
- ${ this . room . name }
197
+ ${ safeRoomName }
189
198
</div>
190
199
</div>
191
- <div class="mx_RoomHeader_topic" dir="auto"> ${ topic } </div>
200
+ <div class="mx_RoomHeader_topic" dir="auto"> ${ safeTopic } </div>
192
201
</div>
193
202
</div>
194
203
${ previousMessagesLink }
@@ -214,10 +223,10 @@ export default class HTMLExporter extends Exporter {
214
223
currentPage == 0
215
224
? `<div class="mx_NewRoomIntro">
216
225
${ roomAvatar }
217
- <h2> ${ this . room . name } </h2>
218
- <p> ${ createdText } <br/><br/> ${ exportedText } </p>
226
+ <h2> ${ safeRoomName } </h2>
227
+ <p> ${ safeCreatedText } <br/><br/> ${ safeExportedText } </p>
219
228
<br/>
220
- <p> ${ topicText } </p>
229
+ <p> ${ safeTopicText } </p>
221
230
</div>`
222
231
: ""
223
232
}
0 commit comments