@@ -20,11 +20,13 @@ import (
2020 "github.com/VirusTotal/vt-cli/utils"
2121 vt "github.com/VirusTotal/vt-go"
2222 "github.com/spf13/cobra"
23+ "github.com/spf13/pflag"
2324 "github.com/spf13/viper"
2425)
2526
2627type fileScanner struct {
27- scanner * vt.FileScanner
28+ scanner * vt.FileScanner
29+ showInVT bool
2830}
2931
3032func (s * fileScanner ) Do (path interface {}, ds * utils.DoerState ) string {
@@ -53,6 +55,13 @@ func (s *fileScanner) Do(path interface{}, ds *utils.DoerState) string {
5355 return fmt .Sprintf ("%s" , err )
5456 }
5557
58+ if s .showInVT {
59+ // Return the analysis URL in VT so users can visit it
60+ return fmt .Sprintf (
61+ "%s https://www.virustotal.com/gui/file-analysis/%s" ,
62+ path .(string ), analysis .ID ())
63+ }
64+
5665 return fmt .Sprintf ("%s %s" , path .(string ), analysis .ID ())
5766}
5867
@@ -96,27 +105,37 @@ func NewScanFileCmd() *cobra.Command {
96105 if err != nil {
97106 return err
98107 }
99- s := & fileScanner {scanner : client .NewFileScanner ()}
108+ s := & fileScanner {
109+ scanner : client .NewFileScanner (),
110+ showInVT : viper .GetBool ("open" )}
100111 c .DoWithStringsFromReader (s , argReader )
101112 return nil
102113 },
103114 }
104115
105116 addThreadsFlag (cmd .Flags ())
117+ addOpenInVTFlag (cmd .Flags ())
106118 cmd .MarkZshCompPositionalArgumentFile (1 )
107119
108120 return cmd
109121}
110122
111123type urlScanner struct {
112- scanner * vt.URLScanner
124+ scanner * vt.URLScanner
125+ showInVT bool
113126}
114127
115128func (s * urlScanner ) Do (url interface {}, ds * utils.DoerState ) string {
116129 analysis , err := s .scanner .Scan (url .(string ))
117130 if err != nil {
118131 return fmt .Sprintf ("%s" , err )
119132 }
133+
134+ if s .showInVT {
135+ return fmt .Sprintf (
136+ "%s https://www.virustotal.com/gui/url-analysis/%s" , url , analysis .ID ())
137+ }
138+
120139 return fmt .Sprintf ("%s %s" , url , analysis .ID ())
121140}
122141
@@ -155,13 +174,16 @@ func NewScanURLCmd() *cobra.Command {
155174 if err != nil {
156175 return err
157176 }
158- s := & urlScanner {scanner : client .NewURLScanner ()}
177+ s := & urlScanner {
178+ scanner : client .NewURLScanner (),
179+ showInVT : viper .GetBool ("open" )}
159180 c .DoWithStringsFromReader (s , argReader )
160181 return nil
161182 },
162183 }
163184
164185 addThreadsFlag (cmd .Flags ())
186+ addOpenInVTFlag (cmd .Flags ())
165187
166188 return cmd
167189}
@@ -184,3 +206,9 @@ func NewScanCmd() *cobra.Command {
184206
185207 return cmd
186208}
209+
210+ func addOpenInVTFlag (flags * pflag.FlagSet ) {
211+ flags .BoolP (
212+ "open" , "o" , false ,
213+ "Return an URL to see the analysis report at the VirusTotal web GUI" )
214+ }
0 commit comments