mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-03 21:08:25 +00:00 
			
		
		
		
	Fix commenting on non-utf8 encoded files (#11916)
* Add comment on non-unicode line to force fail Signed-off-by: Andrew Thornton <art27@cantab.net> * Just quote/unquote patch Signed-off-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
		@@ -86,6 +86,11 @@ func TestAPIPullReview(t *testing.T) {
 | 
				
			|||||||
			Body:       "first old line",
 | 
								Body:       "first old line",
 | 
				
			||||||
			OldLineNum: 1,
 | 
								OldLineNum: 1,
 | 
				
			||||||
			NewLineNum: 0,
 | 
								NewLineNum: 0,
 | 
				
			||||||
 | 
							}, {
 | 
				
			||||||
 | 
								Path:       "iso-8859-1.txt",
 | 
				
			||||||
 | 
								Body:       "this line contains a non-utf-8 character",
 | 
				
			||||||
 | 
								OldLineNum: 0,
 | 
				
			||||||
 | 
								NewLineNum: 1,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
@@ -93,7 +98,7 @@ func TestAPIPullReview(t *testing.T) {
 | 
				
			|||||||
	DecodeJSON(t, resp, &review)
 | 
						DecodeJSON(t, resp, &review)
 | 
				
			||||||
	assert.EqualValues(t, 6, review.ID)
 | 
						assert.EqualValues(t, 6, review.ID)
 | 
				
			||||||
	assert.EqualValues(t, "PENDING", review.State)
 | 
						assert.EqualValues(t, "PENDING", review.State)
 | 
				
			||||||
	assert.EqualValues(t, 2, review.CodeCommentsCount)
 | 
						assert.EqualValues(t, 3, review.CodeCommentsCount)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// test SubmitPullReview
 | 
						// test SubmitPullReview
 | 
				
			||||||
	req = NewRequestWithJSON(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/reviews/%d?token=%s", repo.OwnerName, repo.Name, pullIssue.Index, review.ID, token), &api.SubmitPullReviewOptions{
 | 
						req = NewRequestWithJSON(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/reviews/%d?token=%s", repo.OwnerName, repo.Name, pullIssue.Index, review.ID, token), &api.SubmitPullReviewOptions{
 | 
				
			||||||
@@ -104,7 +109,7 @@ func TestAPIPullReview(t *testing.T) {
 | 
				
			|||||||
	DecodeJSON(t, resp, &review)
 | 
						DecodeJSON(t, resp, &review)
 | 
				
			||||||
	assert.EqualValues(t, 6, review.ID)
 | 
						assert.EqualValues(t, 6, review.ID)
 | 
				
			||||||
	assert.EqualValues(t, "APPROVED", review.State)
 | 
						assert.EqualValues(t, "APPROVED", review.State)
 | 
				
			||||||
	assert.EqualValues(t, 2, review.CodeCommentsCount)
 | 
						assert.EqualValues(t, 3, review.CodeCommentsCount)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// test DeletePullReview
 | 
						// test DeletePullReview
 | 
				
			||||||
	req = NewRequestWithJSON(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/reviews?token=%s", repo.OwnerName, repo.Name, pullIssue.Index, token), &api.CreatePullReviewOptions{
 | 
						req = NewRequestWithJSON(t, http.MethodPost, fmt.Sprintf("/api/v1/repos/%s/%s/pulls/%d/reviews?token=%s", repo.OwnerName, repo.Name, pullIssue.Index, token), &api.CreatePullReviewOptions{
 | 
				
			||||||
 
 | 
				
			|||||||
										
											Binary file not shown.
										
									
								
							@@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					xe<><65>N<EFBFBD>0D<>#<23><1F><03>4 
 | 
				
			||||||
 | 
					J<EFBFBD>A<05>5<EFBFBD><35><EFBFBD><EFBFBD>,<2C>x<EFBFBD>zsV<73><56><EFBFBD>5<08>D<EFBFBD><44>ػ<EFBFBD>7<EFBFBD>,=<3D><>o.<13>E卢<45>q5J=<3D><><EFBFBD><EFBFBD><EFBFBD>	r<>=>4<1B><1D>
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							@@ -1 +1 @@
 | 
				
			|||||||
4a357436d925b5c974181ff12a994538ddc5a269
 | 
					5f22f7d0d95d614d25a5b68592adb345a4b5c7fd
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,7 +11,9 @@ import (
 | 
				
			|||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"regexp"
 | 
						"regexp"
 | 
				
			||||||
 | 
						"strconv"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
						"unicode/utf8"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"code.gitea.io/gitea/modules/git"
 | 
						"code.gitea.io/gitea/modules/git"
 | 
				
			||||||
	"code.gitea.io/gitea/modules/log"
 | 
						"code.gitea.io/gitea/modules/log"
 | 
				
			||||||
@@ -143,7 +145,8 @@ type Comment struct {
 | 
				
			|||||||
	RenderedContent string `xorm:"-"`
 | 
						RenderedContent string `xorm:"-"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Path represents the 4 lines of code cemented by this comment
 | 
						// Path represents the 4 lines of code cemented by this comment
 | 
				
			||||||
	Patch string `xorm:"TEXT"`
 | 
						Patch       string `xorm:"-"`
 | 
				
			||||||
 | 
						PatchQuoted string `xorm:"TEXT patch"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
 | 
						CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
 | 
				
			||||||
	UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
 | 
						UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
 | 
				
			||||||
@@ -199,6 +202,33 @@ func (c *Comment) loadIssue(e Engine) (err error) {
 | 
				
			|||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// BeforeInsert will be invoked by XORM before inserting a record
 | 
				
			||||||
 | 
					func (c *Comment) BeforeInsert() {
 | 
				
			||||||
 | 
						c.PatchQuoted = c.Patch
 | 
				
			||||||
 | 
						if !utf8.ValidString(c.Patch) {
 | 
				
			||||||
 | 
							c.PatchQuoted = strconv.Quote(c.Patch)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// BeforeUpdate will be invoked by XORM before updating a record
 | 
				
			||||||
 | 
					func (c *Comment) BeforeUpdate() {
 | 
				
			||||||
 | 
						c.PatchQuoted = c.Patch
 | 
				
			||||||
 | 
						if !utf8.ValidString(c.Patch) {
 | 
				
			||||||
 | 
							c.PatchQuoted = strconv.Quote(c.Patch)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// AfterLoad is invoked from XORM after setting the values of all fields of this object.
 | 
				
			||||||
 | 
					func (c *Comment) AfterLoad(session *xorm.Session) {
 | 
				
			||||||
 | 
						c.Patch = c.PatchQuoted
 | 
				
			||||||
 | 
						if len(c.PatchQuoted) > 0 && c.PatchQuoted[0] == '"' {
 | 
				
			||||||
 | 
							unquoted, err := strconv.Unquote(c.PatchQuoted)
 | 
				
			||||||
 | 
							if err == nil {
 | 
				
			||||||
 | 
								c.Patch = unquoted
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c *Comment) loadPoster(e Engine) (err error) {
 | 
					func (c *Comment) loadPoster(e Engine) (err error) {
 | 
				
			||||||
	if c.PosterID <= 0 || c.Poster != nil {
 | 
						if c.PosterID <= 0 || c.Poster != nil {
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user