CVE-2019-25094 (HTML, published 2023-01-04T10:15Z)
Description: value: A vulnerability, which was classified as problematic, was found in innologi appointments Extension up to 2.0.5 on TYPO3. This affects an unknown part of the component Appointment Handler. The manipulation of the argument formfield leads to cross site scripting. It is possible to initiate the attack remotely. Upgrading to version 2.0.6 is able to address this issue. The identifier of the patch is 986d3cb34e5e086c6f04e061f600ffc5837abe7f. It is recommended to upgrade the affected component. The identifier VDB-217353 was assigned to this vulnerability.
Severity: nan (CVSS v3 base score: 6.1)
Weakness: CWE-79 \u2014 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
The product does not neutralize or incorrectly neutralizes user-controllable input before it is placed in output that is used as a web page that is served to other users.
Repository: https://github.com/innologi/typo3-appointments
Files changed:
Resources/Private/Partials/Address/Properties.html
Resources/Private/Partials/Agenda/Week.html
Resources/Private/Partials/Appointment/Properties.html
Resources/Private/Partials/Appointment/Unfinished.html
Resources/Private/Partials/FormField/FormField5.html
Resources/Private/Partials/FormField/Properties.html
Resources/Private/Partials/FormField/Property2.html
Resources/Private/Partials/FormField/Property3.html
Resources/Private/Partials/FormField/Property4.html
Resources/Private/Partials/FormField/Property5.html
Resources/Private/Templates/Appointment/List.html
Commit message: [BUGFIX] Prevent XSS on various formfield values

Also, use the standalone Fluid's htmlspecialchars VH instead of TYPO3's
htmlentities VH. They're essentially the same, but going with the former
increases the portability of our code.

Vulnerable code:
		<td><f:format.html>{address.name}</f:format.html></td>
		<td><f:format.html>{address.socialSecurityNumber}</f:format.html></td>
		<td><f:format.date format="d-m-Y">{address.birthday}</f:format.date></td>
			<f:format.html>{address.address}<br />{address.zip} {address.city}</f:format.html>
		<td><f:format.html>{address.email}</f:format.html></td>
							<f:format.htmlentities>{appointment.type.name}</f:format.htmlentities>
		<td><f:format.htmlentities>{appointment.type.name}</f:format.htmlentities></td>
			<td>{f:if(condition:appointment.feUser.name, then:appointment.feUser.name, else:appointment.feUser.username)}</td>
			<td><f:format.html>{appointment.notes}</f:format.html></td>
			<td><f:format.html>{appointment.notesSu}</f:format.html></td>
									<f:format.htmlentities>{appointment.type.name}</f:format.htmlentities>
									<f:format.htmlentities>{appointment.type.name}</f:format.htmlentities>
	/> <f:format.htmlentities>{choiceValue}</f:format.htmlentities>
		<td scope="row"><f:format.html>{formField.label}</f:format.html></td>
<f:format.html>{formField.choicesArray.{formFieldValue.value}}</f:format.html>
<f:format.html>{formFieldValue.value}</f:format.html>
<f:format.html>{formFieldValue.value}</f:format.html>
<f:format.html>{formField.choicesArray.{formFieldValue.value}}</f:format.html>
					<f:format.htmlentities>{appointment.type.name}</f:format.htmlentities>

Fixed code:
		<td><f:format.htmlspecialchars>{address.name}</f:format.htmlspecialchars></td>
		<td><f:format.htmlspecialchars>{address.socialSecurityNumber}</f:format.htmlspecialchars></td>
		<td><f:format.htmlspecialchars>
			<f:format.date format="d-m-Y">{address.birthday}</f:format.date>
		</f:format.htmlspecialchars></td>
			<f:format.htmlspecialchars>{address.address}</f:format.htmlspecialchars>
			<br />
			<f:format.htmlspecialchars>{address.zip} {address.city}</f:format.htmlspecialchars>
		<td><f:format.htmlspecialchars>{address.email}</f:format.htmlspecialchars></td>
							<f:format.htmlspecialchars>{appointment.type.name}</f:format.htmlspecialchars>
		<td><f:format.htmlspecialchars>{appointment.type.name}</f:format.htmlspecialchars></td>
			<td><f:format.htmlspecialchars>
				{f:if(condition:appointment.feUser.name, then:appointment.feUser.name, else:appointment.feUser.username)}
			</f:format.htmlspecialchars></td>
			<td><f:format.htmlspecialchars>{appointment.notes}</f:format.htmlspecialchars></td>
			<td><f:format.htmlspecialchars>{appointment.notesSu}</f:format.htmlspecialchars></td>
									<f:format.htmlspecialchars>{appointment.type.name}</f:format.htmlspecialchars>
									<f:format.htmlspecialchars>{appointment.type.name}</f:format.htmlspecialchars>
	/> <f:format.htmlspecialchars>{choiceValue}</f:format.htmlspecialchars>
		<td scope="row"><f:format.htmlspecialchars>{formField.label}</f:format.htmlspecialchars></td>
<f:format.htmlspecialchars>{formField.choicesArray.{formFieldValue.value}}</f:format.htmlspecialchars>
<f:format.htmlspecialchars>{formFieldValue.value}</f:format.htmlspecialchars>
<f:format.htmlspecialchars>{formFieldValue.value}</f:format.htmlspecialchars>
<f:format.htmlspecialchars>{formField.choicesArray.{formFieldValue.value}}</f:format.htmlspecialchars>
					<f:format.htmlspecialchars>{appointment.type.name}</f:format.htmlspecialchars>