# Custom functions

Custom functions allow one to extend LL::NG, they can be used in Headers, Rules or form replay data. Two actions are needed:

- declare them in LLNG configuration

- load the relevant code

## Implementation

Your perl custom functions must be declared on appropriate server when separating:

Portal type: declare custom functions here when using it in rules, macros or menu.

Reverse-proxy type: declare custom functions here when using it in headers.

## Write custom functions library

Create your Perl module with custom functions. You can name your module as you want, for example `SSOExtensions.pm`:

    vi /path/to/SSOExtensions.pm

    package SSOExtensions;

    sub function1 {
      my (@args) = @_;

      # Your nice code here
      return $result;
    }

    sub function2 {
      return $_[0];
    }

    1;

## Import custom functions in LemonLDAP::NG

### LemonLDAP::NG Configuration

Edit `lemonldap-ng.ini` to load the Perl module(s)

    [all]
    require = /path/to/SSOExtensions.pm
    ; Prevent Portal to crash if Perl module is not found
    ;requireDontDie = 1

Tip

You can declare multiple custom function files, separated by a ,

require = /path/to/SSOExtensions1.pm, /path/to/SSOExtensions2.pm

### Declare custom functions

Go in Manager, `General Parameters` » `Advanced Parameters` » `Custom functions` and declare your function names, separated by a space:

    SSOExtensions::function1 SSOExtensions::function2

Attention

If your function is not compliant with Safe jail, you will need to disable the jail.

## Usage

You can now use your function in a macro, an header or an access rule, for example:

    function1( $uid, $ENV{REMOTE_ADDR} )