@@ -14,7 +14,7 @@ import (
14
14
"github.com/stretchr/testify/assert"
15
15
)
16
16
17
- func testPullCreate (t * testing.T , session * TestSession , user , repo , branch string ) * httptest.ResponseRecorder {
17
+ func testPullCreate (t * testing.T , session * TestSession , user , repo , branch , title string ) * httptest.ResponseRecorder {
18
18
req := NewRequest (t , "GET" , path .Join (user , repo ))
19
19
resp := session .MakeRequest (t , req , http .StatusOK )
20
20
@@ -35,7 +35,7 @@ func testPullCreate(t *testing.T, session *TestSession, user, repo, branch strin
35
35
assert .True (t , exists , "The template has changed" )
36
36
req = NewRequestWithValues (t , "POST" , link , map [string ]string {
37
37
"_csrf" : htmlDoc .GetCSRF (),
38
- "title" : "This is a pull title" ,
38
+ "title" : title ,
39
39
})
40
40
resp = session .MakeRequest (t , req , http .StatusFound )
41
41
@@ -47,7 +47,7 @@ func TestPullCreate(t *testing.T) {
47
47
session := loginUser (t , "user1" )
48
48
testRepoFork (t , session , "user2" , "repo1" , "user1" , "repo1" )
49
49
testEditFile (t , session , "user1" , "repo1" , "master" , "README.md" , "Hello, World (Edited)\n " )
50
- resp := testPullCreate (t , session , "user1" , "repo1" , "master" )
50
+ resp := testPullCreate (t , session , "user1" , "repo1" , "master" , "This is a pull title" )
51
51
52
52
// check the redirected URL
53
53
url := resp .HeaderMap .Get ("Location" )
@@ -68,3 +68,38 @@ func TestPullCreate(t *testing.T) {
68
68
assert .Regexp (t , `Subject: \[PATCH\] Update 'README.md'` , resp .Body )
69
69
assert .NotRegexp (t , "diff.*diff" , resp .Body ) // not two diffs, just one
70
70
}
71
+
72
+ func TestPullCreate_TitleEscape (t * testing.T ) {
73
+ prepareTestEnv (t )
74
+ session := loginUser (t , "user1" )
75
+ testRepoFork (t , session , "user2" , "repo1" , "user1" , "repo1" )
76
+ testEditFile (t , session , "user1" , "repo1" , "master" , "README.md" , "Hello, World (Edited)\n " )
77
+ resp := testPullCreate (t , session , "user1" , "repo1" , "master" , "<i>XSS PR</i>" )
78
+
79
+ // check the redirected URL
80
+ url := resp .HeaderMap .Get ("Location" )
81
+ assert .Regexp (t , "^/user2/repo1/pulls/[0-9]*$" , url )
82
+
83
+ // Edit title
84
+ req := NewRequest (t , "GET" , url )
85
+ resp = session .MakeRequest (t , req , http .StatusOK )
86
+ htmlDoc := NewHTMLParser (t , resp .Body )
87
+ editTestTitleURL , exists := htmlDoc .doc .Find ("#save-edit-title" ).First ().Attr ("data-update-url" )
88
+ assert .True (t , exists , "The template has changed" )
89
+
90
+ req = NewRequestWithValues (t , "POST" , editTestTitleURL , map [string ]string {
91
+ "_csrf" : htmlDoc .GetCSRF (),
92
+ "title" : "<u>XSS PR</u>" ,
93
+ })
94
+ session .MakeRequest (t , req , http .StatusOK )
95
+
96
+ req = NewRequest (t , "GET" , url )
97
+ resp = session .MakeRequest (t , req , http .StatusOK )
98
+ htmlDoc = NewHTMLParser (t , resp .Body )
99
+ titleHTML , err := htmlDoc .doc .Find (".comments .event .text b" ).First ().Html ()
100
+ assert .NoError (t , err )
101
+ assert .Equal (t , "<i>XSS PR</i>" , titleHTML )
102
+ titleHTML , err = htmlDoc .doc .Find (".comments .event .text b" ).Next ().Html ()
103
+ assert .NoError (t , err )
104
+ assert .Equal (t , "<u>XSS PR</u>" , titleHTML )
105
+ }
0 commit comments