Skip to content

Commit 52891ba

Browse files
brandurabrightwell
authored andcommitted
Allow cb open redirect to be modified by CB_REDIRECT_URL
Here, let `cb open` redirect to a non-standard Dashboard URL (or other internal component) by respecting the `CB_REDIRECT_URL` env var. If the var's empty, it continues to have the same behavior as before.
1 parent 8805c40 commit 52891ba

File tree

4 files changed

+42
-3
lines changed

4 files changed

+42
-3
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
66

77
## [Unreleased]
88

9+
### Added
10+
- `cb open` can now take a non-default redirect URL using `CB_REDIRECT_URL`.
11+
912
## [3.6.3] - 2025-04-03
1013
### Fixed
1114
- Missing values from cluster state enum.

spec/cb/open_spec.cr

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ Spectator.describe CB::Open do
1717

1818
it "creates a session and executes open" do
1919
ENV["CB_API_KEY"] = nil
20+
ENV["CB_REDIRECT_URL"] = nil
2021

2122
open_args : Array(String)? = nil
2223

@@ -27,7 +28,38 @@ Spectator.describe CB::Open do
2728

2829
expect(client).to receive(:create_session)
2930
.with(
30-
Client::SessionCreateParams.new(generate_one_time_token: true)
31+
Client::SessionCreateParams.new(
32+
generate_one_time_token: true,
33+
redirect_url: nil
34+
)
35+
)
36+
.and_return(
37+
CB::Model::Session.new(id: session_id, one_time_token: session_one_time_token)
38+
)
39+
40+
action.call
41+
42+
expected_login_url = "https://#{client_host}/sessions/#{session_id}/actions/login?one_time_token=#{session_one_time_token}"
43+
expect(open_args).to eq([expected_login_url])
44+
end
45+
46+
it "redirects to a URL based on env var" do
47+
ENV["CB_API_KEY"] = nil
48+
ENV["CB_REDIRECT_URL"] = "https://my-custom-url.crunchybridge.com"
49+
50+
open_args : Array(String)? = nil
51+
52+
action.open = ->(args : Array(String), _env : Process::Env) do
53+
open_args = args
54+
nil
55+
end
56+
57+
expect(client).to receive(:create_session)
58+
.with(
59+
Client::SessionCreateParams.new(
60+
generate_one_time_token: true,
61+
redirect_url: "https://my-custom-url.crunchybridge.com"
62+
)
3163
)
3264
.and_return(
3365
CB::Model::Session.new(id: session_id, one_time_token: session_one_time_token)

src/cb/open.cr

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ module CB
1414
def run
1515
raise Error.new "Cannot open browser session with #{"CB_API_KEY".colorize.red.bold} set." if ENV["CB_API_KEY"]?
1616

17-
session = client.create_session Client::SessionCreateParams.new(generate_one_time_token: true)
17+
session = client.create_session Client::SessionCreateParams.new(
18+
redirect_url: ENV["CB_REDIRECT_URL"]?,
19+
generate_one_time_token: true,
20+
)
1821
# A one-time token is sent via query string since we don't have any choice
1922
# while using an executable like `open`, which means that there is some
2023
# potential danger of it leaking to logs. To protect against this, tokens

src/client/session.cr

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
module CB
22
class Client
33
jrecord SessionCreateParams,
4-
generate_one_time_token : Bool
4+
generate_one_time_token : Bool,
5+
redirect_url : String?
56

67
# https://crunchybridgeapiinternal.docs.apiary.io/#reference/0/sessions/create-session
78
def create_session(params : SessionCreateParams)

0 commit comments

Comments
 (0)