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, ) }