filegate/service/staticanalysis.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,
)
}