code-intelligence.com/cifuzz@v0.40.0/internal/tokenstorage/tokenstorage.go (about)

     1  package tokenstorage
     2  
     3  import (
     4  	"encoding/json"
     5  	"os"
     6  	"path/filepath"
     7  	"strings"
     8  
     9  	"github.com/pkg/errors"
    10  
    11  	"code-intelligence.com/cifuzz/pkg/log"
    12  	"code-intelligence.com/cifuzz/util/fileutil"
    13  )
    14  
    15  var accessTokens map[string]string
    16  
    17  var (
    18  	configDir, err       = os.UserConfigDir()
    19  	accessTokensFilePath = filepath.Join(configDir, "cifuzz", "access_tokens.json")
    20  )
    21  
    22  func init() {
    23  	migrateOldTokens()
    24  
    25  	// Expand the $HOME environment variable in the access tokens file path
    26  	accessTokensFilePath = os.ExpandEnv(accessTokensFilePath)
    27  	if err != nil {
    28  		log.Errorf(err, "Error getting user config directory: %v", err.Error())
    29  	}
    30  
    31  	var err error
    32  	bytes, err := os.ReadFile(accessTokensFilePath)
    33  	if err != nil && os.IsNotExist(err) {
    34  		// The access tokens file doesn't exist, so we initialize the
    35  		// access tokens with an empty map
    36  		accessTokens = map[string]string{}
    37  		return
    38  	}
    39  	if err != nil {
    40  		log.Errorf(err, "Error reading access tokens file: %v", err.Error())
    41  	}
    42  	err = json.Unmarshal(bytes, &accessTokens)
    43  	if err != nil {
    44  		log.Errorf(err, "Error parsing access tokens: %v", err.Error())
    45  	}
    46  }
    47  
    48  func Set(target, token string) error {
    49  	// Ensure that the parent directory exists
    50  	err := os.MkdirAll(filepath.Dir(accessTokensFilePath), 0o755)
    51  	if err != nil {
    52  		return errors.WithStack(err)
    53  	}
    54  
    55  	accessTokens[target] = token
    56  
    57  	// Convert the access tokens to JSON
    58  	bytes, err := json.MarshalIndent(accessTokens, "", "  ")
    59  	if err != nil {
    60  		return errors.WithStack(err)
    61  	}
    62  
    63  	// Write the JSON to file
    64  	err = os.WriteFile(accessTokensFilePath, bytes, 0o600)
    65  	if err != nil {
    66  		return errors.WithStack(err)
    67  	}
    68  	return nil
    69  }
    70  
    71  // Get returns the access token for the given target
    72  // If the given target doesn't exist, try to add or remove a trailing slash
    73  // and return the access token for that target
    74  func Get(target string) string {
    75  	if token, ok := accessTokens[target]; ok {
    76  		return token
    77  	}
    78  	if token, ok := accessTokens[strings.TrimSuffix(target, "/")]; ok {
    79  		return token
    80  	}
    81  	if token, ok := accessTokens[target+"/"]; ok {
    82  		return token
    83  	}
    84  	return ""
    85  }
    86  
    87  func GetServerURLs() []string {
    88  	var serverURLs []string
    89  	for target := range accessTokens {
    90  		serverURLs = append(serverURLs, target)
    91  	}
    92  	return serverURLs
    93  }
    94  
    95  func GetTokenFilePath() string {
    96  	return accessTokensFilePath
    97  }
    98  
    99  // migrateOldTokens migrates the old access tokens file to the new location
   100  func migrateOldTokens() {
   101  	oldTokensFilePath := os.ExpandEnv("$HOME/.config/cifuzz/access_tokens.json")
   102  
   103  	// make sure that new tokens file directory exists
   104  	err := os.MkdirAll(filepath.Dir(accessTokensFilePath), 0o755)
   105  	if err != nil {
   106  		log.Errorf(err, "Error creating config directory: %v", err.Error())
   107  	}
   108  
   109  	exists, err := fileutil.Exists(oldTokensFilePath)
   110  	if err != nil {
   111  		log.Errorf(err, "Error checking if old tokens file exists: %v", err.Error())
   112  	}
   113  
   114  	if exists && oldTokensFilePath != accessTokensFilePath {
   115  		log.Infof("Migrating old tokens file to new location: %s", accessTokensFilePath)
   116  		err := os.Rename(oldTokensFilePath, accessTokensFilePath)
   117  		if err != nil {
   118  			log.Errorf(err, "Error migrating old tokens file: %v", err.Error())
   119  		}
   120  	}
   121  }