| 
									
										
										
										
											2016-10-06 23:25:52 +01:00
										 |  |  | 'use strict'; // necessary for es6 output in node 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import { browser, element, By } from 'protractor'; | 
					
						
							| 
									
										
										
										
											2016-06-30 07:21:55 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-20 23:34:14 -07:00
										 |  |  | describe('Security E2E Tests', () => { | 
					
						
							| 
									
										
										
										
											2016-06-30 07:21:55 -07:00
										 |  |  |   beforeAll(() => browser.get('')); | 
					
						
							| 
									
										
										
										
											2016-06-20 23:34:14 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   it('sanitizes innerHTML', () => { | 
					
						
							|  |  |  |     let interpolated = element(By.className('e2e-inner-html-interpolated')); | 
					
						
							|  |  |  |     expect(interpolated.getText()) | 
					
						
							|  |  |  |         .toContain('Template <script>alert("0wned")</script> <b>Syntax</b>'); | 
					
						
							|  |  |  |     let bound = element(By.className('e2e-inner-html-bound')); | 
					
						
							|  |  |  |     expect(bound.getText()).toContain('Template alert("0wned") Syntax'); | 
					
						
							|  |  |  |     let bold = element(By.css('.e2e-inner-html-bound b')); | 
					
						
							|  |  |  |     expect(bold.getText()).toContain('Syntax'); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-30 07:21:55 -07:00
										 |  |  |   it('escapes untrusted URLs', () => { | 
					
						
							|  |  |  |     let untrustedUrl = element(By.className('e2e-dangerous-url')); | 
					
						
							|  |  |  |     expect(untrustedUrl.getAttribute('href')).toMatch(/^unsafe:javascript/); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-20 23:34:14 -07:00
										 |  |  |   it('binds trusted URLs', () => { | 
					
						
							| 
									
										
										
										
											2016-06-30 07:21:55 -07:00
										 |  |  |     let trustedUrl = element(By.className('e2e-trusted-url')); | 
					
						
							|  |  |  |     expect(trustedUrl.getAttribute('href')).toMatch(/^javascript:alert/); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('escapes untrusted resource URLs', () => { | 
					
						
							|  |  |  |     let iframe = element(By.className('e2e-iframe-untrusted-src')); | 
					
						
							|  |  |  |     expect(iframe.getAttribute('src')).toBe(''); | 
					
						
							| 
									
										
										
										
											2016-06-20 23:34:14 -07:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   it('binds trusted resource URLs', () => { | 
					
						
							| 
									
										
										
										
											2016-06-30 07:21:55 -07:00
										 |  |  |     let iframe = element(By.className('e2e-iframe-trusted-src')); | 
					
						
							| 
									
										
										
										
											2016-06-20 23:34:14 -07:00
										 |  |  |     expect(iframe.getAttribute('src')).toMatch(/^https:\/\/www.youtube.com\//); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | }); |