@@ -641,32 +641,34 @@ import { atob, btoa } from "../libs/AtobBtoa.js";
641
641
* @name extractImageFromDataUrl
642
642
* @function
643
643
* @param {string } dataUrl a valid data URI of format 'data:[<MIME-type>][;base64],<data>'
644
- * @returns {Array }an Array containing the following
645
- * [0] the complete data URI
646
- * [1] <MIME-type>
647
- * [2] format - the second part of the mime-type i.e 'png' in 'image/png'
648
- * [4] <data>
644
+ * @returns {string } The raw Base64-encoded data.
649
645
*/
650
646
var extractImageFromDataUrl = ( jsPDFAPI . __addimage__ . extractImageFromDataUrl = function (
651
647
dataUrl
652
648
) {
653
- dataUrl = dataUrl || "" ;
654
- var dataUrlParts = dataUrl . split ( "base64," ) ;
655
- var result = null ;
649
+ if ( dataUrl == null ) {
650
+ return null ;
651
+ }
656
652
657
- if ( dataUrlParts . length === 2 ) {
658
- var extractedInfo = / ^ d a t a : ( \w * \/ \w * ) ; * ( c h a r s e t = (? ! c h a r s e t = ) [ \w = - ] * ) * ; * $ / . exec (
659
- dataUrlParts [ 0 ]
660
- ) ;
661
- if ( Array . isArray ( extractedInfo ) ) {
662
- result = {
663
- mimeType : extractedInfo [ 1 ] ,
664
- charset : extractedInfo [ 2 ] ,
665
- data : dataUrlParts [ 1 ]
666
- } ;
667
- }
653
+ // avoid using a regexp for parsing because it might be vulnerable against ReDoS attacks
654
+
655
+ dataUrl = dataUrl . trim ( ) ;
656
+
657
+ if ( ! dataUrl . startsWith ( "data:" ) ) {
658
+ return null ;
668
659
}
669
- return result ;
660
+
661
+ const commaIndex = dataUrl . indexOf ( "," ) ;
662
+ if ( commaIndex < 0 ) {
663
+ return null ;
664
+ }
665
+
666
+ const dataScheme = dataUrl . substring ( 0 , commaIndex ) . trim ( ) ;
667
+ if ( ! dataScheme . endsWith ( "base64" ) ) {
668
+ return null ;
669
+ }
670
+
671
+ return dataUrl . substring ( commaIndex + 1 ) ;
670
672
} ) ;
671
673
672
674
/**
@@ -942,13 +944,11 @@ import { atob, btoa } from "../libs/AtobBtoa.js";
942
944
throwError
943
945
) {
944
946
throwError = typeof throwError === "boolean" ? throwError : true ;
945
- var base64Info ;
946
947
var imageData = "" ;
947
948
var rawData ;
948
949
949
950
if ( typeof stringData === "string" ) {
950
- base64Info = extractImageFromDataUrl ( stringData ) ;
951
- rawData = base64Info !== null ? base64Info . data : stringData ;
951
+ rawData = extractImageFromDataUrl ( stringData ) ?? stringData ;
952
952
953
953
try {
954
954
imageData = atob ( rawData ) ;
0 commit comments