##
## 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
##

# A policy to allow unrestricted access to management
# from host
#    0.0.0.0     - proton 0.12
#    localhost   - proton 0.13
#    unnamed host- proton 0.13
[
  ["vhost", {
      "vhostName": "",
      "maxConnections": 50,
      "maxConnectionsPerUser": 5,
      "maxConnectionsPerHost": 20,
      "allowUnknownUser": true,
      "groups": {
        "$default" : {
          "users":            "*",
          "remoteHosts":      "*",
          "maxFrameSize":     222222,
          "maxMessageSize":   222222,
          "maxSessionWindow": 222222,
          "maxSessions":           2,
          "maxSenders":           22,
          "maxReceivers":         22,
          "allowDynamicSource":   true,
          "allowAnonymousSender": true,
          "sources": "$management",
          "targets": "$management"
        }
      }
    }
  ],
  ["vhost", {
      "vhostName": "0.0.0.0",
      "maxConnections": 50,
      "maxConnectionsPerUser": 5,
      "maxConnectionsPerHost": 20,
      "allowUnknownUser": true,
      "groups": {
        "$default" : {
          "users":            "*",
          "remoteHosts":      "*",
          "maxFrameSize":     222222,
          "maxMessageSize":   222222,
          "maxSessionWindow": 222222,
          "maxSessions":           2,
          "maxSenders":           22,
          "maxReceivers":         22,
          "allowDynamicSource":   true,
          "allowAnonymousSender": true,
          "sources": "$management",
          "targets": "$management"
        }
      }
    }
  ],
  ["vhost", {
      "vhostName": "localhost",
      "maxConnections": 50,
      "maxConnectionsPerUser": 5,
      "maxConnectionsPerHost": 20,
      "allowUnknownUser": true,
      "groups": {
        "$default" : {
          "users":            "*",
          "remoteHosts":      "*",
          "maxFrameSize":     222222,
          "maxMessageSize":   222222,
          "maxSessionWindow": 222222,
          "maxSessions":           2,
          "maxSenders":           22,
          "maxReceivers":         22,
          "allowDynamicSource":   true,
          "allowAnonymousSender": true,
          "sources": "$management",
          "targets": "$management"
        }
      }
    }
  ]
]
