Skip to content

Commit f8b9734

Browse files
authored
Initialize login UI with state needed for IdC flow (#58)
1 parent 7e8933a commit f8b9734

File tree

8 files changed

+126
-7
lines changed

8 files changed

+126
-7
lines changed

plugin/META-INF/MANIFEST.MF

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ Bundle-Classpath: .,
7878
target/dependency/jna-5.14.0.jar,
7979
target/dependency/jna-platform-5.14.0.jar,
8080
target/dependency/json-utils-2.25.33.jar,
81-
target/dependency/jsoup-1.17.2.jar,
8281
target/dependency/jsr305-3.0.2.jar,
8382
target/dependency/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar,
8483
target/dependency/metrics-spi-2.25.33.jar,
@@ -110,6 +109,7 @@ Bundle-Classpath: .,
110109
target/dependency/reactive-streams-1.0.4.jar,
111110
target/dependency/regions-2.25.33.jar,
112111
target/dependency/sdk-core-2.25.33.jar,
112+
target/dependency/slf4j-api-1.7.30.jar,
113113
target/dependency/slf4j-api-2.0.13.jar,
114114
target/dependency/third-party-jackson-core-2.25.33.jar,
115115
target/dependency/utils-2.25.33.jar,

plugin/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,11 @@
8282
<artifactId>auth</artifactId>
8383
<version>${aws.java.sdk.version}</version>
8484
</dependency>
85+
<dependency>
86+
<groupId>software.amazon.awssdk</groupId>
87+
<artifactId>regions</artifactId>
88+
<version>${aws.java.sdk.version}</version>
89+
</dependency>
8590
<dependency>
8691
<groupId>software.amazon.awssdk</groupId>
8792
<artifactId>apache-client</artifactId>

plugin/src/software/aws/toolkits/eclipse/amazonq/lsp/auth/model/GetSsoTokenSource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33

44
package software.aws.toolkits.eclipse.amazonq.lsp.auth.model;
55

6-
public record GetSsoTokenSource(String clientName, String kind) { }
6+
public record GetSsoTokenSource(String clientName, String kind, String issuerUrl, String region) { }

plugin/src/software/aws/toolkits/eclipse/amazonq/util/AuthUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public static CompletableFuture<Void> invalidateToken() {
8989
}
9090

9191
private static CompletableFuture<SsoToken> getSsoToken(final boolean triggerSignIn) {
92-
GetSsoTokenSource source = new GetSsoTokenSource(Q_PRODUCT_NAME, "AwsBuilderId");
92+
GetSsoTokenSource source = new GetSsoTokenSource(Q_PRODUCT_NAME, "AwsBuilderId", null, null);
9393
GetSsoTokenOptions options = new GetSsoTokenOptions(true, true, triggerSignIn);
9494
GetSsoTokenParams params = new GetSsoTokenParams(source, Q_SCOPES, options);
9595
return LspProvider.getAuthServer()
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package software.aws.toolkits.eclipse.amazonq.util;
2+
3+
import software.amazon.awssdk.regions.Region;
4+
5+
public final class AwsRegion {
6+
private final String id;
7+
private final String name;
8+
private final String partitionId;
9+
private final String category;
10+
private final String displayName;
11+
12+
private AwsRegion(final Region region) {
13+
this.id = region.id();
14+
this.name = region.metadata().description();
15+
this.partitionId = region.metadata().partition().id();
16+
this.category = getCategory(this.id);
17+
this.displayName = getDisplayName(this.name, this.category, this.id);
18+
}
19+
20+
public static AwsRegion from(final Region region) {
21+
return new AwsRegion(region);
22+
}
23+
24+
public String id() {
25+
return id;
26+
}
27+
28+
public String name() {
29+
return name;
30+
}
31+
32+
public String partitionId() {
33+
return partitionId;
34+
}
35+
36+
public String category() {
37+
return category;
38+
}
39+
40+
public String displayName() {
41+
return displayName;
42+
}
43+
44+
private static String getCategory(final String id) {
45+
if (id.startsWith("af")) {
46+
return "Africa";
47+
} else if (id.startsWith("us") || id.startsWith("ca")) {
48+
return "North America";
49+
} else if (id.startsWith("eu")) {
50+
return "Europe";
51+
} else if (id.startsWith("ap")) {
52+
return "Asia Pacific";
53+
} else if (id.startsWith("sa")) {
54+
return "South America";
55+
} else if (id.startsWith("cn")) {
56+
return "China";
57+
} else if (id.startsWith("me")) {
58+
return "Middle East";
59+
} else {
60+
return null;
61+
}
62+
}
63+
64+
private static String getDisplayName(final String name, final String category, final String id) {
65+
if (category == null) {
66+
return name;
67+
} else if (category.equals("Europe")) {
68+
return name.replaceFirst("Europe", "").trim() + " (" + id + ")";
69+
} else if (category.equals("North America")) {
70+
return name.replaceFirst("US West", "").replaceFirst("US East", "").trim() + " (" + id + ")";
71+
} else {
72+
return category + " (" + id + ")";
73+
}
74+
}
75+
76+
public String toString() {
77+
return "{\"id\":\"" + id + "\",\"name\":\"" + name + "\",\"partitionId\":\"" + partitionId
78+
+ "\",\"category\":\"" + category + "\",\"displayName\":\"" + displayName + "\"}";
79+
}
80+
}
81+

plugin/src/software/aws/toolkits/eclipse/amazonq/views/LoginViewActionHandler.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,14 @@
44
package software.aws.toolkits.eclipse.amazonq.views;
55

66

7+
import java.util.stream.Collectors;
8+
79
import org.eclipse.swt.browser.Browser;
810
import org.eclipse.swt.widgets.Display;
911

12+
import software.amazon.awssdk.regions.servicemetadata.OidcServiceMetadata;
1013
import software.aws.toolkits.eclipse.amazonq.util.AuthUtils;
14+
import software.aws.toolkits.eclipse.amazonq.util.AwsRegion;
1115
import software.aws.toolkits.eclipse.amazonq.util.PluginLogger;
1216
import software.aws.toolkits.eclipse.amazonq.util.ThreadingUtils;
1317
import software.aws.toolkits.eclipse.amazonq.views.model.ParsedCommand;
@@ -17,7 +21,6 @@ public class LoginViewActionHandler implements ViewActionHandler {
1721
public final void handleCommand(final ParsedCommand parsedCommand, final Browser browser) {
1822
switch (parsedCommand.getCommand()) {
1923
case LOGIN_BUILDER_ID:
20-
PluginLogger.info("loginBuilderId command received");
2124
ThreadingUtils.executeAsyncTask(() -> {
2225
try {
2326
AuthUtils.signIn().get();
@@ -30,9 +33,34 @@ public final void handleCommand(final ParsedCommand parsedCommand, final Browser
3033
}
3134
});
3235
break;
36+
case LOGIN_IDC:
37+
PluginLogger.info("loginIdc command received");
3338
case CANCEL_LOGIN:
3439
PluginLogger.info("cancelLogin command received");
3540
break;
41+
case ON_LOAD:
42+
OidcServiceMetadata oidcMetadata = new OidcServiceMetadata();
43+
String regions = "[" + oidcMetadata.regions().stream()
44+
.filter(region -> region.metadata().partition().id().equals("aws"))
45+
.map(AwsRegion::from)
46+
.map(AwsRegion::toString)
47+
.collect(Collectors.joining(",")) + "]";
48+
var js = String.format("""
49+
{
50+
stage: '%s',
51+
regions: %s,
52+
cancellable: false,
53+
idcInfo: {
54+
profileName: '',
55+
startUrl: '',
56+
region: 'us-east-1'
57+
},
58+
feature: 'q',
59+
existConnections: []
60+
}
61+
""", "START", regions).stripIndent();
62+
browser.execute(String.format("ideClient.prepareUi(%s)", js));
63+
break;
3664
default:
3765
System.out.println("Unknown command: " + parsedCommand.getCommand());
3866
break;

plugin/src/software/aws/toolkits/eclipse/amazonq/views/ToolkitLoginWebview.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
import java.net.URISyntaxException;
88
import java.net.URL;
99
import java.nio.file.Path;
10-
1110
import org.eclipse.swt.browser.BrowserFunction;
1211
import org.eclipse.swt.widgets.Composite;
1312
import org.eclipse.swt.widgets.Display;
13+
1414
import software.aws.toolkits.eclipse.amazonq.util.AuthUtils;
1515
import software.aws.toolkits.eclipse.amazonq.util.PluginUtils;
1616
import software.aws.toolkits.eclipse.amazonq.util.ThreadingUtils;
@@ -46,7 +46,7 @@ public void createPartControl(final Composite parent) {
4646
@Override
4747
public Object function(final Object[] arguments) {
4848
commandParser.parseCommand(arguments)
49-
.ifPresent(command -> actionHandler.handleCommand(command, browser));
49+
.ifPresent(command -> actionHandler.handleCommand(command, browser));
5050
return null;
5151
}
5252
};
@@ -96,6 +96,9 @@ private String getContent() {
9696
};
9797
window.ideApi = ideApi;
9898
});
99+
window.onload = function() {
100+
ideCommand(JSON.stringify({"command":"onLoad"}));
101+
}
99102
</script>
100103
</body>
101104
</html>

plugin/src/software/aws/toolkits/eclipse/amazonq/views/model/Command.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ public enum Command {
1818

1919
// Auth
2020
LOGIN_BUILDER_ID("loginBuilderId"),
21-
CANCEL_LOGIN("cancelLogin");
21+
LOGIN_IDC("loginIdC"),
22+
CANCEL_LOGIN("cancelLogin"),
23+
ON_LOAD("onLoad");
2224

2325
private final String commandString;
2426

0 commit comments

Comments
 (0)