Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 14 additions & 10 deletions src/main/java/utils/Validate.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpSession;
import java.math.BigInteger;
import java.util.Set;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

Expand Down Expand Up @@ -345,28 +346,31 @@ public static String validateEncryptionKey(String userSalt) {
* Function that will check if a valid language is set. if not, returns en (English)
*
* @param ses Session Language Parameter
* @return en by default, or the valid setting found in the submitted lang
* @return The supported language code in the session's lang (a picker value such as "es", or a
* locale such as "es_ES"), or en_GB by default
*/
public static String validateLanguage(HttpSession ses) {
String result = "en_GB";
String lang = new String();
String lang = "";

try {
if (ses != null && ses.getAttribute("lang") != null) {
lang = ses.getAttribute("lang").toString();
} catch (NullPointerException e) {
lang = "";
}
// log.debug("lang submitted: " + lang);
if (lang != null) {
if (lang.matches(".[a-z]{2}-[A-Z]{2}$")) {
result = lang;
// A two-letter language, optionally followed by a region (es, es_ES, pt-BR)
if (lang.matches("^[a-z]{2}([_-][A-Za-z]{2})?$")) {
String language = lang.substring(0, 2);
if (SUPPORTED_LANGUAGES.contains(language)) {
result = language;
}
}
// log.debug("lang set to: " + result);

return result;
}

/** The languages offered by translation-select.jsp */
private static final Set<String> SUPPORTED_LANGUAGES =
Set.of("en", "es", "fr", "pt", "ga", "zh", "hi", "ru");

/**
* Validates objects received through a function request. Also ensures max length is not too high.
*
Expand Down
45 changes: 45 additions & 0 deletions src/test/java/utils/ValidateLanguageTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package utils;

import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.Locale;
import org.junit.jupiter.api.Test;
import org.springframework.mock.web.MockHttpSession;

/** Validate.validateLanguage keeps the language the player picked (#937) */
class ValidateLanguageTest {

private static String languageFor(Object lang) {
MockHttpSession session = new MockHttpSession();
session.setAttribute("lang", lang);
return Validate.validateLanguage(session);
}

@Test
public void pickerLanguages_AreKept() {
for (String lang : new String[] {"en", "es", "fr", "pt", "ga", "zh", "hi", "ru"}) {
assertEquals(lang, languageFor(lang), lang);
}
}

@Test
public void languageWithRegion_IsReducedToTheLanguage() {
assertEquals("es", languageFor("es_ES"));
assertEquals("pt", languageFor("pt-BR"));
// translation.jsp stores the request's Locale when no language was picked
assertEquals("fr", languageFor(Locale.FRANCE));
}

@Test
public void unsupportedOrMalformed_FallsBackToDefault() {
for (String lang : new String[] {"de", "xen-GB", "EN", "english", "../es", "es_ES_x", ""}) {
assertEquals("en_GB", languageFor(lang), lang);
}
}

@Test
public void missingLanguage_FallsBackToDefault() {
assertEquals("en_GB", Validate.validateLanguage(new MockHttpSession()));
assertEquals("en_GB", Validate.validateLanguage(null));
}
}
Loading