Skip to content

Commit 6fc1f16

Browse files
authored
Remove duplicate entires of certs in files (nginx#988)
1 parent f57f686 commit 6fc1f16

File tree

2 files changed

+104
-1
lines changed

2 files changed

+104
-1
lines changed

internal/watcher/instance/nginx_config_parser.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,10 @@ func (ncp *NginxConfigParser) createNginxConfigContext(
139139
nginxConfigContext.Files = append(nginxConfigContext.Files, rootFiles...)
140140
case "ssl_certificate", "proxy_ssl_certificate", "ssl_client_certificate", "ssl_trusted_certificate":
141141
sslCertFile := ncp.sslCert(ctx, directive.Args[0], rootDir)
142-
nginxConfigContext.Files = append(nginxConfigContext.Files, sslCertFile)
142+
if !ncp.isDuplicateFile(nginxConfigContext.Files, sslCertFile) {
143+
nginxConfigContext.Files = append(nginxConfigContext.Files, sslCertFile)
144+
}
145+
143146
case "app_protect_security_log":
144147
if len(directive.Args) > 1 {
145148
syslogArg := directive.Args[1]
@@ -349,6 +352,16 @@ func (ncp *NginxConfigParser) sslCert(ctx context.Context, file, rootDir string)
349352
return sslCertFile
350353
}
351354

355+
func (ncp *NginxConfigParser) isDuplicateFile(nginxConfigContextFiles []*mpi.File, newFile *mpi.File) bool {
356+
for _, nginxConfigContextFile := range nginxConfigContextFiles {
357+
if nginxConfigContextFile.GetFileMeta().GetName() == newFile.GetFileMeta().GetName() {
358+
return true
359+
}
360+
}
361+
362+
return false
363+
}
364+
352365
func (ncp *NginxConfigParser) crossplaneConfigTraverse(
353366
ctx context.Context,
354367
root *crossplane.Config,

internal/watcher/instance/nginx_config_parser_test.go

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import (
1414
"os"
1515
"testing"
1616

17+
"google.golang.org/protobuf/types/known/timestamppb"
18+
1719
"github.com/google/go-cmp/cmp"
1820
"github.com/nginx/agent/v3/internal/model"
1921
"github.com/nginx/agent/v3/pkg/files"
@@ -960,3 +962,91 @@ func TestNginxConfigParser_ignoreLog(t *testing.T) {
960962
})
961963
}
962964
}
965+
966+
func TestNginxConfigParser_checkDuplicate(t *testing.T) {
967+
fileContent := []byte("location /test {\n return 200 \"Test location\\n\";\n}")
968+
fileContentNew := []byte("some test data")
969+
fileHash := files.GenerateHash(fileContent)
970+
fileHashNew := files.GenerateHash(fileContentNew)
971+
972+
tests := []struct {
973+
file *mpi.File
974+
name string
975+
expected bool
976+
}{
977+
{
978+
name: "Test 1: File already in files",
979+
file: &mpi.File{
980+
FileMeta: &mpi.FileMeta{
981+
Name: "/etc/nginx/certs/nginx-repo.crt",
982+
Hash: fileHashNew,
983+
ModifiedTime: timestamppb.Now(),
984+
Permissions: "0640",
985+
Size: 0,
986+
},
987+
},
988+
expected: true,
989+
},
990+
{
991+
name: "Test 2: File not in files",
992+
file: &mpi.File{
993+
FileMeta: &mpi.FileMeta{
994+
Name: "/etc/nginx/certs/nginx-repo-new.crt",
995+
Hash: fileHashNew,
996+
ModifiedTime: timestamppb.Now(),
997+
Permissions: "0640",
998+
Size: 0,
999+
},
1000+
},
1001+
expected: false,
1002+
},
1003+
}
1004+
1005+
nginxConfigContextFiles := model.NginxConfigContext{
1006+
Files: []*mpi.File{
1007+
{
1008+
FileMeta: &mpi.FileMeta{
1009+
Name: "/etc/nginx/certs/nginx-repo.crt",
1010+
Hash: fileHash,
1011+
ModifiedTime: timestamppb.Now(),
1012+
Permissions: "0640",
1013+
Size: 0,
1014+
},
1015+
},
1016+
{
1017+
FileMeta: &mpi.FileMeta{
1018+
Name: "/etc/nginx/keys/nginx-repo.key",
1019+
Hash: fileHash,
1020+
ModifiedTime: timestamppb.Now(),
1021+
Permissions: "0640",
1022+
Size: 0,
1023+
},
1024+
},
1025+
{
1026+
FileMeta: &mpi.FileMeta{
1027+
Name: "/etc/nginx/keys/inline_key.pem",
1028+
Hash: fileHash,
1029+
ModifiedTime: timestamppb.Now(),
1030+
Permissions: "0640",
1031+
Size: 0,
1032+
},
1033+
},
1034+
{
1035+
FileMeta: &mpi.FileMeta{
1036+
Name: "/etc/nginx/certs/inline_cert.pem",
1037+
Hash: fileHash,
1038+
ModifiedTime: timestamppb.Now(),
1039+
Permissions: "0640",
1040+
Size: 0,
1041+
},
1042+
},
1043+
},
1044+
}
1045+
1046+
for _, test := range tests {
1047+
ncp := NewNginxConfigParser(types.AgentConfig())
1048+
t.Run(test.name, func(t *testing.T) {
1049+
assert.Equal(t, test.expected, ncp.isDuplicateFile(nginxConfigContextFiles.Files, test.file))
1050+
})
1051+
}
1052+
}

0 commit comments

Comments
 (0)