# Custom handlers

LLNG provides Perl libraries that can be easily used by inheritance. So you can write your own handlers but you need first to understand Handler architecture

## Add a new handler type

1. Write your new Module (in Lemonldap/NG/Handler/Lib for example) that overload some Lemonldap::NG::Handler::Main methods
2. Write a wrapper in each platform directory (see Lemonldap::NG::Handler::Apache2::AuthBasic or Lemonldap::NG::Handler::Server::AuthBasic for examples)

Wrapper usually look at this:

    package Lemonldap::NG::Handler::ApacheMP2::MyType;

    use base 'Lemonldap::NG::Handler::ApacheMP2::Main', 'Lemonldap::NG::Handler::Lib::MyType';

    1;

### Enable it

Your wrappers must be named "Lemonldap::NG::Handler::<platform>::<type>" where <platform> is the target (ApacheMP2 or Server) and <type> is the name you've chosen.

You can enable it either:

- by setting a `PerlSetVar VHOSTTYPE <type>` in the Apache configuration file
- by setting a `fastcgi_param VHOSTTYPE <type>` in the Nginx configuration file
- by adding it to the menu: add its name in `vhostType` "select" declaration (file `lemonldap-ng-manager/lib/Lemonldap/NG/Build/Attributes`) and rebuild LLNG

Note that configuration parameter can be set only in lemonldap-ng.ini configuration file (section Handler).

## Add a new platform

LLNG provides 3 platforms:

- ApacheMP2
- FastCGI server (Nginx is build from there)
- Auto-protected PSGI

If you want to add another, you must write:

- the platform launcher file that launch the required type (see `lemonldap-ng-handler/lib/Lemonldap/NG/Handler/ApacheMP2` file for example)
- write the main platform file (`Lemonldap::NG::Handler::MyPlatform::Main`) that provides required method (see `lemonldap-ng-handler/lib/Lemonldap/NG/Handler/*/Main` for examples) and inherits from `Lemonldap::NG::Handler::Main`
- write the "type" wrapper files (AuthBasic,...).

Wrapper usually look at this:

    package Lemonldap::NG::Handler::MyPlatform::AuthBasic;

    use base 'Lemonldap::NG::Handler::MyPlatform::Main', 'Lemonldap::NG::Handler::Lib::AuthBasic';

    1;

## Old fashion Nginx handlers

There is no need to use this feature now. It is kept for compatibility.

Three actions are needed:

- declare your own module in the manager "General Parameters >> Advanced Parameters >> Custom handlers (Nginx)". Key is the name that will be used below and value is the name of the custom package,
- in your Nginx configuration file, add `LLTYPE=<name>;` in the `location = /lmauth {...}` paragraph
- restart FastCGI server(s) (reload is not enough here)