Browse Source

#1419: 500 when visit a issue with issue/comments of deleted user

Unknwon 9 years ago
parent
commit
30b428bf0e
5 changed files with 28 additions and 7 deletions
  1. 1 1
      cmd/web.go
  2. 1 1
      models/issue.go
  3. 20 1
      models/user.go
  4. 2 2
      routers/repo/issue.go
  5. 4 2
      templates/repo/issue/view_content.tmpl

+ 1 - 1
cmd/web.go

@@ -453,12 +453,12 @@ func runWeb(ctx *cli.Context) {
 			m.Combo("/new").Get(repo.NewIssue).
 				Post(bindIgnErr(auth.CreateIssueForm{}), repo.NewIssuePost)
 
+			m.Combo("/:index/comments").Post(bindIgnErr(auth.CreateCommentForm{}), repo.NewComment)
 			m.Group("/:index", func() {
 				m.Post("", bindIgnErr(auth.CreateIssueForm{}), repo.UpdateIssue)
 				m.Post("/label", repo.UpdateIssueLabel)
 				m.Post("/milestone", repo.UpdateIssueMilestone)
 				m.Post("/assignee", repo.UpdateIssueAssignee)
-				m.Combo("/comments").Post(bindIgnErr(auth.CreateCommentForm{}), repo.NewComment)
 			}, reqRepoAdmin)
 		})
 		m.Group("/labels", func() {

+ 1 - 1
models/issue.go

@@ -1364,7 +1364,7 @@ func (c *Comment) AfterSet(colName string, _ xorm.Cell) {
 		if err != nil {
 			if IsErrUserNotExist(err) {
 				c.PosterID = -1
-				c.Poster = &User{Name: "someone"}
+				c.Poster = NewFakeUser()
 			} else {
 				log.Error(3, "GetUserByID[%d]: %v", c.ID, err)
 			}

+ 20 - 1
models/user.go

@@ -119,6 +119,10 @@ func (u *User) HomeLink() string {
 // AvatarLink returns user gravatar link.
 func (u *User) AvatarLink() string {
 	defaultImgUrl := setting.AppSubUrl + "/img/avatar_default.jpg"
+	if u.Id == -1 {
+		return defaultImgUrl
+	}
+
 	imgPath := path.Join(setting.AvatarUploadPath, com.ToStr(u.Id))
 	switch {
 	case u.UseCustomAvatar:
@@ -321,6 +325,15 @@ func GetUserSalt() string {
 	return base.GetRandomString(10)
 }
 
+// NewFakeUser creates and returns a fake user for someone has deleted his/her account.
+func NewFakeUser() *User {
+	return &User{
+		Id:        -1,
+		Name:      "Someone",
+		LowerName: "someone",
+	}
+}
+
 // CreateUser creates record of a new user.
 func CreateUser(u *User) (err error) {
 	if err = IsUsableName(u.Name); err != nil {
@@ -546,6 +559,7 @@ func DeleteUser(u *User) error {
 		&Collaboration{UserID: u.Id},
 		&EmailAddress{Uid: u.Id},
 		&Watch{UserID: u.Id},
+		&IssueUser{UID: u.Id},
 	); err != nil {
 		return err
 	}
@@ -563,11 +577,16 @@ func DeleteUser(u *User) error {
 		return err
 	}
 	for _, key := range keys {
-		if err = DeletePublicKey(key); err != nil {
+		if err = deletePublicKey(sess, key); err != nil {
 			return err
 		}
 	}
 
+	// Clear assignee.
+	if _, err = sess.Exec("UPDATE `issue` SET assignee_id=0 WHERE assignee_id=?", u.Id); err != nil {
+		return err
+	}
+
 	if _, err = sess.Delete(u); err != nil {
 		return err
 	}

+ 2 - 2
routers/repo/issue.go

@@ -508,7 +508,7 @@ func ViewIssue(ctx *middleware.Context) {
 	}
 
 	ctx.Data["Issue"] = issue
-	// ctx.Data["IsIssueOwner"] = ctx.Repo.IsOwner() || (ctx.IsSigned && issue.PosterID == ctx.User.Id)
+	ctx.Data["IsIssueOwner"] = ctx.Repo.IsAdmin() || (ctx.IsSigned && issue.IsPoster(ctx.User.Id))
 	ctx.HTML(200, ISSUE_VIEW)
 }
 
@@ -685,7 +685,7 @@ func NewComment(ctx *middleware.Context, form auth.CreateCommentForm) {
 	}
 
 	// Check if issue owner/poster changes the status of issue.
-	if (ctx.Repo.IsOwner() || issue.IsPoster(ctx.User.Id)) &&
+	if (ctx.Repo.IsOwner() || (ctx.IsSigned && issue.IsPoster(ctx.User.Id))) &&
 		(form.Status == "reopen" || form.Status == "close") {
 		issue.Repo = ctx.Repo.Repository
 		if err = issue.ChangeStatus(ctx.User, form.Status == "close"); err != nil {

+ 4 - 2
templates/repo/issue/view_content.tmpl

@@ -56,12 +56,12 @@
 			<!-- 0 = COMMENT, 1 = REOPEN, 2 = CLOSE, 3 = ISSUE_REF, 4 = COMMIT_REF, 5 = COMMENT_REF, 6 = PULL_REF -->
 			{{if eq .Type 0}}
   		<div class="comment">
-		    <a class="avatar" href="{{.Poster.HomeLink}}">
+		    <a class="avatar" {{if gt .Poster.Id 0}}href="{{.Poster.HomeLink}}"{{end}}>
 		      <img src="{{.Poster.AvatarLink}}">
 		    </a>
 		    <div class="content">
 					<div class="ui top attached header">
-						<span class="text grey"><a href="{{.Poster.HomeLink}}">{{.Poster.Name}}</a> {{$.i18n.Tr "repo.issues.commented_at" .HashTag $createdStr | Safe}}</span>
+						<span class="text grey"><a {{if gt .Poster.Id 0}}href="{{.Poster.HomeLink}}"{{end}}>{{.Poster.Name}}</a> {{$.i18n.Tr "repo.issues.commented_at" .HashTag $createdStr | Safe}}</span>
 					  <div class="ui right actions">
 					  	{{if gt .ShowTag 0}}
 					  	<div class="tag">
@@ -125,6 +125,7 @@
 						{{.CsrfTokenHtml}}
 						<input id="status" name="status" type="hidden">
 			      <div class="text right">
+			      	{{if .IsIssueOwner}}
 			      	{{if .Issue.IsClosed}}
 							<div id="status-button" class="ui green basic button" data-status="{{.i18n.Tr "repo.issues.reopen_issue"}}" data-status-and-comment="{{.i18n.Tr "repo.issues.reopen_comment_issue"}}" data-status-val="reopen">
 								{{.i18n.Tr "repo.issues.reopen_issue"}}
@@ -134,6 +135,7 @@
 								{{.i18n.Tr "repo.issues.close_issue"}}
 							</div>
 							{{end}}
+							{{end}}
 							<button class="ui green button">
 								{{.i18n.Tr "repo.issues.create_comment"}}
 							</button>