##
## Licensed to the Apache Software Foundation (ASF) under one
## or more contributor license agreements.  See the NOTICE file
## distributed with this work for additional information
## regarding copyright ownership.  The ASF licenses this file
## to you under the Apache License, Version 2.0 (the
## "License"); you may not use this file except in compliance
## with the License.  You may obtain a copy of the License at
##
##   http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing,
## software distributed under the License is distributed on an
## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
## KIND, either express or implied.  See the License for the
## specific language governing permissions and limitations
## under the License
##

[
    # The boardwalk policy ruleset
    ["vhost",
        {
            "hostname": "boardwalk",
            "maxConnections": 10,
            "maxConnectionsPerUser": 2,
            "maxConnectionsPerHost": 5,
            "allowUnknownUser": true,
            "groups": {
                "anonymous": {
                    "users": "anonymous",
                    "remoteHosts": "10.18.0.0-10.18.255.255, 10.48.0.0-10.48.255.255, 192.168.0.0-192.168.255.255",
                    "maxFrameSize": 111111,
                    "maxMessageSize": 111111,
                    "maxSessionWindow": 111111,
                    "maxSessions": 1,
                    "maxSenders": 11,
                    "maxReceivers": 11,
                    "allowDynamicSource": false,
                    "allowAnonymousSender": false,
                    "sources": "public",
                    "targets": ""
                },
                "users": {
                    "users": "u1, u2, u3",
                    "remoteHosts": "*",
                    "maxFrameSize": 222222,
                    "maxMessageSize": 222222,
                    "maxSessionWindow": 222222,
                    "maxSessions": 2,
                    "maxSenders": 22,
                    "maxReceivers": 22,
                    "allowDynamicSource": false,
                    "allowAnonymousSender": false,
                    "sources": "public, private",
                    "targets": "public"
                },
                "superuser": {
                    "users": "ellen",
                    "remoteHosts": "127.0.0.1, 72.135.2.9{IPV6_LOOPBACK}",
                    "maxFrameSize": 666666,
                    "maxMessageSize": 666666,
                    "maxSessionWindow": 666666,
                    "maxSessions": 6,
                    "maxSenders": 66,
                    "maxReceivers": 66,
                    "allowDynamicSource": false,
                    "allowAnonymousSender": false,
                    "sources": "public, private, management, root",
                    "targets": "public, private, management, root"
                },
                "$default": {
                    "remoteHosts": "*",
                    "maxFrameSize": 222222,
                    "maxMessageSize": 222222,
                    "maxSessionWindow": 222222,
                    "maxSessions": 2,
                    "maxSenders": 22,
                    "maxReceivers": 22,
                    "allowDynamicSource": false,
                    "allowAnonymousSender": false,
                    "sources": "public, private",
                    "targets": "public"
                }
            }
        }
    ]
]
