RANGER-568: fixed RangerTimeOfDayMatcher condition to handle 12am/12pm correctly
Project: http://git-wip-us.apache.org/repos/asf/incubator-ranger/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ranger/commit/f0b129b7 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ranger/tree/f0b129b7 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ranger/diff/f0b129b7 Branch: refs/heads/tag-policy Commit: f0b129b7924f57c00a38fed11cb9754dc7c22c18 Parents: a31d901 Author: Madhan Neethiraj <[email protected]> Authored: Thu Jun 25 02:08:14 2015 -0700 Committer: Madhan Neethiraj <[email protected]> Committed: Thu Jun 25 08:07:19 2015 -0700 ---------------------------------------------------------------------- .../RangerTimeOfDayMatcher.java | 14 ++++- .../RangerTimeOfDayMatcherTest.java | 55 +++++++++++++++++++- 2 files changed, 66 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/f0b129b7/agents-common/src/main/java/org/apache/ranger/plugin/conditionevaluator/RangerTimeOfDayMatcher.java ---------------------------------------------------------------------- diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/conditionevaluator/RangerTimeOfDayMatcher.java b/agents-common/src/main/java/org/apache/ranger/plugin/conditionevaluator/RangerTimeOfDayMatcher.java index 3ddb250..f65f29e 100644 --- a/agents-common/src/main/java/org/apache/ranger/plugin/conditionevaluator/RangerTimeOfDayMatcher.java +++ b/agents-common/src/main/java/org/apache/ranger/plugin/conditionevaluator/RangerTimeOfDayMatcher.java @@ -105,12 +105,22 @@ public class RangerTimeOfDayMatcher extends RangerAbstractConditionEvaluator { endMinute = Integer.parseInt(m.group(7)); } String endType = m.group(8).toUpperCase(); - if (startType.equals("P")) { + if(startHour == 12) { + if(startType.equals("A")) { + startHour = 0; + } + } else if (startType.equals("P")) { startHour += 12; } - if (endType.equals("P")) { + + if(endHour == 12) { + if(endType.equals("A")) { + endHour = 0; + } + } else if (endType.equals("P")) { endHour += 12; } + result = new int[] { (startHour*60)+startMin, (endHour*60)+endMinute }; } } http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/f0b129b7/agents-common/src/test/java/org/apache/ranger/plugin/conditionevaluator/RangerTimeOfDayMatcherTest.java ---------------------------------------------------------------------- diff --git a/agents-common/src/test/java/org/apache/ranger/plugin/conditionevaluator/RangerTimeOfDayMatcherTest.java b/agents-common/src/test/java/org/apache/ranger/plugin/conditionevaluator/RangerTimeOfDayMatcherTest.java index e894d98..7e8ef0a 100644 --- a/agents-common/src/test/java/org/apache/ranger/plugin/conditionevaluator/RangerTimeOfDayMatcherTest.java +++ b/agents-common/src/test/java/org/apache/ranger/plugin/conditionevaluator/RangerTimeOfDayMatcherTest.java @@ -51,7 +51,8 @@ public class RangerTimeOfDayMatcherTest { String[] durations = new String[] { "9am-5pm", " 9Am -5 Pm", " 9Am -5 Pm", "9 AM -5 p.m.", "9a.M - 5Pm.", "9:30am-5:30pm", " 9:00Am -5:59 Pm", - " 9 am - 4 pm ", "9pm-5AM" + " 9 am - 4 pm ", "9pm-5AM", + "11am-12pm", "11pm-12am", "12am-12pm", "12pm-12am" }; check(durations, true); } @@ -101,6 +102,10 @@ public class RangerTimeOfDayMatcherTest { { "9:30AM - 5:15pm", "9", "30", "A", "5", "15", "p" }, { "9:30 AM - 5:15 p.m.", "9", "30", "A", "5", "15", "p" }, { "9pm-5am", "9", null, "p", "5", null, "a"}, + { "11am-12pm", "11", null, "a", "12", null, "p" }, + { "11pm-12am", "11", null, "p", "12", null, "a" }, + { "12am-12pm", "12", null, "a", "12", null, "p" }, + { "12pm-12am", "12", null, "p", "12", null, "a" }, }; checkGroups(input); } @@ -126,6 +131,10 @@ public class RangerTimeOfDayMatcherTest { { "9am-5pm", true, 9*60, (12+5)*60 }, { "1 PM - 10P.M.", true, (12+1)*60, (12+10)*60 }, { "1PM - 9AM", true, (12+1)*60, 9*60 }, + { "11am-12pm", true, 11*60, 12*60 }, + { "11pm-12am", true, (12+11)*60, 0*60 }, + { "12am-12pm", true, 0*60, 12*60 }, + { "12pm-12am", true, 12*60, 0*60 }, { "1PM", false, null, null }, // illegal patterns should come back as null, too }; for (Object[] data: input) { @@ -217,4 +226,48 @@ public class RangerTimeOfDayMatcherTest { } } } + + @Test + public void test_end2end_happyPath_12_oClock() { + RangerPolicyItemCondition itemCondition = mock(RangerPolicyItemCondition.class); + when(itemCondition.getValues()).thenReturn(Arrays.asList("12am-1am", "11am-12pm", "12pm-1pm", "11pm-12am")); + + RangerTimeOfDayMatcher matcher = new RangerTimeOfDayMatcher(); + matcher.setConditionDef(null); + matcher.setPolicyItemCondition(itemCondition); + matcher.init(); + + Object[][] input = new Object[][] { + { 0, 00, true }, + { 0, 01, true }, + { 1, 00, true }, + { 1, 01, false }, + { 10, 59, false }, + { 11, 00, true }, + { 11, 59, true }, + { 12, 00, true }, + { 12, 01, true }, + { 12, 59, true }, + { 13, 00, true }, + { 13, 01, false }, + {22, 59, false }, + {23, 0, true }, + {23, 59, true }, + }; + + RangerAccessRequest request = mock(RangerAccessRequest.class); + for (Object[] data : input) { + int hour = (int)data[0]; + int minute = (int)data[1]; + Calendar c = new GregorianCalendar(2015, Calendar.APRIL, 1, hour, minute); + Date aDate = c.getTime(); + when(request.getAccessTime()).thenReturn(aDate); + boolean matchExpected = (boolean)data[2]; + if (matchExpected) { + assertTrue("" + hour, matcher.isMatched(request)); + } else { + assertFalse("" + hour, matcher.isMatched(request)); + } + } + } }
