@@ -6,10 +6,8 @@ package credentials
66import (
77 "encoding/json"
88 "path/filepath"
9- "time"
109
1110 "github.com/neo4j/cli/common/clicfg/fileutils"
12- "github.com/neo4j/cli/common/clierr"
1311 "github.com/spf13/afero"
1412)
1513
@@ -49,164 +47,46 @@ func (c *Credentials) load() {
4947 }
5048
5149 c .Aura = credentials .Aura
50+ c .Aura .refresh = c .refreshAura
51+ c .Aura .persist = c .save
5252
5353 if ! fileHasData {
54- c .writeAura ( c . Aura )
54+ c .save ( )
5555 }
5656}
5757
58- func (c * Credentials ) readAuraFresh () (* AuraCredentials , error ) {
58+ // refreshAura re-reads the credentials file from disk into the existing c.Aura, discarding
59+ // whatever was loaded or mutated in memory before this call. It updates the struct in place
60+ // rather than replacing it, so the refresh/persist closures wired up in load stay intact.
61+ func (c * Credentials ) refreshAura () error {
5962 data := fileutils .ReadFileSafe (c .fs , c .filePath )
6063
6164 var credFile CredentialsFile
62- if len (data ) == 0 {
63- credFile = CredentialsFile {
64- Aura : & AuraCredentials {
65- Credentials : []* AuraCredential {},
66- },
67- }
68- } else {
65+ if len (data ) != 0 {
6966 if err := json .Unmarshal (data , & credFile ); err != nil {
70- return nil , err
67+ return err
7168 }
7269 }
7370
7471 if credFile .Aura == nil {
75- credFile .Aura = & AuraCredentials {
76- Credentials : [] * AuraCredential {},
77- }
72+ c .Aura . Credentials = [] * AuraCredential {}
73+ c . Aura . DefaultCredential = ""
74+ return nil
7875 }
7976
80- return credFile .Aura , nil
77+ c .Aura .Credentials = credFile .Aura .Credentials
78+ c .Aura .DefaultCredential = credFile .Aura .DefaultCredential
79+ return nil
8180}
8281
83- func (c * Credentials ) writeAura ( aura * AuraCredentials ) error {
82+ func (c * Credentials ) save ( ) error {
8483 data , err := json .Marshal (CredentialsFile {
85- Aura : aura ,
84+ Aura : c . Aura ,
8685 })
8786 if err != nil {
8887 panic (err )
8988 }
9089
9190 fileutils .WriteFile (c .fs , c .filePath , data )
92- c .Aura = aura
9391 return nil
9492}
95-
96- func (c * Credentials ) Add (name string , clientId string , clientSecret string ) error {
97- aura , err := c .readAuraFresh ()
98- if err != nil {
99- return err
100- }
101-
102- for _ , credential := range aura .Credentials {
103- if credential .Name == name {
104- return clierr .NewUsageError ("already have credential with name %s" , name )
105- }
106- }
107-
108- aura .Credentials = append (aura .Credentials , & AuraCredential {Name : name , ClientId : clientId , ClientSecret : clientSecret })
109- if len (aura .Credentials ) == 1 {
110- aura .DefaultCredential = name
111- }
112-
113- return c .writeAura (aura )
114- }
115-
116- func (c * Credentials ) Remove (name string ) error {
117- aura , err := c .readAuraFresh ()
118- if err != nil {
119- return err
120- }
121-
122- var indexToRemove = - 1
123- for i , credential := range aura .Credentials {
124- if credential .Name == name {
125- indexToRemove = i
126- break
127- }
128- }
129-
130- if indexToRemove == - 1 {
131- return clierr .NewUsageError ("could not find credential with name %s to remove" , name )
132- }
133-
134- if aura .DefaultCredential == name {
135- aura .DefaultCredential = ""
136- }
137-
138- aura .Credentials = append (aura .Credentials [:indexToRemove ], aura .Credentials [indexToRemove + 1 :]... )
139-
140- return c .writeAura (aura )
141- }
142-
143- func (c * Credentials ) SetDefault (name string ) error {
144- aura , err := c .readAuraFresh ()
145- if err != nil {
146- return err
147- }
148-
149- if ! c .credentialExists (name , aura ) {
150- return clierr .NewUsageError ("could not find credential with name %s" , name )
151- }
152-
153- aura .DefaultCredential = name
154-
155- return c .writeAura (aura )
156- }
157-
158- func (c * Credentials ) UpdateAccessToken (cred * AuraCredential , accessToken string , expiresInSeconds int64 ) * AuraCredential {
159- aura , err := c .readAuraFresh ()
160- if err != nil {
161- panic (err )
162- }
163-
164- credential , err := aura .Get (cred .Name )
165- if err != nil {
166- panic (err )
167- }
168-
169- const expireToleranceSeconds = 60
170- now := time .Now ().UnixMilli ()
171-
172- credential .TokenExpiry = now + (expiresInSeconds - expireToleranceSeconds )* 1000
173- credential .AccessToken = accessToken
174-
175- err = c .writeAura (aura )
176- if err != nil {
177- panic (err )
178- }
179-
180- return credential
181- }
182-
183- func (c * Credentials ) ClearAccessToken (cred * AuraCredential ) (* AuraCredential , error ) {
184- aura , err := c .readAuraFresh ()
185- if err != nil {
186- return nil , err
187- }
188-
189- credential , err := aura .Get (cred .Name )
190- if err != nil {
191- return nil , err
192- }
193-
194- credential .TokenExpiry = 0
195- credential .AccessToken = ""
196-
197- err = c .writeAura (aura )
198- if err != nil {
199- return nil , err
200- }
201-
202- return credential , nil
203- }
204-
205- func (c * Credentials ) credentialExists (name string , aura * AuraCredentials ) bool {
206- for _ , credential := range aura .Credentials {
207- if credential .Name == name {
208- return true
209- }
210- }
211- return false
212- }
0 commit comments