vzakharchenko/keycloak-api-gateway

View on GitHub
src/utils/DefaultPageHandlers.ts

Summary

Maintainability
A
0 mins
Test Coverage
import {EnforcerFunction} from "keycloak-lambda-authorizer/dist/src/Options";

import {
    Options,
} from "../index";
import {DefaultSessionManager} from "../session/SessionManager";
import {APIGateWayOptions} from "../apigateway/ApiGateway";
import {DefaultLogout} from "../logout/Logout";
import {DefaultUrlJWKS} from "../jwks/UrlJWKS";
import {DefaultCallback} from "../callback/Callback";
import {DefaultTenantAdapter} from "../tenant/TenantAdapter";
import {DefaultMultiTenantAdapter} from "../multitenants/Multi-tenant-adapter";
import {TenantInternalPage} from "../handlers/TenantInternalPage";
import {PublicUrlPageHandler} from "../handlers/PublicUrlPageHandler";
import {TokenPageHandler} from "../handlers/TokenPageHandler";
import {SingleTenantUrlPageHandler} from "../handlers/SingleTenantUrlPageHandler";

/**
 * default Page Handler
 */
export const defaultPageHandlers = (enforcer?: EnforcerFunction) => ([
  new TenantInternalPage('/tenants', 35000),
  new PublicUrlPageHandler('(.*)(/public)(.*)', 10000),
  new PublicUrlPageHandler('(.*)(.(jpg|jpeg|png|gif|bmp))', 10000),
  new PublicUrlPageHandler('(.*)(.(ico|tiff))', 10000),
  new PublicUrlPageHandler('(.*)(.(css))', 10000),
  new TokenPageHandler("/token"),
  new SingleTenantUrlPageHandler("/", 0, enforcer),
  new SingleTenantUrlPageHandler("/index.html", 32000, enforcer),
]);

function transform(opts: APIGateWayOptions): Options {

  const options: Options = {
    session: {
      sessionConfiguration: {
        storageType: opts.storageType,
        storageTypeSettings: opts.storageTypeSettings,
        keys: opts.keys,
      },
    },
    singleTenantOptions: {
      // eslint-disable-next-line @typescript-eslint/ban-ts-comment
      // @ts-ignore
      defaultAdapterOptions: opts.defaultAdapterOptions,
      idp: opts.identityProviders?.singleTenant,
    },
    pageHandlers: opts.pageHandlers,
  };
  if (opts.multiTenantAdapterOptions && opts.multiTenantJson) {
    options.multiTenantOptions = {
      multiTenantJson: opts.multiTenantJson,
      multiTenantAdapterOptions: opts.multiTenantAdapterOptions,
      idp: opts.identityProviders?.multiTenant,
    };
  }
  options.defaultAuthorization = opts.defaultAuthorization;
  return options;
}

export function initOptions(opts: APIGateWayOptions | Options): Options {
  const options = (<any>opts).session ? <Options>opts : transform(<APIGateWayOptions>opts);
  if (!options.logout) {
    options.logout = new DefaultLogout(options);
  }
  if (!options.jwks) {
    options.jwks = new DefaultUrlJWKS(options);
  }
  if (!options.session.sessionManager) {
    options.session.sessionManager = new DefaultSessionManager(options);
  }
  if (!options.callback) {
    options.callback = new DefaultCallback(options);
  }
  if (options.singleTenantOptions) {
    if (!options.singleTenantOptions.singleTenantAdapter) {
      options.singleTenantOptions.singleTenantAdapter = new DefaultTenantAdapter(options);
    }
  }

  if (options.multiTenantOptions) {
    if (!options.multiTenantOptions.multiTenantAdapter) {
      options.multiTenantOptions.multiTenantAdapter = new DefaultMultiTenantAdapter(options);
    }
  }
  if (!options.pageHandlers || options.pageHandlers.length === 0) {
    options.pageHandlers = defaultPageHandlers(options.defaultAuthorization);
  }
  return options;
}