{"record":{"id":"d6066421432367c2","repo":"grpc/grpc-java","slug":"rule-name-is-absent-or-empty","errorCode":null,"errorMessage":"rule \"name\" is absent or empty","messagePattern":"rule \"name\" is absent or empty","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"authz/src/main/java/io/grpc/authz/AuthorizationPolicyTranslator.java","lineNumber":132,"sourceCode":"      Permission.Set.Builder headersSet = Permission.Set.newBuilder();\n      for (Map<String, ?> header: headersList) {           \n        headersSet.addRules(parseHeader(header));\n      }\n      andSet.addRules(Permission.newBuilder().setAndRules(headersSet.build()).build());\n    }\n    if (andSet.getRulesCount() == 0) {\n      return Permission.newBuilder().setAny(true).build();\n    }\n    return Permission.newBuilder().setAndRules(andSet.build()).build();\n  }\n\n  private static Map<String, Policy> parseRules(\n      List<Map<String, ?>> objects, String name) throws IllegalArgumentException {\n    Map<String, Policy> policies = new LinkedHashMap<String, Policy>();\n    for (Map<String, ?> object: objects) {\n      String policyName = JsonUtil.getString(object, \"name\");\n      if (policyName == null || policyName.isEmpty()) {\n        throw new IllegalArgumentException(\"rule \\\"name\\\" is absent or empty\");\n      }\n      List<Principal> principals = new ArrayList<>();\n      Map<String, ?> source = JsonUtil.getObject(object, \"source\");\n      if (source != null) {\n        principals.add(parseSource(source));\n      } else {\n        principals.add(Principal.newBuilder().setAny(true).build());\n      }\n      List<Permission> permissions = new ArrayList<>();\n      Map<String, ?> request = JsonUtil.getObject(object, \"request\");\n      if (request != null) {\n        permissions.add(parseRequest(request));\n      } else {\n        permissions.add(Permission.newBuilder().setAny(true).build());\n      }\n      Policy policy = \n          Policy.newBuilder()\n          .addAllPermissions(permissions)","sourceCodeStart":114,"sourceCodeEnd":150,"githubUrl":"https://github.com/grpc/grpc-java/blob/64daddc1f3d1975670f769f3e97bde8b2ba32d25/authz/src/main/java/io/grpc/authz/AuthorizationPolicyTranslator.java#L114-L150","documentation":"parseRules iterates the top-level rules of an authorization policy and requires each rule object to have a non-empty \"name\", used as the policy identifier. A missing or empty name makes the policy ambiguous and translation aborts with IllegalArgumentException.","triggerScenarios":"Authorization policy JSON whose rules array contains an object without \"name\", e.g. {\"source\":{...},\"headers\":[...]} with no name field, or \"name\": \"\".","commonSituations":"Hand-authored policy files; programmatic policy generation that skipped the name field; migrations from formats where names were optional or auto-generated.","solutions":["Add a unique, non-empty \"name\" to every rule in the policy","Validate the policy JSON before loading (schema or pre-check)","Remove nameless placeholder rules","Deduplicate: also avoid empty-name duplicates after fixing"],"exampleFix":"// before\n{\"rules\":[{\"source\":{\"address\":\"10.0.0.1\"},\"headers\":[{\"key\":\"x-auth\",\"values\":[\"yes\"]}]}]}\n// after\n{\"rules\":[{\"name\":\"allow-internal\",\"source\":{\"address\":\"10.0.0.1\"},\"headers\":[{\"key\":\"x-auth\",\"values\":[\"yes\"]}]}]}","handlingStrategy":"validation","validationCode":"static void checkRuleName(Map<String, ?> rule) {\n  String name = JsonUtil.getString(rule, \"name\");\n  if (name == null || name.isEmpty()) throw new IllegalArgumentException(\"rule missing \\\"name\\\"\");\n}","typeGuard":null,"tryCatchPattern":"try { AuthorizationPolicyTranslator.translate(policyJson, serverName); } catch (IllegalArgumentException e) { throw new PolicyValidationException(\"Policy rule has no name: \" + e.getMessage(), e); }","preventionTips":["Give every rule a unique non-empty name","Validate the full policy schema before translation","Auto-generate names in policy generators if absent","Lint policy files in CI"],"tags":["grpc","authz","json-policy","validation"],"backgroundTag":"missing-required-config-field","analyzedSha":"64daddc1f3d1975670f769f3e97bde8b2ba32d25","analyzedAt":"2026-09-08T06:14:57.704Z","contentChangedAt":"2026-09-08T06:14:57.704Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}