##
## 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 safari policy ruleset
    ["vhost",
        {
            "vhostName": "safari",
            "maxConnections": 10,
            "maxConnPerUser": 2,
            "maxConnPerHost": 5,
            "userGroups": {
                "anonymous": "anonymous",
                "clients": "moja mbili",
                "guides": "kata hapa"
            },
            "ingressHostGroups": {
                "basecamp": "72.135.2.9",
                "mobile": "10.48.0.0-10.48.255.255, 192.168.0.0-192.168.255.255",
                "Localhost": "127.0.0.1, ::1",
		"TheWorld": "*"
            },
            "ingressPolicies": {
                "anonymous": "TheWorld",
                "clients": "basecamp",
		"guides": "basecamp, mobile, Localhost"
            },
            "connectionAllowDefault": true,
            "settings": {
                "anonymous": {
                    "maxFrameSize": 111111,
                    "maxMessageSize": 111111,
                    "maxSessionWindow": 111111,
                    "maxSessions": 1,
                    "maxSenders": 11,
                    "maxReceivers": 11,
                    "allowDynamicSrc": false,
                    "allowAnonymousSender": false,
                    "sources": "public",
                    "targets": ""
                },
                "clients": {
                    "maxFrameSize": 222222,
                    "maxMessageSize": 222222,
                    "maxSessionWindow": 222222,
                    "maxSessions": 2,
                    "maxSenders": 22,
                    "maxReceivers": 22,
                    "allowDynamicSrc": false,
                    "allowAnonymousSender": false,
                    "sources": "public, private",
                    "targets": "public"
                },
                "guides": {
                    "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"
                }
            }
        }
    ]
]
