| // 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 |
| } |