Skip to content

Commit

Permalink
test(unit): add test cases on isExternal. (#1515)
Browse files Browse the repository at this point in the history
* test(unit): add test cases on xss.
  • Loading branch information
Koooooo-7 committed Feb 26, 2021
1 parent a8016c8 commit abda30d
Show file tree
Hide file tree
Showing 3 changed files with 96 additions and 27 deletions.
28 changes: 1 addition & 27 deletions src/core/fetch/index.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/* eslint-disable no-unused-vars */
import { callHook } from '../init/lifecycle';
import { getParentPath, stringifyQuery } from '../router/util';
import { noop } from '../util/core';
import { noop, isExternal } from '../util/core';
import { getAndActive } from '../event/sidebar';
import { get } from './ajax';

Expand All @@ -20,32 +20,6 @@ function loadNested(path, qs, file, next, vm, first) {
).then(next, _ => loadNested(path, qs, file, next, vm));
}

function isExternal(url) {
let match = url.match(
/^([^:/?#]+:)?(?:\/{2,}([^/?#]*))?([^?#]+)?(\?[^#]*)?(#.*)?/
);
if (
typeof match[1] === 'string' &&
match[1].length > 0 &&
match[1].toLowerCase() !== location.protocol
) {
return true;
}
if (
typeof match[2] === 'string' &&
match[2].length > 0 &&
match[2].replace(
new RegExp(
':(' + { 'http:': 80, 'https:': 443 }[location.protocol] + ')?$'
),
''
) !== location.host
) {
return true;
}
return false;
}

export function fetchMixin(proto) {
let last;

Expand Down
32 changes: 32 additions & 0 deletions src/core/util/core.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,3 +66,35 @@ export function noop() {}
export function isFn(obj) {
return typeof obj === 'function';
}

/**
* Check if url is external
* @param {String} string url
* @returns {Boolean} True if the passed-in url is external
*/
export function isExternal(url) {
let match = url.match(
/^([^:/?#]+:)?(?:\/{2,}([^/?#]*))?([^?#]+)?(\?[^#]*)?(#.*)?/
);

if (
typeof match[1] === 'string' &&
match[1].length > 0 &&
match[1].toLowerCase() !== location.protocol
) {
return true;
}
if (
typeof match[2] === 'string' &&
match[2].length > 0 &&
match[2].replace(
new RegExp(
':(' + { 'http:': 80, 'https:': 443 }[location.protocol] + ')?$'
),
''
) !== location.host
) {
return true;
}
return false;
}
63 changes: 63 additions & 0 deletions test/unit/core-util.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
const { isExternal } = require('../../src/core/util');

// Core util
// -----------------------------------------------------------------------------
describe('core/util', () => {
// isExternal()
// ---------------------------------------------------------------------------
describe('isExternal()', () => {
// cases non external
test('non external local url with one /', () => {
const result = isExternal(`/${location.host}/docsify/demo.md`);

expect(result).toBeFalsy();
});

test('non external local url with two //', () => {
const result = isExternal(`//${location.host}/docsify/demo.md`);

expect(result).toBeFalsy();
});

test('non external local url with three ///', () => {
const result = isExternal(`///${location.host}/docsify/demo.md`);

expect(result).toBeFalsy();
});

test('non external local url with more /', () => {
const result = isExternal(
`//////////////////${location.host}/docsify/demo.md`
);

expect(result).toBeFalsy();
});

test('non external url with one /', () => {
const result = isExternal('/example.github.io/docsify/demo.md');

expect(result).toBeFalsy();
});

// cases is external
test('external url with two //', () => {
const result = isExternal('/docsify/demo.md');

expect(result).toBeFalsy();
});

test('external url with three ///', () => {
const result = isExternal('///example.github.io/docsify/demo.md');

expect(result).toBeTruthy();
});

test('external url with more /', () => {
const result = isExternal(
'//////////////////example.github.io/docsify/demo.md'
);

expect(result).toBeTruthy();
});
});
});

1 comment on commit abda30d

@vercel
Copy link

@vercel vercel bot commented on abda30d Feb 26, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.