63 lines
1.3 KiB
Go
63 lines
1.3 KiB
Go
package cmd
|
|
|
|
import (
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/Snider/Borg/pkg/tim"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var runPassword string
|
|
|
|
var runCmd = NewRunCmd()
|
|
|
|
func NewRunCmd() *cobra.Command {
|
|
cmd := &cobra.Command{
|
|
Use: "run [tim file]",
|
|
Short: "Run a Terminal Isolation Matrix.",
|
|
Args: cobra.ExactArgs(1),
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
filePath := args[0]
|
|
|
|
// Check if encrypted by extension or magic number
|
|
if isEncryptedTIM(filePath) {
|
|
password, _ := cmd.Flags().GetString("password")
|
|
if password == "" {
|
|
return tim.ErrPasswordRequired
|
|
}
|
|
return tim.RunEncrypted(filePath, password)
|
|
}
|
|
|
|
return tim.Run(filePath)
|
|
},
|
|
}
|
|
cmd.Flags().StringVarP(&runPassword, "password", "p", "", "Decryption password for encrypted TIMs (.stim)")
|
|
return cmd
|
|
}
|
|
|
|
// isEncryptedTIM checks if a file is an encrypted TIM by extension or magic number.
|
|
func isEncryptedTIM(path string) bool {
|
|
if strings.HasSuffix(path, ".stim") {
|
|
return true
|
|
}
|
|
// Check magic number
|
|
f, err := os.Open(path)
|
|
if err != nil {
|
|
return false
|
|
}
|
|
defer f.Close()
|
|
magic := make([]byte, 4)
|
|
if _, err := f.Read(magic); err != nil {
|
|
return false
|
|
}
|
|
return string(magic) == "STIM"
|
|
}
|
|
|
|
func GetRunCmd() *cobra.Command {
|
|
return runCmd
|
|
}
|
|
|
|
func init() {
|
|
RootCmd.AddCommand(GetRunCmd())
|
|
}
|