55 "os"
66 "path/filepath"
77 "regexp"
8- "strings"
98
109 "github.com/go-errors/errors"
1110 "github.com/spf13/afero"
@@ -50,6 +49,9 @@ func loadAccessToken(fsys afero.Fs) (string, error) {
5049 fmt .Fprintln (logger , "Using access token from credentials store..." )
5150 return accessToken , nil
5251 }
52+ if credentials .RequiresSecureStorage () {
53+ return "" , errors .New (ErrMissingToken )
54+ }
5355 // Fallback to token file
5456 return fallbackLoadToken (fsys )
5557}
@@ -77,6 +79,9 @@ func SaveAccessToken(accessToken string, fsys afero.Fs) error {
7779 // Save to current profile
7880 if err := credentials .StoreProvider .Set (CurrentProfile .Name , accessToken ); err != nil {
7981 fmt .Fprintln (GetDebugLogger (), err )
82+ if credentials .RequiresSecureStorage () {
83+ return errors .Errorf ("failed to save access token to secure storage: %w" , err )
84+ }
8085 } else {
8186 return nil
8287 }
@@ -98,72 +103,6 @@ func fallbackSaveToken(accessToken string, fsys afero.Fs) error {
98103 return nil
99104}
100105
101- func MigrateFallbackAccessToken (fsys afero.Fs ) (bool , error ) {
102- paths , err := fallbackAccessTokenMigrationPaths ()
103- if err != nil {
104- return false , err
105- }
106-
107- migrated := false
108- for _ , path := range paths {
109- didMigrate , err := migrateFallbackAccessTokenPath (path , fsys )
110- if err != nil {
111- return migrated , err
112- }
113- migrated = migrated || didMigrate
114- }
115- return migrated , nil
116- }
117-
118- func fallbackAccessTokenMigrationPaths () ([]string , error ) {
119- var paths []string
120- supabaseHome := os .Getenv ("SUPABASE_HOME" )
121- defaultPath , err := getAccessTokenPath ()
122- if err != nil {
123- if supabaseHome == "" {
124- return nil , err
125- }
126- } else {
127- paths = append (paths , defaultPath )
128- }
129- if supabaseHome != "" {
130- paths = append (paths , filepath .Join (supabaseHome , AccessTokenKey ))
131- }
132-
133- seen := make (map [string ]struct {}, len (paths ))
134- unique := paths [:0 ]
135- for _ , path := range paths {
136- if _ , ok := seen [path ]; ok {
137- continue
138- }
139- seen [path ] = struct {}{}
140- unique = append (unique , path )
141- }
142- return unique , nil
143- }
144-
145- func migrateFallbackAccessTokenPath (path string , fsys afero.Fs ) (bool , error ) {
146- contents , err := afero .ReadFile (fsys , path )
147- if errors .Is (err , os .ErrNotExist ) {
148- return false , nil
149- }
150- if err != nil {
151- return false , errors .Errorf ("failed to read access token file for migration: %w" , err )
152- }
153-
154- accessToken := strings .TrimSpace (string (contents ))
155- if ! AccessTokenPattern .MatchString (accessToken ) {
156- return false , errors .Errorf ("refusing to migrate invalid access token file: %s" , path )
157- }
158- if err := credentials .StoreProvider .Set (CurrentProfile .Name , accessToken ); err != nil {
159- return false , errors .Errorf ("failed to migrate access token file to keychain: %w" , err )
160- }
161- if err := fsys .Remove (path ); err != nil && ! errors .Is (err , os .ErrNotExist ) {
162- return false , errors .Errorf ("failed to remove migrated access token file: %w" , err )
163- }
164- return true , nil
165- }
166-
167106func DeleteAccessToken (fsys afero.Fs ) error {
168107 // Always delete the fallback token file to handle legacy CLI
169108 if err := fallbackDeleteToken (fsys ); err != nil && ! errors .Is (err , os .ErrNotExist ) {
0 commit comments