73 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import * as t from '@angular/core/testing/testing_internal';
 | 
						|
 | 
						|
import {getDOM} from '../../src/dom/dom_adapter';
 | 
						|
import {sanitizeUrl} from '../../src/security/url_sanitizer';
 | 
						|
 | 
						|
export function main() {
 | 
						|
  t.describe('URL sanitizer', () => {
 | 
						|
    let logMsgs: string[];
 | 
						|
    let originalLog: (msg: any) => any;
 | 
						|
 | 
						|
    t.beforeEach(() => {
 | 
						|
      logMsgs = [];
 | 
						|
      originalLog = getDOM().log;  // Monkey patch DOM.log.
 | 
						|
      getDOM().log = (msg) => logMsgs.push(msg);
 | 
						|
    });
 | 
						|
    t.afterEach(() => { getDOM().log = originalLog; });
 | 
						|
 | 
						|
    t.it('reports unsafe URLs', () => {
 | 
						|
      t.expect(sanitizeUrl('javascript:evil()')).toBe('unsafe:javascript:evil()');
 | 
						|
      t.expect(logMsgs.join('\n')).toMatch(/sanitizing unsafe URL value/);
 | 
						|
    });
 | 
						|
 | 
						|
 | 
						|
    t.describe('valid URLs', () => {
 | 
						|
      const validUrls = [
 | 
						|
        '',
 | 
						|
        'http://abc',
 | 
						|
        'HTTP://abc',
 | 
						|
        'https://abc',
 | 
						|
        'HTTPS://abc',
 | 
						|
        'ftp://abc',
 | 
						|
        'FTP://abc',
 | 
						|
        'mailto:me@example.com',
 | 
						|
        'MAILTO:me@example.com',
 | 
						|
        'tel:123-123-1234',
 | 
						|
        'TEL:123-123-1234',
 | 
						|
        '#anchor',
 | 
						|
        '/page1.md',
 | 
						|
        'http://JavaScript/my.js',
 | 
						|
        'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/',  // Truncated.
 | 
						|
        'data:video/webm;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/',
 | 
						|
      ];
 | 
						|
      for (let url of validUrls) {
 | 
						|
        t.it(`valid ${url}`, () => t.expect(sanitizeUrl(url)).toEqual(url));
 | 
						|
      }
 | 
						|
    });
 | 
						|
 | 
						|
    t.describe('invalid URLs', () => {
 | 
						|
      const invalidUrls = [
 | 
						|
        'javascript:evil()',
 | 
						|
        'JavaScript:abc',
 | 
						|
        'evilNewProtocol:abc',
 | 
						|
        ' \n Java\n Script:abc',
 | 
						|
        'javascript:',
 | 
						|
        'javascript:',
 | 
						|
        'j avascript:',
 | 
						|
        'javascript:',
 | 
						|
        'javascript:',
 | 
						|
        'jav	ascript:alert();',
 | 
						|
        'jav\u0000ascript:alert();',
 | 
						|
        'data:;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/',
 | 
						|
        'data:,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/',
 | 
						|
        'data:iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/',
 | 
						|
        'data:text/javascript;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/',
 | 
						|
        'data:application/x-msdownload;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/',
 | 
						|
      ];
 | 
						|
      for (let url of invalidUrls) {
 | 
						|
        t.it(`valid ${url}`, () => t.expect(sanitizeUrl(url)).toMatch(/^unsafe:/));
 | 
						|
      }
 | 
						|
    });
 | 
						|
  });
 | 
						|
}
 |