1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- // Copyright 2018 The etcd Authors
- //
- // Licensed 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.
- package etcdserver
- import "sync"
- // AccessController controls etcd server HTTP request access.
- type AccessController struct {
- corsMu sync.RWMutex
- CORS map[string]struct{}
- hostWhitelistMu sync.RWMutex
- HostWhitelist map[string]struct{}
- }
- // NewAccessController returns a new "AccessController" with default "*" values.
- func NewAccessController() *AccessController {
- return &AccessController{
- CORS: map[string]struct{}{"*": {}},
- HostWhitelist: map[string]struct{}{"*": {}},
- }
- }
- // OriginAllowed determines whether the server will allow a given CORS origin.
- // If CORS is empty, allow all.
- func (ac *AccessController) OriginAllowed(origin string) bool {
- ac.corsMu.RLock()
- defer ac.corsMu.RUnlock()
- if len(ac.CORS) == 0 { // allow all
- return true
- }
- _, ok := ac.CORS["*"]
- if ok {
- return true
- }
- _, ok = ac.CORS[origin]
- return ok
- }
- // IsHostWhitelisted returns true if the host is whitelisted.
- // If whitelist is empty, allow all.
- func (ac *AccessController) IsHostWhitelisted(host string) bool {
- ac.hostWhitelistMu.RLock()
- defer ac.hostWhitelistMu.RUnlock()
- if len(ac.HostWhitelist) == 0 { // allow all
- return true
- }
- _, ok := ac.HostWhitelist["*"]
- if ok {
- return true
- }
- _, ok = ac.HostWhitelist[host]
- return ok
- }
|