diff --git a/src/http-web/authentication/login-page.ts b/src/http-web/authentication/login-page.ts index 50ebcef..84e54fb 100644 --- a/src/http-web/authentication/login-page.ts +++ b/src/http-web/authentication/login-page.ts @@ -4,6 +4,7 @@ import { HttpWebDependencies } from '../server'; import { ErrorCode, ErrorInfo } from '../../http/send-error'; import { redirect_303_see_other } from '../../http/redirects'; import { FastifyInstance, FastifyReply, RouteShorthandOptions } from 'fastify'; +import { csp_headers } from '../../http/content-security-policy'; export function register_login_page_endpoint(http_server: FastifyInstance, conf: HttpConfig, { pkce_cookie, session }: HttpWebDependencies) { const opts: RouteShorthandOptions = { @@ -24,6 +25,7 @@ export function register_login_page_endpoint(http_server: FastifyInstance, conf: function send_login_page(res: FastifyReply) { res.status(200); res.header('content-type', 'text/html; charset=utf-8'); + csp_headers(res, conf.exposed_url); session.reset(res); pkce_cookie.reset(res); return render_login_page(); diff --git a/src/http-web/root-page.ts b/src/http-web/root-page.ts new file mode 100644 index 0000000..d08ede6 --- /dev/null +++ b/src/http-web/root-page.ts @@ -0,0 +1,46 @@ + +import { Req } from '../http/request'; +import { UserData } from '../storage'; +import { HttpConfig } from '../http/server'; +import { HttpWebDependencies } from './server'; +import { ErrorCode, ErrorInfo } from '../http/send-error'; +import { csp_headers } from '../http/content-security-policy'; +import { FastifyInstance, RouteShorthandOptions } from 'fastify'; + +export function register_root_page_endpoint(http_server: FastifyInstance, conf: HttpConfig, { session, logger }: HttpWebDependencies) { + const opts: RouteShorthandOptions = { + schema: { }, + }; + + http_server.get('/', opts, async (req: Req, res) => { + try { + await session.check_login(req); + } + + catch (error) { + session.reset(res); + } + + res.status(200); + res.header('content-type', 'text/html; charset=utf-8'); + csp_headers(res, conf.exposed_url); + return render_root_page(req.session?.user); + }); +} + +export const render_root_page = (user?: UserData, error_code?: ErrorCode, error?: ErrorInfo) => ` + +
+Logged in as ${user.name} (${user.username})
+` +: 'Login Page'} + + +`; diff --git a/src/http-web/server.ts b/src/http-web/server.ts index d9696d9..f526ef3 100644 --- a/src/http-web/server.ts +++ b/src/http-web/server.ts @@ -9,9 +9,11 @@ import { BaseHttpDependencies, HttpConfig, create_http_server } from '../http/se import { SnowflakeProvider } from '../utilities/snowflake-uid'; import { register_csp_report_endpoint } from '../http/content-security-policy'; +import { register_root_page_endpoint } from './root-page'; import { register_login_page_endpoint } from './authentication/login-page'; import { register_submit_login_endpoint } from './authentication/submit-login'; import { register_login_callback_endpoint } from './authentication/login-callback'; +import { register_logout_endpoint } from './authentication/logout'; export interface HttpWebDependencies extends BaseHttpDependencies { oidc: OIDCProvider; @@ -27,10 +29,14 @@ export function create_http_web_server(conf: HttpConfig, deps: HttpWebDependenci endpoints: [ register_csp_report_endpoint, + // Root page + register_root_page_endpoint, + // Login/logout register_login_page_endpoint, register_submit_login_endpoint, register_login_callback_endpoint, + register_logout_endpoint, ], content_parsers: { // 'application/ld+json': json_content_parser, diff --git a/src/http/server.ts b/src/http/server.ts index 982918f..dff3707 100644 --- a/src/http/server.ts +++ b/src/http/server.ts @@ -52,6 +52,11 @@ export function create_http_server