2022-07-07 17:27:21 +00:00
//go:build detectors
// +build detectors
2022-01-19 06:19:13 +00:00
package sentrytoken
import (
"context"
"fmt"
"testing"
"time"
2023-09-01 17:33:21 +00:00
"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
2022-02-10 18:54:33 +00:00
"github.com/trufflesecurity/trufflehog/v3/pkg/detectors"
2022-01-19 06:19:13 +00:00
2022-02-10 18:54:33 +00:00
"github.com/trufflesecurity/trufflehog/v3/pkg/common"
"github.com/trufflesecurity/trufflehog/v3/pkg/pb/detectorspb"
2022-01-19 06:19:13 +00:00
)
func TestSentryToken_FromChunk ( t * testing . T ) {
ctx , cancel := context . WithTimeout ( context . Background ( ) , time . Second * 5 )
defer cancel ( )
2022-02-16 03:19:09 +00:00
testSecrets , err := common . GetSecret ( ctx , "trufflehog-testing" , "detectors3" )
2022-01-19 06:19:13 +00:00
if err != nil {
t . Fatalf ( "could not get test secrets from GCP: %s" , err )
}
secret := testSecrets . MustGetField ( "SENTRYTOKEN_TOKEN" )
inactiveSecret := testSecrets . MustGetField ( "SENTRYTOKEN_INACTIVE" )
type args struct {
ctx context . Context
data [ ] byte
verify bool
}
tests := [ ] struct {
2023-09-01 17:33:21 +00:00
name string
s Scanner
args args
want [ ] detectors . Result
wantErr bool
wantVerificationErr bool
2022-01-19 06:19:13 +00:00
} {
{
name : "found, verified" ,
s : Scanner { } ,
args : args {
ctx : context . Background ( ) ,
data : [ ] byte ( fmt . Sprintf ( "You can find a sentry secret %s within" , secret ) ) ,
verify : true ,
} ,
want : [ ] detectors . Result {
{
DetectorType : detectorspb . DetectorType_SentryToken ,
Verified : true ,
} ,
} ,
wantErr : false ,
} ,
{
name : "found, unverified" ,
s : Scanner { } ,
args : args {
ctx : context . Background ( ) ,
data : [ ] byte ( fmt . Sprintf ( "You can find a sentry secret %s within but not valid" , inactiveSecret ) ) , // the secret would satisfy the regex but not pass validation
verify : true ,
} ,
want : [ ] detectors . Result {
{
DetectorType : detectorspb . DetectorType_SentryToken ,
Verified : false ,
} ,
} ,
wantErr : false ,
} ,
2023-09-01 17:33:21 +00:00
{
name : "found, would be verified but for timeout" ,
s : Scanner { client : common . SaneHttpClientTimeOut ( 1 * time . Microsecond ) } ,
args : args {
ctx : context . Background ( ) ,
data : [ ] byte ( fmt . Sprintf ( "You can find a sentry super secret %s within" , secret ) ) ,
verify : true ,
} ,
want : [ ] detectors . Result {
{
DetectorType : detectorspb . DetectorType_SentryToken ,
Verified : false ,
} ,
} ,
wantErr : false ,
wantVerificationErr : true ,
} ,
{
name : "found and valid but unexpected api response" ,
s : Scanner { client : common . ConstantResponseHttpClient ( 500 , "" ) } ,
args : args {
ctx : context . Background ( ) ,
data : [ ] byte ( fmt . Sprintf ( "You can find a sentry super secret %s within" , secret ) ) ,
verify : true ,
} ,
want : [ ] detectors . Result {
{
DetectorType : detectorspb . DetectorType_SentryToken ,
Verified : false ,
} ,
} ,
wantErr : false ,
wantVerificationErr : true ,
} ,
{
name : "found, good key but wrong scope" ,
s : Scanner { client : common . ConstantResponseHttpClient ( 403 , responseBody403 ) } ,
args : args {
ctx : context . Background ( ) ,
data : [ ] byte ( fmt . Sprintf ( "You can find a sentry super secret %s within" , secret ) ) ,
verify : true ,
} ,
want : [ ] detectors . Result {
{
DetectorType : detectorspb . DetectorType_SentryToken ,
Verified : true ,
} ,
} ,
wantErr : false ,
} ,
2023-09-11 14:26:09 +00:00
{
name : "found, account deactivated" ,
s : Scanner { client : common . ConstantResponseHttpClient ( 200 , reponseAccountDeactivated ) } ,
args : args {
ctx : context . Background ( ) ,
data : [ ] byte ( fmt . Sprintf ( "You can find a sentry super secret %s within" , secret ) ) ,
verify : true ,
} ,
want : [ ] detectors . Result {
{
DetectorType : detectorspb . DetectorType_SentryToken ,
Verified : false ,
} ,
} ,
wantErr : false ,
wantVerificationErr : true ,
} ,
{
name : "found, account deactivated" ,
s : Scanner { client : common . ConstantResponseHttpClient ( 200 , responseEnmpty ) } ,
args : args {
ctx : context . Background ( ) ,
data : [ ] byte ( fmt . Sprintf ( "You can find a sentry super secret %s within" , secret ) ) ,
verify : true ,
} ,
want : [ ] detectors . Result {
{
DetectorType : detectorspb . DetectorType_SentryToken ,
Verified : false ,
} ,
} ,
wantErr : false ,
wantVerificationErr : true ,
} ,
2022-01-19 06:19:13 +00:00
{
name : "not found" ,
s : Scanner { } ,
args : args {
ctx : context . Background ( ) ,
data : [ ] byte ( "You cannot find the secret within" ) ,
verify : true ,
} ,
want : nil ,
wantErr : false ,
} ,
}
2023-09-01 17:33:21 +00:00
2022-01-19 06:19:13 +00:00
for _ , tt := range tests {
t . Run ( tt . name , func ( t * testing . T ) {
2023-09-01 17:33:21 +00:00
got , err := tt . s . FromData ( tt . args . ctx , tt . args . verify , tt . args . data )
2022-01-19 06:19:13 +00:00
if ( err != nil ) != tt . wantErr {
2023-09-01 17:33:21 +00:00
t . Errorf ( "Gitlab.FromData() error = %v, wantErr %v" , err , tt . wantErr )
2022-01-19 06:19:13 +00:00
return
}
for i := range got {
if len ( got [ i ] . Raw ) == 0 {
2023-09-01 17:33:21 +00:00
t . Fatal ( "no raw secret present" )
}
2023-12-05 13:57:52 +00:00
if ( got [ i ] . VerificationError ( ) != nil ) != tt . wantVerificationErr {
t . Fatalf ( "wantVerificationError = %v, verification error = %v," , tt . wantVerificationErr , got [ i ] . VerificationError ( ) )
2022-01-19 06:19:13 +00:00
}
}
2023-12-05 13:57:52 +00:00
opts := cmpopts . IgnoreFields ( detectors . Result { } , "Raw" , "verificationError" )
2023-09-01 17:33:21 +00:00
if diff := cmp . Diff ( got , tt . want , opts ) ; diff != "" {
t . Errorf ( "Gitlab.FromData() %s diff: (-got +want)\n%s" , tt . name , diff )
2022-01-19 06:19:13 +00:00
}
} )
}
}
2023-09-11 14:26:09 +00:00
const (
responseBody403 = `
2023-09-01 17:33:21 +00:00
[
{
"organization" : {
"id" : "911964" ,
"slug" : "wigslap" ,
"status" : {
"id" : "active" ,
"name" : "active"
} ,
"name" : "wigslap"
}
}
]
`
2023-09-11 14:26:09 +00:00
reponseAccountDeactivated = ` { "detail": "Authentication credentials were not provided"} `
responseEnmpty = ` [] `
)
2023-09-01 17:33:21 +00:00
2022-01-19 06:19:13 +00:00
func BenchmarkFromData ( benchmark * testing . B ) {
ctx := context . Background ( )
s := Scanner { }
for name , data := range detectors . MustGetBenchmarkData ( ) {
benchmark . Run ( name , func ( b * testing . B ) {
2023-08-23 21:34:10 +00:00
b . ResetTimer ( )
2022-01-19 06:19:13 +00:00
for n := 0 ; n < b . N ; n ++ {
2022-03-01 04:38:13 +00:00
_ , err := s . FromData ( ctx , false , data )
if err != nil {
b . Fatal ( err )
}
2022-01-19 06:19:13 +00:00
}
} )
}
}