8000 Fix identity provider links for users linked past the first 100 providers by marsluca · Pull Request #54435 · keycloak/keycloak · GitHub
[go: up one dir, main page]

Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
8000
Diff view
18 changes: 10 additions & 8 deletions js/apps/admin-ui/src/user/UserIdentityProviderLinks.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ export const UserIdentityProviderLinks = ({
};

type WithProviderId = FederatedIdentityRepresentation & {
providerId: string;
providerId?: string;
};

const identityProviders = useServerInfo().identityProviders;
Expand All @@ -79,12 +79,14 @@ export const UserIdentityProviderLinks = ({
})) as WithProviderId[];

if (canQueryIDPDetails) {
const allProviders = await adminClient.identityProviders.find();
for (const element of allFedIds) {
element.providerId = allProviders.find(
(item) => item.alias === element.identityProvider,
)?.providerId!;
}
await Promise.all(
allFedIds.map(async (element) => {
const provider = await adminClient.identityProviders.findOne({
alias: element.identityProvider!,
});
element.providerId = provider?.providerId;
}),
);
}

return allFedIds;
Expand Down Expand Up @@ -135,7 +137,7 @@ export const UserIdentityProviderLinks = ({
});

const idpLinkRenderer = (idp: WithProviderId) => {
if (!canQueryIDPDetails)
if (!canQueryIDPDetails || !idp.providerId)
return <span>{capitalize(idp.identityProvider)}</span>;

return (
Expand Down
49 changes: 49 additions & 0 deletions js/apps/admin-ui/test/users/main.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import {
searchItem,
} from "../utils/table.ts";
import {
assertLinkedProvider,
clickAddUserButton,
clickCancelButton,
clickSaveButton,
Expand Down Expand Up @@ -437,3 +438,51 @@ test.describe("User attribute search", () => {
await assertRowExists(page, "service-account-sa-client", false);
});
});

test.describe("Identity provider links", () => {
test("shows a linked provider when the realm has more than 100 providers", async ({
page,
}) => {
// the server returns at most 100 providers per request, sorted by alias
const identityProviders = Array.from({ length: 101 }, (_, index) => ({
alias: `idp-${String(index).padStart(3, "0")}`,
providerId: "oidc",
config: {
clientId: "client",
clientSecret: "secret",
authorizationUrl: "https://idp.example.com/auth",
tokenUrl: "https://idp.example.com/token",
},
}));
const linkedAlias = identityProviders[100].alias;
await using testBed = await createTestBed({
identityProviders,
users: [
{
username: "linked-user",
federatedIdentities: [
{
identityProvider: linkedAlias,
userId: "remote-id",
userName: "remote-user",
},
],
},
],
});
const user = await adminClient.findUserByUsername(
testBed.realm,
"linked-user",
);

await login(page, {
to: toUser({
realm: testBed.realm,
id: user.id!,
tab: "identity-provider-links",
}),
});

await assertLinkedProvider(page, linkedAlias, "oidc");
});
});
13 changes: 12 additions & 1 deletion js/apps/admin-ui/test/users/main.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { Page } from "@playwright/test";
import { type Page, expect } from "@playwright/test";

export async function clickCancelButton(page: Page) {
await page.getByTestId("user-creation-revert").click();
Expand Down Expand Up @@ -45,3 +45,14 @@ export async function joinGroup(page: Page, groups: string[], empty = false) {

await page.getByTestId("join-button").click();
}

export async function assertLinkedProvider(
page: Page,
alias: string,
providerId: string,
) {
await expect(page.getByRole("link", { name: alias })).toHaveAttribute(
"href",
new RegExp(`/identity-providers/${providerId}/${alias}/settings$`),
);
}
Loading
0