mirror of
https://github.com/CommunitySolidServer/CommunitySolidServer.git
synced 2024-10-03 14:55:10 +00:00
feat: Indicate to templates if this is part of an auth request
This commit is contained in:
parent
cb227d6431
commit
f71f8683fc
@ -167,8 +167,9 @@ export class IdentityProviderHttpHandler extends HttpHandler {
|
||||
private async resolveRoute(request: HttpRequest, response: HttpResponse, route: InteractionRoute,
|
||||
oidcInteraction?: Interaction): Promise<void> {
|
||||
if (request.method === 'GET') {
|
||||
// .ejs templates errors on undefined variables
|
||||
return await this.handleTemplateResponse(response, route.viewTemplate, { errorMessage: '', prefilled: {}});
|
||||
return await this.handleTemplateResponse(
|
||||
response, route.viewTemplate, { errorMessage: '', prefilled: {}}, oidcInteraction,
|
||||
);
|
||||
}
|
||||
|
||||
if (request.method === 'POST') {
|
||||
@ -179,7 +180,9 @@ export class IdentityProviderHttpHandler extends HttpHandler {
|
||||
// Render error in the view
|
||||
const prefilled = IdpInteractionError.isInstance(error) ? error.prefilled : {};
|
||||
const errorMessage = createErrorMessage(error);
|
||||
return await this.handleTemplateResponse(response, route.viewTemplate, { errorMessage, prefilled });
|
||||
return await this.handleTemplateResponse(
|
||||
response, route.viewTemplate, { errorMessage, prefilled }, oidcInteraction,
|
||||
);
|
||||
}
|
||||
|
||||
if (result.type === 'complete') {
|
||||
@ -193,15 +196,17 @@ export class IdentityProviderHttpHandler extends HttpHandler {
|
||||
return await this.interactionCompleter.handleSafe({ ...result.details, request, response });
|
||||
}
|
||||
if (result.type === 'response' && route.responseTemplate) {
|
||||
return await this.handleTemplateResponse(response, route.responseTemplate, result.details);
|
||||
return await this.handleTemplateResponse(response, route.responseTemplate, result.details, oidcInteraction);
|
||||
}
|
||||
}
|
||||
throw new BadRequestHttpError(`Unsupported request: ${request.method} ${request.url}`);
|
||||
}
|
||||
|
||||
private async handleTemplateResponse(response: HttpResponse, templateFile: string, contents?: NodeJS.Dict<any>):
|
||||
Promise<void> {
|
||||
await this.templateHandler.handleSafe({ response, templateFile, contents: contents ?? {}});
|
||||
private async handleTemplateResponse(response: HttpResponse, templateFile: string, data?: NodeJS.Dict<any>,
|
||||
oidcInteraction?: Interaction): Promise<void> {
|
||||
const contents = data ?? {};
|
||||
contents.authenticating = Boolean(oidcInteraction);
|
||||
await this.templateHandler.handleSafe({ response, templateFile, contents });
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -26,7 +26,11 @@
|
||||
<h2>Your new account</h2>
|
||||
<p>
|
||||
Via your email address <em><%= email %></em>,
|
||||
this server lets you <a href="./login">log in</a> to Solid apps
|
||||
<% if (authenticating) { %>
|
||||
you can now <a href="./login">log in</a>
|
||||
<% } else { %>
|
||||
this server lets you log in to Solid apps
|
||||
<% } %>
|
||||
with your WebID <a href="<%= webId %>" class="link"><%= webId %></a>
|
||||
</p>
|
||||
<% if (!createWebId) { %>
|
||||
|
@ -83,9 +83,9 @@ describe('An IdentityProviderHttpHandler', (): void => {
|
||||
request.url = '/idp/routeResponse';
|
||||
await expect(handler.handle({ request, response })).resolves.toBeUndefined();
|
||||
expect(templateHandler.handleSafe).toHaveBeenCalledTimes(1);
|
||||
expect(templateHandler.handleSafe).toHaveBeenLastCalledWith(
|
||||
{ response, templateFile: routes.response.viewTemplate, contents: { errorMessage: '', prefilled: {}}},
|
||||
);
|
||||
expect(templateHandler.handleSafe).toHaveBeenLastCalledWith({ response,
|
||||
templateFile: routes.response.viewTemplate,
|
||||
contents: { errorMessage: '', prefilled: {}, authenticating: false }});
|
||||
});
|
||||
|
||||
it('calls the templateHandler for InteractionResponseResults.', async(): Promise<void> => {
|
||||
@ -96,20 +96,22 @@ describe('An IdentityProviderHttpHandler', (): void => {
|
||||
expect(routes.response.handler.handleSafe).toHaveBeenLastCalledWith({ request });
|
||||
expect(templateHandler.handleSafe).toHaveBeenCalledTimes(1);
|
||||
expect(templateHandler.handleSafe).toHaveBeenLastCalledWith(
|
||||
{ response, templateFile: routes.response.responseTemplate, contents: { key: 'val' }},
|
||||
{ response, templateFile: routes.response.responseTemplate, contents: { key: 'val', authenticating: false }},
|
||||
);
|
||||
});
|
||||
|
||||
it('supports InteractionResponseResults without details.', async(): Promise<void> => {
|
||||
it('indicates to the templates if the request is part of an auth flow.', async(): Promise<void> => {
|
||||
request.url = '/idp/routeResponse';
|
||||
request.method = 'POST';
|
||||
const oidcInteraction = { session: { accountId: 'account' }} as any;
|
||||
provider.interactionDetails.mockResolvedValueOnce(oidcInteraction);
|
||||
(routes.response.handler as jest.Mocked<InteractionHandler>).handleSafe.mockResolvedValueOnce({ type: 'response' });
|
||||
await expect(handler.handle({ request, response })).resolves.toBeUndefined();
|
||||
expect(routes.response.handler.handleSafe).toHaveBeenCalledTimes(1);
|
||||
expect(routes.response.handler.handleSafe).toHaveBeenLastCalledWith({ request });
|
||||
expect(routes.response.handler.handleSafe).toHaveBeenLastCalledWith({ request, oidcInteraction });
|
||||
expect(templateHandler.handleSafe).toHaveBeenCalledTimes(1);
|
||||
expect(templateHandler.handleSafe).toHaveBeenLastCalledWith(
|
||||
{ response, templateFile: routes.response.responseTemplate, contents: {}},
|
||||
{ response, templateFile: routes.response.responseTemplate, contents: { authenticating: true }},
|
||||
);
|
||||
});
|
||||
|
||||
@ -175,7 +177,8 @@ describe('An IdentityProviderHttpHandler', (): void => {
|
||||
expect(templateHandler.handleSafe).toHaveBeenLastCalledWith({
|
||||
response,
|
||||
templateFile: routes.response.viewTemplate,
|
||||
contents: { errorMessage: 'handle error', prefilled: { name: 'name' }},
|
||||
contents: { errorMessage: 'handle error', prefilled: { name: 'name' }, authenticating: false },
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
@ -188,7 +191,7 @@ describe('An IdentityProviderHttpHandler', (): void => {
|
||||
expect(templateHandler.handleSafe).toHaveBeenLastCalledWith({
|
||||
response,
|
||||
templateFile: routes.response.viewTemplate,
|
||||
contents: { errorMessage: 'handle error', prefilled: { }},
|
||||
contents: { errorMessage: 'handle error', prefilled: {}, authenticating: false },
|
||||
});
|
||||
});
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user