* * Copyright 2018 gRPC 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 alts

import (
	
	
	
	
	
	
	
	
	
	
	

	
	
	
)

const (
	linuxProductNameFile     = "/sys/class/dmi/id/product_name"
	windowsCheckCommand      = "powershell.exe"
	windowsCheckCommandArgs  = "Get-WmiObject -Class Win32_BIOS"
	powershellOutputFilter   = "Manufacturer"
	windowsManufacturerRegex = ":(.*)"
)

type platformError string

func ( platformError) () string {
	return fmt.Sprintf("%s is not supported", string())
}

The following two variables will be reassigned in tests.
	runningOS          = runtime.GOOS
	manufacturerReader = func() (io.Reader, error) {
		switch runningOS {
		case "linux":
			return os.Open(linuxProductNameFile)
		case "windows":
			 := exec.Command(windowsCheckCommand, windowsCheckCommandArgs)
			,  := .Output()
			if  != nil {
				return nil, 
			}

			for ,  := range strings.Split(strings.TrimSuffix(string(), "\n"), "\n") {
				if strings.HasPrefix(, powershellOutputFilter) {
					 := regexp.MustCompile(windowsManufacturerRegex)
					 := .FindString()
					 = strings.TrimLeft(, ":")
					return strings.NewReader(), nil
				}
			}

			return nil, errors.New("cannot determine the machine's manufacturer")
		default:
			return nil, platformError(runningOS)
		}
	}
	vmOnGCP bool
)
isRunningOnGCP checks whether the local system, without doing a network request is running on GCP.
func () bool {
	,  := readManufacturer()
	if os.IsNotExist() {
		return false
	}
	if  != nil {
		log.Fatalf("failure to read manufacturer information: %v", )
	}
	 := string()
	switch runningOS {
	case "linux":
		 = strings.TrimSpace()
		return  == "Google" ||  == "Google Compute Engine"
	case "windows":
		 = strings.Replace(, " ", "", -1)
		 = strings.Replace(, "\n", "", -1)
		 = strings.Replace(, "\r", "", -1)
		return  == "Google"
	default:
		log.Fatal(platformError(runningOS))
	}
	return false
}

func () ([]byte, error) {
	,  := manufacturerReader()
	if  != nil {
		return nil, 
	}
	if  == nil {
		return nil, errors.New("got nil reader")
	}
	,  := ioutil.ReadAll()
	if  != nil {
		return nil, fmt.Errorf("failed reading %v: %v", linuxProductNameFile, )
	}
	return , nil
}
AuthInfoFromContext extracts the alts.AuthInfo object from the given context, if it exists. This API should be used by gRPC server RPC handlers to get information about the communicating peer. For client-side, use grpc.Peer() CallOption.
func ( context.Context) (AuthInfo, error) {
	,  := peer.FromContext()
	if ! {
		return nil, errors.New("no Peer found in Context")
	}
	return AuthInfoFromPeer()
}
AuthInfoFromPeer extracts the alts.AuthInfo object from the given peer, if it exists. This API should be used by gRPC clients after obtaining a peer object using the grpc.Peer() CallOption.
func ( *peer.Peer) (AuthInfo, error) {
	,  := .AuthInfo.(AuthInfo)
	if ! {
		return nil, errors.New("no alts.AuthInfo found in Peer")
	}
	return , nil
}
ClientAuthorizationCheck checks whether the client is authorized to access the requested resources based on the given expected client service accounts. This API should be used by gRPC server RPC handlers. This API should not be used by clients.
func ( context.Context,  []string) error {
	,  := AuthInfoFromContext()
	if  != nil {
		return status.Newf(codes.PermissionDenied, "The context is not an ALTS-compatible context: %v", ).Err()
	}
	for ,  := range  {
		if .PeerServiceAccount() ==  {
			return nil
		}
	}
	return status.Newf(codes.PermissionDenied, "Client %v is not authorized", .PeerServiceAccount()).Err()