mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	* Allow options.InsecurePort to be set to 0 to switch off insecure access * In NewSelfClient, Set the TLSClientConfig to the cert and key files if InsecurePort is switched off * Mint a bearer token that allows the client(s) created in NewSelfClient to talk to the api server * Add a new authenticator that checks for this specific bearer token Fixes #13598
		
			
				
	
	
		
			86 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
/*
 | 
						|
Copyright 2014 The Kubernetes 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 tokenfile
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/csv"
 | 
						|
	"fmt"
 | 
						|
	"io"
 | 
						|
	"os"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"k8s.io/kubernetes/pkg/auth/user"
 | 
						|
)
 | 
						|
 | 
						|
type TokenAuthenticator struct {
 | 
						|
	tokens map[string]*user.DefaultInfo
 | 
						|
}
 | 
						|
 | 
						|
// New returns a TokenAuthenticator for a single token
 | 
						|
func New(tokens map[string]*user.DefaultInfo) *TokenAuthenticator {
 | 
						|
	return &TokenAuthenticator{
 | 
						|
		tokens: tokens,
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// NewCSV returns a TokenAuthenticator, populated from a CSV file.
 | 
						|
// The CSV file must contain records in the format "token,username,useruid"
 | 
						|
func NewCSV(path string) (*TokenAuthenticator, error) {
 | 
						|
	file, err := os.Open(path)
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
	defer file.Close()
 | 
						|
 | 
						|
	tokens := make(map[string]*user.DefaultInfo)
 | 
						|
	reader := csv.NewReader(file)
 | 
						|
	reader.FieldsPerRecord = -1
 | 
						|
	for {
 | 
						|
		record, err := reader.Read()
 | 
						|
		if err == io.EOF {
 | 
						|
			break
 | 
						|
		}
 | 
						|
		if err != nil {
 | 
						|
			return nil, err
 | 
						|
		}
 | 
						|
		if len(record) < 3 {
 | 
						|
			return nil, fmt.Errorf("token file '%s' must have at least 3 columns (token, user name, user uid), found %d", path, len(record))
 | 
						|
		}
 | 
						|
		obj := &user.DefaultInfo{
 | 
						|
			Name: record[1],
 | 
						|
			UID:  record[2],
 | 
						|
		}
 | 
						|
		tokens[record[0]] = obj
 | 
						|
 | 
						|
		if len(record) >= 4 {
 | 
						|
			obj.Groups = strings.Split(record[3], ",")
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return &TokenAuthenticator{
 | 
						|
		tokens: tokens,
 | 
						|
	}, nil
 | 
						|
}
 | 
						|
 | 
						|
func (a *TokenAuthenticator) AuthenticateToken(value string) (user.Info, bool, error) {
 | 
						|
	user, ok := a.tokens[value]
 | 
						|
	if !ok {
 | 
						|
		return nil, false, nil
 | 
						|
	}
 | 
						|
	return user, true, nil
 | 
						|
}
 |