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 }