# Fonctions personnalisées

Custom functions allow one to extend LL::NG, they can be used in headers, rules or form replay data.

## Écrire une librairie de fonctions personnalisées

Créer un module Perl avec des fonctions personnalisées. Le module peut être appelé à la diligence du rédacteur, par exemple `SSOExtensions.pm` :

    vi /root/SSOExtensions.pm

    package SSOExtensions;

    sub function1 {
      my $url = shift;
      my $param = shift;

      # Le joli code ici :

      return $param;
    }

    1;

Le premier paramètre passé à la fonction personnalisée est l'URL demandée, c'est à dire

- l'URL complète du portail si la fonction personnalisée est appelée par le portail (i.e. https://auth.example.com/)
- l'URL absolue si elle est appelée par un agent (e.g. /admin/index.php?param=foo).

## Importer les fonctions personnalisées dans LemonLDAP::NG

### Declarer le module dans le serveur « handler »

#### Apache

Le module doit être chargé par Apache (par exemple après le chargement de l'agent) :

    # Perl environment
    PerlRequire Lemonldap::NG::Handler
    PerlRequire /root/SSOExtensions.pm
    PerlOptions +GlobalRequest

#### Serveur FastCGI (Nginx)

Il faut indiquer au serveur FastCGI de LLNG le fichier à lire en utilisant l'option `-f` ou la variable d'environnement `CUSTOM_FUNCTIONS_FILE`. En utilisant les packages, il suffit de modifier le fichier `/etc/default/llng-fastcgi-server` (ou `/etc/default/lemonldap-ng-fastcgi-server`) :

    # Nombre de processus (défaut : 7)
    #NPROC = 7

    # Socket Unix d'écoute
    SOCKET=/var/run/llng-fastcgi-server/llng-fastcgi.sock

    # Fichier identifiant de processus (PID)
    PID=/var/run/llng-fastcgi-server/llng-fastcgi-server.pid

    # Utilisateur et groupe
    USER=www-data
    GROUP=www-data

    # Fichier éventuel de fonctions personnalisées
    CUSTOM_FUNCTIONS_FILE=/root/SSOExtensions.pm

### Declarer les fonctions personnalisées

Aller dans le manager, `Paramètres généraux` » `Paramètres avancés` » `Fonctions personnalisées` et indiquer :

    SSOExtensions::function1

Si la fonction n'est pas compatible avec la cage saine, il faut désactiver la mise en cage.

## Les utiliser

Les fonctions peuvent être utilisées dans une macro, un en-tête ou une règle d'accès, par exemple:

    Custom-Header => function1($uid)