|
@@ -7,11 +7,8 @@ package repo
|
|
|
import (
|
|
|
"errors"
|
|
|
"fmt"
|
|
|
- "io"
|
|
|
- "io/ioutil"
|
|
|
"net/http"
|
|
|
"net/url"
|
|
|
- "os"
|
|
|
"strings"
|
|
|
"time"
|
|
|
|
|
@@ -181,6 +178,7 @@ func NewIssue(ctx *middleware.Context) {
|
|
|
ctx.Data["RequireDropzone"] = true
|
|
|
ctx.Data["IsAttachmentEnabled"] = setting.AttachmentEnabled
|
|
|
ctx.Data["AttachmentAllowedTypes"] = setting.AttachmentAllowedTypes
|
|
|
+ ctx.Data["AttachmentMaxFiles"] = setting.AttachmentMaxFiles
|
|
|
|
|
|
if ctx.User.IsAdmin {
|
|
|
var (
|
|
@@ -215,18 +213,19 @@ func NewIssue(ctx *middleware.Context) {
|
|
|
}
|
|
|
|
|
|
func NewIssuePost(ctx *middleware.Context, form auth.CreateIssueForm) {
|
|
|
- fmt.Println(ctx.QueryStrings("uuids"))
|
|
|
ctx.Data["Title"] = ctx.Tr("repo.issues.new")
|
|
|
ctx.Data["PageIsIssueList"] = true
|
|
|
ctx.Data["RequireDropzone"] = true
|
|
|
ctx.Data["IsAttachmentEnabled"] = setting.AttachmentEnabled
|
|
|
ctx.Data["AttachmentAllowedTypes"] = setting.AttachmentAllowedTypes
|
|
|
+ ctx.Data["AttachmentMaxFiles"] = setting.AttachmentMaxFiles
|
|
|
|
|
|
var (
|
|
|
repo = ctx.Repo.Repository
|
|
|
labelIDs []int64
|
|
|
milestoneID int64
|
|
|
assigneeID int64
|
|
|
+ attachments []string
|
|
|
)
|
|
|
if ctx.User.IsAdmin {
|
|
|
// Check labels.
|
|
@@ -286,6 +285,10 @@ func NewIssuePost(ctx *middleware.Context, form auth.CreateIssueForm) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if setting.AttachmentEnabled {
|
|
|
+ attachments = ctx.QueryStrings("attachments")
|
|
|
+ }
|
|
|
+
|
|
|
if ctx.HasError() {
|
|
|
ctx.HTML(200, ISSUE_NEW)
|
|
|
return
|
|
@@ -301,7 +304,7 @@ func NewIssuePost(ctx *middleware.Context, form auth.CreateIssueForm) {
|
|
|
AssigneeID: assigneeID,
|
|
|
Content: form.Content,
|
|
|
}
|
|
|
- if err := models.NewIssue(repo, issue, labelIDs); err != nil {
|
|
|
+ if err := models.NewIssue(repo, issue, labelIDs, attachments); err != nil {
|
|
|
ctx.Handle(500, "NewIssue", err)
|
|
|
return
|
|
|
}
|
|
@@ -347,9 +350,50 @@ func NewIssuePost(ctx *middleware.Context, form auth.CreateIssueForm) {
|
|
|
ctx.Redirect(ctx.Repo.RepoLink + "/issues/" + com.ToStr(issue.Index))
|
|
|
}
|
|
|
|
|
|
-func UploadAttachment(ctx *middleware.Context) {
|
|
|
+func UploadIssueAttachment(ctx *middleware.Context) {
|
|
|
+ if !setting.AttachmentEnabled {
|
|
|
+ ctx.Error(404, "attachment is not enabled")
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ allowedTypes := strings.Split(setting.AttachmentAllowedTypes, ",")
|
|
|
+ file, header, err := ctx.Req.FormFile("file")
|
|
|
+ if err != nil {
|
|
|
+ ctx.Error(500, fmt.Sprintf("FormFile: %v", err))
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer file.Close()
|
|
|
+
|
|
|
+ buf := make([]byte, 1024)
|
|
|
+ n, _ := file.Read(buf)
|
|
|
+ if n > 0 {
|
|
|
+ buf = buf[:n]
|
|
|
+ }
|
|
|
+ fileType := http.DetectContentType(buf)
|
|
|
+
|
|
|
+ allowed := false
|
|
|
+ for _, t := range allowedTypes {
|
|
|
+ t := strings.Trim(t, " ")
|
|
|
+ if t == "*/*" || t == fileType {
|
|
|
+ allowed = true
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if !allowed {
|
|
|
+ ctx.Error(400, ErrFileTypeForbidden.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ attach, err := models.NewAttachment(header.Filename, buf, file)
|
|
|
+ if err != nil {
|
|
|
+ ctx.Error(500, fmt.Sprintf("NewAttachment: %v", err))
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ log.Trace("New attachment uploaded: %s", attach.UUID)
|
|
|
ctx.JSON(200, map[string]string{
|
|
|
- "uuid": "fuck",
|
|
|
+ "uuid": attach.UUID,
|
|
|
})
|
|
|
}
|
|
|
|
|
@@ -687,78 +731,6 @@ func UpdateAssignee(ctx *middleware.Context) {
|
|
|
})
|
|
|
}
|
|
|
|
|
|
-func uploadFiles(ctx *middleware.Context, issueId, commentId int64) {
|
|
|
- if !setting.AttachmentEnabled {
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- allowedTypes := strings.Split(setting.AttachmentAllowedTypes, "|")
|
|
|
- attachments := ctx.Req.MultipartForm.File["attachments"]
|
|
|
-
|
|
|
- if len(attachments) > setting.AttachmentMaxFiles {
|
|
|
- ctx.Handle(400, "issue.Comment", ErrTooManyFiles)
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- for _, header := range attachments {
|
|
|
- file, err := header.Open()
|
|
|
-
|
|
|
- if err != nil {
|
|
|
- ctx.Handle(500, "issue.Comment(header.Open)", err)
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- defer file.Close()
|
|
|
-
|
|
|
- buf := make([]byte, 1024)
|
|
|
- n, _ := file.Read(buf)
|
|
|
- if n > 0 {
|
|
|
- buf = buf[:n]
|
|
|
- }
|
|
|
- fileType := http.DetectContentType(buf)
|
|
|
- fmt.Println(fileType)
|
|
|
-
|
|
|
- allowed := false
|
|
|
-
|
|
|
- for _, t := range allowedTypes {
|
|
|
- t := strings.Trim(t, " ")
|
|
|
-
|
|
|
- if t == "*/*" || t == fileType {
|
|
|
- allowed = true
|
|
|
- break
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if !allowed {
|
|
|
- ctx.Handle(400, "issue.Comment", ErrFileTypeForbidden)
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- os.MkdirAll(setting.AttachmentPath, os.ModePerm)
|
|
|
- out, err := ioutil.TempFile(setting.AttachmentPath, "attachment_")
|
|
|
-
|
|
|
- if err != nil {
|
|
|
- ctx.Handle(500, "ioutil.TempFile", err)
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- defer out.Close()
|
|
|
-
|
|
|
- out.Write(buf)
|
|
|
- _, err = io.Copy(out, file)
|
|
|
- if err != nil {
|
|
|
- ctx.Handle(500, "io.Copy", err)
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- _, err = models.CreateAttachment(issueId, commentId, header.Filename, out.Name())
|
|
|
- if err != nil {
|
|
|
- ctx.Handle(500, "CreateAttachment", err)
|
|
|
- return
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
func Comment(ctx *middleware.Context) {
|
|
|
send := func(status int, data interface{}, err error) {
|
|
|
if err != nil {
|
|
@@ -884,7 +856,7 @@ func Comment(ctx *middleware.Context) {
|
|
|
}
|
|
|
|
|
|
if comment != nil {
|
|
|
- uploadFiles(ctx, issue.ID, comment.Id)
|
|
|
+ // uploadFiles(ctx, issue.ID, comment.Id)
|
|
|
}
|
|
|
|
|
|
// Notify watchers.
|
|
@@ -1194,25 +1166,6 @@ func DeleteMilestone(ctx *middleware.Context) {
|
|
|
})
|
|
|
}
|
|
|
|
|
|
-func IssueGetAttachment(ctx *middleware.Context) {
|
|
|
- id := com.StrTo(ctx.Params(":id")).MustInt64()
|
|
|
- if id == 0 {
|
|
|
- ctx.Error(404)
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- attachment, err := models.GetAttachmentById(id)
|
|
|
-
|
|
|
- if err != nil {
|
|
|
- ctx.Handle(404, "models.GetAttachmentById", err)
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- // Fix #312. Attachments with , in their name are not handled correctly by Google Chrome.
|
|
|
- // We must put the name in " manually.
|
|
|
- ctx.ServeFile(attachment.Path, "\""+attachment.Name+"\"")
|
|
|
-}
|
|
|
-
|
|
|
func PullRequest2(ctx *middleware.Context) {
|
|
|
ctx.HTML(200, "repo/pr2/list")
|
|
|
}
|