Skip to content

Commit 8e67a61

Browse files
authored
Merge pull request #114 from kusaridev/pxp928-update-console-url-for-api-keys
add api key console result output
2 parents 96313e7 + 6050f63 commit 8e67a61

File tree

3 files changed

+128
-35
lines changed

3 files changed

+128
-35
lines changed

pkg/repo/scanner.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,12 +176,12 @@ func scan(dir string, rev string, platformUrl string, consoleUrl string, verbose
176176
return fmt.Errorf("failed to upload file to S3: %w", err)
177177
}
178178

179-
workspaceID, userID, epoch, err := urlBuilder.GetIDsFromUrl(presignedUrl)
179+
workspaceID, userID, epoch, isMachine, err := urlBuilder.GetIDsFromUrl(presignedUrl)
180180
if err != nil {
181181
return err
182182
}
183183

184-
sortString := urlBuilder.CreateSortString(userID, epoch, full)
184+
sortString := urlBuilder.CreateSortString(userID, epoch, full, isMachine)
185185

186186
consoleFullUrl, err := urlBuilder.Build(consoleUrl, "workspaces", workspaceID, "analysis", sortString, "result")
187187
if err != nil {

pkg/url/build_test.go

Lines changed: 88 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,56 +12,74 @@ func Test_Build_Base(t *testing.T) {
1212
assert.Nil(t, e)
1313
assert.Equal(t, "https://jerry.wilson", *actual)
1414
}
15+
1516
func Test_Build_Hostname_Error(t *testing.T) {
1617
_, e := Build("*****")
1718

1819
assert.NotNil(t, e)
1920
}
21+
2022
func Test_Build_Base_Trailing_Slash(t *testing.T) {
2123
actual, e := Build("https://jerry.wilson/")
2224

2325
assert.Nil(t, e)
2426
assert.Equal(t, "https://jerry.wilson/", *actual)
2527
}
28+
2629
func Test_Build_Path(t *testing.T) {
2730
actual, e := Build("https://jerry.wilson", "a", "b")
2831

2932
assert.Nil(t, e)
3033
assert.Equal(t, "https://jerry.wilson/a/b", *actual)
3134
}
35+
3236
func Test_Build_Path_Trailing_Slash(t *testing.T) {
3337
actual, e := Build("https://jerry.wilson/", "a", "b")
3438

3539
assert.Nil(t, e)
3640
assert.Equal(t, "https://jerry.wilson/a/b", *actual)
3741
}
3842

39-
func Test_GetIDsFromUrl_Success(t *testing.T) {
43+
func Test_GetIDsFromUrl_Success_Machine(t *testing.T) {
44+
presignUrl := "https://inspector-bundle-upload-dev-us-east-1.s3.us-east-1.amazonaws.com/workspace/4382f4d8-3a11-401f-a9ba-3b1702f6917e/user/machine/6a5404db-a484-4115-8a69-a9def45a8fe3/diff/blob/1761082861?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAS7LCAOM53APYAJ26%2F20251021%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251021T214101Z&X-Amz-Expires=300&X-Amz-Security-Token=asdf1234qwer4567&X-Amz-SignedHeaders=host&x-id=PutObject&X-Amz-Signature=aafacd4d8cd5c1a1aa405138b516c37db775698d75f4a798dbb8f0e6a6009378"
45+
46+
workspaceID, userID, epoch, isMachine, err := GetIDsFromUrl(presignUrl)
47+
48+
assert.Nil(t, err)
49+
assert.Equal(t, "4382f4d8-3a11-401f-a9ba-3b1702f6917e", workspaceID)
50+
assert.Equal(t, "6a5404db-a484-4115-8a69-a9def45a8fe3", userID)
51+
assert.True(t, isMachine)
52+
assert.Equal(t, "1761082861", epoch)
53+
}
54+
55+
func Test_GetIDsFromUrl_Success_Human(t *testing.T) {
4056
presignUrl := "https://inspector-bundle-upload-dev-us-east-1.s3.us-east-1.amazonaws.com/workspace/4382f4d8-3a11-401f-a9ba-3b1702f6917e/user/human/6a5404db-a484-4115-8a69-a9def45a8fe3/diff/blob/1761082861?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAS7LCAOM53APYAJ26%2F20251021%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251021T214101Z&X-Amz-Expires=300&X-Amz-Security-Token=asdf1234qwer4567&X-Amz-SignedHeaders=host&x-id=PutObject&X-Amz-Signature=aafacd4d8cd5c1a1aa405138b516c37db775698d75f4a798dbb8f0e6a6009378"
4157

42-
workspaceID, userID, epoch, err := GetIDsFromUrl(presignUrl)
58+
workspaceID, userID, epoch, isMachine, err := GetIDsFromUrl(presignUrl)
4359

4460
assert.Nil(t, err)
4561
assert.Equal(t, "4382f4d8-3a11-401f-a9ba-3b1702f6917e", workspaceID)
4662
assert.Equal(t, "6a5404db-a484-4115-8a69-a9def45a8fe3", userID)
63+
assert.False(t, isMachine)
4764
assert.Equal(t, "1761082861", epoch)
4865
}
4966

5067
func Test_GetIDsFromUrl_NoQueryParams(t *testing.T) {
5168
presignUrl := "https://example.com/workspace/test-workspace-id/user/human/test-user-id/diff/blob/123"
5269

53-
workspaceID, userID, epoch, err := GetIDsFromUrl(presignUrl)
70+
workspaceID, userID, epoch, isMachine, err := GetIDsFromUrl(presignUrl)
5471

5572
assert.Nil(t, err)
5673
assert.Equal(t, "test-workspace-id", workspaceID)
5774
assert.Equal(t, "test-user-id", userID)
75+
assert.False(t, isMachine)
5876
assert.Equal(t, "123", epoch)
5977
}
6078

6179
func Test_GetIDsFromUrl_MissingWorkspace(t *testing.T) {
6280
presignUrl := "https://example.com/user/human/test-user-id/diff/blob/123"
6381

64-
_, _, _, err := GetIDsFromUrl(presignUrl)
82+
_, _, _, _, err := GetIDsFromUrl(presignUrl)
6583

6684
assert.NotNil(t, err)
6785
assert.Contains(t, err.Error(), "workspace ID not found")
@@ -70,7 +88,7 @@ func Test_GetIDsFromUrl_MissingWorkspace(t *testing.T) {
7088
func Test_GetIDsFromUrl_MissingUser(t *testing.T) {
7189
presignUrl := "https://example.com/workspace/test-workspace-id/diff/blob/123"
7290

73-
_, _, _, err := GetIDsFromUrl(presignUrl)
91+
_, _, _, _, err := GetIDsFromUrl(presignUrl)
7492

7593
assert.NotNil(t, err)
7694
assert.Contains(t, err.Error(), "user ID not found")
@@ -79,65 +97,114 @@ func Test_GetIDsFromUrl_MissingUser(t *testing.T) {
7997
func Test_GetIDsFromUrl_InvalidURL(t *testing.T) {
8098
presignUrl := "://invalid-url"
8199

82-
_, _, _, err := GetIDsFromUrl(presignUrl)
100+
_, _, _, _, err := GetIDsFromUrl(presignUrl)
83101

84102
assert.NotNil(t, err)
85103
assert.Contains(t, err.Error(), "error parsing URL")
86104
}
87105

88-
func Test_CreateSortString_Basic(t *testing.T) {
106+
// CreateSortString tests for cli-user (human users)
107+
func Test_CreateSortString_Basic_Human(t *testing.T) {
89108
userID := "6a5404db-a484-4115-8a69-a9def45a8fe3"
90109
epoch := "1761082861"
91110

92-
result := CreateSortString(userID, epoch, false)
111+
result := CreateSortString(userID, epoch, false, false)
93112

94113
assert.Equal(t, "cli-user%7C6a5404db-a484-4115-8a69-a9def45a8fe3%7C1761082861", result)
95114
}
96115

97-
func Test_CreateSortString_Full(t *testing.T) {
116+
func Test_CreateSortString_Full_Human(t *testing.T) {
98117
userID := "6a5404db-a484-4115-8a69-a9def45a8fe3"
99118
epoch := "1761082861"
100119

101-
result := CreateSortString(userID, epoch, true)
120+
result := CreateSortString(userID, epoch, true, false)
102121

103122
assert.Equal(t, "cli-user-full%7C6a5404db-a484-4115-8a69-a9def45a8fe3%7C1761082861", result)
104123
}
105124

125+
// CreateSortString tests for cli-api (machine users)
126+
func Test_CreateSortString_Basic_Machine(t *testing.T) {
127+
userID := "6a5404db-a484-4115-8a69-a9def45a8fe3"
128+
epoch := "1761082861"
129+
130+
result := CreateSortString(userID, epoch, false, true)
131+
132+
assert.Equal(t, "cli-api%7Cmachine%7C1761082861", result)
133+
}
134+
135+
func Test_CreateSortString_Full_Machine(t *testing.T) {
136+
userID := "6a5404db-a484-4115-8a69-a9def45a8fe3"
137+
epoch := "1761082861"
138+
139+
result := CreateSortString(userID, epoch, true, true)
140+
141+
assert.Equal(t, "cli-api-full%7Cmachine%7C1761082861", result)
142+
}
143+
106144
func Test_CreateSortString_WithSpecialChars(t *testing.T) {
107145
userID := "[email protected]"
108146
epoch := "2024/10/21"
109147

110-
result := CreateSortString(userID, epoch, false)
148+
result := CreateSortString(userID, epoch, false, false)
111149

112150
assert.Equal(t, "cli-user%7Cuser%40example.com%7C2024%2F10%2F21", result)
113151
}
114152

115-
func Test_CreateSortString_EmptyValues(t *testing.T) {
116-
result := CreateSortString("", "", false)
153+
func Test_CreateSortString_EmptyValues_Human(t *testing.T) {
154+
result := CreateSortString("", "", false, false)
117155

118156
assert.Equal(t, "cli-user%7C%7C", result)
119157
}
120158

121-
func Test_CreateSortString_Integration(t *testing.T) {
122-
// Test that we can use the output from GetIDsFromUrl
159+
func Test_CreateSortString_EmptyValues_Machine(t *testing.T) {
160+
result := CreateSortString("", "", false, true)
161+
162+
assert.Equal(t, "cli-api%7Cmachine%7C", result)
163+
}
164+
165+
// Integration tests
166+
func Test_CreateSortString_Integration_Human(t *testing.T) {
123167
presignUrl := "https://inspector-bundle-upload-dev-us-east-1.s3.us-east-1.amazonaws.com/workspace/4382f4d8-3a11-401f-a9ba-3b1702f6917e/user/human/6a5404db-a484-4115-8a69-a9def45a8fe3/diff/blob/1761082861?X-Amz-Algorithm=AWS4-HMAC-SHA256"
124168

125-
_, userID, epoch, err := GetIDsFromUrl(presignUrl)
169+
_, userID, epoch, isMachine, err := GetIDsFromUrl(presignUrl)
126170
assert.Nil(t, err)
127171

128-
result := CreateSortString(userID, epoch, false)
172+
result := CreateSortString(userID, epoch, false, isMachine)
129173

130174
assert.Equal(t, "cli-user%7C6a5404db-a484-4115-8a69-a9def45a8fe3%7C1761082861", result)
131175
}
132176

133-
func Test_CreateSortString_Integration_Full(t *testing.T) {
134-
// Test that we can use the output from GetIDsFromUrl with full=true
177+
func Test_CreateSortString_Integration_Human_Full(t *testing.T) {
135178
presignUrl := "https://inspector-bundle-upload-dev-us-east-1.s3.us-east-1.amazonaws.com/workspace/4382f4d8-3a11-401f-a9ba-3b1702f6917e/user/human/6a5404db-a484-4115-8a69-a9def45a8fe3/diff/blob/1761082861?X-Amz-Algorithm=AWS4-HMAC-SHA256"
136179

137-
_, userID, epoch, err := GetIDsFromUrl(presignUrl)
180+
_, userID, epoch, isMachine, err := GetIDsFromUrl(presignUrl)
138181
assert.Nil(t, err)
139182

140-
result := CreateSortString(userID, epoch, true)
183+
result := CreateSortString(userID, epoch, true, isMachine)
141184

142185
assert.Equal(t, "cli-user-full%7C6a5404db-a484-4115-8a69-a9def45a8fe3%7C1761082861", result)
143186
}
187+
188+
func Test_CreateSortString_Integration_Machine(t *testing.T) {
189+
presignUrl := "https://inspector-bundle-upload-dev-us-east-1.s3.us-east-1.amazonaws.com/workspace/4382f4d8-3a11-401f-a9ba-3b1702f6917e/user/machine/6a5404db-a484-4115-8a69-a9def45a8fe3/diff/blob/1761082861?X-Amz-Algorithm=AWS4-HMAC-SHA256"
190+
191+
_, userID, epoch, isMachine, err := GetIDsFromUrl(presignUrl)
192+
assert.Nil(t, err)
193+
assert.True(t, isMachine)
194+
195+
result := CreateSortString(userID, epoch, false, isMachine)
196+
197+
assert.Equal(t, "cli-api%7Cmachine%7C1761082861", result)
198+
}
199+
200+
func Test_CreateSortString_Integration_Machine_Full(t *testing.T) {
201+
presignUrl := "https://inspector-bundle-upload-dev-us-east-1.s3.us-east-1.amazonaws.com/workspace/4382f4d8-3a11-401f-a9ba-3b1702f6917e/user/machine/6a5404db-a484-4115-8a69-a9def45a8fe3/diff/blob/1761082861?X-Amz-Algorithm=AWS4-HMAC-SHA256"
202+
203+
_, userID, epoch, isMachine, err := GetIDsFromUrl(presignUrl)
204+
assert.Nil(t, err)
205+
assert.True(t, isMachine)
206+
207+
result := CreateSortString(userID, epoch, true, isMachine)
208+
209+
assert.Equal(t, "cli-api-full%7Cmachine%7C1761082861", result)
210+
}

pkg/url/epoch.go

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,51 @@ import (
88
)
99

1010
// CreateSortString creates a URL-encoded sort string from user ID and epoch.
11-
// Format: "cli-user|{userID}|{epoch}" or "cli-user-full|{userID}|{epoch}" (URL-encoded)
12-
func CreateSortString(userID string, epoch string, full bool) string {
13-
prefix := "cli-user"
14-
if full {
15-
prefix = "cli-user-full"
11+
/* Sort Key format:
12+
13+
cli-user: cli-user|{{user sub}}|{{epoch}}
14+
cli-user-full: cli-user-full|{{user sub}}|{{epoch}}
15+
cli-api: cli-api|machine|{{epoch}}
16+
cli-api-full: cli-api-full|machine|{{epoch}}
17+
cli-user: cli-user|{{user sub}}|{{timestamp}}|status|{{status}}
18+
cli-user-full: cli-user-full|{{user sub}}|{{timestamp}}|status|{{status}}
19+
cli-api: cli-api|machine|{{timestamp}}|status|{{status}}
20+
cli-api-full: cli-api-full|machine|{{timestamp}}|status|{{status}}
21+
*/
22+
func CreateSortString(userID string, epoch string, full, isMachine bool) string {
23+
var prefix string
24+
25+
if !isMachine {
26+
prefix = "cli-user"
27+
if full {
28+
prefix = "cli-user-full"
29+
}
30+
} else {
31+
prefix = "cli-api"
32+
if full {
33+
prefix = "cli-api-full"
34+
}
35+
userID = "machine"
1636
}
37+
1738
sortString := fmt.Sprintf("%s|%s|%s", prefix, userID, epoch)
1839
return url.QueryEscape(sortString)
1940
}
2041

2142
// GetIDsFromUrl extracts the workspace ID, user ID, and epoch from a presigned URL.
2243
// Returns workspaceID, userID, epoch, error.
2344
// Expected URL format: .../workspace/{workspaceID}/user/{userType}/{userID}/.../{epoch}
24-
func GetIDsFromUrl(presignUrl string) (string, string, string, error) {
45+
func GetIDsFromUrl(presignUrl string) (string, string, string, bool, error) {
2546
u, err := url.Parse(presignUrl)
2647
if err != nil {
27-
return "", "", "", fmt.Errorf("error parsing URL: %w", err)
48+
return "", "", "", false, fmt.Errorf("error parsing URL: %w", err)
2849
}
2950

3051
// Split the path into segments
3152
segments := strings.Split(strings.Trim(u.Path, "/"), "/")
3253

33-
var workspaceID, userID string
54+
var workspaceID, userID, isMachineStr string
55+
var isMachine bool
3456

3557
// Find workspace ID
3658
for i, segment := range segments {
@@ -40,21 +62,25 @@ func GetIDsFromUrl(presignUrl string) (string, string, string, error) {
4062
if segment == "user" && i+2 < len(segments) {
4163
// Skip userType (segments[i+1]) and get userID (segments[i+2])
4264
userID = segments[i+2]
65+
isMachineStr = segments[i+1]
4366
}
4467
}
4568

4669
// Get epoch from the last segment
4770
epoch := path.Base(u.Path)
4871

4972
if workspaceID == "" {
50-
return "", "", "", fmt.Errorf("workspace ID not found in URL")
73+
return "", "", "", false, fmt.Errorf("workspace ID not found in URL")
5174
}
5275
if userID == "" {
53-
return "", "", "", fmt.Errorf("user ID not found in URL")
76+
return "", "", "", false, fmt.Errorf("user ID not found in URL")
5477
}
5578
if epoch == "" || epoch == "/" {
56-
return "", "", "", fmt.Errorf("epoch not found in URL")
79+
return "", "", "", false, fmt.Errorf("epoch not found in URL")
80+
}
81+
if isMachineStr == "machine" {
82+
isMachine = true
5783
}
5884

59-
return workspaceID, userID, epoch, nil
85+
return workspaceID, userID, epoch, isMachine, nil
6086
}

0 commit comments

Comments
 (0)