Skip to content

Commit

Permalink
Initialize login UI with state needed for IdC flow (#58)
Browse files Browse the repository at this point in the history
  • Loading branch information
breedloj authored Oct 7, 2024
1 parent 7e8933a commit f8b9734
Show file tree
Hide file tree
Showing 8 changed files with 126 additions and 7 deletions.
2 changes: 1 addition & 1 deletion plugin/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,6 @@ Bundle-Classpath: .,
target/dependency/jna-5.14.0.jar,
target/dependency/jna-platform-5.14.0.jar,
target/dependency/json-utils-2.25.33.jar,
target/dependency/jsoup-1.17.2.jar,
target/dependency/jsr305-3.0.2.jar,
target/dependency/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar,
target/dependency/metrics-spi-2.25.33.jar,
Expand Down Expand Up @@ -110,6 +109,7 @@ Bundle-Classpath: .,
target/dependency/reactive-streams-1.0.4.jar,
target/dependency/regions-2.25.33.jar,
target/dependency/sdk-core-2.25.33.jar,
target/dependency/slf4j-api-1.7.30.jar,
target/dependency/slf4j-api-2.0.13.jar,
target/dependency/third-party-jackson-core-2.25.33.jar,
target/dependency/utils-2.25.33.jar,
Expand Down
5 changes: 5 additions & 0 deletions plugin/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,11 @@
<artifactId>auth</artifactId>
<version>${aws.java.sdk.version}</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>regions</artifactId>
<version>${aws.java.sdk.version}</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>apache-client</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@

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

public record GetSsoTokenSource(String clientName, String kind) { }
public record GetSsoTokenSource(String clientName, String kind, String issuerUrl, String region) { }
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ public static CompletableFuture<Void> invalidateToken() {
}

private static CompletableFuture<SsoToken> getSsoToken(final boolean triggerSignIn) {
GetSsoTokenSource source = new GetSsoTokenSource(Q_PRODUCT_NAME, "AwsBuilderId");
GetSsoTokenSource source = new GetSsoTokenSource(Q_PRODUCT_NAME, "AwsBuilderId", null, null);
GetSsoTokenOptions options = new GetSsoTokenOptions(true, true, triggerSignIn);
GetSsoTokenParams params = new GetSsoTokenParams(source, Q_SCOPES, options);
return LspProvider.getAuthServer()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package software.aws.toolkits.eclipse.amazonq.util;

import software.amazon.awssdk.regions.Region;

public final class AwsRegion {
private final String id;
private final String name;
private final String partitionId;
private final String category;
private final String displayName;

private AwsRegion(final Region region) {
this.id = region.id();
this.name = region.metadata().description();
this.partitionId = region.metadata().partition().id();
this.category = getCategory(this.id);
this.displayName = getDisplayName(this.name, this.category, this.id);
}

public static AwsRegion from(final Region region) {
return new AwsRegion(region);
}

public String id() {
return id;
}

public String name() {
return name;
}

public String partitionId() {
return partitionId;
}

public String category() {
return category;
}

public String displayName() {
return displayName;
}

private static String getCategory(final String id) {
if (id.startsWith("af")) {
return "Africa";
} else if (id.startsWith("us") || id.startsWith("ca")) {
return "North America";
} else if (id.startsWith("eu")) {
return "Europe";
} else if (id.startsWith("ap")) {
return "Asia Pacific";
} else if (id.startsWith("sa")) {
return "South America";
} else if (id.startsWith("cn")) {
return "China";
} else if (id.startsWith("me")) {
return "Middle East";
} else {
return null;
}
}

private static String getDisplayName(final String name, final String category, final String id) {
if (category == null) {
return name;
} else if (category.equals("Europe")) {
return name.replaceFirst("Europe", "").trim() + " (" + id + ")";
} else if (category.equals("North America")) {
return name.replaceFirst("US West", "").replaceFirst("US East", "").trim() + " (" + id + ")";
} else {
return category + " (" + id + ")";
}
}

public String toString() {
return "{\"id\":\"" + id + "\",\"name\":\"" + name + "\",\"partitionId\":\"" + partitionId
+ "\",\"category\":\"" + category + "\",\"displayName\":\"" + displayName + "\"}";
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,14 @@
package software.aws.toolkits.eclipse.amazonq.views;


import java.util.stream.Collectors;

import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.widgets.Display;

import software.amazon.awssdk.regions.servicemetadata.OidcServiceMetadata;
import software.aws.toolkits.eclipse.amazonq.util.AuthUtils;
import software.aws.toolkits.eclipse.amazonq.util.AwsRegion;
import software.aws.toolkits.eclipse.amazonq.util.PluginLogger;
import software.aws.toolkits.eclipse.amazonq.util.ThreadingUtils;
import software.aws.toolkits.eclipse.amazonq.views.model.ParsedCommand;
Expand All @@ -17,7 +21,6 @@ public class LoginViewActionHandler implements ViewActionHandler {
public final void handleCommand(final ParsedCommand parsedCommand, final Browser browser) {
switch (parsedCommand.getCommand()) {
case LOGIN_BUILDER_ID:
PluginLogger.info("loginBuilderId command received");
ThreadingUtils.executeAsyncTask(() -> {
try {
AuthUtils.signIn().get();
Expand All @@ -30,9 +33,34 @@ public final void handleCommand(final ParsedCommand parsedCommand, final Browser
}
});
break;
case LOGIN_IDC:
PluginLogger.info("loginIdc command received");
case CANCEL_LOGIN:
PluginLogger.info("cancelLogin command received");
break;
case ON_LOAD:
OidcServiceMetadata oidcMetadata = new OidcServiceMetadata();
String regions = "[" + oidcMetadata.regions().stream()
.filter(region -> region.metadata().partition().id().equals("aws"))
.map(AwsRegion::from)
.map(AwsRegion::toString)
.collect(Collectors.joining(",")) + "]";
var js = String.format("""
{
stage: '%s',
regions: %s,
cancellable: false,
idcInfo: {
profileName: '',
startUrl: '',
region: 'us-east-1'
},
feature: 'q',
existConnections: []
}
""", "START", regions).stripIndent();
browser.execute(String.format("ideClient.prepareUi(%s)", js));
break;
default:
System.out.println("Unknown command: " + parsedCommand.getCommand());
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Path;

import org.eclipse.swt.browser.BrowserFunction;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;

import software.aws.toolkits.eclipse.amazonq.util.AuthUtils;
import software.aws.toolkits.eclipse.amazonq.util.PluginUtils;
import software.aws.toolkits.eclipse.amazonq.util.ThreadingUtils;
Expand Down Expand Up @@ -46,7 +46,7 @@ public void createPartControl(final Composite parent) {
@Override
public Object function(final Object[] arguments) {
commandParser.parseCommand(arguments)
.ifPresent(command -> actionHandler.handleCommand(command, browser));
.ifPresent(command -> actionHandler.handleCommand(command, browser));
return null;
}
};
Expand Down Expand Up @@ -96,6 +96,9 @@ private String getContent() {
};
window.ideApi = ideApi;
});
window.onload = function() {
ideCommand(JSON.stringify({"command":"onLoad"}));
}
</script>
</body>
</html>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ public enum Command {

// Auth
LOGIN_BUILDER_ID("loginBuilderId"),
CANCEL_LOGIN("cancelLogin");
LOGIN_IDC("loginIdC"),
CANCEL_LOGIN("cancelLogin"),
ON_LOAD("onLoad");

private final String commandString;

Expand Down

0 comments on commit f8b9734

Please sign in to comment.