fix(read): allow reading base64 files from a dataURI scheme #2763

Merged
AbdelrahmanHafez merged 3 commits from gh-2762 into master 2022-08-08 20:41:10 +00:00
4 changed files with 37 additions and 7 deletions

@ -48,7 +48,9 @@ function Base64_encode_pass(input) {
function Base64_decode(input) {
var o = "";
var c1 = 0, c2 = 0, c3 = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0;
input = input.replace(/[^\w\+\/\=]/g, "");
input = input.replace(/^data:([^\/]+\/[^\/]+)?;base64,/, '')
.replace(/[^\w\+\/\=]/g, "");
for (var i = 0; i < input.length; ) {
e1 = Base64_map.indexOf(input.charAt(i++));
e2 = Base64_map.indexOf(input.charAt(i++));

@ -48,7 +48,9 @@ function Base64_encode_pass(input) {
function Base64_decode(input) {
var o = "";
var c1 = 0, c2 = 0, c3 = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0;
input = input.replace(/[^\w\+\/\=]/g, "");
input = input.replace(/^data:.+\/.+;base64\,/,'')
.replace(/[^\w\+\/\=]/g, "")
for (var i = 0; i < input.length; ) {
e1 = Base64_map.indexOf(input.charAt(i++));
e2 = Base64_map.indexOf(input.charAt(i++));

@ -40,7 +40,8 @@ function Base64_encode_pass(input: string): string {
function Base64_decode(input: string): string {
var o = "";
var c1=0, c2=0, c3=0, e1=0, e2=0, e3=0, e4=0;
input = input.replace(/[^\w\+\/\=]/g, "");
input = input.replace(/^data:.+\/.+;base64\,/,'')
.replace(/[^\w\+\/\=]/g, "")
for(var i = 0; i < input.length;) {
e1 = Base64_map.indexOf(input.charAt(i++));
e2 = Base64_map.indexOf(input.charAt(i++));

33
test.js

@ -688,6 +688,31 @@ describe('input formats', function() {
it('should read base64 strings', function() { artifax.forEach(function(p) {
X.read(fs.readFileSync(p, 'base64'), {type: 'base64'});
}); });
it('handles base64 within data URI scheme (gh-2762)', function() {
// Arrange
var fileInBase64 = 'TmFtZXMNCkhhZmV6DQpTYW0NCg==';
var fileInBase64WithDataURIScheme = 'data:text/csv;base64,TmFtZXMNCkhhZmV6DQpTYW0NCg==';
// Act
var workBookFromRawBase64 = X.read(fileInBase64, { type: 'base64' });
var workBookFromBase64WithinDataURI = X.read(fileInBase64WithDataURIScheme, { type: 'base64' });
// Assert
assert.deepStrictEqual(workBookFromRawBase64, workBookFromBase64WithinDataURI);
});
it('handles base64 where data URI has no media type (gh-2762)', function() {
// Arrange
var fileInBase64 = 'TmFtZXMNCkhhZmV6DQpTYW0NCg==';
var fileInBase64WithDataURIScheme = 'data:;base64,TmFtZXMNCkhhZmV6DQpTYW0NCg==';
// Act
var workBookFromRawBase64 = X.read(fileInBase64, { type: 'base64' });
var workBookFromBase64WithinDataURI = X.read(fileInBase64WithDataURIScheme, { type: 'base64' });
// Assert
assert.deepStrictEqual(workBookFromRawBase64, workBookFromBase64WithinDataURI);
});
if(typeof Uint8Array !== 'undefined') it('should read array', function() { artifax.forEach(function(p) {
X.read(fs.readFileSync(p, 'binary').split("").map(function(x) { return x.charCodeAt(0); }), {type:'array'});
}); });
@ -1393,7 +1418,7 @@ describe('parse features', function() {
});
describe('data types formats', function() {[
['xlsx', paths.dtfxlsx],
['xlsx', paths.dtfxlsx]
].forEach(function(m) { it(m[0], function() {
var wb = X.read(fs.readFileSync(m[1]), {type: TYPE, cellDates: true});
var ws = wb.Sheets[wb.SheetNames[0]];
@ -2109,7 +2134,7 @@ function plaintext_test(wb, raw) {
var sheet = wb.Sheets[wb.SheetNames[0]];
plaintext_val.forEach(function(x) {
var cell = get_cell(sheet, x[0]);
var tcval = x[2+(!!raw ? 1 : 0)];
var tcval = x[2+(raw ? 1 : 0)];
var type = raw ? 's' : x[1];
if(x.length == 1) { if(cell) { assert.equal(cell.t, 'z'); assert.ok(!cell.v); } return; }
assert.equal(cell.v, tcval); assert.equal(cell.t, type);
@ -2201,8 +2226,8 @@ describe('CSV', function() {
var aoa = [
["3a", "3 a", "3 a-1"],
["3b", "3 b", "3 b-1"],
["3p", "3 P", "3 p-1"],
]
["3p", "3 P", "3 p-1"]
];
var ws = X.read(aoa.map(function(row) { return row.join(","); }).join("\n"), {type: "string", cellDates: true}).Sheets.Sheet1;
for(var R = 0; R < 3; ++R) {
assert.equal(get_cell(ws, "A" + (R+1)).v, aoa[R][0]);