2017-07-13 20:22:02 -04:00
|
|
|
/**
|
|
|
|
* @license
|
|
|
|
* Copyright Google Inc. All Rights Reserved.
|
|
|
|
*
|
|
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
|
|
* found in the LICENSE file at https://angular.io/license
|
|
|
|
*/
|
|
|
|
|
|
|
|
import {HttpHeaders} from '../src/headers';
|
|
|
|
import {HttpRequest} from '../src/request';
|
2018-06-24 21:22:22 -04:00
|
|
|
import {HttpXsrfCookieExtractor, HttpXsrfInterceptor, HttpXsrfTokenExtractor} from '../src/xsrf';
|
2017-07-13 20:22:02 -04:00
|
|
|
|
|
|
|
import {HttpClientTestingBackend} from '../testing/src/backend';
|
|
|
|
|
2018-06-24 21:22:22 -04:00
|
|
|
class SampleTokenExtractor extends HttpXsrfTokenExtractor {
|
|
|
|
constructor(private token: string|null) { super(); }
|
2017-07-13 20:22:02 -04:00
|
|
|
|
|
|
|
getToken(): string|null { return this.token; }
|
|
|
|
}
|
|
|
|
|
2017-12-16 17:42:55 -05:00
|
|
|
{
|
2017-07-13 20:22:02 -04:00
|
|
|
describe('HttpXsrfInterceptor', () => {
|
|
|
|
let backend: HttpClientTestingBackend;
|
|
|
|
const interceptor = new HttpXsrfInterceptor(new SampleTokenExtractor('test'), 'X-XSRF-TOKEN');
|
|
|
|
beforeEach(() => { backend = new HttpClientTestingBackend(); });
|
|
|
|
it('applies XSRF protection to outgoing requests', () => {
|
|
|
|
interceptor.intercept(new HttpRequest('POST', '/test', {}), backend).subscribe();
|
|
|
|
const req = backend.expectOne('/test');
|
|
|
|
expect(req.request.headers.get('X-XSRF-TOKEN')).toEqual('test');
|
|
|
|
req.flush({});
|
|
|
|
});
|
|
|
|
it('does not apply XSRF protection when request is a GET', () => {
|
|
|
|
interceptor.intercept(new HttpRequest('GET', '/test'), backend).subscribe();
|
|
|
|
const req = backend.expectOne('/test');
|
|
|
|
expect(req.request.headers.has('X-XSRF-TOKEN')).toEqual(false);
|
|
|
|
req.flush({});
|
|
|
|
});
|
|
|
|
it('does not apply XSRF protection when request is a HEAD', () => {
|
|
|
|
interceptor.intercept(new HttpRequest('HEAD', '/test'), backend).subscribe();
|
|
|
|
const req = backend.expectOne('/test');
|
|
|
|
expect(req.request.headers.has('X-XSRF-TOKEN')).toEqual(false);
|
|
|
|
req.flush({});
|
|
|
|
});
|
|
|
|
it('does not overwrite existing header', () => {
|
|
|
|
interceptor
|
|
|
|
.intercept(
|
|
|
|
new HttpRequest(
|
|
|
|
'POST', '/test', {}, {headers: new HttpHeaders().set('X-XSRF-TOKEN', 'blah')}),
|
|
|
|
backend)
|
|
|
|
.subscribe();
|
|
|
|
const req = backend.expectOne('/test');
|
|
|
|
expect(req.request.headers.get('X-XSRF-TOKEN')).toEqual('blah');
|
|
|
|
req.flush({});
|
|
|
|
});
|
|
|
|
it('does not set the header for a null token', () => {
|
|
|
|
const interceptor = new HttpXsrfInterceptor(new SampleTokenExtractor(null), 'X-XSRF-TOKEN');
|
|
|
|
interceptor.intercept(new HttpRequest('POST', '/test', {}), backend).subscribe();
|
|
|
|
const req = backend.expectOne('/test');
|
|
|
|
expect(req.request.headers.has('X-XSRF-TOKEN')).toEqual(false);
|
|
|
|
req.flush({});
|
|
|
|
});
|
|
|
|
afterEach(() => { backend.verify(); });
|
|
|
|
});
|
|
|
|
describe('HttpXsrfCookieExtractor', () => {
|
|
|
|
let document: {[key: string]: string};
|
2017-07-27 19:13:16 -04:00
|
|
|
let extractor: HttpXsrfCookieExtractor;
|
2017-07-13 20:22:02 -04:00
|
|
|
beforeEach(() => {
|
|
|
|
document = {
|
|
|
|
cookie: 'XSRF-TOKEN=test',
|
|
|
|
};
|
|
|
|
extractor = new HttpXsrfCookieExtractor(document, 'browser', 'XSRF-TOKEN');
|
|
|
|
});
|
|
|
|
it('parses the cookie from document.cookie',
|
|
|
|
() => { expect(extractor.getToken()).toEqual('test'); });
|
|
|
|
it('does not re-parse if document.cookie has not changed', () => {
|
|
|
|
expect(extractor.getToken()).toEqual('test');
|
|
|
|
expect(extractor.getToken()).toEqual('test');
|
2018-06-29 14:55:55 -04:00
|
|
|
expect(getParseCount(extractor)).toEqual(1);
|
2017-07-13 20:22:02 -04:00
|
|
|
});
|
|
|
|
it('re-parses if document.cookie changes', () => {
|
|
|
|
expect(extractor.getToken()).toEqual('test');
|
|
|
|
document['cookie'] = 'XSRF-TOKEN=blah';
|
|
|
|
expect(extractor.getToken()).toEqual('blah');
|
2018-06-29 14:55:55 -04:00
|
|
|
expect(getParseCount(extractor)).toEqual(2);
|
2017-07-13 20:22:02 -04:00
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
2018-06-29 14:55:55 -04:00
|
|
|
|
|
|
|
function getParseCount(extractor: HttpXsrfCookieExtractor): number {
|
|
|
|
return (extractor as any).parseCount;
|
|
|
|
}
|