@@ -67,11 +67,13 @@ import (
67
67
"github.com/mongodb/mongodb-atlas-cli/atlascli/internal/homebrew"
68
68
"github.com/mongodb/mongodb-atlas-cli/atlascli/internal/latestrelease"
69
69
"github.com/mongodb/mongodb-atlas-cli/atlascli/internal/log"
70
+ "github.com/mongodb/mongodb-atlas-cli/atlascli/internal/plugin"
70
71
"github.com/mongodb/mongodb-atlas-cli/atlascli/internal/prerun"
71
72
"github.com/mongodb/mongodb-atlas-cli/atlascli/internal/sighandle"
72
73
"github.com/mongodb/mongodb-atlas-cli/atlascli/internal/telemetry"
73
74
"github.com/mongodb/mongodb-atlas-cli/atlascli/internal/terminal"
74
75
"github.com/mongodb/mongodb-atlas-cli/atlascli/internal/usage"
76
+ "github.com/mongodb/mongodb-atlas-cli/atlascli/internal/validate"
75
77
"github.com/mongodb/mongodb-atlas-cli/atlascli/internal/version"
76
78
"github.com/spf13/afero"
77
79
"github.com/spf13/cobra"
@@ -86,6 +88,18 @@ type Notifier struct {
86
88
writer io.Writer
87
89
}
88
90
91
+ type AuthRequirements int64
92
+
93
+ const (
94
+ // NoAuth command does not require authentication.
95
+ NoAuth AuthRequirements = 0
96
+ // RequiredAuth command requires authentication.
97
+ RequiredAuth AuthRequirements = 1
98
+ // OptionalAuth command can work with or without authentication,
99
+ // and if access token is found, try to refresh it.
100
+ OptionalAuth AuthRequirements = 2
101
+ )
102
+
89
103
func handleSignal () {
90
104
sighandle .Notify (func (sig os.Signal ) {
91
105
telemetry .FinishTrackingCommand (telemetry.TrackOptions {
@@ -135,7 +149,29 @@ Use the --help flag with any command for more info on that command.`,
135
149
config .SetService (config .CloudService )
136
150
}
137
151
138
- return prerun .ExecuteE (opts .InitFlow (config .Default ()))
152
+ authReq := shouldCheckCredentials (cmd )
153
+ if authReq == NoAuth {
154
+ return nil
155
+ }
156
+
157
+ if err := prerun .ExecuteE (
158
+ opts .InitFlow (config .Default ()),
159
+ func () error {
160
+ err := opts .RefreshAccessToken (cmd .Context ())
161
+ if err != nil && authReq == RequiredAuth {
162
+ return err
163
+ }
164
+ return nil
165
+ },
166
+ ); err != nil {
167
+ return err
168
+ }
169
+
170
+ if authReq == RequiredAuth {
171
+ return validate .Credentials ()
172
+ }
173
+
174
+ return nil
139
175
},
140
176
// PersistentPostRun only runs if the command is successful
141
177
PersistentPostRun : func (cmd * cobra.Command , _ []string ) {
@@ -253,6 +289,43 @@ func shouldSetService(cmd *cobra.Command) bool {
253
289
return true
254
290
}
255
291
292
+ func shouldCheckCredentials (cmd * cobra.Command ) AuthRequirements {
293
+ searchByName := []string {
294
+ "__complete" ,
295
+ "help" ,
296
+ }
297
+ for _ , n := range searchByName {
298
+ if cmd .Name () == n {
299
+ return NoAuth
300
+ }
301
+ }
302
+ customRequirements := map [string ]AuthRequirements {
303
+ fmt .Sprintf ("%s %s" , atlas , "completion" ): NoAuth , // completion commands do not require credentials
304
+ fmt .Sprintf ("%s %s" , atlas , "config" ): NoAuth , // user wants to set credentials
305
+ fmt .Sprintf ("%s %s" , atlas , "auth" ): NoAuth , // user wants to set credentials
306
+ fmt .Sprintf ("%s %s" , atlas , "register" ): NoAuth , // user wants to set credentials
307
+ fmt .Sprintf ("%s %s" , atlas , "login" ): NoAuth , // user wants to set credentials
308
+ fmt .Sprintf ("%s %s" , atlas , "logout" ): NoAuth , // user wants to set credentials
309
+ fmt .Sprintf ("%s %s" , atlas , "whoami" ): NoAuth , // user wants to set credentials
310
+ fmt .Sprintf ("%s %s" , atlas , "setup" ): NoAuth , // user wants to set credentials
311
+ fmt .Sprintf ("%s %s" , atlas , "register" ): NoAuth , // user wants to set credentials
312
+ fmt .Sprintf ("%s %s" , atlas , "plugin" ): NoAuth , // plugin functionality requires no authentication
313
+ fmt .Sprintf ("%s %s" , atlas , "quickstart" ): NoAuth , // command supports login
314
+ fmt .Sprintf ("%s %s" , atlas , "deployments" ): OptionalAuth , // command supports local and Atlas
315
+ }
316
+ for p , r := range customRequirements {
317
+ if strings .HasPrefix (cmd .CommandPath (), p ) {
318
+ return r
319
+ }
320
+ }
321
+
322
+ if plugin .IsPluginCmd (cmd ) || pluginCmd .IsFirstClassPluginCmd (cmd ) {
323
+ return OptionalAuth
324
+ }
325
+
326
+ return RequiredAuth
327
+ }
328
+
256
329
func formattedVersion () string {
257
330
return fmt .Sprintf (verTemplate ,
258
331
version .Version ,
0 commit comments