From 78eddadac4f4dc85ab549a9aa3a7cc081410f10c Mon Sep 17 00:00:00 2001 From: andrea Date: Tue, 26 May 2015 22:50:53 +0200 Subject: [PATCH] Added user substitution during ACL pattern mathing --- .../spi/impl/security/AuthorizationsCollector.java | 10 +++++++--- .../spi/impl/security/AuthorizationsCollectorTest.java | 10 +++++++++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/broker/src/main/java/org/eclipse/moquette/spi/impl/security/AuthorizationsCollector.java b/broker/src/main/java/org/eclipse/moquette/spi/impl/security/AuthorizationsCollector.java index 76ec126f..3f11785a 100644 --- a/broker/src/main/java/org/eclipse/moquette/spi/impl/security/AuthorizationsCollector.java +++ b/broker/src/main/java/org/eclipse/moquette/spi/impl/security/AuthorizationsCollector.java @@ -130,9 +130,9 @@ class AuthorizationsCollector implements IAuthorizator { } } - if (client != null && !client.isEmpty()) { + if (isNotEmpty(client) || isNotEmpty(username)) { for (Authorization auth : m_patternAuthorizations) { - String substitutedTopic = auth.topic.replace("%c", client); + String substitutedTopic = auth.topic.replace("%c", client).replace("%u", username); if (auth.permission == permission || auth.permission == READWRITE) { if (SubscriptionsStore.matchTopics(topic, substitutedTopic)) { return true; @@ -141,7 +141,7 @@ class AuthorizationsCollector implements IAuthorizator { } } - if (username != null && !username.isEmpty()) { + if (isNotEmpty(username)) { if (m_userAuthorizations.containsKey(username)) { for (Authorization auth : m_userAuthorizations.get(username)) { if (auth.permission == permission || auth.permission == READWRITE) { @@ -155,6 +155,10 @@ class AuthorizationsCollector implements IAuthorizator { return false; } + private boolean isNotEmpty(String client) { + return client != null && !client.isEmpty(); + } + public boolean isEmpty() { return m_globalAuthorizations.isEmpty(); } diff --git a/broker/src/test/java/org/eclipse/moquette/spi/impl/security/AuthorizationsCollectorTest.java b/broker/src/test/java/org/eclipse/moquette/spi/impl/security/AuthorizationsCollectorTest.java index 1245e05a..950ac7e7 100644 --- a/broker/src/test/java/org/eclipse/moquette/spi/impl/security/AuthorizationsCollectorTest.java +++ b/broker/src/test/java/org/eclipse/moquette/spi/impl/security/AuthorizationsCollectorTest.java @@ -140,10 +140,18 @@ public class AuthorizationsCollectorTest { } @Test - public void testParsePatternClientLineACL() throws ParseException { + public void testPatternClientLineACL() throws ParseException { authorizator.parse("pattern read /weather/italy/%c"); //Verify assertTrue(authorizator.canRead("/weather/italy/anemometer1", "", "anemometer1")); } + + @Test + public void testPatternClientAndUserLineACL() throws ParseException { + authorizator.parse("pattern read /weather/%u/%c"); + + //Verify + assertTrue(authorizator.canRead("/weather/italy/anemometer1", "italy", "anemometer1")); + } } \ No newline at end of file