mirror of
https://github.com/coder/coder.git
synced 2025-07-12 00:14:10 +00:00
fix(cli): replace $SESSION_TOKEN placeholder for external apps (#17048)
Fixes an oversight in https://github.com/coder/coder/pull/17032 The FE has logic to replace the string `$SESSION_TOKEN` with a newly-minted session token. This adds corresponding logic to the `coder open app` command.
This commit is contained in:
18
cli/open.go
18
cli/open.go
@ -301,6 +301,10 @@ func (r *RootCmd) openApp() *serpent.Command {
|
|||||||
pathAppURL := strings.TrimPrefix(region.PathAppURL, baseURL.String())
|
pathAppURL := strings.TrimPrefix(region.PathAppURL, baseURL.String())
|
||||||
appURL := buildAppLinkURL(baseURL, ws, agt, foundApp, region.WildcardHostname, pathAppURL)
|
appURL := buildAppLinkURL(baseURL, ws, agt, foundApp, region.WildcardHostname, pathAppURL)
|
||||||
|
|
||||||
|
if foundApp.External {
|
||||||
|
appURL = replacePlaceholderExternalSessionTokenString(client, appURL)
|
||||||
|
}
|
||||||
|
|
||||||
// Check if we're inside a workspace. Generally, we know
|
// Check if we're inside a workspace. Generally, we know
|
||||||
// that if we're inside a workspace, `open` can't be used.
|
// that if we're inside a workspace, `open` can't be used.
|
||||||
insideAWorkspace := inv.Environ.Get("CODER") == "true"
|
insideAWorkspace := inv.Environ.Get("CODER") == "true"
|
||||||
@ -314,7 +318,7 @@ func (r *RootCmd) openApp() *serpent.Command {
|
|||||||
if !testOpenError {
|
if !testOpenError {
|
||||||
err = open.Run(appURL)
|
err = open.Run(appURL)
|
||||||
} else {
|
} else {
|
||||||
err = xerrors.New("test.open-error")
|
err = xerrors.New("test.open-error: " + appURL)
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
},
|
},
|
||||||
@ -511,3 +515,15 @@ func buildAppLinkURL(baseURL *url.URL, workspace codersdk.Workspace, agent coder
|
|||||||
}
|
}
|
||||||
return u.String()
|
return u.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// replacePlaceholderExternalSessionTokenString replaces any $SESSION_TOKEN
|
||||||
|
// strings in the URL with the actual session token.
|
||||||
|
// This is consistent behavior with the frontend. See: site/src/modules/resources/AppLink/AppLink.tsx
|
||||||
|
func replacePlaceholderExternalSessionTokenString(client *codersdk.Client, appURL string) string {
|
||||||
|
if !strings.Contains(appURL, "$SESSION_TOKEN") {
|
||||||
|
return appURL
|
||||||
|
}
|
||||||
|
|
||||||
|
// We will just re-use the existing session token we're already using.
|
||||||
|
return strings.ReplaceAll(appURL, "$SESSION_TOKEN", client.SessionToken())
|
||||||
|
}
|
||||||
|
@ -381,4 +381,29 @@ func TestOpenApp(t *testing.T) {
|
|||||||
w.RequireError()
|
w.RequireError()
|
||||||
w.RequireContains("region not found")
|
w.RequireContains("region not found")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("ExternalAppSessionToken", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
client, ws, _ := setupWorkspaceForAgent(t, func(agents []*proto.Agent) []*proto.Agent {
|
||||||
|
agents[0].Apps = []*proto.App{
|
||||||
|
{
|
||||||
|
Slug: "app1",
|
||||||
|
Url: "https://example.com/app1?token=$SESSION_TOKEN",
|
||||||
|
External: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return agents
|
||||||
|
})
|
||||||
|
inv, root := clitest.New(t, "open", "app", ws.Name, "app1", "--test.open-error")
|
||||||
|
clitest.SetupConfig(t, client, root)
|
||||||
|
pty := ptytest.New(t)
|
||||||
|
inv.Stdin = pty.Input()
|
||||||
|
inv.Stdout = pty.Output()
|
||||||
|
|
||||||
|
w := clitest.StartWithWaiter(t, inv)
|
||||||
|
w.RequireError()
|
||||||
|
w.RequireContains("test.open-error")
|
||||||
|
w.RequireContains(client.SessionToken())
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user