From 43197747b23290397d19212505d7e844751a5364 Mon Sep 17 00:00:00 2001 From: akgupta Date: Wed, 21 Oct 2026 15:49:41 +0530 Subject: [PATCH] RANGER-5836:Ranger Admin authentication failure due to wrong cookie expiration --- .../security/web/filter/RangerKrbFilter.java | 3 +- .../web/filter/TestRangerKrbFilter.java | 38 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/security-admin/src/main/java/org/apache/ranger/security/web/filter/RangerKrbFilter.java b/security-admin/src/main/java/org/apache/ranger/security/web/filter/RangerKrbFilter.java index 2ff12b82040..e17616740f1 100644 --- a/security-admin/src/main/java/org/apache/ranger/security/web/filter/RangerKrbFilter.java +++ b/security-admin/src/main/java/org/apache/ranger/security/web/filter/RangerKrbFilter.java @@ -53,6 +53,7 @@ import java.util.Collection; import java.util.Date; import java.util.Enumeration; +import java.util.Locale; import java.util.Properties; import java.util.TimeZone; @@ -200,7 +201,7 @@ public static void createAuthCookie(HttpServletResponse resp, String token, Stri if (expires >= 0) { Date date = new Date(expires); - SimpleDateFormat df = new SimpleDateFormat("EEE, " + "dd-MMM-yyyy HH:mm:ss zzz"); + SimpleDateFormat df = new SimpleDateFormat("EEE, " + "dd-MMM-yyyy HH:mm:ss zzz", Locale.US); df.setTimeZone(TimeZone.getTimeZone("GMT")); diff --git a/security-admin/src/test/java/org/apache/ranger/security/web/filter/TestRangerKrbFilter.java b/security-admin/src/test/java/org/apache/ranger/security/web/filter/TestRangerKrbFilter.java index 43a0ab27c2e..9c54f2a213d 100644 --- a/security-admin/src/test/java/org/apache/ranger/security/web/filter/TestRangerKrbFilter.java +++ b/security-admin/src/test/java/org/apache/ranger/security/web/filter/TestRangerKrbFilter.java @@ -43,10 +43,15 @@ import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.net.HttpCookie; import java.util.Collections; +import java.util.List; +import java.util.Locale; import java.util.Properties; +import java.util.TimeZone; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -63,6 +68,7 @@ * @generated by Cursor * @description */ + @ExtendWith(MockitoExtension.class) @TestMethodOrder(MethodOrderer.MethodName.class) public class TestRangerKrbFilter { @@ -85,6 +91,38 @@ public void testCreateAuthCookieFormatsHeader() { assertTrue(v.endsWith("; HttpOnly")); } + @Test + void testCreateAuthCookieUsesHttpLocaleForExpires() { + HttpServletResponse res = mock(HttpServletResponse.class); + Locale originalLocale = Locale.getDefault(); + TimeZone originalTimeZone = TimeZone.getDefault(); + + try { + Locale.setDefault(Locale.FRANCE); + TimeZone.setDefault(TimeZone.getTimeZone("Asia/Tokyo")); + + long expires = 4_093_966_090_000L; // Thu, 24-Sep-2099 20:48:10 GMT + RangerKrbFilter.createAuthCookie(res, "token123", "example.com", "/", expires, true); + + ArgumentCaptor headerValue = ArgumentCaptor.forClass(String.class); + verify(res).addHeader(eq("Set-Cookie"), headerValue.capture()); + + String v = headerValue.getValue(); + assertTrue(v.contains("; Expires=Thu, 24-Sep-2099 20:48:10 GMT")); + assertFalse(v.contains("Sept")); + assertFalse(v.contains("sept.")); + + List cookies = HttpCookie.parse(v); + + assertEquals(AuthenticatedURL.AUTH_COOKIE, cookies.get(0).getName()); + assertTrue(cookies.get(0).getMaxAge() > 0); + assertFalse(cookies.get(0).hasExpired()); + } finally { + Locale.setDefault(originalLocale); + TimeZone.setDefault(originalTimeZone); + } + } + @Test public void testConstructSecretProvider_randomFallbackOnFileFailure() throws Exception { Properties config = new Properties();