[ https://issues.apache.org/jira/browse/KAFKA-13352?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Vyacheslav Boyko updated KAFKA-13352: ------------------------------------- Description: I'm trying to connect to Kafka with Apache Camel's component. I have SASL JAAS CONFIG param as: {code:java} "org.apache.kafka.common.security.plain.PlainLoginModule required username=pf_kafka_card-products password=8GMf0yWkLHrI4cNYYoyHGxclkXCLSCGJ;" {code} And I faced an issue during my application starts: {code:java} Caused by: java.lang.IllegalArgumentException: Value not specified for key 'password' in JAAS config {code} I have tried to inspect this issue. I prepared a block of code to reproduce it (Original code is in JaasConfig.java in kafka-client-*.*.jar). Here it is: {code:java} public static void main(String[] args) { String test = "org.apache.kafka.common.security.plain.PlainLoginModule required username=pf_kafka_card-products password=8GMf0yWkLHrI4cNYYoyHGxclkXCLSCGJ;"; testJaasConfig(test); //SpringApplication.run(CardApplication.class, args); } private static void testJaasConfig(String config) { StreamTokenizer tokenizer = new StreamTokenizer(new StringReader(config)); tokenizer.slashSlashComments(true); tokenizer.slashStarComments(true); tokenizer.wordChars('-', '-'); tokenizer.wordChars('_', '_'); tokenizer.wordChars('$', '$'); tokenizer.wordChars('0', '9'); List<AppConfigurationEntry> configEntries; try { configEntries = new ArrayList<>(); while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) { configEntries.add(parseAppConfigurationEntry(tokenizer)); } if (configEntries.isEmpty()) throw new IllegalArgumentException("Login module not specified in JAAS config"); } catch (IOException e) { throw new KafkaException("Unexpected exception while parsing JAAS config"); } } private static AppConfigurationEntry parseAppConfigurationEntry(StreamTokenizer tokenizer) throws IOException { String loginModule = tokenizer.sval; if (tokenizer.nextToken() == StreamTokenizer.TT_EOF) throw new IllegalArgumentException("Login module control flag not specified in JAAS config"); AppConfigurationEntry.LoginModuleControlFlag controlFlag = loginModuleControlFlag(tokenizer.sval); Map<String, String> options = new HashMap<>(); while (tokenizer.nextToken() != StreamTokenizer.TT_EOF && tokenizer.ttype != ';') { String key = tokenizer.sval; if (tokenizer.nextToken() != '=' || tokenizer.nextToken() == StreamTokenizer.TT_EOF || tokenizer.sval == null) throw new IllegalArgumentException("Value not specified for key '" + key + "' in JAAS config"); String value = tokenizer.sval; options.put(key, value); } if (tokenizer.ttype != ';') throw new IllegalArgumentException("JAAS config entry not terminated by semi-colon"); return new AppConfigurationEntry(loginModule, controlFlag, options); } private static AppConfigurationEntry.LoginModuleControlFlag loginModuleControlFlag(String flag) { if (flag == null) throw new IllegalArgumentException("Login module control flag is not available in the JAAS config"); AppConfigurationEntry.LoginModuleControlFlag controlFlag; switch (flag.toUpperCase(Locale.ROOT)) { case "REQUIRED": controlFlag = AppConfigurationEntry.LoginModuleControlFlag.REQUIRED; break; case "REQUISITE": controlFlag = AppConfigurationEntry.LoginModuleControlFlag.REQUISITE; break; case "SUFFICIENT": controlFlag = AppConfigurationEntry.LoginModuleControlFlag.SUFFICIENT; break; case "OPTIONAL": controlFlag = AppConfigurationEntry.LoginModuleControlFlag.OPTIONAL; break; default: throw new IllegalArgumentException("Invalid login module control flag '" + flag + "' in JAAS config"); } return controlFlag; } {code} I have solved this issue by changing my password from {code:java} 8GMf0yWkLHrI4cNYYoyHGxclkXCLSCGJ {code} to {code:java} aaa {code} This leads me to suggestion that Tokenizer interprets any leading digit as 'bad' symbol and it breaks to parse the whole line. was: I'm trying to connect to Kafka with Apache Camel's component. I have SASL JAAS CONFIG param as: {code:java} "org.apache.kafka.common.security.plain.PlainLoginModule required username=pf_kafka_card-products password=8GMf0yWkLHrI4cNYYoyHGxclkXCLSCGJ;" {code} And I faced an issue during my application starts: {code:java} Caused by: java.lang.IllegalArgumentException: Value not specified for key 'password' in JAAS config {code} I have tried to inspect this issue. I prepared a block of code to reproduce it. Here it is: {code:java} public static void main(String[] args) { String test = "org.apache.kafka.common.security.plain.PlainLoginModule required username=pf_kafka_card-products password=8GMf0yWkLHrI4cNYYoyHGxclkXCLSCGJ;"; testJaasConfig(test); //SpringApplication.run(CardApplication.class, args); } private static void testJaasConfig(String config) { StreamTokenizer tokenizer = new StreamTokenizer(new StringReader(config)); tokenizer.slashSlashComments(true); tokenizer.slashStarComments(true); tokenizer.wordChars('-', '-'); tokenizer.wordChars('_', '_'); tokenizer.wordChars('$', '$'); tokenizer.wordChars('0', '9'); List<AppConfigurationEntry> configEntries; try { configEntries = new ArrayList<>(); while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) { configEntries.add(parseAppConfigurationEntry(tokenizer)); } if (configEntries.isEmpty()) throw new IllegalArgumentException("Login module not specified in JAAS config"); } catch (IOException e) { throw new KafkaException("Unexpected exception while parsing JAAS config"); } } private static AppConfigurationEntry parseAppConfigurationEntry(StreamTokenizer tokenizer) throws IOException { String loginModule = tokenizer.sval; if (tokenizer.nextToken() == StreamTokenizer.TT_EOF) throw new IllegalArgumentException("Login module control flag not specified in JAAS config"); AppConfigurationEntry.LoginModuleControlFlag controlFlag = loginModuleControlFlag(tokenizer.sval); Map<String, String> options = new HashMap<>(); while (tokenizer.nextToken() != StreamTokenizer.TT_EOF && tokenizer.ttype != ';') { String key = tokenizer.sval; if (tokenizer.nextToken() != '=' || tokenizer.nextToken() == StreamTokenizer.TT_EOF || tokenizer.sval == null) throw new IllegalArgumentException("Value not specified for key '" + key + "' in JAAS config"); String value = tokenizer.sval; options.put(key, value); } if (tokenizer.ttype != ';') throw new IllegalArgumentException("JAAS config entry not terminated by semi-colon"); return new AppConfigurationEntry(loginModule, controlFlag, options); } private static AppConfigurationEntry.LoginModuleControlFlag loginModuleControlFlag(String flag) { if (flag == null) throw new IllegalArgumentException("Login module control flag is not available in the JAAS config"); AppConfigurationEntry.LoginModuleControlFlag controlFlag; switch (flag.toUpperCase(Locale.ROOT)) { case "REQUIRED": controlFlag = AppConfigurationEntry.LoginModuleControlFlag.REQUIRED; break; case "REQUISITE": controlFlag = AppConfigurationEntry.LoginModuleControlFlag.REQUISITE; break; case "SUFFICIENT": controlFlag = AppConfigurationEntry.LoginModuleControlFlag.SUFFICIENT; break; case "OPTIONAL": controlFlag = AppConfigurationEntry.LoginModuleControlFlag.OPTIONAL; break; default: throw new IllegalArgumentException("Invalid login module control flag '" + flag + "' in JAAS config"); } return controlFlag; } {code} I have solved this issue by changing my password from {code:java} 8GMf0yWkLHrI4cNYYoyHGxclkXCLSCGJ {code} to {code:java} aaa {code} This leads me to suggestion that Tokenizer interprets any leading digit as 'bad' symbol and it breaks to parse the whole line. > Kafka Client does not support passwords starting with number in jaas config > --------------------------------------------------------------------------- > > Key: KAFKA-13352 > URL: https://issues.apache.org/jira/browse/KAFKA-13352 > Project: Kafka > Issue Type: Bug > Affects Versions: 2.7.1 > Reporter: Vyacheslav Boyko > Priority: Trivial > > I'm trying to connect to Kafka with Apache Camel's component. > I have SASL JAAS CONFIG param as: > {code:java} > "org.apache.kafka.common.security.plain.PlainLoginModule required > username=pf_kafka_card-products password=8GMf0yWkLHrI4cNYYoyHGxclkXCLSCGJ;" > {code} > And I faced an issue during my application starts: > {code:java} > Caused by: java.lang.IllegalArgumentException: Value not specified for key > 'password' in JAAS config {code} > I have tried to inspect this issue. I prepared a block of code to reproduce > it (Original code is in JaasConfig.java in kafka-client-*.*.jar). Here it is: > {code:java} > public static void main(String[] args) { > String test = "org.apache.kafka.common.security.plain.PlainLoginModule > required username=pf_kafka_card-products > password=8GMf0yWkLHrI4cNYYoyHGxclkXCLSCGJ;"; > testJaasConfig(test); > //SpringApplication.run(CardApplication.class, args); > } > private static void testJaasConfig(String config) { > StreamTokenizer tokenizer = new StreamTokenizer(new StringReader(config)); > tokenizer.slashSlashComments(true); > tokenizer.slashStarComments(true); > tokenizer.wordChars('-', '-'); > tokenizer.wordChars('_', '_'); > tokenizer.wordChars('$', '$'); > tokenizer.wordChars('0', '9'); > List<AppConfigurationEntry> configEntries; > try { > configEntries = new ArrayList<>(); > while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) { > configEntries.add(parseAppConfigurationEntry(tokenizer)); > } > if (configEntries.isEmpty()) > throw new IllegalArgumentException("Login module not specified in > JAAS config"); > } catch (IOException e) { > throw new KafkaException("Unexpected exception while parsing JAAS > config"); > } > } > private static AppConfigurationEntry > parseAppConfigurationEntry(StreamTokenizer tokenizer) throws IOException { > String loginModule = tokenizer.sval; > if (tokenizer.nextToken() == StreamTokenizer.TT_EOF) > throw new IllegalArgumentException("Login module control flag not > specified in JAAS config"); > AppConfigurationEntry.LoginModuleControlFlag controlFlag = > loginModuleControlFlag(tokenizer.sval); > Map<String, String> options = new HashMap<>(); > while (tokenizer.nextToken() != StreamTokenizer.TT_EOF && tokenizer.ttype > != ';') { > String key = tokenizer.sval; > if (tokenizer.nextToken() != '=' || tokenizer.nextToken() == > StreamTokenizer.TT_EOF || tokenizer.sval == null) > throw new IllegalArgumentException("Value not specified for key > '" + key + "' in JAAS config"); > String value = tokenizer.sval; > options.put(key, value); > } > if (tokenizer.ttype != ';') > throw new IllegalArgumentException("JAAS config entry not terminated > by semi-colon"); > return new AppConfigurationEntry(loginModule, controlFlag, options); > } > private static AppConfigurationEntry.LoginModuleControlFlag > loginModuleControlFlag(String flag) { > if (flag == null) > throw new IllegalArgumentException("Login module control flag is not > available in the JAAS config"); > AppConfigurationEntry.LoginModuleControlFlag controlFlag; > switch (flag.toUpperCase(Locale.ROOT)) { > case "REQUIRED": > controlFlag = > AppConfigurationEntry.LoginModuleControlFlag.REQUIRED; > break; > case "REQUISITE": > controlFlag = > AppConfigurationEntry.LoginModuleControlFlag.REQUISITE; > break; > case "SUFFICIENT": > controlFlag = > AppConfigurationEntry.LoginModuleControlFlag.SUFFICIENT; > break; > case "OPTIONAL": > controlFlag = > AppConfigurationEntry.LoginModuleControlFlag.OPTIONAL; > break; > default: > throw new IllegalArgumentException("Invalid login module control > flag '" + flag + "' in JAAS config"); > } > return controlFlag; > } > {code} > I have solved this issue by changing my password from > {code:java} > 8GMf0yWkLHrI4cNYYoyHGxclkXCLSCGJ {code} > to > {code:java} > aaa {code} > This leads me to suggestion that Tokenizer interprets any leading digit as > 'bad' symbol and it breaks to parse the whole line. -- This message was sent by Atlassian Jira (v8.3.4#803005)