##
## 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",
        {
            "applicationName": "boardwalk",
            "maxConnections": 10,
            "maxConnPerUser": 2,
            "maxConnPerHost": 5,
            "userGroups": {
                "anonymous": "anonymous",
                "users": "u1 u2 u3",
                "superuser": "ellen"
            },
            "ingressHostGroups": {
                "Ten18": "10.18.0.0-10.18.255.255",
                "EllensWS": "72.135.2.9",
                "TheLabs": "10.48.0.0-10.48.255.255, 192.168.0.0-192.168.255.255",
                "Localhost": "127.0.0.1, ::1"
            },
            "ingressPolicies": {
                "anonymous": "Ten18, TheLabs",
                "superuser": "Localhost, EllensWS"
            },
            "connectionAllowDefault": true,
            "settings": {
                "anonymous": {
                    "maxFrameSize": 111111,
                    "maxMessageSize": 111111,
                    "maxSessionWindow": 111111,
                    "maxSessions": 1,
                    "maxSenders": 11,
                    "maxReceivers": 11,
                    "allowDynamicSrc": false,
                    "allowAnonymousSender": false,
                    "sources": "public",
                    "targets": ""
                },
                "users": {
                    "maxFrameSize": 222222,
                    "maxMessageSize": 222222,
                    "maxSessionWindow": 222222,
                    "maxSessions": 2,
                    "maxSenders": 22,
                    "maxReceivers": 22,
                    "allowDynamicSrc": false,
                    "allowAnonymousSender": false,
                    "sources": "public, private",
                    "targets": "public"
                },
                "superuser": {
                    "maxFrameSize": 666666,
                    "maxMessageSize": 666666,
                    "maxSessionWindow": 666666,
                    "maxSessions": 6,
                    "maxSenders": 66,
                    "maxReceivers": 66,
                    "allowDynamicSrc": false,
                    "allowAnonymousSender": false,
                    "sources": "public, private, management, root",
                    "targets": "public, private, management, root"
                },
                "default": {
                    "maxFrameSize": 222222,
                    "maxMessageSize": 222222,
                    "maxSessionWindow": 222222,
                    "maxSessions": 2,
                    "maxSenders": 22,
                    "maxReceivers": 22,
                    "allowDynamicSrc": false,
                    "allowAnonymousSender": false,
                    "sources": "public, private",
                    "targets": "public"
                }
            }
        }
    ]
]
