import { Config, Configuration, CoreApi, CurrentTenant, Middleware, ResponseContext, RootApi, Tenant } from "authentik-api"; import { getCookie } from "../utils"; import { API_DRAWER_MIDDLEWARE } from "../elements/notifications/APIDrawer"; import { MessageMiddleware } from "../elements/messages/Middleware"; export class LoggingMiddleware implements Middleware { post(context: ResponseContext): Promise { tenant().then(tenant => { let msg = `authentik/api[${tenant.matchedDomain}]: `; msg += `${context.response.status} ${context.init.method} ${context.url}`; if (context.response.status >= 400) { const resClone = context.response.clone(); resClone.text().then(t => { msg += ` => ${t}`; console.debug(msg); }); } else { console.debug(msg); } }); return Promise.resolve(context.response); } } let globalConfigPromise: Promise; export function config(): Promise { if (!globalConfigPromise) { globalConfigPromise = new RootApi(DEFAULT_CONFIG).rootConfigRetrieve(); } return globalConfigPromise; } let globalTenantPromise: Promise; export function tenant(): Promise { if (!globalTenantPromise) { globalTenantPromise = new CoreApi(DEFAULT_CONFIG).coreTenantsCurrentRetrieve().then(tenant => { /** * * */ const rels = ["icon", "shortcut icon"]; rels.forEach(rel => { let relIcon = document.head.querySelector(`link[rel='${rel}']`); if (!relIcon) { relIcon = document.createElement('link'); relIcon.rel = rel; document.getElementsByTagName('head')[0].appendChild(relIcon); } relIcon.href = tenant.brandingFavicon; }) return tenant; }); } return globalTenantPromise; } export const DEFAULT_CONFIG = new Configuration({ basePath: "", headers: { "X-CSRFToken": getCookie("authentik_csrf"), }, middleware: [ API_DRAWER_MIDDLEWARE, new MessageMiddleware(), new LoggingMiddleware(), ], });