Skip to content

Commit d11599e

Browse files
committed
impl: simplify auto-login logic
Auto connect will now happen everytime at start up if there is a url and token available.
1 parent 3679ec4 commit d11599e

File tree

3 files changed

+20
-26
lines changed

3 files changed

+20
-26
lines changed

src/main/kotlin/com/coder/toolbox/CoderRemoteProvider.kt

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ class CoderRemoteProvider(
8080
)
8181
)
8282

83+
private val errorBuffer = mutableListOf<Throwable>()
84+
8385
/**
8486
* With the provided client, start polling for workspaces. Every time a new
8587
* workspace is added, reconfigure SSH using the provided cli (including the
@@ -162,13 +164,12 @@ class CoderRemoteProvider(
162164
if (elapsed > POLL_INTERVAL * 2) {
163165
context.logger.info("wake-up from an OS sleep was detected")
164166
} else {
165-
context.logger.error(ex, "workspace polling error encountered, trying to auto-login")
167+
context.logger.error(ex, "workspace polling error encountered")
166168
if (ex is APIResponseException && ex.isTokenExpired) {
167169
WorkspaceConnectionManager.shouldEstablishWorkspaceConnections = true
168170
close()
169-
// force auto-login
170-
firstRun = true
171171
context.envPageManager.showPluginEnvironmentsPage()
172+
errorBuffer.add(ex)
172173
break
173174
}
174175
}
@@ -194,9 +195,6 @@ class CoderRemoteProvider(
194195
* first page.
195196
*/
196197
private fun logout() {
197-
// Keep the URL and token to make it easy to log back in, but set
198-
// rememberMe to false so we do not try to automatically log in.
199-
context.secrets.rememberMe = false
200198
WorkspaceConnectionManager.reset()
201199
close()
202200
}
@@ -358,22 +356,17 @@ class CoderRemoteProvider(
358356
override fun getOverrideUiPage(): UiPage? {
359357
// Show the setup page if we have not configured the client yet.
360358
if (client == null) {
361-
val errorBuffer = mutableListOf<Throwable>()
362359
// When coming back to the application, initializeSession immediately.
363-
val autoSetup = shouldDoAutoSetup()
364-
context.secrets.lastToken.let { lastToken ->
365-
context.secrets.lastDeploymentURL.let { lastDeploymentURL ->
366-
if (autoSetup && lastDeploymentURL.isNotBlank() && (lastToken.isNotBlank() || !settings.requireTokenAuth)) {
367-
try {
368-
CoderCliSetupWizardState.goToStep(WizardStep.CONNECT)
369-
return CoderCliSetupWizardPage(context, settingsPage, visibilityState, true, ::onConnect)
370-
} catch (ex: Exception) {
371-
errorBuffer.add(ex)
372-
}
373-
}
360+
if (shouldDoAutoSetup()) {
361+
try {
362+
CoderCliSetupWizardState.goToStep(WizardStep.CONNECT)
363+
return CoderCliSetupWizardPage(context, settingsPage, visibilityState, true, ::onConnect)
364+
} catch (ex: Exception) {
365+
errorBuffer.add(ex)
366+
} finally {
367+
firstRun = false
374368
}
375369
}
376-
firstRun = false
377370

378371
// Login flow.
379372
val setupWizardPage =
@@ -382,21 +375,24 @@ class CoderRemoteProvider(
382375
errorBuffer.forEach {
383376
setupWizardPage.notify("Error encountered", it)
384377
}
378+
errorBuffer.clear()
385379
// and now reset the errors, otherwise we show it every time on the screen
386380
return setupWizardPage
387381
}
388382
return null
389383
}
390384

391-
private fun shouldDoAutoSetup(): Boolean = firstRun && context.secrets.rememberMe == true
385+
/**
386+
* Auto-login only on first the firs run if there is a url & token configured or the auth
387+
* should be done via certificates.
388+
*/
389+
private fun shouldDoAutoSetup(): Boolean = firstRun && (context.secrets.canAutoLogin || !settings.requireTokenAuth)
392390

393391
private fun onConnect(client: CoderRestClient, cli: CoderCLIManager) {
394392
// Store the URL and token for use next time.
395393
context.secrets.lastDeploymentURL = client.url.toString()
396394
context.secrets.lastToken = client.token ?: ""
397395
context.secrets.storeTokenFor(client.url, context.secrets.lastToken)
398-
// Currently we always remember, but this could be made an option.
399-
context.secrets.rememberMe = true
400396
this.client = client
401397
pollJob?.cancel()
402398
environments.showLoadingMessage()

src/main/kotlin/com/coder/toolbox/store/CoderSecretsStore.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,8 @@ class CoderSecretsStore(private val store: PluginSecretStore) {
2424
var lastToken: String
2525
get() = get("last-token")
2626
set(value) = set("last-token", value)
27-
var rememberMe: Boolean
28-
get() = get("remember-me").toBoolean()
29-
set(value) = set("remember-me", value.toString())
27+
val canAutoLogin: Boolean
28+
get() = lastDeploymentURL.isNotBlank() && lastToken.isNotBlank()
3029

3130
fun tokenFor(url: URL): String? = store[url.host]
3231

src/main/kotlin/com/coder/toolbox/views/ConnectStep.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,6 @@ class ConnectStep(
128128
if (shouldAutoLogin.value) {
129129
CoderCliSetupContext.reset()
130130
CoderCliSetupWizardState.goToFirstStep()
131-
context.secrets.rememberMe = false
132131
} else {
133132
if (context.settingsStore.requireTokenAuth) {
134133
CoderCliSetupWizardState.goToPreviousStep()

0 commit comments

Comments
 (0)