|
@@ -1,3 +1,5 @@
|
|
|
|
|
+import { objectIdUtils } from '@growi/core/dist/utils';
|
|
|
|
|
+
|
|
|
import { validateReferer } from './validate-referer';
|
|
import { validateReferer } from './validate-referer';
|
|
|
|
|
|
|
|
const mocks = vi.hoisted(() => {
|
|
const mocks = vi.hoisted(() => {
|
|
@@ -11,6 +13,12 @@ vi.mock('./retrieve-site-url', () => ({ retrieveSiteUrl: mocks.retrieveSiteUrlMo
|
|
|
|
|
|
|
|
describe('validateReferer', () => {
|
|
describe('validateReferer', () => {
|
|
|
|
|
|
|
|
|
|
+ const isValidObjectIdSpy = vi.spyOn(objectIdUtils, 'isValidObjectId');
|
|
|
|
|
+
|
|
|
|
|
+ beforeEach(() => {
|
|
|
|
|
+ isValidObjectIdSpy.mockClear();
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
describe('refurns false', () => {
|
|
describe('refurns false', () => {
|
|
|
|
|
|
|
|
it('when the referer argument is undefined', () => {
|
|
it('when the referer argument is undefined', () => {
|
|
@@ -22,6 +30,7 @@ describe('validateReferer', () => {
|
|
|
// then
|
|
// then
|
|
|
expect(result).toBeFalsy();
|
|
expect(result).toBeFalsy();
|
|
|
expect(mocks.retrieveSiteUrlMock).not.toHaveBeenCalled();
|
|
expect(mocks.retrieveSiteUrlMock).not.toHaveBeenCalled();
|
|
|
|
|
+ expect(isValidObjectIdSpy).not.toHaveBeenCalled();
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
it('when the referer is invalid', () => {
|
|
it('when the referer is invalid', () => {
|
|
@@ -31,6 +40,7 @@ describe('validateReferer', () => {
|
|
|
// then
|
|
// then
|
|
|
expect(result).toBeFalsy();
|
|
expect(result).toBeFalsy();
|
|
|
expect(mocks.retrieveSiteUrlMock).not.toHaveBeenCalledOnce();
|
|
expect(mocks.retrieveSiteUrlMock).not.toHaveBeenCalledOnce();
|
|
|
|
|
+ expect(isValidObjectIdSpy).not.toHaveBeenCalled();
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
it('when the siteUrl returns null', () => {
|
|
it('when the siteUrl returns null', () => {
|
|
@@ -46,29 +56,66 @@ describe('validateReferer', () => {
|
|
|
// then
|
|
// then
|
|
|
expect(result).toBeFalsy();
|
|
expect(result).toBeFalsy();
|
|
|
expect(mocks.retrieveSiteUrlMock).toHaveBeenCalledOnce();
|
|
expect(mocks.retrieveSiteUrlMock).toHaveBeenCalledOnce();
|
|
|
|
|
+ expect(isValidObjectIdSpy).not.toHaveBeenCalled();
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it('when the hostname of the referer does not match with siteUrl', () => {
|
|
|
|
|
+ // setup
|
|
|
|
|
+ mocks.retrieveSiteUrlMock.mockImplementation(() => {
|
|
|
|
|
+ return new URL('https://example.com');
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // when
|
|
|
|
|
+ const refererString = 'https://example.org/share/xxxxx';
|
|
|
|
|
+ const result = validateReferer(refererString);
|
|
|
|
|
+
|
|
|
|
|
+ // then
|
|
|
|
|
+ expect(result).toBeFalsy();
|
|
|
|
|
+ expect(mocks.retrieveSiteUrlMock).toHaveBeenCalledOnce();
|
|
|
|
|
+ expect(isValidObjectIdSpy).not.toHaveBeenCalled();
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
- it('when the domain of the referer does not match with siteUrl', () => {
|
|
|
|
|
|
|
+ it('when the port of the referer does not match with siteUrl', () => {
|
|
|
// setup
|
|
// setup
|
|
|
- const siteUrl = 'https://example.com';
|
|
|
|
|
- mocks.configManagerMock.getConfig.mockImplementation(() => {
|
|
|
|
|
- return siteUrl;
|
|
|
|
|
|
|
+ mocks.retrieveSiteUrlMock.mockImplementation(() => {
|
|
|
|
|
+ return new URL('https://example.com');
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
// when
|
|
// when
|
|
|
- const shareLinkId = '65436ba09ae6983bd608b89c';
|
|
|
|
|
- const refererString = `https://example.org/share/${shareLinkId}`;
|
|
|
|
|
|
|
+ const refererString = 'https://example.com:8080/share/xxxxx';
|
|
|
const result = validateReferer(refererString);
|
|
const result = validateReferer(refererString);
|
|
|
|
|
|
|
|
// then
|
|
// then
|
|
|
expect(result).toBeFalsy();
|
|
expect(result).toBeFalsy();
|
|
|
- expect(mocks.configManagerMock.getConfig).toHaveBeenCalledWith('crowi', 'app:siteUrl');
|
|
|
|
|
- expect(mocks.configManagerMock.getConfig).toHaveBeenCalledOnce();
|
|
|
|
|
|
|
+ expect(mocks.retrieveSiteUrlMock).toHaveBeenCalledOnce();
|
|
|
|
|
+ expect(isValidObjectIdSpy).not.toHaveBeenCalled();
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it('when the shareLinkId is invalid', () => {
|
|
|
|
|
+ // setup
|
|
|
|
|
+ mocks.retrieveSiteUrlMock.mockImplementation(() => {
|
|
|
|
|
+ return new URL('https://example.com');
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ // when
|
|
|
|
|
+ const refererString = 'https://example.com/share/FFFFFFFFFFFFFFFFFFFFFFFF';
|
|
|
|
|
+ const result = validateReferer(refererString);
|
|
|
|
|
+
|
|
|
|
|
+ // then
|
|
|
|
|
+ expect(result).toBeFalsy();
|
|
|
|
|
+ expect(mocks.retrieveSiteUrlMock).toHaveBeenCalledOnce();
|
|
|
|
|
+ expect(isValidObjectIdSpy).toHaveBeenCalledOnce();
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
it('returns ValidReferer instance', () => {
|
|
it('returns ValidReferer instance', () => {
|
|
|
|
|
+ // setup
|
|
|
|
|
+ mocks.retrieveSiteUrlMock.mockImplementation(() => {
|
|
|
|
|
+ return new URL('https://example.com');
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
// when
|
|
// when
|
|
|
const shareLinkId = '65436ba09ae6983bd608b89c';
|
|
const shareLinkId = '65436ba09ae6983bd608b89c';
|
|
|
const refererString = `https://example.com/share/${shareLinkId}`;
|
|
const refererString = `https://example.com/share/${shareLinkId}`;
|