in server/core/src/main/java/org/apache/vysper/xmpp/addressing/stringprep/StringPrep.java [64:102]
public String prepareString(String str) throws StringPrepViolationException {
// 1. map -> RFC3454:3
for (int i = 0; i < str.length(); i++) {
String codePoint = codePointAt(str, i);
if (mapping.containsKey(codePoint)) {
str = str.replace(codePoint, mapping.get(codePoint));
}
}
// TODO: 2. normalize -> RFC3454:4
// 3. prohibit -> RFC3454:5
for (int i = 0; i < str.length(); i++) {
String codePoint = codePointAt(str, i);
if (prohibited.contains(codePoint)) {
throw new StringPrepViolationException(String.format("character '%s' prohibited!", codePoint));
}
}
// 4. check bidi -> RFC3454:6
boolean containsRAndAlCat = false;
boolean containsLCat = false;
for (int i = 0; i < str.length() && NAND(containsRAndAlCat, containsLCat); i++) {
String codePoint = codePointAt(str, i);
containsRAndAlCat |= StringPrepConstants.D_1_CharactersWithBiDiPropertiesRorAl.contains(codePoint);
containsLCat |= StringPrepConstants.D_2_CharactersWithBiDiPropertyL.contains(codePoint);
}
if (containsRAndAlCat && containsLCat) {
throw new StringPrepViolationException("invalid bidi sequence");
}
if (containsRAndAlCat) {
if (!StringPrepConstants.D_1_CharactersWithBiDiPropertiesRorAl.contains(codePointAt(str, 0))
|| !StringPrepConstants.D_1_CharactersWithBiDiPropertiesRorAl.contains(codePointAt(str, str
.length() - 1))) {
throw new StringPrepViolationException("invalid bidi sequence");
}
}
return str;
}