diff --git a/project/build.scala b/project/build.scala index 1337898..3034720 100644 --- a/project/build.scala +++ b/project/build.scala @@ -56,6 +56,7 @@ "org.apache.commons" % "commons-email" % "1.3.3", "org.apache.httpcomponents" % "httpclient" % "4.3.6", "org.apache.sshd" % "apache-sshd" % "0.11.0", + "org.apache.tika" % "tika-core" % "1.10", "com.typesafe.slick" %% "slick" % "2.1.0", "com.novell.ldap" % "jldap" % "2009-10-07", "com.h2database" % "h2" % "1.4.180", diff --git a/src/main/scala/gitbucket/core/controller/FileUploadController.scala b/src/main/scala/gitbucket/core/controller/FileUploadController.scala index c3503ac..d6213a2 100644 --- a/src/main/scala/gitbucket/core/controller/FileUploadController.scala +++ b/src/main/scala/gitbucket/core/controller/FileUploadController.scala @@ -17,22 +17,22 @@ configureMultipartHandling(MultipartConfig(maxFileSize = Some(3 * 1024 * 1024))) post("/image"){ - execute { (file, fileId) => + execute({ (file, fileId) => FileUtils.writeByteArrayToFile(new java.io.File(getTemporaryDir(session.getId), fileId), file.get) session += Keys.Session.Upload(fileId) -> file.name - } + }, FileUtil.isImage) } - post("/image/:owner/:repository"){ - execute { (file, fileId) => + post("/file/:owner/:repository"){ + execute({ (file, fileId) => FileUtils.writeByteArrayToFile(new java.io.File( getAttachedDir(params("owner"), params("repository")), fileId + "." + FileUtil.getExtension(file.getName)), file.get) - } + }, FileUtil.isUploadableType) } - private def execute(f: (FileItem, String) => Unit) = fileParams.get("file") match { - case Some(file) if(FileUtil.isImage(file.name)) => + private def execute(f: (FileItem, String) => Unit, mimeTypeChcker: (String) => Boolean) = fileParams.get("file") match { + case Some(file) if(mimeTypeChcker(file.name)) => defining(FileUtil.generateFileId){ fileId => f(file, fileId) diff --git a/src/main/scala/gitbucket/core/controller/IssuesController.scala b/src/main/scala/gitbucket/core/controller/IssuesController.scala index b15cd16..21821a5 100644 --- a/src/main/scala/gitbucket/core/controller/IssuesController.scala +++ b/src/main/scala/gitbucket/core/controller/IssuesController.scala @@ -332,6 +332,7 @@ (Directory.getAttachedDir(repository.owner, repository.name) match { case dir if(dir.exists && dir.isDirectory) => dir.listFiles.find(_.getName.startsWith(params("file") + ".")).map { file => + response.setHeader("Content-Disposition", f"""inline; filename=${file.getName}""") RawData(FileUtil.getMimeType(file.getName), file) } case _ => None diff --git a/src/main/scala/gitbucket/core/util/FileUtil.scala b/src/main/scala/gitbucket/core/util/FileUtil.scala index d3428fb..f753a60 100644 --- a/src/main/scala/gitbucket/core/util/FileUtil.scala +++ b/src/main/scala/gitbucket/core/util/FileUtil.scala @@ -1,7 +1,7 @@ package gitbucket.core.util import org.apache.commons.io.FileUtils -import java.net.URLConnection +import org.apache.tika.Tika import java.io.File import ControlUtil._ import scala.util.Random @@ -9,8 +9,8 @@ object FileUtil { def getMimeType(name: String): String = - defining(URLConnection.getFileNameMap()){ fileNameMap => - fileNameMap.getContentTypeFor(name) match { + defining(new Tika()){ tika => + tika.detect(name) match { case null => "application/octet-stream" case mimeType => mimeType } @@ -28,6 +28,8 @@ def isImage(name: String): Boolean = getMimeType(name).startsWith("image/") + def isUploadableType(name: String): Boolean = mimeTypeWhiteList contains getMimeType(name) + def isLarge(size: Long): Boolean = (size > 1024 * 1000) def isText(content: Array[Byte]): Boolean = !content.contains(0) @@ -50,4 +52,14 @@ FileUtils.deleteDirectory(dir) } } + + val mimeTypeWhiteList: Array[String] = Array( + "application/pdf", + "application/vnd.openxmlformats-officedocument.presentationml.presentation", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "image/gif", + "image/jpeg", + "image/png", + "text/plain") } diff --git a/src/main/twirl/gitbucket/core/helper/attached.scala.html b/src/main/twirl/gitbucket/core/helper/attached.scala.html index 33bd58e..0ceb228 100644 --- a/src/main/twirl/gitbucket/core/helper/attached.scala.html +++ b/src/main/twirl/gitbucket/core/helper/attached.scala.html @@ -1,22 +1,24 @@ @(owner: String, repository: String)(textarea: Html)(implicit context: gitbucket.core.controller.Context) @import context._ +@import gitbucket.core.util.FileUtil