2023-02-09 23:48:16 +01:00
|
|
|
// Copyright 2022 Google LLC.
|
|
|
|
// 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
|
|
|
|
//
|
|
|
|
// https://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.
|
|
|
|
|
2022-06-20 13:30:23 +02:00
|
|
|
// Package util provides helper functions for the client.
|
|
|
|
package util
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"errors"
|
2023-02-19 00:36:41 +01:00
|
|
|
"io"
|
2022-06-20 13:30:23 +02:00
|
|
|
"os"
|
|
|
|
"os/user"
|
|
|
|
"path/filepath"
|
|
|
|
"runtime"
|
|
|
|
)
|
|
|
|
|
2022-10-01 16:20:01 +02:00
|
|
|
const configFileName = "certificate_config.json"
|
2022-06-20 13:30:23 +02:00
|
|
|
|
|
|
|
// EnterpriseCertificateConfig contains parameters for initializing signer.
|
|
|
|
type EnterpriseCertificateConfig struct {
|
|
|
|
Libs Libs `json:"libs"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// Libs specifies the locations of helper libraries.
|
|
|
|
type Libs struct {
|
2022-10-01 16:20:01 +02:00
|
|
|
ECP string `json:"ecp"`
|
2022-06-20 13:30:23 +02:00
|
|
|
}
|
|
|
|
|
2023-02-09 23:48:16 +01:00
|
|
|
// ErrConfigUnavailable is a sentinel error that indicates ECP config is unavailable,
|
|
|
|
// possibly due to entire config missing or missing binary path.
|
|
|
|
var ErrConfigUnavailable = errors.New("Config is unavailable")
|
|
|
|
|
2022-06-20 13:30:23 +02:00
|
|
|
// LoadSignerBinaryPath retrieves the path of the signer binary from the config file.
|
|
|
|
func LoadSignerBinaryPath(configFilePath string) (path string, err error) {
|
|
|
|
jsonFile, err := os.Open(configFilePath)
|
|
|
|
if err != nil {
|
2023-02-09 23:48:16 +01:00
|
|
|
if errors.Is(err, os.ErrNotExist) {
|
|
|
|
return "", ErrConfigUnavailable
|
|
|
|
}
|
2022-06-20 13:30:23 +02:00
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
|
2023-02-19 00:36:41 +01:00
|
|
|
byteValue, err := io.ReadAll(jsonFile)
|
2022-06-20 13:30:23 +02:00
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
var config EnterpriseCertificateConfig
|
|
|
|
err = json.Unmarshal(byteValue, &config)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
2022-10-01 16:20:01 +02:00
|
|
|
signerBinaryPath := config.Libs.ECP
|
2022-06-20 13:30:23 +02:00
|
|
|
if signerBinaryPath == "" {
|
2023-02-09 23:48:16 +01:00
|
|
|
return "", ErrConfigUnavailable
|
2022-06-20 13:30:23 +02:00
|
|
|
}
|
|
|
|
return signerBinaryPath, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func guessHomeDir() string {
|
|
|
|
// Prefer $HOME over user.Current due to glibc bug: golang.org/issue/13470
|
|
|
|
if v := os.Getenv("HOME"); v != "" {
|
|
|
|
return v
|
|
|
|
}
|
|
|
|
// Else, fall back to user.Current:
|
|
|
|
if u, err := user.Current(); err == nil {
|
|
|
|
return u.HomeDir
|
|
|
|
}
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
|
|
|
func getDefaultConfigFileDirectory() (directory string) {
|
|
|
|
if runtime.GOOS == "windows" {
|
|
|
|
return filepath.Join(os.Getenv("APPDATA"), "gcloud")
|
|
|
|
}
|
2022-10-01 16:20:01 +02:00
|
|
|
return filepath.Join(guessHomeDir(), ".config/gcloud")
|
2022-06-20 13:30:23 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// GetDefaultConfigFilePath returns the default path of the enterprise certificate config file created by gCloud.
|
|
|
|
func GetDefaultConfigFilePath() (path string) {
|
|
|
|
return filepath.Join(getDefaultConfigFileDirectory(), configFileName)
|
|
|
|
}
|