Skip to content

Commit 5db4a63

Browse files
authored
validate generated local service name in templates (#3007)
Signed-off-by: Henry Avetisyan <hga@yahooinc.com>
1 parent 7db8783 commit 5db4a63

5 files changed

Lines changed: 77 additions & 2 deletions

File tree

servers/zms/src/main/java/com/yahoo/athenz/zms/DBService.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5187,7 +5187,7 @@ boolean addSolutionTemplate(ResourceContext ctx, ObjectStoreConnection con, Stri
51875187
auditDetails.append("{\"name\": \"").append(templateName).append('\"');
51885188

51895189
// we have already verified that our template is valid, but
5190-
// we'll just double check to make sure it's not null
5190+
// we'll just double-check to make sure it's not null
51915191

51925192
Template template = zmsConfig.getServerSolutionTemplates().get(templateName);
51935193
if (template == null) {
@@ -5273,6 +5273,7 @@ boolean addSolutionTemplate(ResourceContext ctx, ObjectStoreConnection con, Stri
52735273
}
52745274

52755275
// add domain change event
5276+
52765277
addDomainChangeMessage(ctx, domainName, policyName, DomainChangeMessage.ObjectType.POLICY);
52775278
}
52785279
}
@@ -5291,6 +5292,14 @@ boolean addSolutionTemplate(ResourceContext ctx, ObjectStoreConnection con, Stri
52915292
String serviceIdentityName = ZMSUtils.removeDomainPrefixForService(
52925293
templateServiceIdentity.getName(), domainName);
52935294

5295+
// before processing, make sure to validate the generated service
5296+
// local name does not contain any dots. e.g. it might contain
5297+
// value like api.service and generated full service identity
5298+
// name: athenz.api.service will pass the validation check
5299+
5300+
ZMSUtils.validateObject(zmsConfig.getValidator(), serviceIdentityName,
5301+
ZMSConsts.TYPE_SIMPLE_NAME, CALLER_TEMPLATE);
5302+
52945303
// retrieve our original service
52955304

52965305
ServiceIdentity originalServiceIdentity = getServiceIdentity(con, domainName,
@@ -5306,6 +5315,7 @@ boolean addSolutionTemplate(ResourceContext ctx, ObjectStoreConnection con, Stri
53065315
}
53075316

53085317
// add domain change event
5318+
53095319
addDomainChangeMessage(ctx, domainName, serviceIdentityName, DomainChangeMessage.ObjectType.SERVICE);
53105320
}
53115321
}

servers/zms/src/main/java/com/yahoo/athenz/zms/ZMSConsts.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,7 @@ public final class ZMSConsts {
320320
// Validator object types
321321
public static final String TYPE_DOMAIN_NAME = "DomainName";
322322
public static final String TYPE_RESOURCE_NAME = "ResourceName";
323+
public static final String TYPE_SIMPLE_NAME = "SimpleName";
323324
public static final String TYPE_ROLE = "Role";
324325
public static final String TYPE_POLICY = "Policy";
325326
public static final String TYPE_SERVICE_IDENTITY = "ServiceIdentity";

servers/zms/src/test/java/com/yahoo/athenz/zms/ZMSImplTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23392,7 +23392,7 @@ public void testGetServerTemplateDetailsList() {
2339223392
RsrcCtxWrapper ctx = zmsTestInitializer.getMockDomRsrcCtx();
2339323393

2339423394
DomainTemplateDetailsList serverTemplateDetailsList = zmsImpl.getServerTemplateDetailsList(ctx);
23395-
assertEquals(serverTemplateDetailsList.getMetaData().size(), 14);
23395+
assertEquals(serverTemplateDetailsList.getMetaData().size(), 15);
2339623396
TemplateMetaData vipTemplateMetaData = null;
2339723397
for (TemplateMetaData templateMetaData : serverTemplateDetailsList.getMetaData()) {
2339823398
if (templateMetaData.getTemplateName().equals("vipng")) {

servers/zms/src/test/java/com/yahoo/athenz/zms/ZMSTemplateTest.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -998,4 +998,48 @@ public void testPutDomainTemplateWithInvalidPolicyRuleRoleSubstitution() {
998998

999999
zmsImpl.deleteTopLevelDomain(ctx, domainName, auditRef, null);
10001000
}
1001+
1002+
@Test
1003+
public void testPutDomainTemplateWithInvalidServiceName() {
1004+
1005+
ZMSImpl zmsImpl = zmsTestInitializer.getZms();
1006+
RsrcCtxWrapper ctx = zmsTestInitializer.getMockDomRsrcCtx();
1007+
final String auditRef = zmsTestInitializer.getAuditRef();
1008+
String domainName = "template-invalid-service-name";
1009+
TopLevelDomain dom1 = zmsTestInitializer.createTopLevelDomainObject(domainName,
1010+
"Test Domain1", "testOrg", zmsTestInitializer.getAdminUser());
1011+
zmsImpl.postTopLevelDomain(ctx, auditRef, null, dom1);
1012+
1013+
final String templateName = "template_service_test";
1014+
DomainTemplate templateList = new DomainTemplate();
1015+
List<String> templateNames = new ArrayList<>();
1016+
templateNames.add(templateName);
1017+
templateList.setTemplateNames(templateNames);
1018+
1019+
// the keywords to be specified for the rule substitution
1020+
// "keywordsToReplace": "_service_"
1021+
1022+
// we're going to create an invalid service name
1023+
1024+
List<TemplateParam> params = new ArrayList<>();
1025+
params.add(new TemplateParam().setName("service").setValue("api.service"));
1026+
templateList.setParams(params);
1027+
1028+
try {
1029+
zmsImpl.putDomainTemplateExt(ctx, domainName, templateName, auditRef, templateList);
1030+
fail();
1031+
} catch (ResourceException ex) {
1032+
assertEquals(ex.getCode(), 400);
1033+
assertTrue(ex.getMessage().contains("Invalid SimpleName error: String pattern mismatch"));
1034+
}
1035+
1036+
// verify simple service name is successful
1037+
1038+
params = new ArrayList<>();
1039+
params.add(new TemplateParam().setName("service").setValue("api"));
1040+
templateList.setParams(params);
1041+
1042+
zmsImpl.putDomainTemplateExt(ctx, domainName, templateName, auditRef, templateList);
1043+
zmsImpl.deleteTopLevelDomain(ctx, domainName, auditRef, null);
1044+
}
10011045
}

servers/zms/src/test/resources/solution_templates.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,26 @@
637637
"userAuthorityExpiration": "newValue"
638638
}
639639
]
640+
},
641+
"template_service_test": {
642+
"metadata":
643+
{
644+
"latestVersion": 1,
645+
"timestamp": "2024-02-15T00:00:00.000Z",
646+
"description": "TemplateServiceTest",
647+
"keywordsToReplace": "_service_",
648+
"autoUpdate": false
649+
},
650+
"services": [
651+
{
652+
"name": "_domain_._service_",
653+
"description": "Service for Testing"
654+
}
655+
],
656+
"roles": [
657+
],
658+
"policies": [
659+
]
640660
}
641661
}
642662
}

0 commit comments

Comments
 (0)