133 lines
2.8 KiB
Go
133 lines
2.8 KiB
Go
package service
|
|
|
|
import (
|
|
"crypto/md5"
|
|
"crypto/sha1"
|
|
"crypto/sha256"
|
|
"fmt"
|
|
"io"
|
|
"log"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
|
|
"github.com/spf13/viper"
|
|
|
|
"git.jmbit.de/filegate/filegate/db"
|
|
"git.jmbit.de/filegate/filegate/files"
|
|
)
|
|
|
|
func mimeType(path string) string {
|
|
fileMimeOut, err := exec.Command("/usr/bin/file", "-bi", path).Output()
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
mimeString := strings.Split(string(fileMimeOut), ";")[0]
|
|
|
|
return mimeString
|
|
}
|
|
|
|
func fileExtension(path string) string {
|
|
fileOut, err := exec.Command("/usr/bin/file", "-b", "--extension", path).Output()
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
|
|
return string(fileOut)
|
|
}
|
|
|
|
func fileCmd(path string) string {
|
|
fileOut, err := exec.Command("/usr/bin/file", "-b", path).Output()
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
|
|
return string(fileOut)
|
|
}
|
|
|
|
func fileChecksums(path string) (string, string, string) {
|
|
input := strings.NewReader(path)
|
|
md5Hash := md5.New()
|
|
sha1Hash := sha1.New()
|
|
sha256Hash := sha256.New()
|
|
if _, err := io.Copy(md5Hash, input); err != nil {
|
|
log.Println(err)
|
|
}
|
|
if _, err := io.Copy(sha1Hash, input); err != nil {
|
|
log.Println(err)
|
|
}
|
|
if _, err := io.Copy(sha256Hash, input); err != nil {
|
|
log.Println(err)
|
|
}
|
|
md5Sum := fmt.Sprintf("%x", md5Hash.Sum(nil))
|
|
sha1Sum := fmt.Sprintf("%x", sha1Hash.Sum(nil))
|
|
sha256Sum := fmt.Sprintf("%x", sha256Hash.Sum(nil))
|
|
return md5Sum, sha1Sum, sha256Sum
|
|
}
|
|
|
|
func fileSize(path string) int64 {
|
|
fileInfo, err := os.Stat(path)
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
filesize := fileInfo.Size()
|
|
return filesize
|
|
}
|
|
|
|
//TODO: Use container instead of running on local disk
|
|
|
|
// RunStaticAnalysis populates the File Properties Table for a given file
|
|
func RunStaticAnalysis(id uint) {
|
|
file := db.GetFileByID(id)
|
|
|
|
filepath := fmt.Sprintf(
|
|
"%s/%d/%s",
|
|
viper.GetString("tempfiles"),
|
|
file.ID,
|
|
file.Properties.OriginalName,
|
|
)
|
|
err := os.Mkdir(fmt.Sprintf("%s/%d", viper.GetString("tempfiles"), file.ID), 700)
|
|
if err != nil {
|
|
|
|
log.Printf("Error Creating analysis directory, %v", err)
|
|
return
|
|
}
|
|
fileObject, err := files.GetFile(file.Blob)
|
|
if err != nil {
|
|
log.Printf("Error getting file from S3, %v", err)
|
|
fileObject.Close()
|
|
return
|
|
}
|
|
localFile, err := os.Create(filepath)
|
|
if err != nil {
|
|
log.Printf("Error Creating analysis file, %v", err)
|
|
fileObject.Close()
|
|
localFile.Close()
|
|
return
|
|
}
|
|
if _, err = io.Copy(localFile, fileObject); err != nil {
|
|
log.Printf("Could not Copy S3 File to local disk: %v", err)
|
|
fileObject.Close()
|
|
localFile.Close()
|
|
return
|
|
}
|
|
fileObject.Close()
|
|
localFile.Close()
|
|
mimeType := mimeType(filepath)
|
|
fileCmd := fileCmd(filepath)
|
|
fileExtension := fileExtension(filepath)
|
|
fileSize := fileSize(filepath)
|
|
md5Sum, sha1Sum, sha256Sum := fileChecksums(filepath)
|
|
|
|
db.SetSimpleAttributes(
|
|
id,
|
|
mimeType,
|
|
fileSize,
|
|
sha256Sum,
|
|
sha1Sum,
|
|
md5Sum,
|
|
fileCmd,
|
|
fileExtension,
|
|
)
|
|
}
|