baseline_test.go 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. package detect
  2. import (
  3. "errors"
  4. "testing"
  5. "github.com/stretchr/testify/assert"
  6. "github.com/stretchr/testify/require"
  7. "github.com/zricethezav/gitleaks/v8/report"
  8. )
  9. func TestIsNew(t *testing.T) {
  10. t.Parallel()
  11. tests := map[string]struct {
  12. findings report.Finding
  13. redact uint
  14. baseline []report.Finding
  15. expect bool
  16. }{
  17. // new
  18. "new - commit doesn't match baseline": {
  19. findings: report.Finding{
  20. Commit: "0000",
  21. Author: "a",
  22. },
  23. baseline: []report.Finding{
  24. {
  25. Commit: "0002",
  26. Author: "a",
  27. },
  28. },
  29. expect: true,
  30. },
  31. "new - redacted, different baseline": {
  32. findings: report.Finding{
  33. RuleID: "private-key",
  34. Description: "Identified a Private Key, which may compromise cryptographic security and sensitive data encryption.",
  35. StartLine: 1,
  36. EndLine: 15,
  37. StartColumn: 1,
  38. EndColumn: 30,
  39. Match: "REDACTED",
  40. Secret: "REDACTED",
  41. File: "key.txt",
  42. Commit: "6d3ba1f7653822c0f8ac9a9af56daaa2cd8bbcad",
  43. Entropy: 5.9834013,
  44. Author: "James Bond",
  45. Email: "jbond@gov.co.uk",
  46. Date: "2025-03-02T15:10:40Z",
  47. Message: "init",
  48. Fingerprint: "6d3ba1f7653822c0f8ac9a9af56daaa2cd8bbcad:key.txt:private-key:1",
  49. },
  50. baseline: []report.Finding{
  51. {
  52. RuleID: "private-key",
  53. Description: "Identified a Private Key, which may compromise cryptographic security and sensitive data encryption.",
  54. StartLine: 1,
  55. EndLine: 15,
  56. StartColumn: 1,
  57. EndColumn: 30,
  58. Match: "-----BEGIN RSA PRIVATE KEY-----\nMIICWgIBAAKBgFIckgeuo80H6skLd1FKYfJC75/tnmtDWO4Rf2AFqrYZdu71VKGR\noGfEVl7AmvxTd9u6tnPtWjAeu9k2VMQcOtXEwgU0A6H09EBcS1EVN/I8pcNw1qjO\nkJ7ZA8AhZk/OpVAK7665CEny7ISRNZnx1nPaHjlb8lebPzlWOvxX9wjbAgMBAAEC\ngYBN6wqv+4s4juC/cwAAxeL4L4iQbL497yS+lSAYEIiUUMnJrEhpIXXjwi5rr73i\n35oHisCEdaF1tFRxpNr/VgKFsM1KqQUZvCVRE9Rokfe23QkQDvcxh9CI/Ah9Eofp\nx/m5DjSsRKrbIpOOAC3J3B/s02HRmxy8tRYnQVqWXzAH8QJBAJdBgXi62KI1eytU\n7l3Q8ymkS1OHzSOGBEYPpZZQ7WRpZlv/06cKfJBT/dGgA4z9i9ySs8cWUoh+FGYX\nlkDB4c0CQQCK+TwfAFvrkSWorZ9Gjb6y2LZQPUufTzJNhzhK5XObCDbwyMXEM/Vs\newiyUFljlI/A9PjcrmkgrDLUMD4+og1HAkAs2t01W1uhBvEm0YH6yltCDxnThKM+\nFKEx0bQOVqN/so4LXFt83uw/tNjBkI1dA1e1qr+rm6AQICuWdwo03ApFAkBktes4\nuCTk2GHHFFM5aN0KdHviOBlGULkub9B+jjsx3UkbQxP2dITlYV/TAOFWhcGLXru+\nCPKMR93p4TAqaXtfAkA+ZZDb0mA9rtaetJlSoo6XgwI/+kqltADch9dcyqYBHwjr\nAEkzUKvmCxNAK4GEPA79FZFp30kDx+buysyeX9qY\n-----END RSA PRIVATE KEY-----",
  59. Secret: "-----BEGIN RSA PRIVATE KEY-----\nMIICWgIBAAKBgFIckgeuo80H6skLd1FKYfJC75/tnmtDWO4Rf2AFqrYZdu71VKGR\noGfEVl7AmvxTd9u6tnPtWjAeu9k2VMQcOtXEwgU0A6H09EBcS1EVN/I8pcNw1qjO\nkJ7ZA8AhZk/OpVAK7665CEny7ISRNZnx1nPaHjlb8lebPzlWOvxX9wjbAgMBAAEC\ngYBN6wqv+4s4juC/cwAAxeL4L4iQbL497yS+lSAYEIiUUMnJrEhpIXXjwi5rr73i\n35oHisCEdaF1tFRxpNr/VgKFsM1KqQUZvCVRE9Rokfe23QkQDvcxh9CI/Ah9Eofp\nx/m5DjSsRKrbIpOOAC3J3B/s02HRmxy8tRYnQVqWXzAH8QJBAJdBgXi62KI1eytU\n7l3Q8ymkS1OHzSOGBEYPpZZQ7WRpZlv/06cKfJBT/dGgA4z9i9ySs8cWUoh+FGYX\nlkDB4c0CQQCK+TwfAFvrkSWorZ9Gjb6y2LZQPUufTzJNhzhK5XObCDbwyMXEM/Vs\newiyUFljlI/A9PjcrmkgrDLUMD4+og1HAkAs2t01W1uhBvEm0YH6yltCDxnThKM+\nFKEx0bQOVqN/so4LXFt83uw/tNjBkI1dA1e1qr+rm6AQICuWdwo03ApFAkBktes4\nuCTk2GHHFFM5aN0KdHviOBlGULkub9B+jjsx3UkbQxP2dITlYV/TAOFWhcGLXru+\nCPKMR93p4TAqaXtfAkA+ZZDb0mA9rtaetJlSoo6XgwI/+kqltADch9dcyqYBHwjr\nAEkzUKvmCxNAK4GEPA79FZFp30kDx+buysyeX9qY\n-----END RSA PRIVATE KEY-----",
  60. File: "key.txt",
  61. Commit: "e55e00ca1690a6b5b612d28b3d9ada3fd1775ac4",
  62. Entropy: 5.9834013,
  63. Author: "James Bond",
  64. Email: "jbond@gov.co.uk",
  65. Date: "2025-02-02T17:45:30Z",
  66. Message: "init",
  67. Fingerprint: "e55e00ca1690a6b5b612d28b3d9ada3fd1775ac4:key.txt:private-key:1",
  68. },
  69. },
  70. expect: true,
  71. },
  72. // not new
  73. "not new - commit+author matches": {
  74. findings: report.Finding{
  75. Commit: "0000",
  76. Author: "a",
  77. },
  78. baseline: []report.Finding{
  79. {
  80. Commit: "0000",
  81. Author: "a",
  82. },
  83. },
  84. expect: false,
  85. },
  86. "not new - commit+author matches, tags ignored": {
  87. findings: report.Finding{
  88. Commit: "0000",
  89. Author: "a",
  90. Tags: []string{"a", "b"},
  91. },
  92. baseline: []report.Finding{
  93. {
  94. Commit: "0000",
  95. Author: "a",
  96. Tags: []string{"a", "c"},
  97. },
  98. },
  99. expect: false, // Updated tags doesn't make it a new finding
  100. },
  101. "not new - redacted, everything else matches": {
  102. findings: report.Finding{
  103. RuleID: "private-key",
  104. Description: "Identified a Private Key, which may compromise cryptographic security and sensitive data encryption.",
  105. StartLine: 1,
  106. EndLine: 15,
  107. StartColumn: 1,
  108. EndColumn: 30,
  109. Match: "REDACTED",
  110. Secret: "REDACTED",
  111. File: "key.txt",
  112. Commit: "e55e00ca1690a6b5b612d28b3d9ada3fd1775ac4",
  113. Entropy: 5.9834013,
  114. Author: "James Bond",
  115. Email: "jbond@gov.co.uk",
  116. Date: "2025-02-02T17:45:30Z",
  117. Message: "init",
  118. Fingerprint: "e55e00ca1690a6b5b612d28b3d9ada3fd1775ac4:key.txt:private-key:1",
  119. },
  120. redact: 100,
  121. baseline: []report.Finding{
  122. {
  123. RuleID: "private-key",
  124. Description: "Identified a Private Key, which may compromise cryptographic security and sensitive data encryption.",
  125. StartLine: 1,
  126. EndLine: 15,
  127. StartColumn: 1,
  128. EndColumn: 30,
  129. Match: "-----BEGIN RSA PRIVATE KEY-----\nMIICWgIBAAKBgFIckgeuo80H6skLd1FKYfJC75/tnmtDWO4Rf2AFqrYZdu71VKGR\noGfEVl7AmvxTd9u6tnPtWjAeu9k2VMQcOtXEwgU0A6H09EBcS1EVN/I8pcNw1qjO\nkJ7ZA8AhZk/OpVAK7665CEny7ISRNZnx1nPaHjlb8lebPzlWOvxX9wjbAgMBAAEC\ngYBN6wqv+4s4juC/cwAAxeL4L4iQbL497yS+lSAYEIiUUMnJrEhpIXXjwi5rr73i\n35oHisCEdaF1tFRxpNr/VgKFsM1KqQUZvCVRE9Rokfe23QkQDvcxh9CI/Ah9Eofp\nx/m5DjSsRKrbIpOOAC3J3B/s02HRmxy8tRYnQVqWXzAH8QJBAJdBgXi62KI1eytU\n7l3Q8ymkS1OHzSOGBEYPpZZQ7WRpZlv/06cKfJBT/dGgA4z9i9ySs8cWUoh+FGYX\nlkDB4c0CQQCK+TwfAFvrkSWorZ9Gjb6y2LZQPUufTzJNhzhK5XObCDbwyMXEM/Vs\newiyUFljlI/A9PjcrmkgrDLUMD4+og1HAkAs2t01W1uhBvEm0YH6yltCDxnThKM+\nFKEx0bQOVqN/so4LXFt83uw/tNjBkI1dA1e1qr+rm6AQICuWdwo03ApFAkBktes4\nuCTk2GHHFFM5aN0KdHviOBlGULkub9B+jjsx3UkbQxP2dITlYV/TAOFWhcGLXru+\nCPKMR93p4TAqaXtfAkA+ZZDb0mA9rtaetJlSoo6XgwI/+kqltADch9dcyqYBHwjr\nAEkzUKvmCxNAK4GEPA79FZFp30kDx+buysyeX9qY\n-----END RSA PRIVATE KEY-----",
  130. Secret: "-----BEGIN RSA PRIVATE KEY-----\nMIICWgIBAAKBgFIckgeuo80H6skLd1FKYfJC75/tnmtDWO4Rf2AFqrYZdu71VKGR\noGfEVl7AmvxTd9u6tnPtWjAeu9k2VMQcOtXEwgU0A6H09EBcS1EVN/I8pcNw1qjO\nkJ7ZA8AhZk/OpVAK7665CEny7ISRNZnx1nPaHjlb8lebPzlWOvxX9wjbAgMBAAEC\ngYBN6wqv+4s4juC/cwAAxeL4L4iQbL497yS+lSAYEIiUUMnJrEhpIXXjwi5rr73i\n35oHisCEdaF1tFRxpNr/VgKFsM1KqQUZvCVRE9Rokfe23QkQDvcxh9CI/Ah9Eofp\nx/m5DjSsRKrbIpOOAC3J3B/s02HRmxy8tRYnQVqWXzAH8QJBAJdBgXi62KI1eytU\n7l3Q8ymkS1OHzSOGBEYPpZZQ7WRpZlv/06cKfJBT/dGgA4z9i9ySs8cWUoh+FGYX\nlkDB4c0CQQCK+TwfAFvrkSWorZ9Gjb6y2LZQPUufTzJNhzhK5XObCDbwyMXEM/Vs\newiyUFljlI/A9PjcrmkgrDLUMD4+og1HAkAs2t01W1uhBvEm0YH6yltCDxnThKM+\nFKEx0bQOVqN/so4LXFt83uw/tNjBkI1dA1e1qr+rm6AQICuWdwo03ApFAkBktes4\nuCTk2GHHFFM5aN0KdHviOBlGULkub9B+jjsx3UkbQxP2dITlYV/TAOFWhcGLXru+\nCPKMR93p4TAqaXtfAkA+ZZDb0mA9rtaetJlSoo6XgwI/+kqltADch9dcyqYBHwjr\nAEkzUKvmCxNAK4GEPA79FZFp30kDx+buysyeX9qY\n-----END RSA PRIVATE KEY-----",
  131. File: "key.txt",
  132. Commit: "e55e00ca1690a6b5b612d28b3d9ada3fd1775ac4",
  133. Entropy: 5.9834013,
  134. Author: "James Bond",
  135. Email: "jbond@gov.co.uk",
  136. Date: "2025-02-02T17:45:30Z",
  137. Message: "init",
  138. Fingerprint: "e55e00ca1690a6b5b612d28b3d9ada3fd1775ac4:key.txt:private-key:1",
  139. },
  140. },
  141. expect: false,
  142. },
  143. }
  144. for name, test := range tests {
  145. t.Run(name, func(t *testing.T) {
  146. assert.Equal(t, test.expect, IsNew(test.findings, test.redact, test.baseline))
  147. })
  148. }
  149. }
  150. func TestFileLoadBaseline(t *testing.T) {
  151. t.Parallel()
  152. tests := []struct {
  153. Filename string
  154. ExpectedError error
  155. }{
  156. {
  157. Filename: "../testdata/baseline/baseline.csv",
  158. ExpectedError: errors.New("the format of the file ../testdata/baseline/baseline.csv is not supported"),
  159. },
  160. {
  161. Filename: "../testdata/baseline/baseline.sarif",
  162. ExpectedError: errors.New("the format of the file ../testdata/baseline/baseline.sarif is not supported"),
  163. },
  164. {
  165. Filename: "../testdata/baseline/notfound.json",
  166. ExpectedError: errors.New("could not open ../testdata/baseline/notfound.json"),
  167. },
  168. }
  169. for _, test := range tests {
  170. _, err := LoadBaseline(test.Filename)
  171. assert.Equal(t, test.ExpectedError, err)
  172. }
  173. }
  174. func TestIgnoreIssuesInBaseline(t *testing.T) {
  175. t.Parallel()
  176. tests := []struct {
  177. findings []report.Finding
  178. baseline []report.Finding
  179. expectCount int
  180. }{
  181. {
  182. findings: []report.Finding{
  183. {
  184. Author: "a",
  185. Commit: "5",
  186. },
  187. },
  188. baseline: []report.Finding{
  189. {
  190. Author: "a",
  191. Commit: "5",
  192. },
  193. },
  194. expectCount: 0,
  195. },
  196. {
  197. findings: []report.Finding{
  198. {
  199. Author: "a",
  200. Commit: "5",
  201. Fingerprint: "a",
  202. },
  203. },
  204. baseline: []report.Finding{
  205. {
  206. Author: "a",
  207. Commit: "5",
  208. Fingerprint: "b",
  209. },
  210. },
  211. expectCount: 0,
  212. },
  213. }
  214. for _, test := range tests {
  215. d, err := NewDetectorDefaultConfig()
  216. require.NoError(t, err)
  217. d.baseline = test.baseline
  218. for _, finding := range test.findings {
  219. d.AddFinding(finding)
  220. }
  221. assert.Len(t, d.findings, test.expectCount)
  222. }
  223. }