Skip to content

Commit 9d5ae3c

Browse files
su-amaastrend-kensin-wu
authored andcommitted
update to latest version: v1.5.0
1 parent 85f021e commit 9d5ae3c

File tree

10 files changed

+520
-15
lines changed

10 files changed

+520
-15
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# CHANGELOG
22

3+
## 1.5.0 - 2024-12-16
4+
* Add `ScanReader` for scanning a well-implemented `AmaasClientReader`
5+
* Add example code `scan-s3obj` for scanning an S3 object which is an example of using `ScanReader`
6+
37
## 1.4.2 - 2024-08-30
48

59
* Fixed the issue of the TLS parameter being overwritten

README.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,50 @@ if err != nil {
102102
// Use the 'response' as needed
103103
```
104104
105+
### Scanning with AmaasClientReader
106+
107+
```go
108+
type CustomReader struct {
109+
...
110+
}
111+
112+
func newCustomReader() *CustomReader {
113+
...
114+
}
115+
116+
func (r *CustomReader) Identifier() string {
117+
// It returns the name of the file.
118+
}
119+
120+
func (r *CustomReader) DataSize() (int64, error) {
121+
// It should return the true size of the file in Reader.
122+
}
123+
124+
func (r *CustomReader) ReadBytes(offset int64, length int32) (data []byte, err error) {
125+
// It should return required number of data bytes starting from certain offset.
126+
}
127+
128+
reader := newCustomReader()
129+
130+
// It is recommended to disable digest when using AmaasReader.
131+
// Because it will trigger ReadBytes to read whole file,
132+
// network traffic will increase if it reads from the Internet.
133+
client.SetDigestDisable()
134+
135+
response, err := client.ScanReader(reader, tags)
136+
if err != nil {
137+
// Handle scanning error
138+
panic(err)
139+
}
140+
141+
// Use the 'response' as needed
142+
```
143+
105144
**_Note_**
106145
107146
- Max number of tags is 8. And the length of each tag can't exceed 63.
147+
- If user wants to take a look how to scan a S3 file without downloading the whole to the ground,
148+
please refer to the [example code](examples/scan-s3obj/scan-s3obj.go) for further detail.
108149

109150
## Additional Functions
110151

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.4.2
1+
1.5.0

examples/scan-s3obj/go.mod

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
module github.com/trendmicro/tm-v1-fs-golang-sdk/examples/scan-s3obj
2+
3+
go 1.23
4+
5+
require (
6+
github.com/aws/aws-sdk-go-v2 v1.32.5 // indirect
7+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 // indirect
8+
github.com/aws/aws-sdk-go-v2/credentials v1.17.46 // indirect
9+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.20 // indirect
10+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.24 // indirect
11+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.24 // indirect
12+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect
13+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.24 // indirect
14+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect
15+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.5 // indirect
16+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.5 // indirect
17+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.5 // indirect
18+
github.com/aws/aws-sdk-go-v2/service/sso v1.24.6 // indirect
19+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.5 // indirect
20+
github.com/aws/aws-sdk-go-v2/service/sts v1.33.1 // indirect
21+
github.com/aws/smithy-go v1.22.1 // indirect
22+
github.com/golang/protobuf v1.5.4 // indirect
23+
golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
24+
golang.org/x/net v0.22.0 // indirect
25+
golang.org/x/sys v0.18.0 // indirect
26+
golang.org/x/text v0.14.0 // indirect
27+
google.golang.org/genproto/googleapis/rpc v0.0.0-20240311173647-c811ad7063a7 // indirect
28+
google.golang.org/grpc v1.62.1 // indirect
29+
google.golang.org/protobuf v1.33.0 // indirect
30+
)
31+
32+
require (
33+
github.com/trendmicro/tm-v1-fs-golang-sdk v0.0.0-20241119105152-8e5832d37e21
34+
github.com/aws/aws-sdk-go-v2/config v1.28.5
35+
github.com/aws/aws-sdk-go-v2/service/s3 v1.67.1
36+
)

examples/scan-s3obj/go.sum

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
github.com/trendmicro/tm-v1-fs-golang-sdk v0.0.0-20241119105152-8e5832d37e21 h1:30XGBlE8B4nrYGFPNxz8Q+tIPQPb95zKIHqmVM5jh8w=
2+
github.com/trendmicro/tm-v1-fs-golang-sdk v0.0.0-20241119105152-8e5832d37e21/go.mod h1:P/bveu/shq7hy5xRt2h6L1H6yR2FGqaNIJ7lm+yJLKU=
3+
github.com/aws/aws-sdk-go-v2 v1.32.5 h1:U8vdWJuY7ruAkzaOdD7guwJjD06YSKmnKCJs7s3IkIo=
4+
github.com/aws/aws-sdk-go-v2 v1.32.5/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U=
5+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 h1:lL7IfaFzngfx0ZwUGOZdsFFnQ5uLvR0hWqqhyE7Q9M8=
6+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7/go.mod h1:QraP0UcVlQJsmHfioCrveWOC1nbiWUl3ej08h4mXWoc=
7+
github.com/aws/aws-sdk-go-v2/config v1.28.5 h1:Za41twdCXbuyyWv9LndXxZZv3QhTG1DinqlFsSuvtI0=
8+
github.com/aws/aws-sdk-go-v2/config v1.28.5/go.mod h1:4VsPbHP8JdcdUDmbTVgNL/8w9SqOkM5jyY8ljIxLO3o=
9+
github.com/aws/aws-sdk-go-v2/credentials v1.17.46 h1:AU7RcriIo2lXjUfHFnFKYsLCwgbz1E7Mm95ieIRDNUg=
10+
github.com/aws/aws-sdk-go-v2/credentials v1.17.46/go.mod h1:1FmYyLGL08KQXQ6mcTlifyFXfJVCNJTVGuQP4m0d/UA=
11+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.20 h1:sDSXIrlsFSFJtWKLQS4PUWRvrT580rrnuLydJrCQ/yA=
12+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.20/go.mod h1:WZ/c+w0ofps+/OUqMwWgnfrgzZH1DZO1RIkktICsqnY=
13+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.24 h1:4usbeaes3yJnCFC7kfeyhkdkPtoRYPa/hTmCqMpKpLI=
14+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.24/go.mod h1:5CI1JemjVwde8m2WG3cz23qHKPOxbpkq0HaoreEgLIY=
15+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.24 h1:N1zsICrQglfzaBnrfM0Ys00860C+QFwu6u/5+LomP+o=
16+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.24/go.mod h1:dCn9HbJ8+K31i8IQ8EWmWj0EiIk0+vKiHNMxTTYveAg=
17+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ=
18+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc=
19+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.24 h1:JX70yGKLj25+lMC5Yyh8wBtvB01GDilyRuJvXJ4piD0=
20+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.24/go.mod h1:+Ln60j9SUTD0LEwnhEB0Xhg61DHqplBrbZpLgyjoEHg=
21+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y=
22+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE=
23+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.5 h1:gvZOjQKPxFXy1ft3QnEyXmT+IqneM9QAUWlM3r0mfqw=
24+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.5/go.mod h1:DLWnfvIcm9IET/mmjdxeXbBKmTCm0ZB8p1za9BVteM8=
25+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.5 h1:wtpJ4zcwrSbwhECWQoI/g6WM9zqCcSpHDJIWSbMLOu4=
26+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.5/go.mod h1:qu/W9HXQbbQ4+1+JcZp0ZNPV31ym537ZJN+fiS7Ti8E=
27+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.5 h1:P1doBzv5VEg1ONxnJss1Kh5ZG/ewoIE4MQtKKc6Crgg=
28+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.5/go.mod h1:NOP+euMW7W3Ukt28tAxPuoWao4rhhqJD3QEBk7oCg7w=
29+
github.com/aws/aws-sdk-go-v2/service/s3 v1.67.1 h1:LXLnDfjT/P6SPIaCE86xCOjJROPn4FNB2EdN68vMK5c=
30+
github.com/aws/aws-sdk-go-v2/service/s3 v1.67.1/go.mod h1:ralv4XawHjEMaHOWnTFushl0WRqim/gQWesAMF6hTow=
31+
github.com/aws/aws-sdk-go-v2/service/sso v1.24.6 h1:3zu537oLmsPfDMyjnUS2g+F2vITgy5pB74tHI+JBNoM=
32+
github.com/aws/aws-sdk-go-v2/service/sso v1.24.6/go.mod h1:WJSZH2ZvepM6t6jwu4w/Z45Eoi75lPN7DcydSRtJg6Y=
33+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.5 h1:K0OQAsDywb0ltlFrZm0JHPY3yZp/S9OaoLU33S7vPS8=
34+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.5/go.mod h1:ORITg+fyuMoeiQFiVGoqB3OydVTLkClw/ljbblMq6Cc=
35+
github.com/aws/aws-sdk-go-v2/service/sts v1.33.1 h1:6SZUVRQNvExYlMLbHdlKB48x0fLbc2iVROyaNEwBHbU=
36+
github.com/aws/aws-sdk-go-v2/service/sts v1.33.1/go.mod h1:GqWyYCwLXnlUB1lOAXQyNSPqPLQJvmo8J0DWBzp9mtg=
37+
github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro=
38+
github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
39+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
40+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
41+
github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
42+
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
43+
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
44+
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
45+
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
46+
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
47+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
48+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
49+
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
50+
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
51+
golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
52+
golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
53+
golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc=
54+
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
55+
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
56+
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
57+
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
58+
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
59+
google.golang.org/genproto/googleapis/rpc v0.0.0-20240311173647-c811ad7063a7 h1:8EeVk1VKMD+GD/neyEHGmz7pFblqPjHoi+PGQIlLx2s=
60+
google.golang.org/genproto/googleapis/rpc v0.0.0-20240311173647-c811ad7063a7/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY=
61+
google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk=
62+
google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE=
63+
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
64+
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
65+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
66+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

examples/scan-s3obj/scan-s3obj.go

Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
package main
2+
3+
/*
4+
This is an example of a test program that can execute a scan on a HTTP URL.
5+
It will return an array of AMaaS scan results as part of its JSON output.
6+
*/
7+
8+
import (
9+
"context"
10+
"flag"
11+
"fmt"
12+
"io"
13+
"log"
14+
"os"
15+
"strings"
16+
17+
amaasclient "github.com/trendmicro/tm-v1-fs-golang-sdk"
18+
19+
"github.com/aws/aws-sdk-go-v2/config"
20+
"github.com/aws/aws-sdk-go-v2/service/s3"
21+
"github.com/aws/aws-sdk-go-v2/service/s3/types"
22+
)
23+
24+
func main() {
25+
26+
var bucketregion string
27+
var bucket string
28+
var key string
29+
30+
var grpcAddr string
31+
var apiKey string
32+
var tls bool
33+
var caCert string
34+
var region string
35+
var pml bool
36+
var feedback bool
37+
var verbose bool
38+
var tag string
39+
var digest bool
40+
41+
flag.StringVar(&bucketregion, "bucketregion", "us-west-2", "region for S3 bucket")
42+
flag.StringVar(&bucket, "bucket", "", "S3 bucket name")
43+
flag.StringVar(&key, "key", "", "S3 object key")
44+
45+
flag.StringVar(&grpcAddr, "addr", "", "the address to connect to for GRPC")
46+
flag.StringVar(&apiKey, "apikey", "", "API key for service authentication")
47+
flag.BoolVar(&tls, "tls", false, "enable server TLS by client for GRPC.")
48+
flag.StringVar(&region, "region", "", "the region to connect to")
49+
flag.BoolVar(&pml, "pml", false, "enable predictive machine learning detection")
50+
flag.BoolVar(&feedback, "feedback", false, "enable SPN feedback")
51+
flag.BoolVar(&verbose, "verbose", false, "enable verbose scan result")
52+
flag.StringVar(&tag, "tag", "", "tags to be used for scanning. separated by comma.")
53+
flag.StringVar(&caCert, "ca_cert", "", "CA certificate for self hosted AMaaS server")
54+
flag.BoolVar(&digest, "digest", false, "enable digest calculation. it might increase network traffic for cloud file.")
55+
56+
flag.Parse()
57+
58+
var ac *amaasclient.AmaasClient
59+
var err error
60+
61+
if region != "" && grpcAddr != "" {
62+
log.Fatal("Both region and addr are specified. Please specify only one.")
63+
} else if region != "" {
64+
ac, err = amaasclient.NewClient(apiKey, region)
65+
if err != nil {
66+
log.Fatalf("Unable to create AMaaS scan client object. error: %v", err)
67+
}
68+
} else if grpcAddr != "" {
69+
ac, err = amaasclient.NewClientInternal(apiKey, grpcAddr, tls, caCert)
70+
if err != nil {
71+
log.Fatalf("Unable to create AMaaS scan client object. error: %v", err)
72+
}
73+
} else {
74+
log.Fatal("Neither region nor addr is specified. Please specify one.")
75+
}
76+
77+
if pml {
78+
ac.SetPMLEnable()
79+
}
80+
81+
if feedback {
82+
ac.SetFeedbackEnable()
83+
}
84+
85+
if verbose {
86+
ac.SetVerboseEnable()
87+
}
88+
89+
if !digest {
90+
// disable digest calculation to reduce network traffic if file is on cloud
91+
ac.SetDigestDisable()
92+
}
93+
94+
var tagsArray []string
95+
if tag != "" {
96+
tagsArray = strings.Split(tag, ",")
97+
}
98+
99+
reader, err := NewS3ClientReader(context.Background(), bucketregion, bucket, key)
100+
if err != nil {
101+
log.Fatalf("Unable to create S3 client reader. error: %v", err)
102+
}
103+
104+
result, err := ac.ScanReader(reader, tagsArray)
105+
if err != nil {
106+
log.Fatalf("Unable to scan reader. error: %v", err)
107+
}
108+
109+
fmt.Printf("%v", result)
110+
111+
os.Exit(0)
112+
}
113+
114+
type S3ClientReader struct {
115+
client *s3.Client
116+
bucket string
117+
key string
118+
size int64
119+
}
120+
121+
func NewS3ClientReader(ctx context.Context, bucketregion, bucket, key string) (*S3ClientReader, error) {
122+
// load default config from environment with specified region
123+
cfg, err := config.LoadDefaultConfig(ctx, config.WithRegion(bucketregion))
124+
if err != nil {
125+
return nil, err
126+
}
127+
defer ctx.Done()
128+
129+
// create S3 client with given config
130+
client := s3.NewFromConfig(cfg)
131+
132+
attr, err := client.GetObjectAttributes(ctx, &s3.GetObjectAttributesInput{
133+
Bucket: &bucket,
134+
Key: &key,
135+
ObjectAttributes: []types.ObjectAttributes{
136+
types.ObjectAttributesObjectSize,
137+
},
138+
})
139+
if err != nil {
140+
return nil, err
141+
}
142+
143+
if attr.ObjectSize == nil {
144+
return nil, fmt.Errorf("unable to get object size from S3")
145+
}
146+
147+
return &S3ClientReader{
148+
client: client,
149+
bucket: bucket,
150+
key: key,
151+
size: *attr.ObjectSize,
152+
}, nil
153+
}
154+
155+
// S3ClientReader implements AmaasClientReader
156+
func (r *S3ClientReader) Identifier() string {
157+
return fmt.Sprintf("s3://%s/%s", r.bucket, r.key)
158+
}
159+
160+
func (r *S3ClientReader) DataSize() (int64, error) {
161+
return r.size, nil
162+
}
163+
164+
func (r *S3ClientReader) ReadBytes(offset int64, length int32) ([]byte, error) {
165+
var rng string = fmt.Sprintf("bytes=%d-%d", offset, offset+int64(length)-1)
166+
167+
output, err := r.client.GetObject(context.Background(), &s3.GetObjectInput{
168+
Bucket: &r.bucket,
169+
Key: &r.key,
170+
Range: &rng,
171+
})
172+
if err != nil {
173+
return nil, err
174+
}
175+
defer output.Body.Close()
176+
177+
bytes, err := io.ReadAll(output.Body)
178+
if err != nil && err != io.EOF {
179+
bytes = nil
180+
}
181+
182+
return bytes, err
183+
}

0 commit comments

Comments
 (0)