Skip to content

Commit

Permalink
Padding option added to dataUri like base64
Browse files Browse the repository at this point in the history
  • Loading branch information
Shudrum committed Jun 9, 2018
1 parent 840eaad commit 52fd99b
Show file tree
Hide file tree
Showing 2 changed files with 139 additions and 2 deletions.
13 changes: 11 additions & 2 deletions lib/types/string/index.js
Expand Up @@ -460,17 +460,26 @@ internals.String = class extends Any {
});
}

dataUri() {
dataUri(dataUriOptions = {}) {

const regex = /^data:[\w\/\+]+;((charset=[\w-]+|base64),)?(.*)$/;

// Determine if padding is required.
const paddingRequired = dataUriOptions.paddingRequired === false ?
dataUriOptions.paddingRequired
: dataUriOptions.paddingRequired || true;

const base64regex = paddingRequired ?
/^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$/
: /^(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}(==)?|[A-Za-z0-9+\/]{3}=?)?$/;

return this._test('dataUri', regex, function (value, state, options) {

const matches = value.match(regex);

if (matches &&
matches[2] === 'base64' &&
/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(matches[3])) {
base64regex.test(matches[3])) {
return value;
}
else if (matches && (!matches[2] || matches[2] !== 'base64')) {
Expand Down
128 changes: 128 additions & 0 deletions test/types/string.js
Expand Up @@ -10144,6 +10144,134 @@ describe('string', () => {
]);
});

it('validates a dataUri string with padding explicitly required', () => {

const rule = Joi.string().dataUri({ paddingRequired: true });
Helper.validate(rule, [
['data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAABJRU5ErkJggg==', true],
['ata:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAABJRU5ErkJggg==', false, null, {
message: '"value" must be a valid dataUri string',
details: [{
message: '"value" must be a valid dataUri string',
path: [],
type: 'string.dataUri',
context: {
value: 'ata:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAABJRU5ErkJggg==',
label: 'value',
key: undefined
}
}]
}],
['data:image/png;iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAABJRU5ErkJggg==', true],
['base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAABJRU5ErkJggg==', false, null, {
message: '"value" must be a valid dataUri string',
details: [{
message: '"value" must be a valid dataUri string',
path: [],
type: 'string.dataUri',
context: {
value: 'base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAABJRU5ErkJggg==',
label: 'value',
key: undefined
}
}]
}],
['data:base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAABJRU5ErkJggg==', false, null, {
message: '"value" must be a valid dataUri string',
details: [{
message: '"value" must be a valid dataUri string',
path: [],
type: 'string.dataUri',
context: {
value: 'data:base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAABJRU5ErkJggg==',
label: 'value',
key: undefined
}
}]
}],
['data:image/png;base64,=YW55IGNhcm5hbCBwbGVhc3VyZS4', false, null, {
message: '"value" must be a valid dataUri string',
details: [{
message: '"value" must be a valid dataUri string',
path: [],
type: 'string.dataUri',
context: {
value: 'data:image/png;base64,=YW55IGNhcm5hbCBwbGVhc3VyZS4',
label: 'value',
key: undefined
}
}]
}],
['data:image/png;base64,YW55IGNhcm5hbCBwbGVhc3VyZS4=', true],
['data:image/png;charset=utf-8,=YW55IGNhcm5hbCBwbGVhc3VyZS', true]
]);

});

it('validates a dataUri string with padding not required', () => {

const rule = Joi.string().dataUri({ paddingRequired: false });
Helper.validate(rule, [
['data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAABJRU5ErkJggg==', true],
['ata:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAABJRU5ErkJggg==', false, null, {
message: '"value" must be a valid dataUri string',
details: [{
message: '"value" must be a valid dataUri string',
path: [],
type: 'string.dataUri',
context: {
value: 'ata:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAABJRU5ErkJggg==',
label: 'value',
key: undefined
}
}]
}],
['data:image/png;iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAABJRU5ErkJggg==', true],
['base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAABJRU5ErkJggg==', false, null, {
message: '"value" must be a valid dataUri string',
details: [{
message: '"value" must be a valid dataUri string',
path: [],
type: 'string.dataUri',
context: {
value: 'base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAABJRU5ErkJggg==',
label: 'value',
key: undefined
}
}]
}],
['data:base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAABJRU5ErkJggg==', false, null, {
message: '"value" must be a valid dataUri string',
details: [{
message: '"value" must be a valid dataUri string',
path: [],
type: 'string.dataUri',
context: {
value: 'data:base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAABJRU5ErkJggg==',
label: 'value',
key: undefined
}
}]
}],
['data:image/png;base64,=YW55IGNhcm5hbCBwbGVhc3VyZS4', false, null, {
message: '"value" must be a valid dataUri string',
details: [{
message: '"value" must be a valid dataUri string',
path: [],
type: 'string.dataUri',
context: {
value: 'data:image/png;base64,=YW55IGNhcm5hbCBwbGVhc3VyZS4',
label: 'value',
key: undefined
}
}]
}],
['data:image/png;base64,YW55IGNhcm5hbCBwbGVhc3VyZS4=', true],
['data:image/png;charset=utf-8,=YW55IGNhcm5hbCBwbGVhc3VyZS', true]
]);

});

it('validates combination of uppercase, min, max, alphanum and valid', () => {

const rule = Joi.string().uppercase().min(2).max(3).alphanum().valid('AB', 'BC');
Expand Down

0 comments on commit 52fd99b

Please sign in to comment.