Vyacheslav Boyko created KAFKA-13352:
----------------------------------------
Summary: 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
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.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)