diff --git a/doc/pages/manager-api/index.html b/doc/pages/manager-api/index.html index 06e984f326eb498cb3515ee5cd8cec3bd2527fd2..7ec58c758bda87c1ad54b5d17795fab50c2c45b3 100644 --- a/doc/pages/manager-api/index.html +++ b/doc/pages/manager-api/index.html @@ -738,11 +738,11 @@ } }; defs.casOptions = { + "required" : [ "service" ], "type" : "object", "properties" : { "service" : { - "type" : "string", - "default" : "none" + "type" : "string" }, "userAttribute" : { "type" : "string", @@ -766,6 +766,90 @@ "type" : "string" } } +}; + defs.MenuApp = { + "required" : [ "confKey" ], + "type" : "object", + "properties" : { + "confKey" : { + "$ref" : "#/components/schemas/confKey" + }, + "order" : { + "type" : "integer" + }, + "options" : { + "$ref" : "#/components/schemas/MenuAppOptions" + } + } +}; + defs.MenuAppOptions = { + "required" : [ "name" ], + "type" : "object", + "properties" : { + "name" : { + "type" : "string" + }, + "tooltip" : { + "type" : "string" + }, + "description" : { + "type" : "string" + }, + "uri" : { + "type" : "string" + }, + "logo" : { + "type" : "string", + "default" : "network.png", + "enum" : [ "attach.png", "bell.png", "bookmark.png", "configure.png", "database.png", "demo.png", "folder.png", "gear.png", "help.png", "llng.png", "mailappt.png", "money.png", "network.png", "terminal.png", "thumbnail.png", "tux.png", "web.png", "(Any reference to an available image in app logo folder)" ] + }, + "display" : { + "type" : "string", + "default" : "auto", + "enum" : [ "enabled", "disabled", "auto", "(Any special rule to apply for example \"$uid eq 'dwho'\")" ] + } + } +}; + defs.MenuAppUpdate = { + "type" : "object", + "properties" : { + "order" : { + "type" : "integer" + }, + "options" : { + "$ref" : "#/components/schemas/MenuAppOptions" + } + } +}; + defs.MenuCat = { + "required" : [ "catname", "confKey" ], + "type" : "object", + "properties" : { + "confKey" : { + "$ref" : "#/components/schemas/confKey" + }, + "catname" : { + "type" : "string" + }, + "order" : { + "type" : "integer" + } + } +}; + defs.menuCatConfKey = { + "pattern" : "^\\w[\\w\\.\\-]*$", + "type" : "string" +}; + defs.MenuCatUpdate = { + "type" : "object", + "properties" : { + "catname" : { + "type" : "string" + }, + "order" : { + "type" : "integer" + } + } }; defs.OidcOptions = { "type" : "object", @@ -1094,8 +1178,8 @@
  • findCasAppByConfKey
  • -
  • - findCasAppsByServiceUrl +
  • + findCasAppByServiceUrl
  • getCasAppByConfKey @@ -1125,6 +1209,47 @@
  • getSecondFactorsByType
  • + +
  • + addMenuApp +
  • +
  • + deleteMenuApp +
  • +
  • + findMenuAppByConfKey +
  • +
  • + getMenuAppByConfKey +
  • +
  • + getMenuApps +
  • +
  • + replaceMenuApp +
  • +
  • + updateMenuApp +
  • + +
  • + addMenuCat +
  • +
  • + deleteMenuCat +
  • +
  • + findMenuCatByConfKey +
  • +
  • + getMenuCatByConfKey +
  • +
  • + replaceMenuCat +
  • +
  • + updateMenuCat +
  • addoidcrp @@ -2233,11 +2358,11 @@ except ApiException as e:
    -
    -
    +
    +
    -

    findCasAppsByServiceUrl

    -

    Finds CAS applications by Service URL

    +

    findCasAppByServiceUrl

    +

    Get CAS Application by Service URL

    @@ -2250,24 +2375,24 @@ except ApiException as e:

    Usage and SDK Samples

    -
    +
    curl -X GET "/api/v1/api/v1/providers/cas/app/findByServiceUrl?serviceUrl="
    -
    +
    import io.swagger.client.*;
     import io.swagger.client.auth.*;
     import io.swagger.client.model.*;
    @@ -2283,17 +2408,17 @@ public class CasappApiExample {
             CasappApi apiInstance = new CasappApi();
             String serviceUrl = serviceUrl_example; // String | Service URL to search
             try {
    -            CasApp result = apiInstance.findCasAppsByServiceUrl(serviceUrl);
    +            CasApp result = apiInstance.findCasAppByServiceUrl(serviceUrl);
                 System.out.println(result);
             } catch (ApiException e) {
    -            System.err.println("Exception when calling CasappApi#findCasAppsByServiceUrl");
    +            System.err.println("Exception when calling CasappApi#findCasAppByServiceUrl");
                 e.printStackTrace();
             }
         }
     }
    -
    +
    import io.swagger.client.api.CasappApi;
     
     public class CasappApiExample {
    @@ -2302,26 +2427,26 @@ public class CasappApiExample {
             CasappApi apiInstance = new CasappApi();
             String serviceUrl = serviceUrl_example; // String | Service URL to search
             try {
    -            CasApp result = apiInstance.findCasAppsByServiceUrl(serviceUrl);
    +            CasApp result = apiInstance.findCasAppByServiceUrl(serviceUrl);
                 System.out.println(result);
             } catch (ApiException e) {
    -            System.err.println("Exception when calling CasappApi#findCasAppsByServiceUrl");
    +            System.err.println("Exception when calling CasappApi#findCasAppByServiceUrl");
                 e.printStackTrace();
             }
         }
     }
    -
    +
    String *serviceUrl = serviceUrl_example; // Service URL to search
     
     CasappApi *apiInstance = [[CasappApi alloc] init];
     
    -// Finds CAS applications by Service URL
    -[apiInstance findCasAppsByServiceUrlWith:serviceUrl
    +// Get CAS Application by Service URL
    +[apiInstance findCasAppByServiceUrlWith:serviceUrl
                   completionHandler: ^(CasApp output, NSError* error) {
                                 if (output) {
                                     NSLog(@"%@", output);
    @@ -2333,7 +2458,7 @@ CasappApi *apiInstance = [[CasappApi alloc] init];
     
    -
    +
    var LemonLdapngManagerApi = require('lemon_ldapng_manager_api');
     
     var api = new LemonLdapngManagerApi.CasappApi()
    @@ -2346,14 +2471,14 @@ var callback = function(error, data, response) {
         console.log('API called successfully. Returned data: ' + data);
       }
     };
    -api.findCasAppsByServiceUrl(serviceUrl, callback);
    +api.findCasAppByServiceUrl(serviceUrl, callback);
     
    - -
    +
    using System;
     using System.Diagnostics;
     using IO.Swagger.Api;
    @@ -2362,7 +2487,7 @@ using IO.Swagger.Model;
     
     namespace Example
     {
    -    public class findCasAppsByServiceUrlExample
    +    public class findCasAppByServiceUrlExample
         {
             public void main()
             {
    @@ -2372,13 +2497,13 @@ namespace Example
     
                 try
                 {
    -                // Finds CAS applications by Service URL
    -                CasApp result = apiInstance.findCasAppsByServiceUrl(serviceUrl);
    +                // Get CAS Application by Service URL
    +                CasApp result = apiInstance.findCasAppByServiceUrl(serviceUrl);
                     Debug.WriteLine(result);
                 }
                 catch (Exception e)
                 {
    -                Debug.Print("Exception when calling CasappApi.findCasAppsByServiceUrl: " + e.Message );
    +                Debug.Print("Exception when calling CasappApi.findCasAppByServiceUrl: " + e.Message );
                 }
             }
         }
    @@ -2386,7 +2511,7 @@ namespace Example
     
    -
    +
    <?php
     require_once(__DIR__ . '/vendor/autoload.php');
     
    @@ -2394,15 +2519,15 @@ $api_instance = new Swagger\Client\ApiCasappApi();
     $serviceUrl = serviceUrl_example; // String | Service URL to search
     
     try {
    -    $result = $api_instance->findCasAppsByServiceUrl($serviceUrl);
    +    $result = $api_instance->findCasAppByServiceUrl($serviceUrl);
         print_r($result);
     } catch (Exception $e) {
    -    echo 'Exception when calling CasappApi->findCasAppsByServiceUrl: ', $e->getMessage(), PHP_EOL;
    +    echo 'Exception when calling CasappApi->findCasAppByServiceUrl: ', $e->getMessage(), PHP_EOL;
     }
     ?>
    -
    +
    use Data::Dumper;
     use WWW::SwaggerClient::Configuration;
     use WWW::SwaggerClient::CasappApi;
    @@ -2411,15 +2536,15 @@ my $api_instance = WWW::SwaggerClient::CasappApi->new();
     my $serviceUrl = serviceUrl_example; # String | Service URL to search
     
     eval { 
    -    my $result = $api_instance->findCasAppsByServiceUrl(serviceUrl => $serviceUrl);
    +    my $result = $api_instance->findCasAppByServiceUrl(serviceUrl => $serviceUrl);
         print Dumper($result);
     };
     if ($@) {
    -    warn "Exception when calling CasappApi->findCasAppsByServiceUrl: $@\n";
    +    warn "Exception when calling CasappApi->findCasAppByServiceUrl: $@\n";
     }
    -
    +
    from __future__ import print_statement
     import time
     import swagger_client
    @@ -2431,11 +2556,11 @@ api_instance = swagger_client.CasappApi()
     serviceUrl = serviceUrl_example # String | Service URL to search
     
     try: 
    -    # Finds CAS applications by Service URL
    -    api_response = api_instance.find_cas_apps_by_service_url(serviceUrl)
    +    # Get CAS Application by Service URL
    +    api_response = api_instance.find_cas_app_by_service_url(serviceUrl)
         pprint(api_response)
     except ApiException as e:
    -    print("Exception when calling CasappApi->findCasAppsByServiceUrl: %s\n" % e)
    + print("Exception when calling CasappApi->findCasAppByServiceUrl: %s\n" % e)
    @@ -2455,7 +2580,7 @@ except ApiException as e: -
    +
    @@ -2480,14 +2605,14 @@ except ApiException as e:
    -
    -
    +
    +
    - +
    @@ -2528,14 +2653,14 @@ except ApiException as e:
    -
    -
    +
    +
    +
    + +
    +
    + +

    Status: 404 - The specified resource was not found

    + + + +
    +
    +
    +
    - +
    @@ -5850,6 +6023,5188 @@ except ApiException as e:

    +
    +

    Menuapp

    +
    +
    +
    +

    addMenuApp

    +

    Create a new Menu Application within a Menu Category

    +
    +
    +
    +

    +

    +

    +
    +
    /api/v1/menu/app/{cat}
    +

    +

    Usage and SDK Samples

    +

    + + +
    +
    +
    curl -X POST "/api/v1/api/v1/menu/app/{cat}"
    +
    +
    +
    import io.swagger.client.*;
    +import io.swagger.client.auth.*;
    +import io.swagger.client.model.*;
    +import io.swagger.client.api.MenuappApi;
    +
    +import java.io.File;
    +import java.util.*;
    +
    +public class MenuappApiExample {
    +
    +    public static void main(String[] args) {
    +        
    +        MenuappApi apiInstance = new MenuappApi();
    +        MenuApp body = ; // MenuApp | Menu Application to add
    +        menuCatConfKey cat = ; // menuCatConfKey | Configuration key of Menu Category to work with
    +        try {
    +            apiInstance.addMenuApp(body, cat);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenuappApi#addMenuApp");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    import io.swagger.client.api.MenuappApi;
    +
    +public class MenuappApiExample {
    +
    +    public static void main(String[] args) {
    +        MenuappApi apiInstance = new MenuappApi();
    +        MenuApp body = ; // MenuApp | Menu Application to add
    +        menuCatConfKey cat = ; // menuCatConfKey | Configuration key of Menu Category to work with
    +        try {
    +            apiInstance.addMenuApp(body, cat);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenuappApi#addMenuApp");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    MenuApp *body = ; // Menu Application to add
    +menuCatConfKey *cat = ; // Configuration key of Menu Category to work with
    +
    +MenuappApi *apiInstance = [[MenuappApi alloc] init];
    +
    +// Create a new Menu Application within a Menu Category
    +[apiInstance addMenuAppWith:body
    +    cat:cat
    +              completionHandler: ^(NSError* error) {
    +                            if (error) {
    +                                NSLog(@"Error: %@", error);
    +                            }
    +                        }];
    +
    +
    + +
    +
    var LemonLdapngManagerApi = require('lemon_ldapng_manager_api');
    +
    +var api = new LemonLdapngManagerApi.MenuappApi()
    +var body = ; // {{MenuApp}} Menu Application to add
    +var cat = ; // {{menuCatConfKey}} Configuration key of Menu Category to work with
    +
    +var callback = function(error, data, response) {
    +  if (error) {
    +    console.error(error);
    +  } else {
    +    console.log('API called successfully.');
    +  }
    +};
    +api.addMenuApp(bodycat, callback);
    +
    +
    + + +
    +
    using System;
    +using System.Diagnostics;
    +using IO.Swagger.Api;
    +using IO.Swagger.Client;
    +using IO.Swagger.Model;
    +
    +namespace Example
    +{
    +    public class addMenuAppExample
    +    {
    +        public void main()
    +        {
    +
    +            var apiInstance = new MenuappApi();
    +            var body = new MenuApp(); // MenuApp | Menu Application to add
    +            var cat = new menuCatConfKey(); // menuCatConfKey | Configuration key of Menu Category to work with
    +
    +            try
    +            {
    +                // Create a new Menu Application within a Menu Category
    +                apiInstance.addMenuApp(body, cat);
    +            }
    +            catch (Exception e)
    +            {
    +                Debug.Print("Exception when calling MenuappApi.addMenuApp: " + e.Message );
    +            }
    +        }
    +    }
    +}
    +
    +
    + +
    +
    <?php
    +require_once(__DIR__ . '/vendor/autoload.php');
    +
    +$api_instance = new Swagger\Client\ApiMenuappApi();
    +$body = ; // MenuApp | Menu Application to add
    +$cat = ; // menuCatConfKey | Configuration key of Menu Category to work with
    +
    +try {
    +    $api_instance->addMenuApp($body, $cat);
    +} catch (Exception $e) {
    +    echo 'Exception when calling MenuappApi->addMenuApp: ', $e->getMessage(), PHP_EOL;
    +}
    +?>
    +
    + +
    +
    use Data::Dumper;
    +use WWW::SwaggerClient::Configuration;
    +use WWW::SwaggerClient::MenuappApi;
    +
    +my $api_instance = WWW::SwaggerClient::MenuappApi->new();
    +my $body = WWW::SwaggerClient::Object::MenuApp->new(); # MenuApp | Menu Application to add
    +my $cat = ; # menuCatConfKey | Configuration key of Menu Category to work with
    +
    +eval { 
    +    $api_instance->addMenuApp(body => $body, cat => $cat);
    +};
    +if ($@) {
    +    warn "Exception when calling MenuappApi->addMenuApp: $@\n";
    +}
    +
    + +
    +
    from __future__ import print_statement
    +import time
    +import swagger_client
    +from swagger_client.rest import ApiException
    +from pprint import pprint
    +
    +# create an instance of the API class
    +api_instance = swagger_client.MenuappApi()
    +body =  # MenuApp | Menu Application to add
    +cat =  # menuCatConfKey | Configuration key of Menu Category to work with
    +
    +try: 
    +    # Create a new Menu Application within a Menu Category
    +    api_instance.add_menu_app(body, cat)
    +except ApiException as e:
    +    print("Exception when calling MenuappApi->addMenuApp: %s\n" % e)
    +
    +
    + +

    Parameters

    + +
    Path parameters
    + + + + + + + + +
    NameDescription
    cat* + + +
    +
    +
    + + menuCatConfKey + + +
    + Configuration key of Menu Category to work with +
    +
    +
    + Required +
    +
    +
    +
    + + +
    Body parameters
    + + + + + + + + +
    NameDescription
    body * + + + +
    +
    + + + +

    Responses

    +

    Status: 201 - Successful creation

    + + + +
    +
    + +

    Status: 400 - An error was encountered when processing the request

    + + + +
    +
    +
    + +
    + +
    +
    + +

    Status: 409 - The specified object could not be created because its configuration key, client_id or entityID already exists

    + + + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +

    deleteMenuApp

    +

    Deletes a Menu Application

    +
    +
    +
    +

    +

    +

    +
    +
    /api/v1/menu/app/{cat}/{confKey}
    +

    +

    Usage and SDK Samples

    +

    + + +
    +
    +
    curl -X DELETE "/api/v1/api/v1/menu/app/{cat}/{confKey}"
    +
    +
    +
    import io.swagger.client.*;
    +import io.swagger.client.auth.*;
    +import io.swagger.client.model.*;
    +import io.swagger.client.api.MenuappApi;
    +
    +import java.io.File;
    +import java.util.*;
    +
    +public class MenuappApiExample {
    +
    +    public static void main(String[] args) {
    +        
    +        MenuappApi apiInstance = new MenuappApi();
    +        menuCatConfKey cat = ; // menuCatConfKey | Configuration key of Menu Category to work with
    +        confKey confKey = ; // confKey | Configuration key of Menu Application to delete
    +        try {
    +            apiInstance.deleteMenuApp(cat, confKey);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenuappApi#deleteMenuApp");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    import io.swagger.client.api.MenuappApi;
    +
    +public class MenuappApiExample {
    +
    +    public static void main(String[] args) {
    +        MenuappApi apiInstance = new MenuappApi();
    +        menuCatConfKey cat = ; // menuCatConfKey | Configuration key of Menu Category to work with
    +        confKey confKey = ; // confKey | Configuration key of Menu Application to delete
    +        try {
    +            apiInstance.deleteMenuApp(cat, confKey);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenuappApi#deleteMenuApp");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    menuCatConfKey *cat = ; // Configuration key of Menu Category to work with
    +confKey *confKey = ; // Configuration key of Menu Application to delete
    +
    +MenuappApi *apiInstance = [[MenuappApi alloc] init];
    +
    +// Deletes a Menu Application
    +[apiInstance deleteMenuAppWith:cat
    +    confKey:confKey
    +              completionHandler: ^(NSError* error) {
    +                            if (error) {
    +                                NSLog(@"Error: %@", error);
    +                            }
    +                        }];
    +
    +
    + +
    +
    var LemonLdapngManagerApi = require('lemon_ldapng_manager_api');
    +
    +var api = new LemonLdapngManagerApi.MenuappApi()
    +var cat = ; // {{menuCatConfKey}} Configuration key of Menu Category to work with
    +var confKey = ; // {{confKey}} Configuration key of Menu Application to delete
    +
    +var callback = function(error, data, response) {
    +  if (error) {
    +    console.error(error);
    +  } else {
    +    console.log('API called successfully.');
    +  }
    +};
    +api.deleteMenuApp(cat, confKey, callback);
    +
    +
    + + +
    +
    using System;
    +using System.Diagnostics;
    +using IO.Swagger.Api;
    +using IO.Swagger.Client;
    +using IO.Swagger.Model;
    +
    +namespace Example
    +{
    +    public class deleteMenuAppExample
    +    {
    +        public void main()
    +        {
    +
    +            var apiInstance = new MenuappApi();
    +            var cat = new menuCatConfKey(); // menuCatConfKey | Configuration key of Menu Category to work with
    +            var confKey = new confKey(); // confKey | Configuration key of Menu Application to delete
    +
    +            try
    +            {
    +                // Deletes a Menu Application
    +                apiInstance.deleteMenuApp(cat, confKey);
    +            }
    +            catch (Exception e)
    +            {
    +                Debug.Print("Exception when calling MenuappApi.deleteMenuApp: " + e.Message );
    +            }
    +        }
    +    }
    +}
    +
    +
    + +
    +
    <?php
    +require_once(__DIR__ . '/vendor/autoload.php');
    +
    +$api_instance = new Swagger\Client\ApiMenuappApi();
    +$cat = ; // menuCatConfKey | Configuration key of Menu Category to work with
    +$confKey = ; // confKey | Configuration key of Menu Application to delete
    +
    +try {
    +    $api_instance->deleteMenuApp($cat, $confKey);
    +} catch (Exception $e) {
    +    echo 'Exception when calling MenuappApi->deleteMenuApp: ', $e->getMessage(), PHP_EOL;
    +}
    +?>
    +
    + +
    +
    use Data::Dumper;
    +use WWW::SwaggerClient::Configuration;
    +use WWW::SwaggerClient::MenuappApi;
    +
    +my $api_instance = WWW::SwaggerClient::MenuappApi->new();
    +my $cat = ; # menuCatConfKey | Configuration key of Menu Category to work with
    +my $confKey = ; # confKey | Configuration key of Menu Application to delete
    +
    +eval { 
    +    $api_instance->deleteMenuApp(cat => $cat, confKey => $confKey);
    +};
    +if ($@) {
    +    warn "Exception when calling MenuappApi->deleteMenuApp: $@\n";
    +}
    +
    + +
    +
    from __future__ import print_statement
    +import time
    +import swagger_client
    +from swagger_client.rest import ApiException
    +from pprint import pprint
    +
    +# create an instance of the API class
    +api_instance = swagger_client.MenuappApi()
    +cat =  # menuCatConfKey | Configuration key of Menu Category to work with
    +confKey =  # confKey | Configuration key of Menu Application to delete
    +
    +try: 
    +    # Deletes a Menu Application
    +    api_instance.delete_menu_app(cat, confKey)
    +except ApiException as e:
    +    print("Exception when calling MenuappApi->deleteMenuApp: %s\n" % e)
    +
    +
    + +

    Parameters

    + +
    Path parameters
    + + + + + + + + + + + +
    NameDescription
    cat* + + +
    +
    +
    + + menuCatConfKey + + +
    + Configuration key of Menu Category to work with +
    +
    +
    + Required +
    +
    +
    +
    confKey* + + +
    +
    +
    + + confKey + + +
    + Configuration key of Menu Application to delete +
    +
    +
    + Required +
    +
    +
    +
    + + + + + +

    Responses

    +

    Status: 204 - Successful modification

    + + + +
    +
    + +

    Status: 400 - An error was encountered when processing the request

    + + + +
    +
    +
    + +
    + +
    +
    + +

    Status: 404 - The specified resource was not found

    + + + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +

    findMenuAppByConfKey

    +

    Finds Menu Applications by configuration key within a Menu Category

    +
    +
    +
    +

    +

    Takes a search pattern to be tested against existing applications within a menu category

    +

    +
    +
    /api/v1/menu/app/{cat}/findByConfKey
    +

    +

    Usage and SDK Samples

    +

    + + +
    +
    +
    curl -X GET "/api/v1/api/v1/menu/app/{cat}/findByConfKey?pattern="
    +
    +
    +
    import io.swagger.client.*;
    +import io.swagger.client.auth.*;
    +import io.swagger.client.model.*;
    +import io.swagger.client.api.MenuappApi;
    +
    +import java.io.File;
    +import java.util.*;
    +
    +public class MenuappApiExample {
    +
    +    public static void main(String[] args) {
    +        
    +        MenuappApi apiInstance = new MenuappApi();
    +        menuCatConfKey cat = ; // menuCatConfKey | Configuration key of Menu Category to work with
    +        String pattern = pattern_example; // String | Search pattern
    +        try {
    +            array[MenuApp] result = apiInstance.findMenuAppByConfKey(cat, pattern);
    +            System.out.println(result);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenuappApi#findMenuAppByConfKey");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    import io.swagger.client.api.MenuappApi;
    +
    +public class MenuappApiExample {
    +
    +    public static void main(String[] args) {
    +        MenuappApi apiInstance = new MenuappApi();
    +        menuCatConfKey cat = ; // menuCatConfKey | Configuration key of Menu Category to work with
    +        String pattern = pattern_example; // String | Search pattern
    +        try {
    +            array[MenuApp] result = apiInstance.findMenuAppByConfKey(cat, pattern);
    +            System.out.println(result);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenuappApi#findMenuAppByConfKey");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    menuCatConfKey *cat = ; // Configuration key of Menu Category to work with
    +String *pattern = pattern_example; // Search pattern
    +
    +MenuappApi *apiInstance = [[MenuappApi alloc] init];
    +
    +// Finds Menu Applications by configuration key within a Menu Category
    +[apiInstance findMenuAppByConfKeyWith:cat
    +    pattern:pattern
    +              completionHandler: ^(array[MenuApp] output, NSError* error) {
    +                            if (output) {
    +                                NSLog(@"%@", output);
    +                            }
    +                            if (error) {
    +                                NSLog(@"Error: %@", error);
    +                            }
    +                        }];
    +
    +
    + +
    +
    var LemonLdapngManagerApi = require('lemon_ldapng_manager_api');
    +
    +var api = new LemonLdapngManagerApi.MenuappApi()
    +var cat = ; // {{menuCatConfKey}} Configuration key of Menu Category to work with
    +var pattern = pattern_example; // {{String}} Search pattern
    +
    +var callback = function(error, data, response) {
    +  if (error) {
    +    console.error(error);
    +  } else {
    +    console.log('API called successfully. Returned data: ' + data);
    +  }
    +};
    +api.findMenuAppByConfKey(cat, pattern, callback);
    +
    +
    + + +
    +
    using System;
    +using System.Diagnostics;
    +using IO.Swagger.Api;
    +using IO.Swagger.Client;
    +using IO.Swagger.Model;
    +
    +namespace Example
    +{
    +    public class findMenuAppByConfKeyExample
    +    {
    +        public void main()
    +        {
    +
    +            var apiInstance = new MenuappApi();
    +            var cat = new menuCatConfKey(); // menuCatConfKey | Configuration key of Menu Category to work with
    +            var pattern = pattern_example;  // String | Search pattern
    +
    +            try
    +            {
    +                // Finds Menu Applications by configuration key within a Menu Category
    +                array[MenuApp] result = apiInstance.findMenuAppByConfKey(cat, pattern);
    +                Debug.WriteLine(result);
    +            }
    +            catch (Exception e)
    +            {
    +                Debug.Print("Exception when calling MenuappApi.findMenuAppByConfKey: " + e.Message );
    +            }
    +        }
    +    }
    +}
    +
    +
    + +
    +
    <?php
    +require_once(__DIR__ . '/vendor/autoload.php');
    +
    +$api_instance = new Swagger\Client\ApiMenuappApi();
    +$cat = ; // menuCatConfKey | Configuration key of Menu Category to work with
    +$pattern = pattern_example; // String | Search pattern
    +
    +try {
    +    $result = $api_instance->findMenuAppByConfKey($cat, $pattern);
    +    print_r($result);
    +} catch (Exception $e) {
    +    echo 'Exception when calling MenuappApi->findMenuAppByConfKey: ', $e->getMessage(), PHP_EOL;
    +}
    +?>
    +
    + +
    +
    use Data::Dumper;
    +use WWW::SwaggerClient::Configuration;
    +use WWW::SwaggerClient::MenuappApi;
    +
    +my $api_instance = WWW::SwaggerClient::MenuappApi->new();
    +my $cat = ; # menuCatConfKey | Configuration key of Menu Category to work with
    +my $pattern = pattern_example; # String | Search pattern
    +
    +eval { 
    +    my $result = $api_instance->findMenuAppByConfKey(cat => $cat, pattern => $pattern);
    +    print Dumper($result);
    +};
    +if ($@) {
    +    warn "Exception when calling MenuappApi->findMenuAppByConfKey: $@\n";
    +}
    +
    + +
    +
    from __future__ import print_statement
    +import time
    +import swagger_client
    +from swagger_client.rest import ApiException
    +from pprint import pprint
    +
    +# create an instance of the API class
    +api_instance = swagger_client.MenuappApi()
    +cat =  # menuCatConfKey | Configuration key of Menu Category to work with
    +pattern = pattern_example # String | Search pattern
    +
    +try: 
    +    # Finds Menu Applications by configuration key within a Menu Category
    +    api_response = api_instance.find_menu_app_by_conf_key(cat, pattern)
    +    pprint(api_response)
    +except ApiException as e:
    +    print("Exception when calling MenuappApi->findMenuAppByConfKey: %s\n" % e)
    +
    +
    + +

    Parameters

    + +
    Path parameters
    + + + + + + + + +
    NameDescription
    cat* + + +
    +
    +
    + + menuCatConfKey + + +
    + Configuration key of Menu Category to work with +
    +
    +
    + Required +
    +
    +
    +
    + + + + +
    Query parameters
    + + + + + + + + +
    NameDescription
    pattern* + + +
    +
    +
    + + String + + +
    + Search pattern +
    +
    +
    + Required +
    +
    +
    +
    + +

    Responses

    +

    Status: 200 - Return a list of Menu Applications

    + + + +
    +
    +
    + +
    + +
    +
    + +

    Status: 400 - An error was encountered when processing the request

    + + + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +

    getMenuAppByConfKey

    +

    Get Menu Application within a Menu Category by configuration key

    +
    +
    +
    +

    +

    Returns a single application

    +

    +
    +
    /api/v1/menu/app/{cat}/{confKey}
    +

    +

    Usage and SDK Samples

    +

    + + +
    +
    +
    curl -X GET "/api/v1/api/v1/menu/app/{cat}/{confKey}"
    +
    +
    +
    import io.swagger.client.*;
    +import io.swagger.client.auth.*;
    +import io.swagger.client.model.*;
    +import io.swagger.client.api.MenuappApi;
    +
    +import java.io.File;
    +import java.util.*;
    +
    +public class MenuappApiExample {
    +
    +    public static void main(String[] args) {
    +        
    +        MenuappApi apiInstance = new MenuappApi();
    +        menuCatConfKey cat = ; // menuCatConfKey | Configuration key of Menu Category to work with
    +        confKey confKey = ; // confKey | Configuration key of Menu Application
    +        try {
    +            MenuApp result = apiInstance.getMenuAppByConfKey(cat, confKey);
    +            System.out.println(result);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenuappApi#getMenuAppByConfKey");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    import io.swagger.client.api.MenuappApi;
    +
    +public class MenuappApiExample {
    +
    +    public static void main(String[] args) {
    +        MenuappApi apiInstance = new MenuappApi();
    +        menuCatConfKey cat = ; // menuCatConfKey | Configuration key of Menu Category to work with
    +        confKey confKey = ; // confKey | Configuration key of Menu Application
    +        try {
    +            MenuApp result = apiInstance.getMenuAppByConfKey(cat, confKey);
    +            System.out.println(result);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenuappApi#getMenuAppByConfKey");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    menuCatConfKey *cat = ; // Configuration key of Menu Category to work with
    +confKey *confKey = ; // Configuration key of Menu Application
    +
    +MenuappApi *apiInstance = [[MenuappApi alloc] init];
    +
    +// Get Menu Application within a Menu Category by configuration key
    +[apiInstance getMenuAppByConfKeyWith:cat
    +    confKey:confKey
    +              completionHandler: ^(MenuApp output, NSError* error) {
    +                            if (output) {
    +                                NSLog(@"%@", output);
    +                            }
    +                            if (error) {
    +                                NSLog(@"Error: %@", error);
    +                            }
    +                        }];
    +
    +
    + +
    +
    var LemonLdapngManagerApi = require('lemon_ldapng_manager_api');
    +
    +var api = new LemonLdapngManagerApi.MenuappApi()
    +var cat = ; // {{menuCatConfKey}} Configuration key of Menu Category to work with
    +var confKey = ; // {{confKey}} Configuration key of Menu Application
    +
    +var callback = function(error, data, response) {
    +  if (error) {
    +    console.error(error);
    +  } else {
    +    console.log('API called successfully. Returned data: ' + data);
    +  }
    +};
    +api.getMenuAppByConfKey(cat, confKey, callback);
    +
    +
    + + +
    +
    using System;
    +using System.Diagnostics;
    +using IO.Swagger.Api;
    +using IO.Swagger.Client;
    +using IO.Swagger.Model;
    +
    +namespace Example
    +{
    +    public class getMenuAppByConfKeyExample
    +    {
    +        public void main()
    +        {
    +
    +            var apiInstance = new MenuappApi();
    +            var cat = new menuCatConfKey(); // menuCatConfKey | Configuration key of Menu Category to work with
    +            var confKey = new confKey(); // confKey | Configuration key of Menu Application
    +
    +            try
    +            {
    +                // Get Menu Application within a Menu Category by configuration key
    +                MenuApp result = apiInstance.getMenuAppByConfKey(cat, confKey);
    +                Debug.WriteLine(result);
    +            }
    +            catch (Exception e)
    +            {
    +                Debug.Print("Exception when calling MenuappApi.getMenuAppByConfKey: " + e.Message );
    +            }
    +        }
    +    }
    +}
    +
    +
    + +
    +
    <?php
    +require_once(__DIR__ . '/vendor/autoload.php');
    +
    +$api_instance = new Swagger\Client\ApiMenuappApi();
    +$cat = ; // menuCatConfKey | Configuration key of Menu Category to work with
    +$confKey = ; // confKey | Configuration key of Menu Application
    +
    +try {
    +    $result = $api_instance->getMenuAppByConfKey($cat, $confKey);
    +    print_r($result);
    +} catch (Exception $e) {
    +    echo 'Exception when calling MenuappApi->getMenuAppByConfKey: ', $e->getMessage(), PHP_EOL;
    +}
    +?>
    +
    + +
    +
    use Data::Dumper;
    +use WWW::SwaggerClient::Configuration;
    +use WWW::SwaggerClient::MenuappApi;
    +
    +my $api_instance = WWW::SwaggerClient::MenuappApi->new();
    +my $cat = ; # menuCatConfKey | Configuration key of Menu Category to work with
    +my $confKey = ; # confKey | Configuration key of Menu Application
    +
    +eval { 
    +    my $result = $api_instance->getMenuAppByConfKey(cat => $cat, confKey => $confKey);
    +    print Dumper($result);
    +};
    +if ($@) {
    +    warn "Exception when calling MenuappApi->getMenuAppByConfKey: $@\n";
    +}
    +
    + +
    +
    from __future__ import print_statement
    +import time
    +import swagger_client
    +from swagger_client.rest import ApiException
    +from pprint import pprint
    +
    +# create an instance of the API class
    +api_instance = swagger_client.MenuappApi()
    +cat =  # menuCatConfKey | Configuration key of Menu Category to work with
    +confKey =  # confKey | Configuration key of Menu Application
    +
    +try: 
    +    # Get Menu Application within a Menu Category by configuration key
    +    api_response = api_instance.get_menu_app_by_conf_key(cat, confKey)
    +    pprint(api_response)
    +except ApiException as e:
    +    print("Exception when calling MenuappApi->getMenuAppByConfKey: %s\n" % e)
    +
    +
    + +

    Parameters

    + +
    Path parameters
    + + + + + + + + + + + +
    NameDescription
    cat* + + +
    +
    +
    + + menuCatConfKey + + +
    + Configuration key of Menu Category to work with +
    +
    +
    + Required +
    +
    +
    +
    confKey* + + +
    +
    +
    + + confKey + + +
    + Configuration key of Menu Application +
    +
    +
    + Required +
    +
    +
    +
    + + + + + +

    Responses

    +

    Status: 200 - Return a Menu Application

    + + + +
    +
    +
    + +
    + +
    +
    + +

    Status: 400 - An error was encountered when processing the request

    + + + +
    +
    +
    + +
    + +
    +
    + +

    Status: 404 - The specified resource was not found

    + + + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +

    getMenuApps

    +

    Get Menu Applications within a Menu Category

    +
    +
    +
    +

    +

    Return existing applications within a menu category

    +

    +
    +
    /api/v1/menu/app/{cat}
    +

    +

    Usage and SDK Samples

    +

    + + +
    +
    +
    curl -X GET "/api/v1/api/v1/menu/app/{cat}"
    +
    +
    +
    import io.swagger.client.*;
    +import io.swagger.client.auth.*;
    +import io.swagger.client.model.*;
    +import io.swagger.client.api.MenuappApi;
    +
    +import java.io.File;
    +import java.util.*;
    +
    +public class MenuappApiExample {
    +
    +    public static void main(String[] args) {
    +        
    +        MenuappApi apiInstance = new MenuappApi();
    +        menuCatConfKey cat = ; // menuCatConfKey | Configuration key of Menu Category to work with
    +        try {
    +            array[MenuApp] result = apiInstance.getMenuApps(cat);
    +            System.out.println(result);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenuappApi#getMenuApps");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    import io.swagger.client.api.MenuappApi;
    +
    +public class MenuappApiExample {
    +
    +    public static void main(String[] args) {
    +        MenuappApi apiInstance = new MenuappApi();
    +        menuCatConfKey cat = ; // menuCatConfKey | Configuration key of Menu Category to work with
    +        try {
    +            array[MenuApp] result = apiInstance.getMenuApps(cat);
    +            System.out.println(result);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenuappApi#getMenuApps");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    menuCatConfKey *cat = ; // Configuration key of Menu Category to work with
    +
    +MenuappApi *apiInstance = [[MenuappApi alloc] init];
    +
    +// Get Menu Applications within a Menu Category
    +[apiInstance getMenuAppsWith:cat
    +              completionHandler: ^(array[MenuApp] output, NSError* error) {
    +                            if (output) {
    +                                NSLog(@"%@", output);
    +                            }
    +                            if (error) {
    +                                NSLog(@"Error: %@", error);
    +                            }
    +                        }];
    +
    +
    + +
    +
    var LemonLdapngManagerApi = require('lemon_ldapng_manager_api');
    +
    +var api = new LemonLdapngManagerApi.MenuappApi()
    +var cat = ; // {{menuCatConfKey}} Configuration key of Menu Category to work with
    +
    +var callback = function(error, data, response) {
    +  if (error) {
    +    console.error(error);
    +  } else {
    +    console.log('API called successfully. Returned data: ' + data);
    +  }
    +};
    +api.getMenuApps(cat, callback);
    +
    +
    + + +
    +
    using System;
    +using System.Diagnostics;
    +using IO.Swagger.Api;
    +using IO.Swagger.Client;
    +using IO.Swagger.Model;
    +
    +namespace Example
    +{
    +    public class getMenuAppsExample
    +    {
    +        public void main()
    +        {
    +
    +            var apiInstance = new MenuappApi();
    +            var cat = new menuCatConfKey(); // menuCatConfKey | Configuration key of Menu Category to work with
    +
    +            try
    +            {
    +                // Get Menu Applications within a Menu Category
    +                array[MenuApp] result = apiInstance.getMenuApps(cat);
    +                Debug.WriteLine(result);
    +            }
    +            catch (Exception e)
    +            {
    +                Debug.Print("Exception when calling MenuappApi.getMenuApps: " + e.Message );
    +            }
    +        }
    +    }
    +}
    +
    +
    + +
    +
    <?php
    +require_once(__DIR__ . '/vendor/autoload.php');
    +
    +$api_instance = new Swagger\Client\ApiMenuappApi();
    +$cat = ; // menuCatConfKey | Configuration key of Menu Category to work with
    +
    +try {
    +    $result = $api_instance->getMenuApps($cat);
    +    print_r($result);
    +} catch (Exception $e) {
    +    echo 'Exception when calling MenuappApi->getMenuApps: ', $e->getMessage(), PHP_EOL;
    +}
    +?>
    +
    + +
    +
    use Data::Dumper;
    +use WWW::SwaggerClient::Configuration;
    +use WWW::SwaggerClient::MenuappApi;
    +
    +my $api_instance = WWW::SwaggerClient::MenuappApi->new();
    +my $cat = ; # menuCatConfKey | Configuration key of Menu Category to work with
    +
    +eval { 
    +    my $result = $api_instance->getMenuApps(cat => $cat);
    +    print Dumper($result);
    +};
    +if ($@) {
    +    warn "Exception when calling MenuappApi->getMenuApps: $@\n";
    +}
    +
    + +
    +
    from __future__ import print_statement
    +import time
    +import swagger_client
    +from swagger_client.rest import ApiException
    +from pprint import pprint
    +
    +# create an instance of the API class
    +api_instance = swagger_client.MenuappApi()
    +cat =  # menuCatConfKey | Configuration key of Menu Category to work with
    +
    +try: 
    +    # Get Menu Applications within a Menu Category
    +    api_response = api_instance.get_menu_apps(cat)
    +    pprint(api_response)
    +except ApiException as e:
    +    print("Exception when calling MenuappApi->getMenuApps: %s\n" % e)
    +
    +
    + +

    Parameters

    + +
    Path parameters
    + + + + + + + + +
    NameDescription
    cat* + + +
    +
    +
    + + menuCatConfKey + + +
    + Configuration key of Menu Category to work with +
    +
    +
    + Required +
    +
    +
    +
    + + + + + +

    Responses

    +

    Status: 200 - Return a list of Menu Applications

    + + + +
    +
    +
    + +
    + +
    +
    + +

    Status: 400 - An error was encountered when processing the request

    + + + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +

    replaceMenuApp

    +

    Replaces a Menu Application

    +
    +
    +
    +

    +

    +

    +
    +
    /api/v1/menu/app/{cat}/{confKey}
    +

    +

    Usage and SDK Samples

    +

    + + +
    +
    +
    curl -X PUT "/api/v1/api/v1/menu/app/{cat}/{confKey}"
    +
    +
    +
    import io.swagger.client.*;
    +import io.swagger.client.auth.*;
    +import io.swagger.client.model.*;
    +import io.swagger.client.api.MenuappApi;
    +
    +import java.io.File;
    +import java.util.*;
    +
    +public class MenuappApiExample {
    +
    +    public static void main(String[] args) {
    +        
    +        MenuappApi apiInstance = new MenuappApi();
    +        menuCatConfKey cat = ; // menuCatConfKey | Configuration key of Menu Category to work with
    +        confKey confKey = ; // confKey | Configuration key of Menu Application that needs to be replaced
    +        MenuApp body = ; // MenuApp | 
    +        try {
    +            apiInstance.replaceMenuApp(cat, confKey, body);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenuappApi#replaceMenuApp");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    import io.swagger.client.api.MenuappApi;
    +
    +public class MenuappApiExample {
    +
    +    public static void main(String[] args) {
    +        MenuappApi apiInstance = new MenuappApi();
    +        menuCatConfKey cat = ; // menuCatConfKey | Configuration key of Menu Category to work with
    +        confKey confKey = ; // confKey | Configuration key of Menu Application that needs to be replaced
    +        MenuApp body = ; // MenuApp | 
    +        try {
    +            apiInstance.replaceMenuApp(cat, confKey, body);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenuappApi#replaceMenuApp");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    menuCatConfKey *cat = ; // Configuration key of Menu Category to work with
    +confKey *confKey = ; // Configuration key of Menu Application that needs to be replaced
    +MenuApp *body = ; //  (optional)
    +
    +MenuappApi *apiInstance = [[MenuappApi alloc] init];
    +
    +// Replaces a Menu Application
    +[apiInstance replaceMenuAppWith:cat
    +    confKey:confKey
    +    body:body
    +              completionHandler: ^(NSError* error) {
    +                            if (error) {
    +                                NSLog(@"Error: %@", error);
    +                            }
    +                        }];
    +
    +
    + +
    +
    var LemonLdapngManagerApi = require('lemon_ldapng_manager_api');
    +
    +var api = new LemonLdapngManagerApi.MenuappApi()
    +var cat = ; // {{menuCatConfKey}} Configuration key of Menu Category to work with
    +var confKey = ; // {{confKey}} Configuration key of Menu Application that needs to be replaced
    +var opts = { 
    +  'body':  // {{MenuApp}} 
    +};
    +var callback = function(error, data, response) {
    +  if (error) {
    +    console.error(error);
    +  } else {
    +    console.log('API called successfully.');
    +  }
    +};
    +api.replaceMenuApp(catconfKey, opts, callback);
    +
    +
    + + +
    +
    using System;
    +using System.Diagnostics;
    +using IO.Swagger.Api;
    +using IO.Swagger.Client;
    +using IO.Swagger.Model;
    +
    +namespace Example
    +{
    +    public class replaceMenuAppExample
    +    {
    +        public void main()
    +        {
    +
    +            var apiInstance = new MenuappApi();
    +            var cat = new menuCatConfKey(); // menuCatConfKey | Configuration key of Menu Category to work with
    +            var confKey = new confKey(); // confKey | Configuration key of Menu Application that needs to be replaced
    +            var body = new MenuApp(); // MenuApp |  (optional) 
    +
    +            try
    +            {
    +                // Replaces a Menu Application
    +                apiInstance.replaceMenuApp(cat, confKey, body);
    +            }
    +            catch (Exception e)
    +            {
    +                Debug.Print("Exception when calling MenuappApi.replaceMenuApp: " + e.Message );
    +            }
    +        }
    +    }
    +}
    +
    +
    + +
    +
    <?php
    +require_once(__DIR__ . '/vendor/autoload.php');
    +
    +$api_instance = new Swagger\Client\ApiMenuappApi();
    +$cat = ; // menuCatConfKey | Configuration key of Menu Category to work with
    +$confKey = ; // confKey | Configuration key of Menu Application that needs to be replaced
    +$body = ; // MenuApp | 
    +
    +try {
    +    $api_instance->replaceMenuApp($cat, $confKey, $body);
    +} catch (Exception $e) {
    +    echo 'Exception when calling MenuappApi->replaceMenuApp: ', $e->getMessage(), PHP_EOL;
    +}
    +?>
    +
    + +
    +
    use Data::Dumper;
    +use WWW::SwaggerClient::Configuration;
    +use WWW::SwaggerClient::MenuappApi;
    +
    +my $api_instance = WWW::SwaggerClient::MenuappApi->new();
    +my $cat = ; # menuCatConfKey | Configuration key of Menu Category to work with
    +my $confKey = ; # confKey | Configuration key of Menu Application that needs to be replaced
    +my $body = WWW::SwaggerClient::Object::MenuApp->new(); # MenuApp | 
    +
    +eval { 
    +    $api_instance->replaceMenuApp(cat => $cat, confKey => $confKey, body => $body);
    +};
    +if ($@) {
    +    warn "Exception when calling MenuappApi->replaceMenuApp: $@\n";
    +}
    +
    + +
    +
    from __future__ import print_statement
    +import time
    +import swagger_client
    +from swagger_client.rest import ApiException
    +from pprint import pprint
    +
    +# create an instance of the API class
    +api_instance = swagger_client.MenuappApi()
    +cat =  # menuCatConfKey | Configuration key of Menu Category to work with
    +confKey =  # confKey | Configuration key of Menu Application that needs to be replaced
    +body =  # MenuApp |  (optional)
    +
    +try: 
    +    # Replaces a Menu Application
    +    api_instance.replace_menu_app(cat, confKey, body=body)
    +except ApiException as e:
    +    print("Exception when calling MenuappApi->replaceMenuApp: %s\n" % e)
    +
    +
    + +

    Parameters

    + +
    Path parameters
    + + + + + + + + + + + +
    NameDescription
    cat* + + +
    +
    +
    + + menuCatConfKey + + +
    + Configuration key of Menu Category to work with +
    +
    +
    + Required +
    +
    +
    +
    confKey* + + +
    +
    +
    + + confKey + + +
    + Configuration key of Menu Application that needs to be replaced +
    +
    +
    + Required +
    +
    +
    +
    + + +
    Body parameters
    + + + + + + + + +
    NameDescription
    body + + + +
    +
    + + + +

    Responses

    +

    Status: 204 - Successful modification

    + + + +
    +
    + +

    Status: 400 - An error was encountered when processing the request

    + + + +
    +
    +
    + +
    + +
    +
    + +

    Status: 404 - The specified resource was not found

    + + + +
    +
    +
    + +
    + +
    +
    + +

    Status: 409 - The specified object could not be created because its configuration key, client_id or entityID already exists

    + + + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +

    updateMenuApp

    +

    Updates a Menu Application

    +
    +
    +
    +

    +

    +

    +
    +
    /api/v1/menu/app/{cat}/{confKey}
    +

    +

    Usage and SDK Samples

    +

    + + +
    +
    +
    curl -X PATCH "/api/v1/api/v1/menu/app/{cat}/{confKey}"
    +
    +
    +
    import io.swagger.client.*;
    +import io.swagger.client.auth.*;
    +import io.swagger.client.model.*;
    +import io.swagger.client.api.MenuappApi;
    +
    +import java.io.File;
    +import java.util.*;
    +
    +public class MenuappApiExample {
    +
    +    public static void main(String[] args) {
    +        
    +        MenuappApi apiInstance = new MenuappApi();
    +        menuCatConfKey cat = ; // menuCatConfKey | Configuration key of Menu Category to work with
    +        confKey confKey = ; // confKey | Configuration key of Menu Application that needs to be updated
    +        MenuAppUpdate body = ; // MenuAppUpdate | 
    +        try {
    +            apiInstance.updateMenuApp(cat, confKey, body);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenuappApi#updateMenuApp");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    import io.swagger.client.api.MenuappApi;
    +
    +public class MenuappApiExample {
    +
    +    public static void main(String[] args) {
    +        MenuappApi apiInstance = new MenuappApi();
    +        menuCatConfKey cat = ; // menuCatConfKey | Configuration key of Menu Category to work with
    +        confKey confKey = ; // confKey | Configuration key of Menu Application that needs to be updated
    +        MenuAppUpdate body = ; // MenuAppUpdate | 
    +        try {
    +            apiInstance.updateMenuApp(cat, confKey, body);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenuappApi#updateMenuApp");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    menuCatConfKey *cat = ; // Configuration key of Menu Category to work with
    +confKey *confKey = ; // Configuration key of Menu Application that needs to be updated
    +MenuAppUpdate *body = ; //  (optional)
    +
    +MenuappApi *apiInstance = [[MenuappApi alloc] init];
    +
    +// Updates a Menu Application
    +[apiInstance updateMenuAppWith:cat
    +    confKey:confKey
    +    body:body
    +              completionHandler: ^(NSError* error) {
    +                            if (error) {
    +                                NSLog(@"Error: %@", error);
    +                            }
    +                        }];
    +
    +
    + +
    +
    var LemonLdapngManagerApi = require('lemon_ldapng_manager_api');
    +
    +var api = new LemonLdapngManagerApi.MenuappApi()
    +var cat = ; // {{menuCatConfKey}} Configuration key of Menu Category to work with
    +var confKey = ; // {{confKey}} Configuration key of Menu Application that needs to be updated
    +var opts = { 
    +  'body':  // {{MenuAppUpdate}} 
    +};
    +var callback = function(error, data, response) {
    +  if (error) {
    +    console.error(error);
    +  } else {
    +    console.log('API called successfully.');
    +  }
    +};
    +api.updateMenuApp(catconfKey, opts, callback);
    +
    +
    + + +
    +
    using System;
    +using System.Diagnostics;
    +using IO.Swagger.Api;
    +using IO.Swagger.Client;
    +using IO.Swagger.Model;
    +
    +namespace Example
    +{
    +    public class updateMenuAppExample
    +    {
    +        public void main()
    +        {
    +
    +            var apiInstance = new MenuappApi();
    +            var cat = new menuCatConfKey(); // menuCatConfKey | Configuration key of Menu Category to work with
    +            var confKey = new confKey(); // confKey | Configuration key of Menu Application that needs to be updated
    +            var body = new MenuAppUpdate(); // MenuAppUpdate |  (optional) 
    +
    +            try
    +            {
    +                // Updates a Menu Application
    +                apiInstance.updateMenuApp(cat, confKey, body);
    +            }
    +            catch (Exception e)
    +            {
    +                Debug.Print("Exception when calling MenuappApi.updateMenuApp: " + e.Message );
    +            }
    +        }
    +    }
    +}
    +
    +
    + +
    +
    <?php
    +require_once(__DIR__ . '/vendor/autoload.php');
    +
    +$api_instance = new Swagger\Client\ApiMenuappApi();
    +$cat = ; // menuCatConfKey | Configuration key of Menu Category to work with
    +$confKey = ; // confKey | Configuration key of Menu Application that needs to be updated
    +$body = ; // MenuAppUpdate | 
    +
    +try {
    +    $api_instance->updateMenuApp($cat, $confKey, $body);
    +} catch (Exception $e) {
    +    echo 'Exception when calling MenuappApi->updateMenuApp: ', $e->getMessage(), PHP_EOL;
    +}
    +?>
    +
    + +
    +
    use Data::Dumper;
    +use WWW::SwaggerClient::Configuration;
    +use WWW::SwaggerClient::MenuappApi;
    +
    +my $api_instance = WWW::SwaggerClient::MenuappApi->new();
    +my $cat = ; # menuCatConfKey | Configuration key of Menu Category to work with
    +my $confKey = ; # confKey | Configuration key of Menu Application that needs to be updated
    +my $body = WWW::SwaggerClient::Object::MenuAppUpdate->new(); # MenuAppUpdate | 
    +
    +eval { 
    +    $api_instance->updateMenuApp(cat => $cat, confKey => $confKey, body => $body);
    +};
    +if ($@) {
    +    warn "Exception when calling MenuappApi->updateMenuApp: $@\n";
    +}
    +
    + +
    +
    from __future__ import print_statement
    +import time
    +import swagger_client
    +from swagger_client.rest import ApiException
    +from pprint import pprint
    +
    +# create an instance of the API class
    +api_instance = swagger_client.MenuappApi()
    +cat =  # menuCatConfKey | Configuration key of Menu Category to work with
    +confKey =  # confKey | Configuration key of Menu Application that needs to be updated
    +body =  # MenuAppUpdate |  (optional)
    +
    +try: 
    +    # Updates a Menu Application
    +    api_instance.update_menu_app(cat, confKey, body=body)
    +except ApiException as e:
    +    print("Exception when calling MenuappApi->updateMenuApp: %s\n" % e)
    +
    +
    + +

    Parameters

    + +
    Path parameters
    + + + + + + + + + + + +
    NameDescription
    cat* + + +
    +
    +
    + + menuCatConfKey + + +
    + Configuration key of Menu Category to work with +
    +
    +
    + Required +
    +
    +
    +
    confKey* + + +
    +
    +
    + + confKey + + +
    + Configuration key of Menu Application that needs to be updated +
    +
    +
    + Required +
    +
    +
    +
    + + +
    Body parameters
    + + + + + + + + +
    NameDescription
    body + + + +
    +
    + + + +

    Responses

    +

    Status: 204 - Successful modification

    + + + +
    +
    + +

    Status: 400 - An error was encountered when processing the request

    + + + +
    +
    +
    + +
    + +
    +
    + +

    Status: 404 - The specified resource was not found

    + + + +
    +
    +
    + +
    + +
    +
    + +

    Status: 409 - The specified object could not be created because its configuration key, client_id or entityID already exists

    + + + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +

    Menucat

    +
    +
    +
    +

    addMenuCat

    +

    Create a new Menu Category

    +
    +
    +
    +

    +

    +

    +
    +
    /api/v1/menu/cat
    +

    +

    Usage and SDK Samples

    +

    + + +
    +
    +
    curl -X POST "/api/v1/api/v1/menu/cat"
    +
    +
    +
    import io.swagger.client.*;
    +import io.swagger.client.auth.*;
    +import io.swagger.client.model.*;
    +import io.swagger.client.api.MenucatApi;
    +
    +import java.io.File;
    +import java.util.*;
    +
    +public class MenucatApiExample {
    +
    +    public static void main(String[] args) {
    +        
    +        MenucatApi apiInstance = new MenucatApi();
    +        MenuCat body = ; // MenuCat | Menu Category to add
    +        try {
    +            apiInstance.addMenuCat(body);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenucatApi#addMenuCat");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    import io.swagger.client.api.MenucatApi;
    +
    +public class MenucatApiExample {
    +
    +    public static void main(String[] args) {
    +        MenucatApi apiInstance = new MenucatApi();
    +        MenuCat body = ; // MenuCat | Menu Category to add
    +        try {
    +            apiInstance.addMenuCat(body);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenucatApi#addMenuCat");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    MenuCat *body = ; // Menu Category to add
    +
    +MenucatApi *apiInstance = [[MenucatApi alloc] init];
    +
    +// Create a new Menu Category
    +[apiInstance addMenuCatWith:body
    +              completionHandler: ^(NSError* error) {
    +                            if (error) {
    +                                NSLog(@"Error: %@", error);
    +                            }
    +                        }];
    +
    +
    + +
    +
    var LemonLdapngManagerApi = require('lemon_ldapng_manager_api');
    +
    +var api = new LemonLdapngManagerApi.MenucatApi()
    +var body = ; // {{MenuCat}} Menu Category to add
    +
    +var callback = function(error, data, response) {
    +  if (error) {
    +    console.error(error);
    +  } else {
    +    console.log('API called successfully.');
    +  }
    +};
    +api.addMenuCat(body, callback);
    +
    +
    + + +
    +
    using System;
    +using System.Diagnostics;
    +using IO.Swagger.Api;
    +using IO.Swagger.Client;
    +using IO.Swagger.Model;
    +
    +namespace Example
    +{
    +    public class addMenuCatExample
    +    {
    +        public void main()
    +        {
    +
    +            var apiInstance = new MenucatApi();
    +            var body = new MenuCat(); // MenuCat | Menu Category to add
    +
    +            try
    +            {
    +                // Create a new Menu Category
    +                apiInstance.addMenuCat(body);
    +            }
    +            catch (Exception e)
    +            {
    +                Debug.Print("Exception when calling MenucatApi.addMenuCat: " + e.Message );
    +            }
    +        }
    +    }
    +}
    +
    +
    + +
    +
    <?php
    +require_once(__DIR__ . '/vendor/autoload.php');
    +
    +$api_instance = new Swagger\Client\ApiMenucatApi();
    +$body = ; // MenuCat | Menu Category to add
    +
    +try {
    +    $api_instance->addMenuCat($body);
    +} catch (Exception $e) {
    +    echo 'Exception when calling MenucatApi->addMenuCat: ', $e->getMessage(), PHP_EOL;
    +}
    +?>
    +
    + +
    +
    use Data::Dumper;
    +use WWW::SwaggerClient::Configuration;
    +use WWW::SwaggerClient::MenucatApi;
    +
    +my $api_instance = WWW::SwaggerClient::MenucatApi->new();
    +my $body = WWW::SwaggerClient::Object::MenuCat->new(); # MenuCat | Menu Category to add
    +
    +eval { 
    +    $api_instance->addMenuCat(body => $body);
    +};
    +if ($@) {
    +    warn "Exception when calling MenucatApi->addMenuCat: $@\n";
    +}
    +
    + +
    +
    from __future__ import print_statement
    +import time
    +import swagger_client
    +from swagger_client.rest import ApiException
    +from pprint import pprint
    +
    +# create an instance of the API class
    +api_instance = swagger_client.MenucatApi()
    +body =  # MenuCat | Menu Category to add
    +
    +try: 
    +    # Create a new Menu Category
    +    api_instance.add_menu_cat(body)
    +except ApiException as e:
    +    print("Exception when calling MenucatApi->addMenuCat: %s\n" % e)
    +
    +
    + +

    Parameters

    + + + +
    Body parameters
    + + + + + + + + +
    NameDescription
    body * + + + +
    +
    + + + +

    Responses

    +

    Status: 201 - Successful creation

    + + + +
    +
    + +

    Status: 400 - An error was encountered when processing the request

    + + + +
    +
    +
    + +
    + +
    +
    + +

    Status: 409 - The specified object could not be created because its configuration key, client_id or entityID already exists

    + + + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +

    deleteMenuCat

    +

    Deletes a Menu Category

    +
    +
    +
    +

    +

    +

    +
    +
    /api/v1/menu/cat/{confKey}
    +

    +

    Usage and SDK Samples

    +

    + + +
    +
    +
    curl -X DELETE "/api/v1/api/v1/menu/cat/{confKey}"
    +
    +
    +
    import io.swagger.client.*;
    +import io.swagger.client.auth.*;
    +import io.swagger.client.model.*;
    +import io.swagger.client.api.MenucatApi;
    +
    +import java.io.File;
    +import java.util.*;
    +
    +public class MenucatApiExample {
    +
    +    public static void main(String[] args) {
    +        
    +        MenucatApi apiInstance = new MenucatApi();
    +        confKey confKey = ; // confKey | Configuration key of Menu Category to delete
    +        try {
    +            apiInstance.deleteMenuCat(confKey);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenucatApi#deleteMenuCat");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    import io.swagger.client.api.MenucatApi;
    +
    +public class MenucatApiExample {
    +
    +    public static void main(String[] args) {
    +        MenucatApi apiInstance = new MenucatApi();
    +        confKey confKey = ; // confKey | Configuration key of Menu Category to delete
    +        try {
    +            apiInstance.deleteMenuCat(confKey);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenucatApi#deleteMenuCat");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    confKey *confKey = ; // Configuration key of Menu Category to delete
    +
    +MenucatApi *apiInstance = [[MenucatApi alloc] init];
    +
    +// Deletes a Menu Category
    +[apiInstance deleteMenuCatWith:confKey
    +              completionHandler: ^(NSError* error) {
    +                            if (error) {
    +                                NSLog(@"Error: %@", error);
    +                            }
    +                        }];
    +
    +
    + +
    +
    var LemonLdapngManagerApi = require('lemon_ldapng_manager_api');
    +
    +var api = new LemonLdapngManagerApi.MenucatApi()
    +var confKey = ; // {{confKey}} Configuration key of Menu Category to delete
    +
    +var callback = function(error, data, response) {
    +  if (error) {
    +    console.error(error);
    +  } else {
    +    console.log('API called successfully.');
    +  }
    +};
    +api.deleteMenuCat(confKey, callback);
    +
    +
    + + +
    +
    using System;
    +using System.Diagnostics;
    +using IO.Swagger.Api;
    +using IO.Swagger.Client;
    +using IO.Swagger.Model;
    +
    +namespace Example
    +{
    +    public class deleteMenuCatExample
    +    {
    +        public void main()
    +        {
    +
    +            var apiInstance = new MenucatApi();
    +            var confKey = new confKey(); // confKey | Configuration key of Menu Category to delete
    +
    +            try
    +            {
    +                // Deletes a Menu Category
    +                apiInstance.deleteMenuCat(confKey);
    +            }
    +            catch (Exception e)
    +            {
    +                Debug.Print("Exception when calling MenucatApi.deleteMenuCat: " + e.Message );
    +            }
    +        }
    +    }
    +}
    +
    +
    + +
    +
    <?php
    +require_once(__DIR__ . '/vendor/autoload.php');
    +
    +$api_instance = new Swagger\Client\ApiMenucatApi();
    +$confKey = ; // confKey | Configuration key of Menu Category to delete
    +
    +try {
    +    $api_instance->deleteMenuCat($confKey);
    +} catch (Exception $e) {
    +    echo 'Exception when calling MenucatApi->deleteMenuCat: ', $e->getMessage(), PHP_EOL;
    +}
    +?>
    +
    + +
    +
    use Data::Dumper;
    +use WWW::SwaggerClient::Configuration;
    +use WWW::SwaggerClient::MenucatApi;
    +
    +my $api_instance = WWW::SwaggerClient::MenucatApi->new();
    +my $confKey = ; # confKey | Configuration key of Menu Category to delete
    +
    +eval { 
    +    $api_instance->deleteMenuCat(confKey => $confKey);
    +};
    +if ($@) {
    +    warn "Exception when calling MenucatApi->deleteMenuCat: $@\n";
    +}
    +
    + +
    +
    from __future__ import print_statement
    +import time
    +import swagger_client
    +from swagger_client.rest import ApiException
    +from pprint import pprint
    +
    +# create an instance of the API class
    +api_instance = swagger_client.MenucatApi()
    +confKey =  # confKey | Configuration key of Menu Category to delete
    +
    +try: 
    +    # Deletes a Menu Category
    +    api_instance.delete_menu_cat(confKey)
    +except ApiException as e:
    +    print("Exception when calling MenucatApi->deleteMenuCat: %s\n" % e)
    +
    +
    + +

    Parameters

    + +
    Path parameters
    + + + + + + + + +
    NameDescription
    confKey* + + +
    +
    +
    + + confKey + + +
    + Configuration key of Menu Category to delete +
    +
    +
    + Required +
    +
    +
    +
    + + + + + +

    Responses

    +

    Status: 204 - Successful modification

    + + + +
    +
    + +

    Status: 400 - An error was encountered when processing the request

    + + + +
    +
    +
    + +
    + +
    +
    + +

    Status: 404 - The specified resource was not found

    + + + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +

    findMenuCatByConfKey

    +

    Finds Menu Categories by configuration key

    +
    +
    +
    +

    +

    Takes a search pattern to be tested against existing categories

    +

    +
    +
    /api/v1/menu/cat/findByConfKey
    +

    +

    Usage and SDK Samples

    +

    + + +
    +
    +
    curl -X GET "/api/v1/api/v1/menu/cat/findByConfKey?pattern="
    +
    +
    +
    import io.swagger.client.*;
    +import io.swagger.client.auth.*;
    +import io.swagger.client.model.*;
    +import io.swagger.client.api.MenucatApi;
    +
    +import java.io.File;
    +import java.util.*;
    +
    +public class MenucatApiExample {
    +
    +    public static void main(String[] args) {
    +        
    +        MenucatApi apiInstance = new MenucatApi();
    +        String pattern = pattern_example; // String | Search pattern
    +        try {
    +            array[MenuCat] result = apiInstance.findMenuCatByConfKey(pattern);
    +            System.out.println(result);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenucatApi#findMenuCatByConfKey");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    import io.swagger.client.api.MenucatApi;
    +
    +public class MenucatApiExample {
    +
    +    public static void main(String[] args) {
    +        MenucatApi apiInstance = new MenucatApi();
    +        String pattern = pattern_example; // String | Search pattern
    +        try {
    +            array[MenuCat] result = apiInstance.findMenuCatByConfKey(pattern);
    +            System.out.println(result);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenucatApi#findMenuCatByConfKey");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    String *pattern = pattern_example; // Search pattern
    +
    +MenucatApi *apiInstance = [[MenucatApi alloc] init];
    +
    +// Finds Menu Categories by configuration key
    +[apiInstance findMenuCatByConfKeyWith:pattern
    +              completionHandler: ^(array[MenuCat] output, NSError* error) {
    +                            if (output) {
    +                                NSLog(@"%@", output);
    +                            }
    +                            if (error) {
    +                                NSLog(@"Error: %@", error);
    +                            }
    +                        }];
    +
    +
    + +
    +
    var LemonLdapngManagerApi = require('lemon_ldapng_manager_api');
    +
    +var api = new LemonLdapngManagerApi.MenucatApi()
    +var pattern = pattern_example; // {{String}} Search pattern
    +
    +var callback = function(error, data, response) {
    +  if (error) {
    +    console.error(error);
    +  } else {
    +    console.log('API called successfully. Returned data: ' + data);
    +  }
    +};
    +api.findMenuCatByConfKey(pattern, callback);
    +
    +
    + + +
    +
    using System;
    +using System.Diagnostics;
    +using IO.Swagger.Api;
    +using IO.Swagger.Client;
    +using IO.Swagger.Model;
    +
    +namespace Example
    +{
    +    public class findMenuCatByConfKeyExample
    +    {
    +        public void main()
    +        {
    +
    +            var apiInstance = new MenucatApi();
    +            var pattern = pattern_example;  // String | Search pattern
    +
    +            try
    +            {
    +                // Finds Menu Categories by configuration key
    +                array[MenuCat] result = apiInstance.findMenuCatByConfKey(pattern);
    +                Debug.WriteLine(result);
    +            }
    +            catch (Exception e)
    +            {
    +                Debug.Print("Exception when calling MenucatApi.findMenuCatByConfKey: " + e.Message );
    +            }
    +        }
    +    }
    +}
    +
    +
    + +
    +
    <?php
    +require_once(__DIR__ . '/vendor/autoload.php');
    +
    +$api_instance = new Swagger\Client\ApiMenucatApi();
    +$pattern = pattern_example; // String | Search pattern
    +
    +try {
    +    $result = $api_instance->findMenuCatByConfKey($pattern);
    +    print_r($result);
    +} catch (Exception $e) {
    +    echo 'Exception when calling MenucatApi->findMenuCatByConfKey: ', $e->getMessage(), PHP_EOL;
    +}
    +?>
    +
    + +
    +
    use Data::Dumper;
    +use WWW::SwaggerClient::Configuration;
    +use WWW::SwaggerClient::MenucatApi;
    +
    +my $api_instance = WWW::SwaggerClient::MenucatApi->new();
    +my $pattern = pattern_example; # String | Search pattern
    +
    +eval { 
    +    my $result = $api_instance->findMenuCatByConfKey(pattern => $pattern);
    +    print Dumper($result);
    +};
    +if ($@) {
    +    warn "Exception when calling MenucatApi->findMenuCatByConfKey: $@\n";
    +}
    +
    + +
    +
    from __future__ import print_statement
    +import time
    +import swagger_client
    +from swagger_client.rest import ApiException
    +from pprint import pprint
    +
    +# create an instance of the API class
    +api_instance = swagger_client.MenucatApi()
    +pattern = pattern_example # String | Search pattern
    +
    +try: 
    +    # Finds Menu Categories by configuration key
    +    api_response = api_instance.find_menu_cat_by_conf_key(pattern)
    +    pprint(api_response)
    +except ApiException as e:
    +    print("Exception when calling MenucatApi->findMenuCatByConfKey: %s\n" % e)
    +
    +
    + +

    Parameters

    + + + + + +
    Query parameters
    + + + + + + + + +
    NameDescription
    pattern* + + +
    +
    +
    + + String + + +
    + Search pattern +
    +
    +
    + Required +
    +
    +
    +
    + +

    Responses

    +

    Status: 200 - Return a list of Menu Categories

    + + + +
    +
    +
    + +
    + +
    +
    + +

    Status: 400 - An error was encountered when processing the request

    + + + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +

    getMenuCatByConfKey

    +

    Get Menu Category by configuration key

    +
    +
    +
    +

    +

    Returns a single Category

    +

    +
    +
    /api/v1/menu/cat/{confKey}
    +

    +

    Usage and SDK Samples

    +

    + + +
    +
    +
    curl -X GET "/api/v1/api/v1/menu/cat/{confKey}"
    +
    +
    +
    import io.swagger.client.*;
    +import io.swagger.client.auth.*;
    +import io.swagger.client.model.*;
    +import io.swagger.client.api.MenucatApi;
    +
    +import java.io.File;
    +import java.util.*;
    +
    +public class MenucatApiExample {
    +
    +    public static void main(String[] args) {
    +        
    +        MenucatApi apiInstance = new MenucatApi();
    +        confKey confKey = ; // confKey | Configuration key of Menu Category
    +        try {
    +            MenuCat result = apiInstance.getMenuCatByConfKey(confKey);
    +            System.out.println(result);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenucatApi#getMenuCatByConfKey");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    import io.swagger.client.api.MenucatApi;
    +
    +public class MenucatApiExample {
    +
    +    public static void main(String[] args) {
    +        MenucatApi apiInstance = new MenucatApi();
    +        confKey confKey = ; // confKey | Configuration key of Menu Category
    +        try {
    +            MenuCat result = apiInstance.getMenuCatByConfKey(confKey);
    +            System.out.println(result);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenucatApi#getMenuCatByConfKey");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    confKey *confKey = ; // Configuration key of Menu Category
    +
    +MenucatApi *apiInstance = [[MenucatApi alloc] init];
    +
    +// Get Menu Category by configuration key
    +[apiInstance getMenuCatByConfKeyWith:confKey
    +              completionHandler: ^(MenuCat output, NSError* error) {
    +                            if (output) {
    +                                NSLog(@"%@", output);
    +                            }
    +                            if (error) {
    +                                NSLog(@"Error: %@", error);
    +                            }
    +                        }];
    +
    +
    + +
    +
    var LemonLdapngManagerApi = require('lemon_ldapng_manager_api');
    +
    +var api = new LemonLdapngManagerApi.MenucatApi()
    +var confKey = ; // {{confKey}} Configuration key of Menu Category
    +
    +var callback = function(error, data, response) {
    +  if (error) {
    +    console.error(error);
    +  } else {
    +    console.log('API called successfully. Returned data: ' + data);
    +  }
    +};
    +api.getMenuCatByConfKey(confKey, callback);
    +
    +
    + + +
    +
    using System;
    +using System.Diagnostics;
    +using IO.Swagger.Api;
    +using IO.Swagger.Client;
    +using IO.Swagger.Model;
    +
    +namespace Example
    +{
    +    public class getMenuCatByConfKeyExample
    +    {
    +        public void main()
    +        {
    +
    +            var apiInstance = new MenucatApi();
    +            var confKey = new confKey(); // confKey | Configuration key of Menu Category
    +
    +            try
    +            {
    +                // Get Menu Category by configuration key
    +                MenuCat result = apiInstance.getMenuCatByConfKey(confKey);
    +                Debug.WriteLine(result);
    +            }
    +            catch (Exception e)
    +            {
    +                Debug.Print("Exception when calling MenucatApi.getMenuCatByConfKey: " + e.Message );
    +            }
    +        }
    +    }
    +}
    +
    +
    + +
    +
    <?php
    +require_once(__DIR__ . '/vendor/autoload.php');
    +
    +$api_instance = new Swagger\Client\ApiMenucatApi();
    +$confKey = ; // confKey | Configuration key of Menu Category
    +
    +try {
    +    $result = $api_instance->getMenuCatByConfKey($confKey);
    +    print_r($result);
    +} catch (Exception $e) {
    +    echo 'Exception when calling MenucatApi->getMenuCatByConfKey: ', $e->getMessage(), PHP_EOL;
    +}
    +?>
    +
    + +
    +
    use Data::Dumper;
    +use WWW::SwaggerClient::Configuration;
    +use WWW::SwaggerClient::MenucatApi;
    +
    +my $api_instance = WWW::SwaggerClient::MenucatApi->new();
    +my $confKey = ; # confKey | Configuration key of Menu Category
    +
    +eval { 
    +    my $result = $api_instance->getMenuCatByConfKey(confKey => $confKey);
    +    print Dumper($result);
    +};
    +if ($@) {
    +    warn "Exception when calling MenucatApi->getMenuCatByConfKey: $@\n";
    +}
    +
    + +
    +
    from __future__ import print_statement
    +import time
    +import swagger_client
    +from swagger_client.rest import ApiException
    +from pprint import pprint
    +
    +# create an instance of the API class
    +api_instance = swagger_client.MenucatApi()
    +confKey =  # confKey | Configuration key of Menu Category
    +
    +try: 
    +    # Get Menu Category by configuration key
    +    api_response = api_instance.get_menu_cat_by_conf_key(confKey)
    +    pprint(api_response)
    +except ApiException as e:
    +    print("Exception when calling MenucatApi->getMenuCatByConfKey: %s\n" % e)
    +
    +
    + +

    Parameters

    + +
    Path parameters
    + + + + + + + + +
    NameDescription
    confKey* + + +
    +
    +
    + + confKey + + +
    + Configuration key of Menu Category +
    +
    +
    + Required +
    +
    +
    +
    + + + + + +

    Responses

    +

    Status: 200 - Return a Menu Category

    + + + +
    +
    +
    + +
    + +
    +
    + +

    Status: 400 - An error was encountered when processing the request

    + + + +
    +
    +
    + +
    + +
    +
    + +

    Status: 404 - The specified resource was not found

    + + + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +

    replaceMenuCat

    +

    Replaces a Menu Category

    +
    +
    +
    +

    +

    +

    +
    +
    /api/v1/menu/cat/{confKey}
    +

    +

    Usage and SDK Samples

    +

    + + +
    +
    +
    curl -X PUT "/api/v1/api/v1/menu/cat/{confKey}"
    +
    +
    +
    import io.swagger.client.*;
    +import io.swagger.client.auth.*;
    +import io.swagger.client.model.*;
    +import io.swagger.client.api.MenucatApi;
    +
    +import java.io.File;
    +import java.util.*;
    +
    +public class MenucatApiExample {
    +
    +    public static void main(String[] args) {
    +        
    +        MenucatApi apiInstance = new MenucatApi();
    +        confKey confKey = ; // confKey | Configuration key of Menu Category that needs to be replaced
    +        MenuCat body = ; // MenuCat | 
    +        try {
    +            apiInstance.replaceMenuCat(confKey, body);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenucatApi#replaceMenuCat");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    import io.swagger.client.api.MenucatApi;
    +
    +public class MenucatApiExample {
    +
    +    public static void main(String[] args) {
    +        MenucatApi apiInstance = new MenucatApi();
    +        confKey confKey = ; // confKey | Configuration key of Menu Category that needs to be replaced
    +        MenuCat body = ; // MenuCat | 
    +        try {
    +            apiInstance.replaceMenuCat(confKey, body);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenucatApi#replaceMenuCat");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    confKey *confKey = ; // Configuration key of Menu Category that needs to be replaced
    +MenuCat *body = ; //  (optional)
    +
    +MenucatApi *apiInstance = [[MenucatApi alloc] init];
    +
    +// Replaces a Menu Category
    +[apiInstance replaceMenuCatWith:confKey
    +    body:body
    +              completionHandler: ^(NSError* error) {
    +                            if (error) {
    +                                NSLog(@"Error: %@", error);
    +                            }
    +                        }];
    +
    +
    + +
    +
    var LemonLdapngManagerApi = require('lemon_ldapng_manager_api');
    +
    +var api = new LemonLdapngManagerApi.MenucatApi()
    +var confKey = ; // {{confKey}} Configuration key of Menu Category that needs to be replaced
    +var opts = { 
    +  'body':  // {{MenuCat}} 
    +};
    +var callback = function(error, data, response) {
    +  if (error) {
    +    console.error(error);
    +  } else {
    +    console.log('API called successfully.');
    +  }
    +};
    +api.replaceMenuCat(confKey, opts, callback);
    +
    +
    + + +
    +
    using System;
    +using System.Diagnostics;
    +using IO.Swagger.Api;
    +using IO.Swagger.Client;
    +using IO.Swagger.Model;
    +
    +namespace Example
    +{
    +    public class replaceMenuCatExample
    +    {
    +        public void main()
    +        {
    +
    +            var apiInstance = new MenucatApi();
    +            var confKey = new confKey(); // confKey | Configuration key of Menu Category that needs to be replaced
    +            var body = new MenuCat(); // MenuCat |  (optional) 
    +
    +            try
    +            {
    +                // Replaces a Menu Category
    +                apiInstance.replaceMenuCat(confKey, body);
    +            }
    +            catch (Exception e)
    +            {
    +                Debug.Print("Exception when calling MenucatApi.replaceMenuCat: " + e.Message );
    +            }
    +        }
    +    }
    +}
    +
    +
    + +
    +
    <?php
    +require_once(__DIR__ . '/vendor/autoload.php');
    +
    +$api_instance = new Swagger\Client\ApiMenucatApi();
    +$confKey = ; // confKey | Configuration key of Menu Category that needs to be replaced
    +$body = ; // MenuCat | 
    +
    +try {
    +    $api_instance->replaceMenuCat($confKey, $body);
    +} catch (Exception $e) {
    +    echo 'Exception when calling MenucatApi->replaceMenuCat: ', $e->getMessage(), PHP_EOL;
    +}
    +?>
    +
    + +
    +
    use Data::Dumper;
    +use WWW::SwaggerClient::Configuration;
    +use WWW::SwaggerClient::MenucatApi;
    +
    +my $api_instance = WWW::SwaggerClient::MenucatApi->new();
    +my $confKey = ; # confKey | Configuration key of Menu Category that needs to be replaced
    +my $body = WWW::SwaggerClient::Object::MenuCat->new(); # MenuCat | 
    +
    +eval { 
    +    $api_instance->replaceMenuCat(confKey => $confKey, body => $body);
    +};
    +if ($@) {
    +    warn "Exception when calling MenucatApi->replaceMenuCat: $@\n";
    +}
    +
    + +
    +
    from __future__ import print_statement
    +import time
    +import swagger_client
    +from swagger_client.rest import ApiException
    +from pprint import pprint
    +
    +# create an instance of the API class
    +api_instance = swagger_client.MenucatApi()
    +confKey =  # confKey | Configuration key of Menu Category that needs to be replaced
    +body =  # MenuCat |  (optional)
    +
    +try: 
    +    # Replaces a Menu Category
    +    api_instance.replace_menu_cat(confKey, body=body)
    +except ApiException as e:
    +    print("Exception when calling MenucatApi->replaceMenuCat: %s\n" % e)
    +
    +
    + +

    Parameters

    + +
    Path parameters
    + + + + + + + + +
    NameDescription
    confKey* + + +
    +
    +
    + + confKey + + +
    + Configuration key of Menu Category that needs to be replaced +
    +
    +
    + Required +
    +
    +
    +
    + + +
    Body parameters
    + + + + + + + + +
    NameDescription
    body + + + +
    +
    + + + +

    Responses

    +

    Status: 204 - Successful modification

    + + + +
    +
    + +

    Status: 400 - An error was encountered when processing the request

    + + + +
    +
    +
    + +
    + +
    +
    + +

    Status: 404 - The specified resource was not found

    + + + +
    +
    +
    + +
    + +
    +
    + +

    Status: 409 - The specified object could not be created because its configuration key, client_id or entityID already exists

    + + + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +

    updateMenuCat

    +

    Updates a Menu Category

    +
    +
    +
    +

    +

    +

    +
    +
    /api/v1/menu/cat/{confKey}
    +

    +

    Usage and SDK Samples

    +

    + + +
    +
    +
    curl -X PATCH "/api/v1/api/v1/menu/cat/{confKey}"
    +
    +
    +
    import io.swagger.client.*;
    +import io.swagger.client.auth.*;
    +import io.swagger.client.model.*;
    +import io.swagger.client.api.MenucatApi;
    +
    +import java.io.File;
    +import java.util.*;
    +
    +public class MenucatApiExample {
    +
    +    public static void main(String[] args) {
    +        
    +        MenucatApi apiInstance = new MenucatApi();
    +        confKey confKey = ; // confKey | Configuration key of Menu Category that needs to be updated
    +        MenuCatUpdate body = ; // MenuCatUpdate | 
    +        try {
    +            apiInstance.updateMenuCat(confKey, body);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenucatApi#updateMenuCat");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    import io.swagger.client.api.MenucatApi;
    +
    +public class MenucatApiExample {
    +
    +    public static void main(String[] args) {
    +        MenucatApi apiInstance = new MenucatApi();
    +        confKey confKey = ; // confKey | Configuration key of Menu Category that needs to be updated
    +        MenuCatUpdate body = ; // MenuCatUpdate | 
    +        try {
    +            apiInstance.updateMenuCat(confKey, body);
    +        } catch (ApiException e) {
    +            System.err.println("Exception when calling MenucatApi#updateMenuCat");
    +            e.printStackTrace();
    +        }
    +    }
    +}
    +
    + +
    +
    confKey *confKey = ; // Configuration key of Menu Category that needs to be updated
    +MenuCatUpdate *body = ; //  (optional)
    +
    +MenucatApi *apiInstance = [[MenucatApi alloc] init];
    +
    +// Updates a Menu Category
    +[apiInstance updateMenuCatWith:confKey
    +    body:body
    +              completionHandler: ^(NSError* error) {
    +                            if (error) {
    +                                NSLog(@"Error: %@", error);
    +                            }
    +                        }];
    +
    +
    + +
    +
    var LemonLdapngManagerApi = require('lemon_ldapng_manager_api');
    +
    +var api = new LemonLdapngManagerApi.MenucatApi()
    +var confKey = ; // {{confKey}} Configuration key of Menu Category that needs to be updated
    +var opts = { 
    +  'body':  // {{MenuCatUpdate}} 
    +};
    +var callback = function(error, data, response) {
    +  if (error) {
    +    console.error(error);
    +  } else {
    +    console.log('API called successfully.');
    +  }
    +};
    +api.updateMenuCat(confKey, opts, callback);
    +
    +
    + + +
    +
    using System;
    +using System.Diagnostics;
    +using IO.Swagger.Api;
    +using IO.Swagger.Client;
    +using IO.Swagger.Model;
    +
    +namespace Example
    +{
    +    public class updateMenuCatExample
    +    {
    +        public void main()
    +        {
    +
    +            var apiInstance = new MenucatApi();
    +            var confKey = new confKey(); // confKey | Configuration key of Menu Category that needs to be updated
    +            var body = new MenuCatUpdate(); // MenuCatUpdate |  (optional) 
    +
    +            try
    +            {
    +                // Updates a Menu Category
    +                apiInstance.updateMenuCat(confKey, body);
    +            }
    +            catch (Exception e)
    +            {
    +                Debug.Print("Exception when calling MenucatApi.updateMenuCat: " + e.Message );
    +            }
    +        }
    +    }
    +}
    +
    +
    + +
    +
    <?php
    +require_once(__DIR__ . '/vendor/autoload.php');
    +
    +$api_instance = new Swagger\Client\ApiMenucatApi();
    +$confKey = ; // confKey | Configuration key of Menu Category that needs to be updated
    +$body = ; // MenuCatUpdate | 
    +
    +try {
    +    $api_instance->updateMenuCat($confKey, $body);
    +} catch (Exception $e) {
    +    echo 'Exception when calling MenucatApi->updateMenuCat: ', $e->getMessage(), PHP_EOL;
    +}
    +?>
    +
    + +
    +
    use Data::Dumper;
    +use WWW::SwaggerClient::Configuration;
    +use WWW::SwaggerClient::MenucatApi;
    +
    +my $api_instance = WWW::SwaggerClient::MenucatApi->new();
    +my $confKey = ; # confKey | Configuration key of Menu Category that needs to be updated
    +my $body = WWW::SwaggerClient::Object::MenuCatUpdate->new(); # MenuCatUpdate | 
    +
    +eval { 
    +    $api_instance->updateMenuCat(confKey => $confKey, body => $body);
    +};
    +if ($@) {
    +    warn "Exception when calling MenucatApi->updateMenuCat: $@\n";
    +}
    +
    + +
    +
    from __future__ import print_statement
    +import time
    +import swagger_client
    +from swagger_client.rest import ApiException
    +from pprint import pprint
    +
    +# create an instance of the API class
    +api_instance = swagger_client.MenucatApi()
    +confKey =  # confKey | Configuration key of Menu Category that needs to be updated
    +body =  # MenuCatUpdate |  (optional)
    +
    +try: 
    +    # Updates a Menu Category
    +    api_instance.update_menu_cat(confKey, body=body)
    +except ApiException as e:
    +    print("Exception when calling MenucatApi->updateMenuCat: %s\n" % e)
    +
    +
    + +

    Parameters

    + +
    Path parameters
    + + + + + + + + +
    NameDescription
    confKey* + + +
    +
    +
    + + confKey + + +
    + Configuration key of Menu Category that needs to be updated +
    +
    +
    + Required +
    +
    +
    +
    + + +
    Body parameters
    + + + + + + + + +
    NameDescription
    body + + + +
    +
    + + + +

    Responses

    +

    Status: 204 - Successful modification

    + + + +
    +
    + +

    Status: 400 - An error was encountered when processing the request

    + + + +
    +
    +
    + +
    + +
    +
    + +

    Status: 404 - The specified resource was not found

    + + + +
    +
    +
    + +
    + +
    +
    + +

    Status: 409 - The specified object could not be created because its configuration key, client_id or entityID already exists

    + + + +
    +
    +
    + +
    + +
    +
    + +
    +
    +
    +

    Oidcrp

    diff --git a/doc/sources/admin/logs.rst b/doc/sources/admin/logs.rst index a9d8d72ac2247f9c4aa1fa0eda4bc9c73a2ae367..39071e6a6cf62098ee7289377e2c409795478295 100644 --- a/doc/sources/admin/logs.rst +++ b/doc/sources/admin/logs.rst @@ -71,19 +71,37 @@ Logout: [notice] User clement.oudot has been disconnected from LDAP (81.20.13.21) -Access to an SAML SP: +Access to a CAS application non registered in configuration (when CAS server is open): :: - [notice] User clement.oudot is authorized to access to sp-example-entityid - [notice] SAML authentication response sent to SAML SP sp-example for clement.oudot + [notice] User clement.oudot is redirected to https://cas.service.url -Access to an OIDC RP: +Access to a CAS application whose configuration key is ``app-example``: + +:: + + [notice] User clement.oudot is authorized to access to app-example + +Access to an SAML SP whose configuration key is ``sp-example``: + +:: + + [notice] User clement.oudot is authorized to access to sp-example + +Access to an OIDC RP whose configuration key is ``rp-example``: :: [notice] User clement.oudot is authorized to access to rp-example +Access to a Get application whose vhost configuration key is ``host.example.com``: + +:: + + [notice] User clement.oudot is authorized to access to host.example.com + + Default loggers --------------- diff --git a/doc/sources/admin/psgi.rst b/doc/sources/admin/psgi.rst index 986c0a4b51f6e82892cdf9596f9b5401c5d6d0a8..328bec26807f75d3c9a8aac4455f850000fc4fd1 100644 --- a/doc/sources/admin/psgi.rst +++ b/doc/sources/admin/psgi.rst @@ -128,7 +128,7 @@ Then adapt your Nginx configuration to use this uWSGI app. Configuration ^^^^^^^^^^^^^ -To serve large requests with uWsgi, you could have to modify in uWsgi +To serve large requests with uWSGI, you could have to modify in uWSGI and/or Nginx init files several options. Example: .. code-block:: ini @@ -146,6 +146,28 @@ and/or Nginx init files several options. Example: uwsgi_read_timeout 120; uwsgi_send_timeout 120; +.. note:: + Nginx natively includes support for upstream servers speaking the uwsgi protocol since version 0.8.40. + To improve performances, you can switch from a TCP socket to an Unix Domain Socket by editing + ``llng-server.yaml`` and adapting Nignx configuration files: + .. code-block:: ini + + uwsgi: + plugins: psgi + socket: /tmp/uwsgi.sock + + .. code-block:: nginx + + # OR TO USE uWSGI + include /etc/nginx/uwsgi_params; + uwsgi_pass unix:///tmp/uwsgi.sock; + uwsgi_param LLTYPE psgi; + uwsgi_param SCRIPT_FILENAME $document_root$sc; + uwsgi_param SCRIPT_NAME $sc; + # Uncomment this if you use Auth SSL: + #uwsgi_param SSL_CLIENT_S_DN_CN $ssl_client_s_dn_cn; + + Protect a PSGI application -------------------------- diff --git a/doc/sources/admin/upgrade_2_0_x.rst b/doc/sources/admin/upgrade_2_0_x.rst index 806fd4f34b1b4ea101eca45c00187d0e79f9d58d..42ea5cdc9fdfd6e682e679ed7456e21e28f62038 100644 --- a/doc/sources/admin/upgrade_2_0_x.rst +++ b/doc/sources/admin/upgrade_2_0_x.rst @@ -22,6 +22,8 @@ backups and a rollback plan ready! - | Bad default value to display OIDC Consents tab has been fixed. | The default value is ``$_oidcConsents`` +- Some user log messages have been modified, check :doc:`logs documentation ` + (see also `#2244 `__) 2.0.8 ----- diff --git a/doc/sources/manager-api/openapi-spec.yaml b/doc/sources/manager-api/openapi-spec.yaml index 7ddd306fd0c0459c2403ff19551a8738676bf188..89794a18faf5c9b549cfb2f4d2d2ced199786cc9 100644 --- a/doc/sources/manager-api/openapi-spec.yaml +++ b/doc/sources/manager-api/openapi-spec.yaml @@ -622,6 +622,353 @@ paths: 404: $ref: '#/components/responses/NotFound' + /api/v1/menu/cat: + post: + tags: + - menucat + summary: Create a new Menu Category + operationId: addMenuCat + requestBody: + description: Menu Category to add + content: + application/json: + schema: + $ref: '#/components/schemas/MenuCat' + required: true + responses: + 201: + $ref: '#/components/responses/Created' + 400: + $ref: '#/components/responses/Error' + 409: + $ref: '#/components/responses/Conflict' + + /api/v1/menu/cat/findByConfKey: + get: + tags: + - menucat + summary: Finds Menu Categories by configuration key + description: Takes a search pattern to be tested against existing categories + operationId: findMenuCatByConfKey + parameters: + - name: pattern + in: query + description: Search pattern + required: true + schema: + type: "string" + examples: + any: + summary: Any value + value: "*" + prefix: + summary: Given prefix + value: "zone1-*" + anywhere: + summary: Substring + value: "something" + responses: + 200: + $ref: '#/components/responses/ManyMenuCat' + 400: + $ref: '#/components/responses/Error' + + /api/v1/menu/cat/{confKey}: + get: + tags: + - menucat + summary: Get Menu Category by configuration key + description: Returns a single Category + operationId: getMenuCatByConfKey + parameters: + - name: confKey + in: path + description: Configuration key of Menu Category + required: true + schema: + $ref: '#/components/schemas/confKey' + responses: + 200: + $ref: '#/components/responses/OneMenuCat' + 400: + $ref: '#/components/responses/Error' + 404: + $ref: '#/components/responses/NotFound' + + put: + tags: + - menucat + summary: Replaces a Menu Category + operationId: replaceMenuCat + parameters: + - name: confKey + in: path + description: Configuration key of Menu Category that needs to be replaced + required: true + schema: + $ref: '#/components/schemas/confKey' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MenuCat' + responses: + 204: + $ref: '#/components/responses/NoContent' + 400: + $ref: '#/components/responses/Error' + 404: + $ref: '#/components/responses/NotFound' + 409: + $ref: '#/components/responses/Conflict' + patch: + tags: + - menucat + summary: Updates a Menu Category + operationId: updateMenuCat + parameters: + - name: confKey + in: path + description: Configuration key of Menu Category that needs to be updated + required: true + schema: + $ref: '#/components/schemas/confKey' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MenuCatUpdate' + responses: + 204: + $ref: '#/components/responses/NoContent' + 400: + $ref: '#/components/responses/Error' + 404: + $ref: '#/components/responses/NotFound' + 409: + $ref: '#/components/responses/Conflict' + + delete: + tags: + - menucat + summary: Deletes a Menu Category + operationId: deleteMenuCat + parameters: + - name: confKey + in: path + description: Configuration key of Menu Category to delete + required: true + schema: + $ref: '#/components/schemas/confKey' + responses: + 204: + $ref: '#/components/responses/NoContent' + 400: + $ref: '#/components/responses/Error' + 404: + $ref: '#/components/responses/NotFound' + + /api/v1/menu/app/{cat}: + get: + tags: + - menuapp + summary: Get Menu Applications within a Menu Category + description: Return existing applications within a menu category + operationId: getMenuApps + parameters: + - name: cat + in: path + description: Configuration key of Menu Category to work with + required: true + schema: + $ref: '#/components/schemas/menuCatConfKey' + responses: + 200: + $ref: '#/components/responses/ManyMenuApp' + 400: + $ref: '#/components/responses/Error' + post: + tags: + - menuapp + summary: Create a new Menu Application within a Menu Category + operationId: addMenuApp + parameters: + - name: cat + in: path + description: Configuration key of Menu Category to work with + required: true + schema: + $ref: '#/components/schemas/menuCatConfKey' + requestBody: + description: Menu Application to add + content: + application/json: + schema: + $ref: '#/components/schemas/MenuApp' + required: true + responses: + 201: + $ref: '#/components/responses/Created' + 400: + $ref: '#/components/responses/Error' + 409: + $ref: '#/components/responses/Conflict' + + /api/v1/menu/app/{cat}/findByConfKey: + get: + tags: + - menuapp + summary: Finds Menu Applications by configuration key within a Menu Category + description: Takes a search pattern to be tested against existing applications within a menu category + operationId: findMenuAppByConfKey + parameters: + - name: cat + in: path + description: Configuration key of Menu Category to work with + required: true + schema: + $ref: '#/components/schemas/menuCatConfKey' + - name: pattern + in: query + description: Search pattern + required: true + schema: + type: "string" + examples: + any: + summary: Any value + value: "*" + prefix: + summary: Given prefix + value: "zone1-*" + anywhere: + summary: Substring + value: "something" + responses: + 200: + $ref: '#/components/responses/ManyMenuApp' + 400: + $ref: '#/components/responses/Error' + + /api/v1/menu/app/{cat}/{confKey}: + get: + tags: + - menuapp + summary: Get Menu Application within a Menu Category by configuration key + description: Returns a single application + operationId: getMenuAppByConfKey + parameters: + - name: cat + in: path + description: Configuration key of Menu Category to work with + required: true + schema: + $ref: '#/components/schemas/menuCatConfKey' + - name: confKey + in: path + description: Configuration key of Menu Application + required: true + schema: + $ref: '#/components/schemas/confKey' + responses: + 200: + $ref: '#/components/responses/OneMenuApp' + 400: + $ref: '#/components/responses/Error' + 404: + $ref: '#/components/responses/NotFound' + + put: + tags: + - menuapp + summary: Replaces a Menu Application + operationId: replaceMenuApp + parameters: + - name: cat + in: path + description: Configuration key of Menu Category to work with + required: true + schema: + $ref: '#/components/schemas/menuCatConfKey' + - name: confKey + in: path + description: Configuration key of Menu Application that needs to be replaced + required: true + schema: + $ref: '#/components/schemas/confKey' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MenuApp' + responses: + 204: + $ref: '#/components/responses/NoContent' + 400: + $ref: '#/components/responses/Error' + 404: + $ref: '#/components/responses/NotFound' + 409: + $ref: '#/components/responses/Conflict' + patch: + tags: + - menuapp + summary: Updates a Menu Application + operationId: updateMenuApp + parameters: + - name: cat + in: path + description: Configuration key of Menu Category to work with + required: true + schema: + $ref: '#/components/schemas/menuCatConfKey' + - name: confKey + in: path + description: Configuration key of Menu Application that needs to be updated + required: true + schema: + $ref: '#/components/schemas/confKey' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MenuAppUpdate' + responses: + 204: + $ref: '#/components/responses/NoContent' + 400: + $ref: '#/components/responses/Error' + 404: + $ref: '#/components/responses/NotFound' + 409: + $ref: '#/components/responses/Conflict' + + delete: + tags: + - menuapp + summary: Deletes a Menu Application + operationId: deleteMenuApp + parameters: + - name: cat + in: path + description: Configuration key of Menu Category to work with + required: true + schema: + $ref: '#/components/schemas/menuCatConfKey' + - name: confKey + in: path + description: Configuration key of Menu Application to delete + required: true + schema: + $ref: '#/components/schemas/confKey' + responses: + 204: + $ref: '#/components/responses/NoContent' + 400: + $ref: '#/components/responses/Error' + 404: + $ref: '#/components/responses/NotFound' + components: schemas: confKey: @@ -925,6 +1272,90 @@ components: items: $ref: "#/components/schemas/SecondFactor" + menuCatConfKey: + type: string + pattern: '^\w[\w\.\-]*$' + MenuCat: + required: + - confKey + - catname + type: object + properties: + confKey: + $ref: '#/components/schemas/confKey' + catname: + type: string + order: + type: integer + MenuCatUpdate: + type: object + properties: + catname: + type: string + order: + type: integer + MenuApp: + required: + - confKey + type: object + properties: + confKey: + $ref: '#/components/schemas/confKey' + order: + type: integer + options: + $ref: '#/components/schemas/MenuAppOptions' + MenuAppOptions: + required: + - name + type: object + properties: + name: + type: string + tooltip: + type: string + description: + type: string + uri: + type: string + logo: + type: string + default: network.png + enum: + - attach.png + - bell.png + - bookmark.png + - configure.png + - database.png + - demo.png + - folder.png + - gear.png + - help.png + - llng.png + - mailappt.png + - money.png + - network.png + - terminal.png + - thumbnail.png + - tux.png + - web.png + - (Any reference to an available image in app logo folder) + display: + type: string + default: auto + enum: + - enabled + - disabled + - auto + - (Any special rule to apply for example "$uid eq 'dwho'") + MenuAppUpdate: + type: object + properties: + order: + type: integer + options: + $ref: '#/components/schemas/MenuAppOptions' + responses: NoContent: description: Successful modification @@ -1002,3 +1433,31 @@ components: application/json: schema: $ref: "#/components/schemas/SecondFactors" + OneMenuCat: + description: Return a Menu Category + content: + application/json: + schema: + $ref: '#/components/schemas/MenuCat' + ManyMenuCat: + description: Return a list of Menu Categories + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/MenuCat' + OneMenuApp: + description: Return a Menu Application + content: + application/json: + schema: + $ref: '#/components/schemas/MenuApp' + ManyMenuApp: + description: Return a list of Menu Applications + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/MenuApp' diff --git a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/Constants.pm b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/Constants.pm index 2d1ee96179cd7edc740f9a51d19962d6d983ad54..6151436f6e3403d169c449d408abbf2cbcf1b528 100644 --- a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/Constants.pm +++ b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/Constants.pm @@ -23,6 +23,12 @@ use constant HANDLERSECTION => "handler"; use constant MANAGERSECTION => "manager"; use constant SESSIONSEXPLORERSECTION => "sessionsExplorer"; use constant APPLYSECTION => "apply"; + +# Default configuration backend +use constant DEFAULTCONFBACKEND => "File"; +use constant DEFAULTCONFBACKENDOPTIONS => ( + dirName => '/usr/local/lemonldap-ng/data/conf', +); our $hashParameters = qr/^(?:(?:l(?:o(?:ca(?:lSessionStorageOption|tionRule)|goutService)|dapExportedVar|wp(?:Ssl)?Opt)|(?:(?:d(?:emo|bi)|facebook|webID)ExportedVa|exported(?:Heade|Va)|issuerDBGetParamete)r|re(?:moteGlobalStorageOption|st2f(?:Verify|Init)Arg|loadUrl)|g(?:r(?:antSessionRule|oup)|lobalStorageOption)|n(?:otificationStorageOption|ginxCustomHandler)|macro)s|o(?:idc(?:S(?:ervice(?:DynamicRegistrationEx(?:portedVar|traClaim)s|MetaDataAuthnContext)|torageOptions)|RPMetaData(?:(?:Option(?:sExtraClaim)?|ExportedVar|Macro)s|Node)|OPMetaData(?:(?:ExportedVar|Option)s|J(?:SON|WKS)|Node))|penIdExportedVars)|s(?:aml(?:S(?:PMetaData(?:(?:ExportedAttribute|Option|Macro)s|Node|XML)|torageOptions)|IDPMetaData(?:(?:ExportedAttribute|Option)s|Node|XML))|essionDataToRemember|laveExportedVars|fExtra)|c(?:as(?:A(?:ppMetaData(?:(?:ExportedVar|Option|Macro)s|Node)|ttributes)|S(?:rvMetaData(?:(?:ExportedVar|Option)s|Node)|torageOptions))|(?:ustom(?:Plugins|Add)Param|ombModule)s)|p(?:ersistentStorageOptions|o(?:rtalSkinRules|st))|a(?:ut(?:hChoiceMod|oSigninR)ules|pplicationList)|v(?:hostOptions|irtualHost)|S(?:MTPTLSOpts|SLVarIf))$/; our $boolKeys = qr/^(?:s(?:aml(?:IDP(?:MetaDataOptions(?:(?:Check(?:S[LS]OMessageSignatur|Audienc|Tim)|IsPassiv)e|A(?:llow(?:LoginFromIDP|ProxiedAuthn)|daptSessionUtime)|Force(?:Authn|UTF8)|StoreSAMLToken|RelayStateURL)|SSODescriptorWantAuthnRequestsSigned)|S(?:P(?:MetaDataOptions(?:(?:CheckS[LS]OMessageSignatur|OneTimeUs)e|EnableIDPInitiatedURL|ForceUTF8)|SSODescriptor(?:WantAssertion|AuthnRequest)sSigned)|erviceUseCertificateInResponse)|DiscoveryProtocol(?:Activation|IsPassive)|CommonDomainCookieActivation|UseQueryStringSpecific|MetadataForceUTF8)|oap(?:Session|Config)Server|t(?:ayConnecte|orePasswor)d|kipRenewConfirmation|fRemovedUseNotif|laveDisplayLogo|howLanguages|slByAjax)|o(?:idc(?:RPMetaDataOptions(?:Allow(?:PasswordGrant|Offline)|Re(?:freshToken|quirePKCE)|LogoutSessionRequired|IDTokenForceClaims|BypassConsent|Public)|ServiceAllow(?:(?:AuthorizationCode|Implicit|Hybrid)Flow|DynamicRegistration)|OPMetaDataOptions(?:(?:CheckJWTSignatur|UseNonc)e|StoreIDToken))|ldNotifFormat)|p(?:ortal(?:Display(?:Re(?:freshMyRights|setPassword|gister)|GeneratePassword|PasswordPolicy)|ErrorOn(?:ExpiredSession|MailNotFound)|(?:CheckLogin|Statu)s|OpenLinkInNewWindow|ForceAuthn|AntiFrame)|roxyUseSoap)|l(?:dap(?:(?:Group(?:DecodeSearchedValu|Recursiv)|UsePasswordResetAttribut)e|(?:AllowResetExpired|Set)Password|ChangePasswordAsUser|PpolicyControl|ITDS)|oginHistoryEnabled)|c(?:a(?:ptcha_(?:register|login|mail)_enabled|sSrvMetaDataOptions(?:Gateway|Renew))|o(?:ntextSwitchingStopWithLogout|mpactConf|rsEnabled)|heck(?:State|User|XSS)|da)|no(?:tif(?:ication(?:Server(?:(?:POS|GE)T|DELETE)?|sExplorer)?|y(?:Deleted|Other))|AjaxHook)|i(?:ssuerDB(?:OpenID(?:Connect)?|SAML|CAS|Get)Activation|mpersonationSkipEmptyValues)|to(?:tp2f(?:UserCan(?:Chang|Remov)eKey|DisplayExistingSecret)|kenUseGlobalStorage)|u(?:se(?:RedirectOn(?:Forbidden|Error)|SafeJail)|2fUserCanRemoveKey|pgradeSession)|re(?:st(?:(?:Password|Session|Config|Auth)Server|ExportSecretKeys)|freshSessions)|br(?:uteForceProtection(?:IncrementalTempo)?|owsersDontStorePassword)|(?:mai(?:lOnPasswordChang|ntenanc)|vhostMaintenanc)e|d(?:isablePersistentStorage|biDynamicHashEnabled)|g(?:roupsBeforeMacros|lobalLogoutTimer)|h(?:ideOldPassword|ttpOnly)|yubikey2fUserCanRemoveKey|(?:activeTim|wsdlServ)er|krb(?:RemoveDomain|ByJs))$/; @@ -47,6 +53,8 @@ our %EXPORT_TAGS = ( MANAGERSECTION SESSIONSEXPLORERSECTION APPLYSECTION + DEFAULTCONFBACKEND + DEFAULTCONFBACKENDOPTIONS NO $hashParameters @sessionTypes diff --git a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/DefaultValues.pm b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/DefaultValues.pm index cfbf923dda9addfdf256d485139603c1b2ed3eec..433d653313086a5ce341d98b878b98f35d5ad25d 100644 --- a/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/DefaultValues.pm +++ b/lemonldap-ng-common/lib/Lemonldap/NG/Common/Conf/DefaultValues.pm @@ -139,7 +139,6 @@ sub defaultValues { 'ldapGroupObjectClass' => 'groupOfNames', 'ldapPasswordResetAttribute' => 'pwdReset', 'ldapPasswordResetAttributeValue' => 'TRUE', - 'ldapPort' => 389, 'ldapPwdEnc' => 'utf-8', 'ldapSearchDeref' => 'find', 'ldapServer' => 'ldap://localhost', diff --git a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Api.pm b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Api.pm index d9b1ed86aa655674243a392a15760bc0f86d0ef9..786dc98df2dec4bbc08062a42f5aca4d71db531a 100644 --- a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Api.pm +++ b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Api.pm @@ -13,8 +13,10 @@ use Lemonldap::NG::Manager::Api::2F; use Lemonldap::NG::Manager::Api::Providers::OidcRp; use Lemonldap::NG::Manager::Api::Providers::SamlSp; use Lemonldap::NG::Manager::Api::Providers::CasApp; +use Lemonldap::NG::Manager::Api::Menu::Cat; +use Lemonldap::NG::Manager::Api::Menu::App; -our $VERSION = '2.0.8'; +our $VERSION = '2.0.9'; ############################# # I. INITIALIZATION METHODS # @@ -77,6 +79,24 @@ sub init { '*' => 'getSecondFactors' }, }, + menu => { + cat => { + findByConfKey => { + ':uPattern' => 'findMenuCatByConfKey' + }, + ':confKey' => { + '*' => 'getMenuCatByConfKey' + } + }, + app => { + ':confKey' => { + findByConfKey => { + ':uPattern' => 'findMenuAppByConfKey' + }, + ':appConfKey' => 'getMenuApp' + } + }, + }, }, }, ['GET'] @@ -96,6 +116,12 @@ sub init { app => 'addCasApp' }, }, + menu => { + cat => 'addMenuCat', + app => { + ':confKey' => 'addMenuApp' + } + }, }, }, ['POST'] @@ -115,6 +141,14 @@ sub init { app => { ':confKey' => 'replaceCasApp' } }, }, + menu => { + cat => { ':confKey' => 'replaceMenuCat' }, + app => { + ':confKey' => { + ':appConfKey' => 'replaceMenuApp' + } + } + }, }, }, ['PUT'] @@ -134,6 +168,14 @@ sub init { app => { ':confKey' => 'updateCasApp' } }, }, + menu => { + cat => { ':confKey' => 'updateMenuCat' }, + app => { + ':confKey' => { + ':appConfKey' => 'updateMenuApp' + } + } + }, }, }, ['PATCH'] @@ -164,6 +206,14 @@ sub init { '*' => 'deleteSecondFactors' }, }, + menu => { + cat => { ':confKey' => 'deleteMenuCat' }, + app => { + ':confKey' => { + ':appConfKey' => 'deleteMenuApp' + } + } + }, }, }, ['DELETE'] diff --git a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Api/Menu/App.pm b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Api/Menu/App.pm new file mode 100644 index 0000000000000000000000000000000000000000..723be266bae3fb5f2cf7198ff4280fec64267da4 --- /dev/null +++ b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Api/Menu/App.pm @@ -0,0 +1,395 @@ +package Lemonldap::NG::Manager::Api::Menu::App; + +our $VERSION = '2.0.9'; + +package Lemonldap::NG::Manager::Api; + +use 5.10.0; +use utf8; +use Mouse; +use Lemonldap::NG::Manager::Conf::Parser; +use Data::Dumper; + +extends 'Lemonldap::NG::Manager::Api::Common'; + +sub getMenuApp { + my ( $self, $req ) = @_; + + my $catConfKey = $req->params('confKey') + or return $self->sendError( $req, 'Category confKey is missing', 400 ); + + my $appConfKey = $req->params('appConfKey'); + + # Get latest configuration + my $conf = $self->_confAcc->getConf; + + if ( defined $appConfKey ) { + + # Return one application referenced with this appConfKey + $self->logger->debug( +"[API] Menu application $appConfKey from category $catConfKey configuration requested" + ); + + my $menuApp = + $self->_getMenuAppByConfKey( $conf, $catConfKey, $appConfKey ); + + # Return 404 if not found + return $self->sendError( + $req, +"Menu application '$appConfKey' from category '$catConfKey' not found", + 404 + ) unless ( defined $menuApp ); + + return $self->sendJSONresponse( $req, $menuApp ); + + } + else { + + # Return all applications for this category + $self->logger->debug( +"[API] Menu applications from category $catConfKey configuration requested" + ); + + # Check if catConfKey is defined + return $self->sendError( $req, + "Menu category '$catConfKey' not found", 404 ) + unless ( defined $conf->{applicationList}->{$catConfKey} ); + + my $cat = $conf->{applicationList}->{$catConfKey}; + + my @menuApps = + map { + $self->_isCatApp( $cat->{$_} ) + ? $self->_getMenuAppByConfKey( $conf, $catConfKey, $_ ) + : () + } + keys %{$cat}; + + return $self->sendJSONresponse( $req, [@menuApps] ); + + } +} + +sub findMenuAppByConfKey { + my ( $self, $req ) = @_; + + my $catConfKey = $req->params('confKey') + or return $self->sendError( $req, 'Category confKey is missing', 400 ); + + my $pattern = ( + defined $req->params('uPattern') + ? $req->params('uPattern') + : ( defined $req->params('pattern') ? $req->params('pattern') : undef ) + ); + + return $self->sendError( $req, 'Invalid input: pattern is missing', 400 ) + unless ( defined $pattern ); + + unless ( $pattern = $self->_getRegexpFromPattern($pattern) ) { + return $self->sendError( $req, 'Invalid input: pattern is invalid', + 400 ); + } + + $self->logger->debug( +"[API] Find Menu Applications from category $catConfKey by confKey regexp $pattern requested" + ); + + # Get latest configuration + my $conf = $self->_confAcc->getConf; + + # Check if catConfKey is defined + return $self->sendError( $req, + "Menu category '$catConfKey' not found", 404 ) + unless ( defined $conf->{applicationList}->{$catConfKey} ); + + my $cat = $conf->{applicationList}->{$catConfKey}; + + my @menuApps = + map { + $self->_isCatApp( $cat->{$_} ) + && $_ =~ $pattern + ? $self->_getMenuAppByConfKey( $conf, $catConfKey, $_ ) + : () + } + keys %{$cat}; + + return $self->sendJSONresponse( $req, [@menuApps] ); +} + +sub addMenuApp { + my ( $self, $req ) = @_; + my $add = $req->jsonBodyToObj; + + my $catConfKey = $req->params('confKey') + or return $self->sendError( $req, 'Category confKey is missing', 400 ); + + return $self->sendError( $req, "Invalid input: " . $req->error, 400 ) + unless ($add); + + return $self->sendError( $req, 'Invalid input: confKey is missing', 400 ) + unless ( defined $add->{confKey} ); + + return $self->sendError( $req, 'Invalid input: confKey is not a string', + 400 ) + if ( ref $add->{confKey} ); + + return $self->sendError( $req, 'Invalid input: name is missing', 400 ) + unless ( defined $add->{options} && defined $add->{options}{name} ); + + return $self->sendError( $req, 'Invalid input: name is not a string', 400 ) + if ( ref $add->{options}{name} ); + + $self->logger->debug( +"[API] Add Menu Application from category $catConfKey with confKey $add->{confKey} requested" + ); + + # Get latest configuration + my $conf = $self->_confAcc->getConf( { noCache => 1 } ); + + return $self->sendError( + $req, +"Invalid input: A Menu Application with confKey $add->{confKey} already exists", + 409 + ) + if ( + defined $self->_getMenuAppByConfKey( $conf, $catConfKey, + $add->{confKey} ) ); + + my $res = + $self->_pushMenuApp( $conf, $catConfKey, $add->{confKey}, $add, 1 ); + + return $self->sendError( $req, $res->{msg}, 400 ) + unless ( $res->{res} eq 'ok' ); + + return $self->sendJSONresponse( + $req, + { message => "Successful operation" }, + code => 201 + ); +} + +sub updateMenuApp { + my ( $self, $req ) = @_; + + my $catConfKey = $req->params('confKey') + or return $self->sendError( $req, 'Category confKey is missing', 400 ); + + my $appConfKey = $req->params('appConfKey') + or return $self->sendError( $req, 'Application confKey is missing', 400 ); + + my $update = $req->jsonBodyToObj; + + return $self->sendError( $req, "Invalid input: " . $req->error, 400 ) + unless ($update); + + $self->logger->debug( +"[API] Menu application $appConfKey from category $catConfKey configuration update requested" + ); + + # Get latest configuration + my $conf = $self->_confAcc->getConf( { noCache => 1 } ); + + # Return 404 if not found + + return $self->sendError( $req, + "Menu category '$catConfKey' not found", 404 ) + unless ( defined $self->_getMenuCatByConfKey( $conf, $catConfKey ) ); + + return $self->sendError( + $req, + "Menu application '$appConfKey' from category '$catConfKey' not found", + 404 + ) + unless ( + defined $self->_getMenuAppByConfKey( $conf, $catConfKey, $appConfKey ) + ); + + my $res = + $self->_pushMenuApp( $conf, $catConfKey, $appConfKey, $update, 0 ); + + return $self->sendError( $req, $res->{msg}, 400 ) + unless ( $res->{res} eq 'ok' ); + + return $self->sendJSONresponse( $req, undef, code => 204 ); +} + +sub replaceMenuApp { + my ( $self, $req ) = @_; + my $catConfKey = $req->params('confKey') + or return $self->sendError( $req, 'Category confKey is missing', 400 ); + + my $appConfKey = $req->params('appConfKey') + or return $self->sendError( $req, 'Application confKey is missing', 400 ); + + my $replace = $req->jsonBodyToObj; + + return $self->sendError( $req, "Invalid input: " . $req->error, 400 ) + unless ($replace); + + return $self->sendError( $req, 'Invalid input: confKey is missing', 400 ) + unless ( defined $replace->{confKey} ); + + return $self->sendError( $req, 'Invalid input: confKey is not a string', + 400 ) + if ( ref $replace->{confKey} ); + + return $self->sendError( $req, 'Invalid input: name is missing', 400 ) + unless ( defined $replace->{options} + && defined $replace->{options}{name} ); + + return $self->sendError( $req, 'Invalid input: name is not a string', 400 ) + if ( ref $replace->{options}{name} ); + + $self->logger->debug( +"[API] Menu application $appConfKey from category $catConfKey configuration replace requested" + ); + + # Get latest configuration + my $conf = $self->_confAcc->getConf( { noCache => 1 } ); + + # Return 404 if not found + + return $self->sendError( $req, + "Menu category '$catConfKey' not found", 404 ) + unless ( defined $self->_getMenuCatByConfKey( $conf, $catConfKey ) ); + + return $self->sendError( + $req, + "Menu application '$appConfKey' from category '$catConfKey' not found", + 404 + ) + unless ( + defined $self->_getMenuAppByConfKey( $conf, $catConfKey, $appConfKey ) + ); + + my $res = + $self->_pushMenuApp( $conf, $catConfKey, $appConfKey, $replace, 1 ); + return $self->sendError( $req, $res->{msg}, 400 ) + unless ( $res->{res} eq 'ok' ); + + return $self->sendJSONresponse( $req, undef, code => 204 ); +} + +sub deleteMenuApp { + my ( $self, $req ) = @_; + + my $catConfKey = $req->params('confKey') + or return $self->sendError( $req, 'Category confKey is missing', 400 ); + + my $appConfKey = $req->params('appConfKey') + or return $self->sendError( $req, 'Application confKey is missing', 400 ); + + $self->logger->debug( +"[API] Menu Application $appConfKey from category $catConfKey configuration delete requested" + ); + + # Get latest configuration + my $conf = $self->_confAcc->getConf( { noCache => 1 } ); + + return $self->sendError( $req, + "Menu category '$catConfKey' not found", 404 ) + unless ( defined $self->_getMenuCatByConfKey( $conf, $catConfKey ) ); + + my $delete = $self->_getMenuAppByConfKey( $conf, $catConfKey, $appConfKey ); + + # Return 404 if not found + + return $self->sendError( $req, + "Menu category '$appConfKey' not found", 404 ) + unless ( defined $delete ); + + delete $conf->{applicationList}->{$catConfKey}->{$appConfKey}; + + # Save configuration + $self->_confAcc->saveConf($conf); + + return $self->sendJSONresponse( $req, undef, code => 204 ); +} + +sub _isCatApp { + my ( $self, $candidate ) = @_; + +# Check if candidate is a hash, has "type" defined and if "type" equals "application". + return + ref $candidate eq ref {} + && defined $candidate->{type} + && $candidate->{type} eq 'application'; +} + +sub _getMenuAppByConfKey { + my ( $self, $conf, $catConfKey, $appConfKey ) = @_; + + # Check if catConfKey is defined + return undef unless ( defined $conf->{applicationList}->{$catConfKey} ); + + # Check if appConfKey is defined + return undef + unless ( defined $conf->{applicationList}->{$catConfKey}->{$appConfKey} ); + + my $cat = $conf->{applicationList}->{$catConfKey}; + + my $menuApp = { confKey => $appConfKey }; + + $menuApp->{order} = $cat->{$appConfKey}->{order} + if ( defined $cat->{$appConfKey}->{order} ); + + # Get options + my $options = {}; + for my $configOption ( keys %{ $cat->{$appConfKey}->{options} } ) { + $options->{ $self->_translateOptionConfToApi($configOption) } = + $cat->{$appConfKey}->{options}->{$configOption}; + } + + $menuApp->{options} = $options; + + return $menuApp; +} + +sub _pushMenuApp { + my ( $self, $conf, $catConfKey, $appConfKey, $push, $replace ) = @_; + + if ($replace) { + $conf->{applicationList}->{$catConfKey}->{$appConfKey} = {}; + $conf->{applicationList}->{$catConfKey}->{$appConfKey}->{type} = + "application"; + $conf->{applicationList}->{$catConfKey}->{$appConfKey}->{options} = {}; + $conf->{applicationList}->{$catConfKey}->{$appConfKey}->{options} + ->{display} = "auto"; + $conf->{applicationList}->{$catConfKey}->{$appConfKey}->{options} + ->{logo} = "network.png"; + } + + $conf->{applicationList}->{$catConfKey}->{$appConfKey}->{order} = + $push->{order} + if ( defined $push->{order} ); + + if ( defined $push->{options} ) { + foreach ( keys %{ $push->{options} } ) { + $conf->{applicationList}->{$catConfKey}->{$appConfKey}->{options} + ->{$_} = $push->{options}->{$_}; + } + } + + # Test new configuration + my $parser = Lemonldap::NG::Manager::Conf::Parser->new( { + refConf => $self->_confAcc->getConf, + newConf => $conf, + req => {}, + } + ); + unless ( $parser->testNewConf( $self->p ) ) { + return { + res => 'ko', + code => 400, + msg => "Configuration error: " + . join( ". ", map { $_->{message} } @{ $parser->errors } ), + }; + } + + # Save configuration + $self->_confAcc->saveConf($conf); + + return { res => 'ok' }; +} + +1; diff --git a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Api/Menu/Cat.pm b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Api/Menu/Cat.pm new file mode 100644 index 0000000000000000000000000000000000000000..700c744e2b630dc253357a0ef39843dd461fd10c --- /dev/null +++ b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Api/Menu/Cat.pm @@ -0,0 +1,262 @@ +package Lemonldap::NG::Manager::Api::Menu::Cat; + +our $VERSION = '2.0.9'; + +package Lemonldap::NG::Manager::Api; + +use 5.10.0; +use utf8; +use Mouse; +use Lemonldap::NG::Manager::Conf::Parser; + +extends 'Lemonldap::NG::Manager::Api::Common'; + +sub getMenuCatByConfKey { + my ( $self, $req ) = @_; + + my $confKey = $req->params('confKey') + or return $self->sendError( $req, 'confKey is missing', 400 ); + + $self->logger->debug( + "[API] Menu Category $confKey configuration requested"); + + # Get latest configuration + my $conf = $self->_confAcc->getConf; + + my $menuCat = $self->_getMenuCatByConfKey( $conf, $confKey ); + + # Return 404 if not found + return $self->sendError( $req, "Menu category '$confKey' not found", 404 ) + unless ( defined $menuCat ); + + return $self->sendJSONresponse( $req, $menuCat ); +} + +sub findMenuCatByConfKey { + my ( $self, $req ) = @_; + + my $pattern = ( + defined $req->params('uPattern') + ? $req->params('uPattern') + : ( defined $req->params('pattern') ? $req->params('pattern') : undef ) + ); + + return $self->sendError( $req, 'Invalid input: pattern is missing', 400 ) + unless ( defined $pattern ); + + unless ( $pattern = $self->_getRegexpFromPattern($pattern) ) { + return $self->sendError( $req, 'Invalid input: pattern is invalid', + 400 ); + } + + $self->logger->debug( + "[API] Find Menu Categories by confKey regexp $pattern requested"); + + # Get latest configuration + my $conf = $self->_confAcc->getConf; + + my @menuCats = + map { $_ =~ $pattern ? $self->_getMenuCatByConfKey( $conf, $_ ) : () } + keys %{ $conf->{applicationList} }; + + return $self->sendJSONresponse( $req, [@menuCats] ); +} + +sub addMenuCat { + my ( $self, $req ) = @_; + my $add = $req->jsonBodyToObj; + + return $self->sendError( $req, "Invalid input: " . $req->error, 400 ) + unless ($add); + + return $self->sendError( $req, 'Invalid input: confKey is missing', 400 ) + unless ( defined $add->{confKey} ); + + return $self->sendError( $req, 'Invalid input: confKey is not a string', + 400 ) + if ( ref $add->{confKey} ); + + return $self->sendError( $req, 'Invalid input: catname is missing', 400 ) + unless ( defined $add->{catname} ); + + return $self->sendError( $req, 'Invalid input: catname is not a string', + 400 ) + if ( ref $add->{catname} ); + + $self->logger->debug( + "[API] Add Menu Category with confKey $add->{confKey} requested"); + + # Get latest configuration + my $conf = $self->_confAcc->getConf( { noCache => 1 } ); + + return $self->sendError( + $req, +"Invalid input: A Menu Category with confKey $add->{confKey} already exists", + 409 + ) if ( defined $self->_getMenuCatByConfKey( $conf, $add->{confKey} ) ); + + my $res = $self->_pushMenuCat( $conf, $add->{confKey}, $add, 1 ); + + return $self->sendError( $req, $res->{msg}, 400 ) + unless ( $res->{res} eq 'ok' ); + + return $self->sendJSONresponse( + $req, + { message => "Successful operation" }, + code => 201 + ); +} + +sub updateMenuCat { + my ( $self, $req ) = @_; + my $confKey = $req->params('confKey') + or return $self->sendError( $req, 'confKey is missing', 400 ); + + my $update = $req->jsonBodyToObj; + + return $self->sendError( $req, "Invalid input: " . $req->error, 400 ) + unless ($update); + + $self->logger->debug( + "[API] Menu Category $confKey configuration update requested"); + + # Get latest configuration + my $conf = $self->_confAcc->getConf( { noCache => 1 } ); + + my $current = $self->_getMenuCatByConfKey( $conf, $confKey ); + + # Return 404 if not found + + return $self->sendError( $req, "Menu category '$confKey' not found", 404 ) + unless ( defined $current ); + + my $res = $self->_pushMenuCat( $conf, $confKey, $update, 0 ); + + return $self->sendError( $req, $res->{msg}, 400 ) + unless ( $res->{res} eq 'ok' ); + + return $self->sendJSONresponse( $req, undef, code => 204 ); +} + +sub replaceMenuCat { + my ( $self, $req ) = @_; + my $confKey = $req->params('confKey') + or return $self->sendError( $req, 'confKey is missing', 400 ); + + my $replace = $req->jsonBodyToObj; + + return $self->sendError( $req, "Invalid input: " . $req->error, 400 ) + unless ($replace); + + return $self->sendError( $req, 'Invalid input: confKey is missing', 400 ) + unless ( defined $replace->{confKey} ); + + return $self->sendError( $req, 'Invalid input: confKey is not a string', + 400 ) + if ( ref $replace->{confKey} ); + + return $self->sendError( $req, 'Invalid input: catname is missing', 400 ) + unless ( defined $replace->{catname} ); + + return $self->sendError( $req, 'Invalid input: catname is not a string', + 400 ) + if ( ref $replace->{catname} ); + + $self->logger->debug( + "[API] Menu Category $confKey configuration replace requested"); + + # Get latest configuration + my $conf = $self->_confAcc->getConf( { noCache => 1 } ); + + # Return 404 if not found + + return $self->sendError( $req, "Menu category '$confKey' not found", 404 ) + unless ( defined $self->_getMenuCatByConfKey( $conf, $confKey ) ); + + my $res = $self->_pushMenuCat( $conf, $confKey, $replace, 1 ); + return $self->sendError( $req, $res->{msg}, 400 ) + unless ( $res->{res} eq 'ok' ); + + return $self->sendJSONresponse( $req, undef, code => 204 ); +} + +sub deleteMenuCat { + my ( $self, $req ) = @_; + my $confKey = $req->params('confKey') + or return $self->sendError( $req, 'confKey is missing', 400 ); + + $self->logger->debug( + "[API] Menu Category $confKey configuration delete requested"); + + # Get latest configuration + my $conf = $self->_confAcc->getConf( { noCache => 1 } ); + + my $delete = $self->_getMenuCatByConfKey( $conf, $confKey ); + + # Return 404 if not found + + return $self->sendError( $req, "Menu category '$confKey' not found", 404 ) + unless ( defined $delete ); + + delete $conf->{applicationList}->{$confKey}; + + # Save configuration + $self->_confAcc->saveConf($conf); + + return $self->sendJSONresponse( $req, undef, code => 204 ); +} + +sub _getMenuCatByConfKey { + my ( $self, $conf, $confKey ) = @_; + + # Check if confKey is defined + return undef unless ( defined $conf->{applicationList}->{$confKey} ); + + my $menuCat = { + confKey => $confKey, + catname => $conf->{applicationList}->{$confKey}->{catname} + }; + + $menuCat->{order} = $conf->{applicationList}->{$confKey}->{order} + if ( defined $conf->{applicationList}->{$confKey}->{order} ); + + return $menuCat; +} + +sub _pushMenuCat { + my ( $self, $conf, $confKey, $push, $replace ) = @_; + + if ($replace) { + $conf->{applicationList}->{$confKey} = {}; + $conf->{applicationList}->{$confKey}->{type} = "category"; + } + + $conf->{applicationList}->{$confKey}->{order} = $push->{order} + if ( defined $push->{order} ); + + $conf->{applicationList}->{$confKey}->{catname} = $push->{catname} + if ( defined $push->{catname} ); + + # Test new configuration + my $parser = Lemonldap::NG::Manager::Conf::Parser->new( { + refConf => $self->_confAcc->getConf, + newConf => $conf, + req => {}, + } + ); + unless ( $parser->testNewConf( $self->p ) ) { + return { + res => 'ko', + code => 400, + msg => "Configuration error: " + . join( ". ", map { $_->{message} } @{ $parser->errors } ), + }; + } + + # Save configuration + $self->_confAcc->saveConf($conf); + + return { res => 'ok' }; +} + +1; diff --git a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Attributes.pm b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Attributes.pm index abfc9d9c6dc4e88cb7753d487f59cf4db8498267..a93f3d0602a7d7bd37799109d346da5f15e74e6b 100644 --- a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Attributes.pm +++ b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Attributes.pm @@ -1644,8 +1644,7 @@ qr/^(?:(?:(?:(?:[a-zA-Z0-9][-a-zA-Z0-9]*)?[a-zA-Z0-9])[.])*(?:[a-zA-Z][-a-zA-Z0- 'type' => 'text' }, 'ldapPort' => { - 'default' => 389, - 'type' => 'int' + 'type' => 'int' }, 'ldapPpolicyControl' => { 'default' => 0, diff --git a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Build.pm b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Build.pm index ae731cfbf8e82bb0e91336d8d07e99f293817366..4735ec25d9e269862a1f9b66cd091d65f3312dfc 100644 --- a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Build.pm +++ b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Build.pm @@ -326,6 +326,12 @@ use constant HANDLERSECTION => "handler"; use constant MANAGERSECTION => "manager"; use constant SESSIONSEXPLORERSECTION => "sessionsExplorer"; use constant APPLYSECTION => "apply"; + +# Default configuration backend +use constant DEFAULTCONFBACKEND => "File"; +use constant DEFAULTCONFBACKENDOPTIONS => ( + dirName => '/usr/local/lemonldap-ng/data/conf', +); $confConstants our \@sessionTypes = ( '$sessionTypes' ); @@ -348,6 +354,8 @@ our %EXPORT_TAGS = ( MANAGERSECTION SESSIONSEXPLORERSECTION APPLYSECTION + DEFAULTCONFBACKEND + DEFAULTCONFBACKENDOPTIONS NO \$hashParameters \@sessionTypes diff --git a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Build/Attributes.pm b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Build/Attributes.pm index bb0ba9be76abc476a64f3afd5d185dc400398f9f..c6d2a98ec20a03d5d7fbebdba02decb6597c2a27 100644 --- a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Build/Attributes.pm +++ b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Build/Attributes.pm @@ -3118,7 +3118,6 @@ sub attributes { }, ldapPort => { type => 'int', - default => 389, documentation => 'LDAP port', }, ldapServer => { diff --git a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Conf.pm b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Conf.pm index 5b73896d66e8ceb1818f23975ae5ef3becf336b3..e1d0ec50f3bb93ad8c24c4a4a92f1f4ef85524d4 100644 --- a/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Conf.pm +++ b/lemonldap-ng-manager/lib/Lemonldap/NG/Manager/Conf.pm @@ -159,7 +159,7 @@ sub prx { # - getConfByNum: override SUPER method to be able to use Zero # - newConf() # - newRawConf(): restore a saved conf -# - applyConf(): called by the 2 previous to prevent other servers that a new +# - applyConf(): called by the 2 previous to inform other servers that a new # configuration is available sub getConfByNum { @@ -328,7 +328,7 @@ sub newRawConf { } ## @method private applyConf() -# Try to prevent other servers declared in `reloadUrls` that a new +# Try to inform other servers declared in `reloadUrls` that a new # configuration is available. # #@return reload status as boolean @@ -352,6 +352,7 @@ sub applyConf { # Parse apply values while ( my ( $host, $request ) = each %reloadUrls ) { my $r = HTTP::Request->new( 'GET', "http://$host$request" ); + $self->logger->debug("Sending reload request to $host"); if ( $request =~ /^https?:\/\/[^\/]+.*$/ ) { my $url = URI::URL->new($request); my $targetUrl = $url->scheme . "://" . $host; diff --git a/lemonldap-ng-manager/site/htdocs/static/languages/de.json b/lemonldap-ng-manager/site/htdocs/static/languages/de.json index 2b7710ca36515ec4b13668e13e749c3f644ecd4a..e92a948b4872b86adf30c1b711029db503322fcb 100644 --- a/lemonldap-ng-manager/site/htdocs/static/languages/de.json +++ b/lemonldap-ng-manager/site/htdocs/static/languages/de.json @@ -271,7 +271,7 @@ "disabled":"Disabled", "done":"done", "dones":"Done", -"down":"Move up", +"down":"Move down", "doubleCookie":"Double cookie (HTTP and HTTPS)", "doubleCookieForSingleSession":"Double cookie for a single session", "databaseLocked":"Database locked by another process", diff --git a/lemonldap-ng-manager/site/htdocs/static/languages/en.json b/lemonldap-ng-manager/site/htdocs/static/languages/en.json index cf686e46c5e1404e9a4417f3a6e0d19072263dab..7bf2fbf4e3b5143f9b8a948400b039abd9b9e87c 100644 --- a/lemonldap-ng-manager/site/htdocs/static/languages/en.json +++ b/lemonldap-ng-manager/site/htdocs/static/languages/en.json @@ -271,7 +271,7 @@ "disabled":"Disabled", "done":"done", "dones":"Done", -"down":"Move up", +"down":"Move down", "doubleCookie":"Double cookie (HTTP and HTTPS)", "doubleCookieForSingleSession":"Double cookie for a single session", "databaseLocked":"Database locked by another process", diff --git a/lemonldap-ng-manager/site/htdocs/static/languages/zh.json b/lemonldap-ng-manager/site/htdocs/static/languages/zh.json index 9eb6e3f3c14860a6e237d76bd9362994e362027c..ad2431a938252c1afac3af56732e3a5740715610 100644 --- a/lemonldap-ng-manager/site/htdocs/static/languages/zh.json +++ b/lemonldap-ng-manager/site/htdocs/static/languages/zh.json @@ -271,7 +271,7 @@ "disabled":"Disabled", "done":"完成", "dones":"完成", -"down":"Move up", +"down":"Move down", "doubleCookie":"Double cookie (HTTP and HTTPS)", "doubleCookieForSingleSession":"Double cookie for a single session", "databaseLocked":"数据库被另一进程锁定", diff --git a/lemonldap-ng-manager/site/htdocs/static/struct.json b/lemonldap-ng-manager/site/htdocs/static/struct.json index 0ccdb557b754cc14e6ac16b47d05addb6a33cfa6..6f260e375dae1ac3a1165f86a1a4ca838f0d76b4 100644 --- a/lemonldap-ng-manager/site/htdocs/static/struct.json +++ b/lemonldap-ng-manager/site/htdocs/static/struct.json @@ -1 +1 @@ -[{"_nodes":[{"_nodes":[{"default":"http://auth.example.com/","id":"portal","title":"portal"},{"_nodes":[{"_nodes":[{"default":1,"id":"portalDisplayLogout","title":"portalDisplayLogout","type":"boolOrExpr"},{"default":"$_auth =~ /^(LDAP|DBI|Demo)$/","id":"portalDisplayChangePassword","title":"portalDisplayChangePassword","type":"boolOrExpr"},{"default":1,"id":"portalDisplayAppslist","title":"portalDisplayAppslist","type":"boolOrExpr"},{"default":1,"id":"portalDisplayLoginHistory","title":"portalDisplayLoginHistory","type":"boolOrExpr"},{"default":"$_oidcConsents","id":"portalDisplayOidcConsents","title":"portalDisplayOidcConsents","type":"boolOrExpr"}],"id":"portalModules","title":"portalModules","type":"simpleInputContainer"},{"cnodes":"applicationList","default":[{"data":{"catname":"Default category","type":"category"},"id":"applicationList/default","title":"default","type":"catAndAppList"}],"help":"portalmenu.html#categories-and-applications","id":"applicationList","title":"applicationList","type":"catAndAppList"}],"help":"portalmenu.html","id":"portalMenu","title":"portalMenu"},{"_nodes":[{"default":"common/logos/logo_llng_400px.png","id":"portalMainLogo","title":"portalMainLogo"},{"default":1,"id":"showLanguages","title":"showLanguages","type":"bool"},{"id":"portalCustomCss","title":"portalCustomCss"},{"default":"bootstrap","id":"portalSkin","select":[{"k":"bootstrap","v":"Bootstrap"}],"title":"portalSkin","type":"portalskin"},{"id":"portalSkinBackground","select":[{"k":"","v":"None"},{"k":"1280px-Anse_Source_d'Argent_2-La_Digue.jpg","v":"Anse"},{"k":"1280px-Autumn-clear-water-waterfall-landscape_-_Virginia_-_ForestWander.jpg","v":"Waterfall"},{"k":"1280px-BrockenSnowedTrees.jpg","v":"Snowed Trees"},{"k":"1280px-Cedar_Breaks_National_Monument_partially.jpg","v":"National Monument"},{"k":"1280px-Parry_Peak_from_Winter_Park.jpg","v":"Winter"},{"k":"Aletschgletscher_mit_Pinus_cembra1.jpg","v":"Pinus"}],"title":"portalSkinBackground","type":"portalskinbackground"},{"cnodes":"portalSkinRules","help":"portalcustom.html","id":"portalSkinRules","title":"portalSkinRules","type":"keyTextContainer"},{"_nodes":[{"default":1,"id":"portalCheckLogins","title":"portalCheckLogins","type":"bool"},{"default":0,"id":"portalDisplayResetPassword","title":"portalDisplayResetPassword","type":"bool"},{"default":3,"id":"passwordResetAllowedRetries","title":"passwordResetAllowedRetries","type":"int"},{"default":1,"id":"portalDisplayRegister","title":"portalDisplayRegister","type":"bool"},{"default":0,"id":"portalDisplayCertificateResetByMail","title":"portalDisplayCertificateResetByMail","type":"boolOrExpr"}],"help":"portalcustom.html#buttons","id":"portalButtons","title":"portalButtons","type":"simpleInputContainer"},{"_nodes":[{"default":1,"id":"portalRequireOldPassword","title":"portalRequireOldPassword","type":"boolOrExpr"},{"default":0,"id":"hideOldPassword","title":"hideOldPassword","type":"bool"},{"default":0,"id":"mailOnPasswordChange","title":"mailOnPasswordChange","type":"bool"},{"default":0,"id":"passwordPolicyMinSize","title":"passwordPolicyMinSize","type":"int"},{"default":0,"id":"passwordPolicyMinLower","title":"passwordPolicyMinLower","type":"int"},{"default":0,"id":"passwordPolicyMinUpper","title":"passwordPolicyMinUpper","type":"int"},{"default":0,"id":"passwordPolicyMinDigit","title":"passwordPolicyMinDigit","type":"int"},{"default":0,"id":"passwordPolicyMinSpeChar","title":"passwordPolicyMinSpeChar","type":"int"},{"default":"! @ # $ % & * ( ) - = + [ ] { } ; : , . / ?","id":"passwordPolicySpecialChar","title":"passwordPolicySpecialChar"},{"default":0,"id":"portalDisplayPasswordPolicy","title":"portalDisplayPasswordPolicy","type":"bool"}],"help":"portalcustom.html#password-management","id":"passwordManagement","title":"passwordManagement","type":"simpleInputContainer"},{"_nodes":[{"default":"_user","id":"portalUserAttr","title":"portalUserAttr"},{"default":0,"id":"portalOpenLinkInNewWindow","title":"portalOpenLinkInNewWindow","type":"bool"},{"default":1,"id":"portalAntiFrame","title":"portalAntiFrame","type":"bool"},{"default":60000,"id":"portalPingInterval","title":"portalPingInterval","type":"int"},{"default":1,"id":"portalErrorOnExpiredSession","title":"portalErrorOnExpiredSession","type":"bool"},{"default":0,"id":"portalErrorOnMailNotFound","title":"portalErrorOnMailNotFound","type":"bool"},{"default":1,"id":"portalDisplayRefreshMyRights","title":"portalDisplayRefreshMyRights","type":"bool"}],"help":"portalcustom.html#other-parameters","id":"portalOther","title":"portalOther","type":"simpleInputContainer"}],"help":"portalcustom.html","id":"portalCustomization","title":"portalCustomization"},{"_nodes":[{"default":0,"id":"captcha_login_enabled","title":"captcha_login_enabled","type":"bool"},{"default":1,"id":"captcha_mail_enabled","title":"captcha_mail_enabled","type":"bool"},{"default":1,"id":"captcha_register_enabled","title":"captcha_register_enabled","type":"bool"},{"default":6,"id":"captcha_size","title":"captcha_size","type":"int"}],"help":"captcha.html","id":"portalCaptcha","title":"portalCaptcha","type":"simpleInputContainer"}],"help":"portal.html","id":"portalParams","title":"portalParams"},{"_nodes":[{"default":"Demo","id":"authentication","select":[{"k":"Apache","v":"Apache"},{"k":"AD","v":"Active Directory"},{"k":"DBI","v":"Database (DBI)"},{"k":"Facebook","v":"Facebook"},{"k":"GitHub","v":"GitHub"},{"k":"GPG","v":"GPG"},{"k":"Kerberos","v":"Kerberos"},{"k":"LDAP","v":"LDAP"},{"k":"LinkedIn","v":"LinkedIn"},{"k":"PAM","v":"PAM"},{"k":"Radius","v":"Radius"},{"k":"REST","v":"REST"},{"k":"SSL","v":"SSL"},{"k":"Twitter","v":"Twitter"},{"k":"WebID","v":"WebID"},{"k":"Demo","v":"Demonstration"},{"k":"Choice","v":"authChoice"},{"k":"Combination","v":"combineMods"},{"k":"CAS","v":"Central Authentication Service (CAS)"},{"k":"OpenID","v":"OpenID"},{"k":"OpenIDConnect","v":"OpenID Connect"},{"k":"SAML","v":"SAML v2"},{"k":"Proxy","v":"Proxy"},{"k":"Remote","v":"Remote"},{"k":"Slave","v":"Slave"},{"k":"Null","v":"None"},{"k":"Custom","v":"customModule"}],"title":"authentication","type":"select"},{"default":"Same","id":"userDB","select":[{"k":"Same","v":"Same"},{"k":"AD","v":"Active Directory"},{"k":"DBI","v":"Database (DBI)"},{"k":"LDAP","v":"LDAP"},{"k":"REST","v":"REST"},{"k":"Null","v":"None"},{"k":"Custom","v":"customModule"}],"title":"userDB","type":"select"},{"default":"Demo","id":"passwordDB","select":[{"k":"AD","v":"Active Directory"},{"k":"Choice","v":"authChoice"},{"k":"DBI","v":"Database (DBI)"},{"k":"Demo","v":"Demonstration"},{"k":"LDAP","v":"LDAP"},{"k":"REST","v":"REST"},{"k":"Null","v":"None"},{"k":"Custom","v":"customModule"}],"title":"passwordDB","type":"select"},{"default":"Null","id":"registerDB","select":[{"k":"AD","v":"Active Directory"},{"k":"Demo","v":"Demonstration"},{"k":"LDAP","v":"LDAP"},{"k":"Null","v":"None"},{"k":"Custom","v":"customModule"}],"title":"registerDB","type":"select"}],"_nodes_cond":[{"_nodes":[{"default":0,"id":"ADPwdMaxAge","title":"ADPwdMaxAge","type":"int"},{"default":0,"id":"ADPwdExpireWarning","title":"ADPwdExpireWarning","type":"int"}],"help":"authad.html","id":"adParams","show":false,"title":"adParams","type":"simpleInputContainer"},{"_nodes":[{"default":"lmAuth","id":"authChoiceParam","title":"authChoiceParam"},{"cnodes":"authChoiceModules","id":"authChoiceModules","select":[[{"k":"Apache","v":"Apache"},{"k":"AD","v":"Active Directory"},{"k":"CAS","v":"Central Authentication Service (CAS)"},{"k":"DBI","v":"Database (DBI)"},{"k":"Demo","v":"Demo"},{"k":"Facebook","v":"Facebook"},{"k":"GitHub","v":"GitHub"},{"k":"GPG","v":"GPG"},{"k":"Kerberos","v":"Kerberos"},{"k":"LDAP","v":"LDAP"},{"k":"LinkedIn","v":"LinkedIn"},{"k":"PAM","v":"PAM"},{"k":"Null","v":"None"},{"k":"OpenID","v":"OpenID"},{"k":"OpenIDConnect","v":"OpenID Connect"},{"k":"Proxy","v":"Proxy"},{"k":"Radius","v":"Radius"},{"k":"REST","v":"REST"},{"k":"Remote","v":"Remote"},{"k":"SAML","v":"SAML v2"},{"k":"Slave","v":"Slave"},{"k":"SSL","v":"SSL"},{"k":"Twitter","v":"Twitter"},{"k":"WebID","v":"WebID"},{"k":"Custom","v":"customModule"}],[{"k":"AD","v":"Active Directory"},{"k":"CAS","v":"Central Authentication Service (CAS)"},{"k":"DBI","v":"Database (DBI)"},{"k":"Demo","v":"Demo"},{"k":"Facebook","v":"Facebook"},{"k":"LDAP","v":"LDAP"},{"k":"Null","v":"None"},{"k":"OpenID","v":"OpenID"},{"k":"OpenIDConnect","v":"OpenID Connect"},{"k":"Proxy","v":"Proxy"},{"k":"REST","v":"REST"},{"k":"Remote","v":"Remote"},{"k":"SAML","v":"SAML v2"},{"k":"Slave","v":"Slave"},{"k":"WebID","v":"WebID"},{"k":"Custom","v":"customModule"}],[{"k":"AD","v":"Active Directory"},{"k":"DBI","v":"Database (DBI)"},{"k":"Demo","v":"Demo"},{"k":"LDAP","v":"LDAP"},{"k":"REST","v":"REST"},{"k":"Null","v":"None"},{"k":"Custom","v":"customModule"}]],"title":"authChoiceModules","type":"authChoiceContainer"},{"id":"authChoiceAuthBasic","title":"authChoiceAuthBasic"}],"help":"authchoice.html","id":"choiceParams","show":false,"title":"choiceParams"},{"_nodes":[{"default":3,"id":"apacheAuthnLevel","title":"apacheAuthnLevel","type":"int"}],"help":"authapache.html","id":"apacheParams","show":false,"title":"apacheParams","type":"simpleInputContainer"},{"_nodes":[{"default":1,"id":"casAuthnLevel","title":"casAuthnLevel","type":"int"}],"help":"authcas.html","id":"casParams","show":false,"title":"casParams","type":"simpleInputContainer"},{"_nodes":[{"default":2,"id":"dbiAuthnLevel","title":"dbiAuthnLevel","type":"int"},{"cnodes":"dbiExportedVars","default":[],"id":"dbiExportedVars","title":"dbiExportedVars","type":"keyTextContainer"},{"_nodes":[{"_nodes":[{"id":"dbiAuthChain","title":"dbiAuthChain"},{"id":"dbiAuthUser","title":"dbiAuthUser"},{"id":"dbiAuthPassword","title":"dbiAuthPassword","type":"password"}],"id":"dbiConnectionAuth","title":"dbiConnectionAuth","type":"simpleInputContainer"},{"_nodes":[{"id":"dbiUserChain","title":"dbiUserChain"},{"id":"dbiUserUser","title":"dbiUserUser"},{"id":"dbiUserPassword","title":"dbiUserPassword","type":"password"}],"id":"dbiConnectionUser","title":"dbiConnectionUser","type":"simpleInputContainer"}],"help":"authdbi.html#connection","id":"dbiConnection","title":"dbiConnection"},{"_nodes":[{"id":"dbiAuthTable","title":"dbiAuthTable"},{"id":"dbiUserTable","title":"dbiUserTable"},{"id":"dbiAuthLoginCol","title":"dbiAuthLoginCol"},{"id":"dbiAuthPasswordCol","title":"dbiAuthPasswordCol"},{"id":"dbiPasswordMailCol","title":"dbiPasswordMailCol"},{"id":"userPivot","title":"userPivot"}],"help":"authdbi.html#schema","id":"dbiSchema","title":"dbiSchema","type":"simpleInputContainer"},{"_nodes":[{"help":"authdbi.html#password","id":"dbiAuthPasswordHash","title":"dbiAuthPasswordHash"},{"_nodes":[{"help":"authdbi.html#password","id":"dbiDynamicHashEnabled","title":"dbiDynamicHashEnabled","type":"bool"},{"help":"authdbi.html#password","id":"dbiDynamicHashValidSchemes","title":"dbiDynamicHashValidSchemes"},{"help":"authdbi.html#password","id":"dbiDynamicHashValidSaltedSchemes","title":"dbiDynamicHashValidSaltedSchemes"},{"help":"authdbi.html#password","id":"dbiDynamicHashNewPasswordScheme","title":"dbiDynamicHashNewPasswordScheme"}],"help":"authdbi.html#password","id":"dbiDynamicHash","title":"dbiDynamicHash","type":"simpleInputContainer"}],"help":"authdbi.html#password","id":"dbiPassword","title":"dbiPassword"}],"help":"authdbi.html","id":"dbiParams","show":false,"title":"dbiParams"},{"_nodes":[{"cnodes":"demoExportedVars","default":[{"data":"cn","id":"demoExportedVars/cn","title":"cn","type":"keyText"},{"data":"mail","id":"demoExportedVars/mail","title":"mail","type":"keyText"},{"data":"uid","id":"demoExportedVars/uid","title":"uid","type":"keyText"}],"id":"demoExportedVars","title":"demoExportedVars","type":"keyTextContainer"}],"help":"authdemo.html","id":"demoParams","show":false,"title":"demoParams"},{"_nodes":[{"default":1,"id":"facebookAuthnLevel","title":"facebookAuthnLevel","type":"int"},{"cnodes":"facebookExportedVars","default":[],"id":"facebookExportedVars","title":"facebookExportedVars","type":"keyTextContainer"},{"id":"facebookAppId","title":"facebookAppId"},{"id":"facebookAppSecret","title":"facebookAppSecret"},{"default":"id","id":"facebookUserField","title":"facebookUserField"}],"help":"authfacebook.html","id":"facebookParams","show":false,"title":"facebookParams"},{"_nodes":[{"default":3,"id":"krbAuthnLevel","title":"krbAuthnLevel","type":"int"},{"id":"krbKeytab","title":"krbKeytab"},{"default":0,"id":"krbByJs","title":"krbByJs","type":"bool"},{"default":1,"id":"krbRemoveDomain","title":"krbRemoveDomain","type":"bool"}],"help":"authkerberos.html","id":"kerberosParams","show":false,"title":"kerberosParams","type":"simpleInputContainer"},{"_nodes":[{"default":2,"id":"ldapAuthnLevel","title":"ldapAuthnLevel","type":"int"},{"cnodes":"ldapExportedVars","default":[{"data":"cn","id":"ldapExportedVars/cn","title":"cn","type":"keyText"},{"data":"mail","id":"ldapExportedVars/mail","title":"mail","type":"keyText"},{"data":"uid","id":"ldapExportedVars/uid","title":"uid","type":"keyText"}],"id":"ldapExportedVars","title":"ldapExportedVars","type":"keyTextContainer"},{"_nodes":[{"default":"ldap://localhost","id":"ldapServer","title":"ldapServer"},{"default":389,"id":"ldapPort","title":"ldapPort","type":"int"},{"default":"dc=example,dc=com","id":"ldapBase","title":"ldapBase"},{"default":"","id":"managerDn","title":"managerDn"},{"default":"","id":"managerPassword","title":"managerPassword","type":"password"},{"default":120,"id":"ldapTimeout","title":"ldapTimeout","type":"int"},{"default":3,"id":"ldapVersion","title":"ldapVersion","type":"int"},{"id":"ldapRaw","title":"ldapRaw"}],"help":"authldap.html#connection","id":"ldapConnection","title":"ldapConnection","type":"simpleInputContainer"},{"_nodes":[{"id":"LDAPFilter","title":"LDAPFilter"},{"id":"AuthLDAPFilter","title":"AuthLDAPFilter"},{"id":"mailLDAPFilter","title":"mailLDAPFilter"},{"default":"find","id":"ldapSearchDeref","select":[{"k":"never","v":"never"},{"k":"search","v":"search"},{"k":"find","v":"find"},{"k":"always","v":"always"}],"title":"ldapSearchDeref","type":"select"}],"help":"authldap.html#filters","id":"ldapFilters","title":"ldapFilters","type":"simpleInputContainer"},{"_nodes":[{"id":"ldapGroupBase","title":"ldapGroupBase"},{"default":"groupOfNames","id":"ldapGroupObjectClass","title":"ldapGroupObjectClass"},{"default":"member","id":"ldapGroupAttributeName","title":"ldapGroupAttributeName"},{"default":"dn","id":"ldapGroupAttributeNameUser","title":"ldapGroupAttributeNameUser"},{"default":"cn","id":"ldapGroupAttributeNameSearch","title":"ldapGroupAttributeNameSearch"},{"default":0,"id":"ldapGroupDecodeSearchedValue","title":"ldapGroupDecodeSearchedValue","type":"bool"},{"default":0,"id":"ldapGroupRecursive","title":"ldapGroupRecursive","type":"bool"},{"default":"dn","id":"ldapGroupAttributeNameGroup","title":"ldapGroupAttributeNameGroup"}],"help":"authldap.html#groups","id":"ldapGroups","title":"ldapGroups","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"ldapPpolicyControl","title":"ldapPpolicyControl","type":"bool"},{"default":0,"id":"ldapSetPassword","title":"ldapSetPassword","type":"bool"},{"default":0,"id":"ldapChangePasswordAsUser","title":"ldapChangePasswordAsUser","type":"bool"},{"default":"utf-8","id":"ldapPwdEnc","title":"ldapPwdEnc"},{"default":1,"id":"ldapUsePasswordResetAttribute","title":"ldapUsePasswordResetAttribute","type":"bool"},{"default":"pwdReset","id":"ldapPasswordResetAttribute","title":"ldapPasswordResetAttribute"},{"default":"TRUE","id":"ldapPasswordResetAttributeValue","title":"ldapPasswordResetAttributeValue"},{"default":0,"id":"ldapAllowResetExpiredPassword","title":"ldapAllowResetExpiredPassword","type":"bool"},{"default":0,"id":"ldapITDS","title":"ldapITDS","type":"bool"}],"help":"authldap.html#password","id":"ldapPassword","title":"ldapPassword","type":"simpleInputContainer"}],"help":"authldap.html","id":"ldapParams","show":false,"title":"ldapParams"},{"_nodes":[{"default":1,"id":"linkedInAuthnLevel","title":"linkedInAuthnLevel","type":"int"},{"id":"linkedInClientID","title":"linkedInClientID"},{"id":"linkedInClientSecret","title":"linkedInClientSecret","type":"password"},{"default":"id,first-name,last-name,email-address","id":"linkedInFields","title":"linkedInFields"},{"default":"emailAddress","id":"linkedInUserField","title":"linkedInUserField"},{"default":"r_liteprofile r_emailaddress","id":"linkedInScope","title":"linkedInScope"}],"help":"authlinkedin.html","id":"linkedinParams","show":false,"title":"linkedinParams","type":"simpleInputContainer"},{"_nodes":[{"default":1,"id":"githubAuthnLevel","title":"githubAuthnLevel","type":"int"},{"id":"githubClientID","title":"githubClientID"},{"id":"githubClientSecret","title":"githubClientSecret","type":"password"},{"default":"login","id":"githubUserField","title":"githubUserField"},{"default":"user:email","id":"githubScope","title":"githubScope"}],"help":"authgithub.html","id":"githubParams","show":false,"title":"githubParams","type":"simpleInputContainer"},{"_nodes":[{"id":"combination","title":"combination"},{"cnodes":"combModules","id":"combModules","select":[{"k":"Apache","v":"Apache"},{"k":"AD","v":"Active Directory"},{"k":"DBI","v":"Database (DBI)"},{"k":"Facebook","v":"Facebook"},{"k":"GitHub","v":"GitHub"},{"k":"GPG","v":"GPG"},{"k":"Kerberos","v":"Kerberos"},{"k":"LDAP","v":"LDAP"},{"k":"LinkedIn","v":"LinkedIn"},{"k":"PAM","v":"PAM"},{"k":"Radius","v":"Radius"},{"k":"REST","v":"REST"},{"k":"SSL","v":"SSL"},{"k":"Twitter","v":"Twitter"},{"k":"WebID","v":"WebID"},{"k":"Demo","v":"Demonstration"},{"k":"CAS","v":"Central Authentication Service (CAS)"},{"k":"OpenID","v":"OpenID"},{"k":"OpenIDConnect","v":"OpenID Connect"},{"k":"SAML","v":"SAML v2"},{"k":"Proxy","v":"Proxy"},{"k":"Remote","v":"Remote"},{"k":"Slave","v":"Slave"},{"k":"Null","v":"None"},{"k":"Custom","v":"customModule"}],"title":"combModules","type":"cmbModuleContainer"}],"help":"authcombination.html","id":"combinationParams","show":false,"title":"combinationParams"},{"_nodes":[{"default":0,"id":"nullAuthnLevel","title":"nullAuthnLevel","type":"int"}],"help":"authnull.html","id":"nullParams","show":false,"title":"nullParams","type":"simpleInputContainer"},{"_nodes":[{"default":1,"id":"openIdAuthnLevel","title":"openIdAuthnLevel","type":"int"},{"cnodes":"openIdExportedVars","default":[],"id":"openIdExportedVars","title":"openIdExportedVars","type":"keyTextContainer"},{"id":"openIdSecret","title":"openIdSecret"},{"default":"0;","id":"openIdIDPList","title":"openIdIDPList","type":"blackWhiteList"}],"help":"authopenid.html","id":"openidParams","show":false,"title":"openidParams"},{"_nodes":[{"default":1,"id":"oidcAuthnLevel","title":"oidcAuthnLevel","type":"int"},{"default":"openidconnectcallback","id":"oidcRPCallbackGetParam","title":"oidcRPCallbackGetParam"},{"default":600,"id":"oidcRPStateTimeout","title":"oidcRPStateTimeout","type":"int"}],"help":"authopenidconnect.html","id":"oidcParams","show":false,"title":"oidcParams","type":"simpleInputContainer"},{"_nodes":[{"default":5,"id":"gpgAuthnLevel","title":"gpgAuthnLevel","type":"int"},{"default":"","id":"gpgDb","title":"gpgDb"}],"help":"authgpg.html","id":"gpgParams","show":false,"title":"gpgParams","type":"simpleInputContainer"},{"_nodes":[{"default":2,"id":"proxyAuthnLevel","title":"proxyAuthnLevel","type":"int"},{"id":"proxyAuthService","title":"proxyAuthService"},{"id":"proxySessionService","title":"proxySessionService"},{"id":"remoteCookieName","title":"remoteCookieName"},{"default":0,"id":"proxyUseSoap","title":"proxyUseSoap","type":"bool"}],"help":"authproxy.html","id":"proxyParams","show":false,"title":"proxyParams","type":"simpleInputContainer"},{"_nodes":[{"default":2,"id":"pamAuthnLevel","title":"pamAuthnLevel","type":"int"},{"default":"login","id":"pamService","title":"pamService"}],"help":"authpam.html","id":"pamParams","show":false,"title":"pamParams","type":"simpleInputContainer"},{"_nodes":[{"default":3,"id":"radiusAuthnLevel","title":"radiusAuthnLevel","type":"int"},{"id":"radiusSecret","title":"radiusSecret"},{"id":"radiusServer","title":"radiusServer"}],"help":"authradius.html","id":"radiusParams","show":false,"title":"radiusParams","type":"simpleInputContainer"},{"_nodes":[{"default":2,"id":"restAuthnLevel","title":"restAuthnLevel","type":"int"},{"id":"restAuthUrl","title":"restAuthUrl"},{"id":"restUserDBUrl","title":"restUserDBUrl"},{"id":"restPwdConfirmUrl","title":"restPwdConfirmUrl"},{"id":"restPwdModifyUrl","title":"restPwdModifyUrl"}],"help":"authrest.html","id":"restParams","show":false,"title":"restParams","type":"simpleInputContainer"},{"_nodes":[{"id":"remotePortal","title":"remotePortal"},{"id":"remoteCookieName","title":"remoteCookieName"},{"default":"Lemonldap::NG::Common::Apache::Session::SOAP","id":"remoteGlobalStorage","title":"remoteGlobalStorage"},{"cnodes":"remoteGlobalStorageOptions","default":[{"data":"http://auth.example.com/Lemonldap/NG/Common/PSGI/SOAPService","id":"remoteGlobalStorageOptions/ns","title":"ns","type":"keyText"},{"data":"http://auth.example.com/sessions","id":"remoteGlobalStorageOptions/proxy","title":"proxy","type":"keyText"}],"id":"remoteGlobalStorageOptions","title":"remoteGlobalStorageOptions","type":"keyTextContainer"}],"help":"authremote.html","id":"remoteParams","show":false,"title":"remoteParams"},{"_nodes":[{"default":2,"id":"slaveAuthnLevel","title":"slaveAuthnLevel","type":"int"},{"id":"slaveUserHeader","title":"slaveUserHeader"},{"id":"slaveMasterIP","title":"slaveMasterIP"},{"id":"slaveHeaderName","title":"slaveHeaderName"},{"id":"slaveHeaderContent","title":"slaveHeaderContent"},{"default":0,"id":"slaveDisplayLogo","title":"slaveDisplayLogo","type":"bool"},{"cnodes":"slaveExportedVars","default":[],"id":"slaveExportedVars","title":"slaveExportedVars","type":"keyTextContainer"}],"help":"authslave.html","id":"slaveParams","show":false,"title":"slaveParams"},{"_nodes":[{"default":5,"id":"SSLAuthnLevel","title":"SSLAuthnLevel","type":"int"},{"default":"SSL_CLIENT_S_DN_Email","id":"SSLVar","title":"SSLVar"},{"cnodes":"SSLVarIf","default":[],"id":"SSLVarIf","title":"SSLVarIf","type":"keyTextContainer"},{"default":0,"id":"sslByAjax","title":"sslByAjax","type":"bool"},{"id":"sslHost","title":"sslHost"}],"help":"authssl.html","id":"sslParams","show":false,"title":"sslParams"},{"_nodes":[{"default":1,"id":"twitterAuthnLevel","title":"twitterAuthnLevel","type":"int"},{"id":"twitterKey","title":"twitterKey"},{"id":"twitterSecret","title":"twitterSecret"},{"id":"twitterAppName","title":"twitterAppName"},{"default":"screen_name","id":"twitterUserField","title":"twitterUserField"}],"help":"authtwitter.html","id":"twitterParams","show":false,"title":"twitterParams","type":"simpleInputContainer"},{"_nodes":[{"default":1,"id":"webIDAuthnLevel","title":"webIDAuthnLevel","type":"int"},{"cnodes":"webIDExportedVars","default":[],"id":"webIDExportedVars","title":"webIDExportedVars","type":"keyTextContainer"},{"id":"webIDWhitelist","title":"webIDWhitelist"}],"help":"authwebid.html","id":"webidParams","show":false,"title":"webidParams"},{"_nodes":[{"id":"customAuth","title":"customAuth"},{"id":"customUserDB","title":"customUserDB"},{"id":"customPassword","title":"customPassword"},{"id":"customRegister","title":"customRegister"},{"id":"customResetCertByMail","title":"customResetCertByMail"},{"cnodes":"customAddParams","id":"customAddParams","title":"customAddParams","type":"keyTextContainer"}],"help":"authcustom.html","id":"customParams","show":false,"title":"customParams"}],"_nodes_filter":"authParams","help":"start.html#authentication-users-and-password-databases","id":"authParams","title":"authParams","type":"authParams"},{"_nodes":[{"_nodes":[{"default":0,"id":"issuerDBSAMLActivation","title":"issuerDBSAMLActivation","type":"bool"},{"default":"^/saml/","id":"issuerDBSAMLPath","title":"issuerDBSAMLPath"},{"default":1,"id":"issuerDBSAMLRule","title":"issuerDBSAMLRule","type":"boolOrExpr"}],"help":"idpsaml.html","id":"issuerDBSAML","title":"issuerDBSAML","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"issuerDBCASActivation","title":"issuerDBCASActivation","type":"bool"},{"default":"^/cas/","id":"issuerDBCASPath","title":"issuerDBCASPath"},{"default":1,"id":"issuerDBCASRule","title":"issuerDBCASRule","type":"boolOrExpr"}],"help":"idpcas.html#enabling-cas","id":"issuerDBCAS","title":"issuerDBCAS","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"issuerDBOpenIDActivation","title":"issuerDBOpenIDActivation","type":"bool"},{"default":"^/openidserver/","id":"issuerDBOpenIDPath","title":"issuerDBOpenIDPath"},{"default":1,"id":"issuerDBOpenIDRule","title":"issuerDBOpenIDRule","type":"boolOrExpr"},{"_nodes":[{"id":"openIdIssuerSecret","title":"openIdIssuerSecret"},{"id":"openIdAttr","title":"openIdAttr"},{"default":"0;","id":"openIdSPList","title":"openIdSPList","type":"blackWhiteList"},{"_nodes":[{"default":"cn","id":"openIdSreg_fullname","title":"openIdSreg_fullname"},{"default":"uid","id":"openIdSreg_nickname","title":"openIdSreg_nickname"},{"id":"openIdSreg_language","title":"openIdSreg_language"},{"id":"openIdSreg_postcode","title":"openIdSreg_postcode"},{"default":"_timezone","id":"openIdSreg_timezone","title":"openIdSreg_timezone"},{"id":"openIdSreg_country","title":"openIdSreg_country"},{"id":"openIdSreg_gender","title":"openIdSreg_gender"},{"default":"mail","id":"openIdSreg_email","title":"openIdSreg_email"},{"id":"openIdSreg_dob","title":"openIdSreg_dob"}],"id":"openIdSreg","title":"openIdSreg","type":"simpleInputContainer"}],"id":"issuerDBOpenIDOptions","title":"issuerDBOpenIDOptions"}],"help":"idpopenid.html","id":"issuerDBOpenID","title":"issuerDBOpenID"},{"_nodes":[{"default":0,"id":"issuerDBOpenIDConnectActivation","title":"issuerDBOpenIDConnectActivation","type":"bool"},{"default":"^/oauth2/","id":"issuerDBOpenIDConnectPath","title":"issuerDBOpenIDConnectPath"},{"default":1,"id":"issuerDBOpenIDConnectRule","title":"issuerDBOpenIDConnectRule","type":"boolOrExpr"}],"help":"idpopenidconnect.html","id":"issuerDBOpenIDConnect","title":"issuerDBOpenIDConnect","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"issuerDBGetActivation","title":"issuerDBGetActivation","type":"bool"},{"default":"^/get/","id":"issuerDBGetPath","title":"issuerDBGetPath"},{"default":1,"id":"issuerDBGetRule","title":"issuerDBGetRule","type":"boolOrExpr"},{"default":[],"id":"issuerDBGetParameters","title":"issuerDBGetParameters","type":"doubleHash"}],"help":"issuerdbget.html","id":"issuerDBGet","title":"issuerDBGet"},{"_nodes":[{"default":120,"id":"issuersTimeout","title":"issuersTimeout","type":"int"}],"help":"start.html#options","id":"issuerOptions","title":"issuerOptions","type":"simpleInputContainer"}],"help":"start.html#identity-provider","id":"issuerParams","title":"issuerParams"},{"_nodes":[{"default":"uid","id":"whatToTrace","title":"whatToTrace"},{"id":"customToTrace","title":"customToTrace"},{"default":"_password _2fDevices","id":"hiddenAttributes","title":"hiddenAttributes"}],"help":"logs.html","id":"logParams","title":"logParams","type":"simpleInputContainer"},{"_nodes":[{"default":"lemonldap","id":"cookieName","title":"cookieName"},{"default":"example.com","id":"domain","title":"domain"},{"default":0,"id":"cda","title":"cda","type":"bool"},{"default":0,"id":"securedCookie","select":[{"k":"0","v":"unsecuredCookie"},{"k":"1","v":"securedCookie"},{"k":"2","v":"doubleCookie"},{"k":"3","v":"doubleCookieForSingleSession"}],"title":"securedCookie","type":"select"},{"default":1,"id":"httpOnly","title":"httpOnly","type":"bool"},{"id":"cookieExpiration","title":"cookieExpiration","type":"int"},{"default":"None","id":"sameSite","select":[{"k":"Strict","v":"Strict"},{"k":"Lax","v":"Lax"},{"k":"None","v":"None"}],"title":"sameSite","type":"select"}],"help":"ssocookie.html","id":"cookieParams","title":"cookieParams","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"storePassword","title":"storePassword","type":"bool"},{"default":72000,"id":"timeout","title":"timeout","type":"int"},{"default":0,"id":"timeoutActivity","title":"timeoutActivity","type":"int"},{"default":60,"id":"timeoutActivityInterval","title":"timeoutActivityInterval","type":"int"},{"cnodes":"grantSessionRules","default":[],"id":"grantSessionRules","title":"grantSessionRules","type":"grantContainer"},{"_nodes":[{"default":"Apache::Session::File","id":"globalStorage","title":"globalStorage"},{"cnodes":"globalStorageOptions","default":[{"data":"/var/lib/lemonldap-ng/sessions/","id":"globalStorageOptions/Directory","title":"Directory","type":"keyText"},{"data":"/var/lib/lemonldap-ng/sessions/lock/","id":"globalStorageOptions/LockDirectory","title":"LockDirectory","type":"keyText"},{"data":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256","id":"globalStorageOptions/generateModule","title":"generateModule","type":"keyText"}],"id":"globalStorageOptions","title":"globalStorageOptions","type":"keyTextContainer"},{"default":"Cache::FileCache","id":"localSessionStorage","title":"localSessionStorage"},{"cnodes":"localSessionStorageOptions","default":[{"data":3,"id":"localSessionStorageOptions/cache_depth","title":"cache_depth","type":"keyText"},{"data":"/tmp","id":"localSessionStorageOptions/cache_root","title":"cache_root","type":"keyText"},{"data":600,"id":"localSessionStorageOptions/default_expires_in","title":"default_expires_in","type":"keyText"},{"data":"007","id":"localSessionStorageOptions/directory_umask","title":"directory_umask","type":"keyText"},{"data":"lemonldap-ng-sessions","id":"localSessionStorageOptions/namespace","title":"namespace","type":"keyText"}],"id":"localSessionStorageOptions","title":"localSessionStorageOptions","type":"keyTextContainer"}],"help":"start.html#sessions-database","id":"sessionStorage","title":"sessionStorage"},{"_nodes":[{"default":0,"id":"singleSession","title":"singleSession","type":"boolOrExpr"},{"default":0,"id":"singleIP","title":"singleIP","type":"boolOrExpr"},{"default":0,"id":"singleUserByIP","title":"singleUserByIP","type":"boolOrExpr"},{"default":1,"id":"notifyDeleted","title":"notifyDeleted","type":"bool"},{"default":0,"id":"notifyOther","title":"notifyOther","type":"bool"}],"id":"multipleSessions","title":"multipleSessions","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"disablePersistentStorage","title":"disablePersistentStorage","type":"bool"},{"id":"persistentStorage","title":"persistentStorage"},{"cnodes":"persistentStorageOptions","id":"persistentStorageOptions","title":"persistentStorageOptions","type":"keyTextContainer"}],"id":"persistentSessions","title":"persistentSessions"}],"help":"sessions.html","id":"sessionParams","title":"sessionParams"},{"_nodes":[{"default":5,"id":"reloadTimeout","title":"reloadTimeout","type":"int"},{"default":0,"id":"compactConf","title":"compactConf","type":"bool"},{"cnodes":"reloadUrls","help":"configlocation.html#configuration-reload","id":"reloadUrls","title":"reloadUrls","type":"keyTextContainer"}],"help":"configlocation.html#configuration-reload","id":"reloadParams","title":"reloadParams"},{"_nodes":[{"default":0,"id":"stayConnected","title":"stayConnected","type":"bool"},{"default":0,"help":"status.html","id":"portalStatus","title":"portalStatus","type":"bool"},{"default":1,"id":"upgradeSession","title":"upgradeSession","type":"bool"},{"id":"refreshSessions","title":"refreshSessions","type":"bool"},{"_nodes":[{"default":0,"id":"wsdlServer","title":"wsdlServer","type":"bool"},{"default":0,"id":"restExportSecretKeys","title":"restExportSecretKeys","type":"bool"},{"default":15,"id":"restClockTolerance","title":"restClockTolerance","type":"int"},{"default":0,"id":"restSessionServer","title":"restSessionServer","type":"bool"},{"default":0,"id":"restConfigServer","title":"restConfigServer","type":"bool"},{"default":0,"id":"restAuthServer","title":"restAuthServer","type":"bool"},{"default":0,"id":"restPasswordServer","title":"restPasswordServer","type":"bool"},{"default":0,"help":"soapservices.html","id":"soapSessionServer","title":"soapSessionServer","type":"bool"},{"default":0,"help":"soapservices.html","id":"soapConfigServer","title":"soapConfigServer","type":"bool"},{"id":"exportedAttr","title":"exportedAttr"}],"help":"portalservers.html","id":"portalServers","title":"portalServers","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"loginHistoryEnabled","title":"loginHistoryEnabled","type":"bool"},{"default":5,"id":"successLoginNumber","title":"successLoginNumber","type":"int"},{"default":5,"id":"failedLoginNumber","title":"failedLoginNumber","type":"int"},{"cnodes":"sessionDataToRemember","id":"sessionDataToRemember","title":"sessionDataToRemember","type":"keyTextContainer"}],"help":"loginhistory.html","id":"loginHistory","title":"loginHistory"},{"_nodes":[{"default":0,"id":"notification","title":"notification","type":"bool"},{"default":0,"id":"notificationsExplorer","title":"notificationsExplorer","type":"bool"},{"default":"allusers","id":"notificationWildcard","title":"notificationWildcard"},{"default":0,"id":"oldNotifFormat","title":"oldNotifFormat","type":"bool"},{"id":"notificationXSLTfile","title":"notificationXSLTfile"},{"default":"File","id":"notificationStorage","title":"notificationStorage"},{"cnodes":"notificationStorageOptions","default":[{"data":"/var/lib/lemonldap-ng/notifications","id":"notificationStorageOptions/dirName","title":"dirName","type":"keyText"}],"id":"notificationStorageOptions","title":"notificationStorageOptions","type":"keyTextContainer"},{"_nodes":[{"default":0,"id":"notificationServer","title":"notificationServer","type":"bool"},{"default":"","id":"notificationDefaultCond","title":"notificationDefaultCond"},{"default":"uid reference date title subtitle text check","id":"notificationServerSentAttributes","title":"notificationServerSentAttributes"},{"_nodes":[{"default":1,"id":"notificationServerPOST","title":"notificationServerPOST","type":"bool"},{"default":0,"id":"notificationServerGET","title":"notificationServerGET","type":"bool"},{"default":0,"id":"notificationServerDELETE","title":"notificationServerDELETE","type":"bool"}],"id":"notificationServerMethods","title":"notificationServerMethods","type":"simpleInputContainer"}],"help":"notifications.html#notification-server","id":"serverNotification","title":"serverNotification"}],"help":"notifications.html","id":"notifications","title":"notifications"},{"_nodes":[{"_nodes":[{"id":"mailSubject","title":"mailSubject"},{"id":"mailBody","title":"mailBody","type":"longtext"},{"id":"mailConfirmSubject","title":"mailConfirmSubject"},{"id":"mailConfirmBody","title":"mailConfirmBody","type":"longtext"}],"id":"mailContent","title":"mailContent","type":"simpleInputContainer"},{"_nodes":[{"default":"http://auth.example.com/resetpwd","id":"mailUrl","title":"mailUrl"},{"default":0,"id":"mailTimeout","title":"mailTimeout","type":"int"},{"default":1,"id":"portalDisplayGeneratePassword","title":"portalDisplayGeneratePassword","type":"bool"},{"default":"[A-Z]{3}[a-z]{5}.\\d{2}","id":"randomPasswordRegexp","title":"randomPasswordRegexp"}],"id":"mailOther","title":"mailOther","type":"simpleInputContainer"}],"help":"resetpassword.html","id":"passwordManagement","title":"passwordManagement"},{"_nodes":[{"_nodes":[{"id":"certificateResetByMailStep1Subject","title":"certificateResetByMailStep1Subject"},{"id":"certificateResetByMailStep1Body","title":"certificateResetByMailStep1Body","type":"longtext"},{"id":"certificateResetByMailStep2Subject","title":"certificateResetByMailStep2Subject"},{"id":"certificateResetByMailStep2Body","title":"certificateResetByMailStep2Body","type":"longtext"}],"id":"certificateMailContent","title":"certificateMailContent","type":"simpleInputContainer"},{"_nodes":[{"default":"http://auth.example.com/certificateReset","id":"certificateResetByMailURL","title":"certificateResetByMailURL"},{"default":"description","id":"certificateResetByMailCeaAttribute","title":"certificateResetByMailCeaAttribute"},{"default":"userCertificate;binary","id":"certificateResetByMailCertificateAttribute","title":"certificateResetByMailCertificateAttribute"},{"default":0,"id":"certificateResetByMailValidityDelay","title":"certificateResetByMailValidityDelay","type":"int"}],"id":"mailOther","title":"mailOther","type":"simpleInputContainer"}],"help":"resetcertificate.html","id":"certificateResetByMailManagement","title":"certificateResetByMailManagement"},{"_nodes":[{"default":"http://auth.example.com/register","id":"registerUrl","title":"registerUrl"},{"default":0,"id":"registerTimeout","title":"registerTimeout","type":"int"},{"id":"registerConfirmSubject","title":"registerConfirmSubject"},{"id":"registerDoneSubject","title":"registerDoneSubject"}],"help":"register.html","id":"register","title":"register","type":"simpleInputContainer"},{"_nodes":[{"cnodes":"autoSigninRules","id":"autoSigninRules","title":"autoSigninRules","type":"keyTextContainer"}],"help":"autosignin.html","id":"autoSignin","title":"autoSignin"},{"_nodes":[{"default":0,"id":"globalLogoutRule","title":"globalLogoutRule","type":"boolOrExpr"},{"default":1,"id":"globalLogoutTimer","title":"globalLogoutTimer","type":"bool"},{"id":"globalLogoutCustomParam","title":"globalLogoutCustomParam"}],"help":"globallogout.html","id":"globalLogout","title":"globalLogout","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"checkState","title":"checkState","type":"bool"},{"id":"checkStateSecret","title":"checkStateSecret"}],"help":"checkstate.html","id":"stateCheck","title":"stateCheck","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"checkUser","title":"checkUser","type":"bool"},{"default":1,"id":"checkUserIdRule","title":"checkUserIdRule"},{"id":"checkUserUnrestrictedUsersRule","title":"checkUserUnrestrictedUsersRule"},{"default":"_loginHistory _session_id hGroups","id":"checkUserHiddenAttributes","title":"checkUserHiddenAttributes"},{"id":"checkUserSearchAttributes","title":"checkUserSearchAttributes"},{"default":0,"id":"checkUserDisplayEmptyHeaders","title":"checkUserDisplayEmptyHeaders","type":"boolOrExpr"},{"default":0,"id":"checkUserDisplayEmptyValues","title":"checkUserDisplayEmptyValues","type":"boolOrExpr"},{"default":0,"id":"checkUserDisplayPersistentInfo","title":"checkUserDisplayPersistentInfo","type":"boolOrExpr"}],"help":"checkuser.html","id":"checkUsers","title":"checkUsers","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"impersonationRule","title":"impersonationRule","type":"boolOrExpr"},{"default":1,"id":"impersonationIdRule","title":"impersonationIdRule"},{"id":"impersonationUnrestrictedUsersRule","title":"impersonationUnrestrictedUsersRule"},{"default":"_2fDevices _loginHistory","id":"impersonationHiddenAttributes","title":"impersonationHiddenAttributes"},{"default":1,"id":"impersonationSkipEmptyValues","title":"impersonationSkipEmptyValues","type":"bool"},{"default":0,"id":"impersonationMergeSSOgroups","title":"impersonationMergeSSOgroups","type":"boolOrExpr"}],"help":"impersonation.html","id":"impersonation","title":"impersonation","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"contextSwitchingRule","title":"contextSwitchingRule","type":"boolOrExpr"},{"default":1,"id":"contextSwitchingIdRule","title":"contextSwitchingIdRule"},{"id":"contextSwitchingUnrestrictedUsersRule","title":"contextSwitchingUnrestrictedUsersRule"},{"default":1,"id":"contextSwitchingStopWithLogout","title":"contextSwitchingStopWithLogout","type":"bool"}],"help":"contextswitching.html","id":"contextSwitching","title":"contextSwitching","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"decryptValueRule","title":"decryptValueRule","type":"boolOrExpr"},{"id":"decryptValueFunctions","title":"decryptValueFunctions"}],"help":"decryptvalue.html","id":"decryptValue","title":"decryptValue","type":"simpleInputContainer"},{"_nodes":[{"id":"customPlugins","title":"customPlugins"},{"cnodes":"customPluginsParams","id":"customPluginsParams","title":"customPluginsParams","type":"keyTextContainer"}],"help":"plugincustom.html","id":"customPluginsNode","title":"customPluginsNode"}],"help":"start.html#plugins","id":"plugins","title":"plugins"},{"_nodes":[{"_nodes":[{"default":0,"id":"utotp2fActivation","title":"utotp2fActivation","type":"boolOrExpr"},{"id":"utotp2fAuthnLevel","title":"utotp2fAuthnLevel","type":"int"},{"id":"utotp2fLabel","title":"utotp2fLabel"},{"id":"utotp2fLogo","title":"utotp2fLogo"}],"help":"utotp2f.html","id":"utotp2f","title":"utotp2f","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"totp2fActivation","title":"totp2fActivation","type":"boolOrExpr"},{"default":0,"id":"totp2fSelfRegistration","title":"totp2fSelfRegistration","type":"boolOrExpr"},{"id":"totp2fIssuer","title":"totp2fIssuer"},{"default":30,"id":"totp2fInterval","title":"totp2fInterval","type":"int"},{"default":1,"id":"totp2fRange","title":"totp2fRange","type":"int"},{"default":6,"id":"totp2fDigits","title":"totp2fDigits","type":"int"},{"default":0,"id":"totp2fDisplayExistingSecret","title":"totp2fDisplayExistingSecret","type":"bool"},{"default":0,"id":"totp2fUserCanChangeKey","title":"totp2fUserCanChangeKey","type":"bool"},{"default":1,"id":"totp2fUserCanRemoveKey","title":"totp2fUserCanRemoveKey","type":"bool"},{"id":"totp2fTTL","title":"totp2fTTL","type":"int"},{"id":"totp2fAuthnLevel","title":"totp2fAuthnLevel","type":"int"},{"id":"totp2fLabel","title":"totp2fLabel"},{"id":"totp2fLogo","title":"totp2fLogo"}],"help":"totp2f.html","id":"totp2f","title":"totp2f","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"u2fActivation","title":"u2fActivation","type":"boolOrExpr"},{"default":0,"id":"u2fSelfRegistration","title":"u2fSelfRegistration","type":"boolOrExpr"},{"default":1,"id":"u2fUserCanRemoveKey","title":"u2fUserCanRemoveKey","type":"bool"},{"id":"u2fTTL","title":"u2fTTL","type":"int"},{"id":"u2fAuthnLevel","title":"u2fAuthnLevel","type":"int"},{"id":"u2fLabel","title":"u2fLabel"},{"id":"u2fLogo","title":"u2fLogo"}],"help":"u2f.html","id":"u2f","title":"u2f","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"yubikey2fActivation","title":"yubikey2fActivation","type":"boolOrExpr"},{"default":0,"id":"yubikey2fSelfRegistration","title":"yubikey2fSelfRegistration","type":"boolOrExpr"},{"id":"yubikey2fClientID","title":"yubikey2fClientID"},{"id":"yubikey2fSecretKey","title":"yubikey2fSecretKey"},{"id":"yubikey2fNonce","title":"yubikey2fNonce"},{"id":"yubikey2fUrl","title":"yubikey2fUrl"},{"default":12,"id":"yubikey2fPublicIDSize","title":"yubikey2fPublicIDSize","type":"int"},{"default":1,"id":"yubikey2fUserCanRemoveKey","title":"yubikey2fUserCanRemoveKey","type":"bool"},{"id":"yubikey2fFromSessionAttribute","title":"yubikey2fFromSessionAttribute"},{"id":"yubikey2fTTL","title":"yubikey2fTTL","type":"int"},{"id":"yubikey2fAuthnLevel","title":"yubikey2fAuthnLevel","type":"int"},{"id":"yubikey2fLabel","title":"yubikey2fLabel"},{"id":"yubikey2fLogo","title":"yubikey2fLogo"}],"help":"yubikey2f.html","id":"yubikey2f","title":"yubikey2f","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"mail2fActivation","title":"mail2fActivation","type":"boolOrExpr"},{"default":"\\d{6}","id":"mail2fCodeRegex","title":"mail2fCodeRegex"},{"id":"mail2fTimeout","title":"mail2fTimeout","type":"int"},{"id":"mail2fSubject","title":"mail2fSubject"},{"id":"mail2fBody","title":"mail2fBody","type":"longtext"},{"id":"mail2fAuthnLevel","title":"mail2fAuthnLevel","type":"int"},{"id":"mail2fLabel","title":"mail2fLabel"},{"id":"mail2fLogo","title":"mail2fLogo"}],"help":"mail2f.html","id":"mail2f","title":"mail2f","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"ext2fActivation","title":"ext2fActivation","type":"boolOrExpr"},{"default":"\\d{6}","id":"ext2fCodeActivation","title":"ext2fCodeActivation"},{"id":"ext2FSendCommand","title":"ext2FSendCommand"},{"id":"ext2FValidateCommand","title":"ext2FValidateCommand"},{"id":"ext2fAuthnLevel","title":"ext2fAuthnLevel","type":"int"},{"id":"ext2fLabel","title":"ext2fLabel"},{"id":"ext2fLogo","title":"ext2fLogo"}],"help":"external2f.html","id":"ext2f","title":"ext2f","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"radius2fActivation","title":"radius2fActivation","type":"boolOrExpr"},{"id":"radius2fServer","title":"radius2fServer"},{"id":"radius2fSecret","title":"radius2fSecret"},{"id":"radius2fUsernameSessionKey","title":"radius2fUsernameSessionKey"},{"default":20,"id":"radius2fTimeout","title":"radius2fTimeout","type":"int"},{"id":"radius2fAuthnLevel","title":"radius2fAuthnLevel","type":"int"},{"id":"radius2fLogo","title":"radius2fLogo"},{"id":"radius2fLabel","title":"radius2fLabel"}],"help":"radius2f.html","id":"radius2f","title":"radius2f","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"rest2fActivation","title":"rest2fActivation","type":"boolOrExpr"},{"id":"rest2fInitUrl","title":"rest2fInitUrl"},{"cnodes":"rest2fInitArgs","id":"rest2fInitArgs","title":"rest2fInitArgs","type":"keyTextContainer"},{"id":"rest2fVerifyUrl","title":"rest2fVerifyUrl"},{"cnodes":"rest2fVerifyArgs","id":"rest2fVerifyArgs","title":"rest2fVerifyArgs","type":"keyTextContainer"},{"id":"rest2fAuthnLevel","title":"rest2fAuthnLevel","type":"int"},{"id":"rest2fLabel","title":"rest2fLabel"},{"id":"rest2fLogo","title":"rest2fLogo"}],"help":"rest2f.html","id":"rest2f","title":"rest2f"},{"cnodes":"sfExtra","id":"sfExtra","select":[{"k":"Mail2F","v":"E-Mail"},{"k":"REST","v":"REST"},{"k":"Ext2F","v":"External"},{"k":"Radius","v":"Radius"}],"title":"sfExtra","type":"sfExtraContainer"},{"_nodes":[{"default":0,"help":"secondfactor.html","id":"sfRemovedMsgRule","title":"sfRemovedMsgRule","type":"boolOrExpr"},{"default":0,"id":"sfRemovedUseNotif","title":"sfRemovedUseNotif","type":"bool"},{"default":"RemoveSF","help":"secondfactor.html","id":"sfRemovedNotifRef","title":"sfRemovedNotifRef"},{"default":"Second factor notification","help":"secondfactor.html","id":"sfRemovedNotifTitle","title":"sfRemovedNotifTitle"},{"default":"_removedSF_ expired second factor(s) has/have been removed!","help":"secondfactor.html","id":"sfRemovedNotifMsg","title":"sfRemovedNotifMsg"}],"help":"secondfactor.html","id":"sfRemovedNotification","title":"sfRemovedNotification","type":"simpleInputContainer"},{"default":1,"help":"secondfactor.html","id":"sfManagerRule","title":"sfManagerRule","type":"boolOrExpr"},{"default":0,"help":"secondfactor.html","id":"sfRequired","title":"sfRequired","type":"boolOrExpr"}],"help":"secondfactor.html","id":"secondFactors","title":"secondFactors"},{"_nodes":[{"help":"customfunctions.html","id":"customFunctions","title":"customFunctions"},{"default":"; ","id":"multiValuesSeparator","title":"multiValuesSeparator","type":"authParamsText"},{"default":0,"id":"groupsBeforeMacros","title":"groupsBeforeMacros","type":"bool"},{"_nodes":[{"default":"mail","id":"mailSessionKey","title":"mailSessionKey"},{"default":"","id":"SMTPServer","title":"SMTPServer"},{"id":"SMTPPort","title":"SMTPPort","type":"int"},{"id":"SMTPAuthUser","title":"SMTPAuthUser"},{"id":"SMTPAuthPass","title":"SMTPAuthPass","type":"password"},{"default":"","id":"SMTPTLS","select":[{"k":"","v":"none"},{"k":"starttls","v":"SMTP + STARTTLS"},{"k":"ssl","v":"SMTPS"}],"title":"SMTPTLS","type":"select"},{"cnodes":"SMTPTLSOpts","id":"SMTPTLSOpts","title":"SMTPTLSOpts","type":"keyTextContainer"},{"_nodes":[{"default":"noreply@example.com","id":"mailFrom","title":"mailFrom"},{"id":"mailReplyTo","title":"mailReplyTo"},{"default":"utf-8","id":"mailCharset","title":"mailCharset"}],"id":"mailHeaders","title":"mailHeaders","type":"simpleInputContainer"}],"help":"smtp.html","id":"SMTP","title":"SMTP"},{"_nodes":[{"default":"^[\\w\\.\\-@]+$","id":"userControl","title":"userControl"},{"default":0,"id":"browsersDontStorePassword","title":"browsersDontStorePassword","type":"bool"},{"default":0,"help":"forcereauthn.html","id":"portalForceAuthn","title":"portalForceAuthn","type":"bool"},{"default":5,"id":"portalForceAuthnInterval","title":"portalForceAuthnInterval","type":"int"},{"id":"key","title":"key","type":"password"},{"id":"trustedDomains","title":"trustedDomains"},{"default":1,"help":"safejail.html","id":"useSafeJail","title":"useSafeJail","type":"bool"},{"default":1,"id":"checkXSS","title":"checkXSS","type":"bool"},{"default":1,"id":"requireToken","title":"requireToken","type":"boolOrExpr"},{"default":120,"id":"formTimeout","title":"formTimeout","type":"int"},{"default":0,"id":"tokenUseGlobalStorage","title":"tokenUseGlobalStorage","type":"bool"},{"_nodes":[{"default":0,"help":"bruteforceprotection.html","id":"bruteForceProtection","title":"bruteForceProtection","type":"bool"},{"default":0,"help":"bruteforceprotection.html","id":"bruteForceProtectionIncrementalTempo","title":"bruteForceProtectionIncrementalTempo","type":"bool"}],"help":"bruteforceprotection.html","id":"bruteForceAttackProtection","title":"bruteForceAttackProtection","type":"simpleInputContainer"},{"cnodes":"lwpOpts","id":"lwpOpts","title":"lwpOpts","type":"keyTextContainer"},{"cnodes":"lwpSslOpts","id":"lwpSslOpts","title":"lwpSslOpts","type":"keyTextContainer"},{"_nodes":[{"default":"'self'","id":"cspDefault","title":"cspDefault"},{"default":"'self' data:","id":"cspImg","title":"cspImg"},{"default":"'self'","id":"cspScript","title":"cspScript"},{"default":"'self'","id":"cspStyle","title":"cspStyle"},{"default":"'self'","id":"cspFont","title":"cspFont"},{"default":"*","id":"cspFormAction","title":"cspFormAction"},{"default":"'self'","id":"cspConnect","title":"cspConnect"},{"default":"","id":"cspFrameAncestors","title":"cspFrameAncestors"}],"help":"security.html#portal","id":"contentSecurityPolicy","title":"contentSecurityPolicy","type":"simpleInputContainer"},{"_nodes":[{"default":1,"id":"corsEnabled","title":"corsEnabled","type":"bool"},{"default":true,"id":"corsAllow_Credentials","title":"corsAllow_Credentials"},{"default":"*","id":"corsAllow_Headers","title":"corsAllow_Headers"},{"default":"POST,GET","id":"corsAllow_Methods","title":"corsAllow_Methods"},{"default":"*","id":"corsAllow_Origin","title":"corsAllow_Origin"},{"default":"*","id":"corsExpose_Headers","title":"corsExpose_Headers"},{"default":"86400","id":"corsMax_Age","title":"corsMax_Age"}],"help":"security.html#portal","id":"crossOrigineResourceSharing","title":"crossOrigineResourceSharing","type":"simpleInputContainer"}],"help":"security.html#configure-security-settings","id":"security","title":"security"},{"_nodes":[{"default":-1,"id":"https","title":"https","type":"trool"},{"default":-1,"id":"port","title":"port","type":"int"},{"default":0,"id":"useRedirectOnForbidden","title":"useRedirectOnForbidden","type":"bool"},{"default":1,"id":"useRedirectOnError","title":"useRedirectOnError","type":"bool"},{"default":0,"id":"maintenance","title":"maintenance","type":"bool"}],"help":"redirections.html","id":"redirection","title":"redirection","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"jsRedirect","title":"jsRedirect","type":"boolOrExpr"},{"default":0,"id":"noAjaxHook","title":"noAjaxHook","type":"bool"},{"default":0,"id":"skipRenewConfirmation","title":"skipRenewConfirmation","type":"bool"}],"help":"redirections.html#portal-redirections","id":"portalRedirection","title":"portalRedirection","type":"simpleInputContainer"},{"cnodes":"nginxCustomHandlers","help":"handlerarch.html","id":"nginxCustomHandlers","title":"nginxCustomHandlers","type":"keyTextContainer"},{"cnodes":"logoutServices","default":[],"help":"logoutforward.html","id":"logoutServices","title":"logoutServices","type":"keyTextContainer"},{"_nodes":[{"default":"get","id":"infoFormMethod","select":[{"k":"get","v":"GET"},{"k":"post","v":"POST"}],"title":"infoFormMethod","type":"select"},{"default":"post","id":"confirmFormMethod","select":[{"k":"get","v":"GET"},{"k":"post","v":"POST"}],"title":"confirmFormMethod","type":"select"},{"default":"get","id":"redirectFormMethod","select":[{"k":"get","v":"GET"},{"k":"post","v":"POST"}],"title":"redirectFormMethod","type":"select"},{"default":1,"id":"activeTimer","title":"activeTimer","type":"bool"}],"id":"forms","title":"forms","type":"simpleInputContainer"}],"help":"start.html#advanced-features","id":"advancedParams","title":"advancedParams"}],"id":"generalParameters","title":"generalParameters"},{"_nodes":[{"cnodes":"exportedVars","default":[{"data":"HTTP_USER_AGENT","id":"exportedVars/UA","title":"UA","type":"keyText"}],"help":"exportedvars.html","id":"exportedVars","title":"exportedVars","type":"keyTextContainer"},{"cnodes":"macros","default":[],"help":"exportedvars.html#extend-variables-using-macros-and-groups","id":"macros","title":"macros","type":"keyTextContainer"},{"cnodes":"groups","default":[],"help":"exportedvars.html#extend-variables-using-macros-and-groups","id":"groups","title":"groups","type":"keyTextContainer"}],"help":"variables.html","id":"variables","title":"variables"},{"cnodes":"virtualHosts","help":"configvhost.html","id":"virtualHosts","template":"virtualHost","title":"virtualHosts","type":"virtualHostContainer"},{"_nodes":[{"default":"#PORTAL#/saml/metadata","id":"samlEntityID","title":"samlEntityID"},{"_nodes":[{"get":["samlServicePrivateKeySig","samlServicePrivateKeySigPwd","samlServicePublicKeySig"],"id":"samlServiceSecuritySig","title":"samlServiceSecuritySig","type":"RSAKey"},{"get":["samlServicePrivateKeyEnc","samlServicePrivateKeyEncPwd","samlServicePublicKeyEnc"],"id":"samlServiceSecurityEnc","title":"samlServiceSecurityEnc","type":"RSAKey"},{"default":0,"id":"samlServiceUseCertificateInResponse","title":"samlServiceUseCertificateInResponse","type":"bool"},{"default":"RSA_SHA1","id":"samlServiceSignatureMethod","select":[{"k":"RSA_SHA1","v":"RSA SHA1"},{"k":"RSA_SHA256","v":"RSA SHA256"}],"title":"samlServiceSignatureMethod","type":"select"}],"help":"samlservice.html#security-parameters","id":"samlServiceSecurity","title":"samlServiceSecurity"},{"_nodes":[{"default":"mail","id":"samlNameIDFormatMapEmail","title":"samlNameIDFormatMapEmail"},{"default":"mail","id":"samlNameIDFormatMapX509","title":"samlNameIDFormatMapX509"},{"default":"uid","id":"samlNameIDFormatMapWindows","title":"samlNameIDFormatMapWindows"},{"default":"uid","id":"samlNameIDFormatMapKerberos","title":"samlNameIDFormatMapKerberos"}],"help":"samlservice.html#nameid-formats","id":"samlNameIDFormatMap","title":"samlNameIDFormatMap","type":"simpleInputContainer"},{"_nodes":[{"default":2,"id":"samlAuthnContextMapPassword","title":"samlAuthnContextMapPassword","type":"int"},{"default":3,"id":"samlAuthnContextMapPasswordProtectedTransport","title":"samlAuthnContextMapPasswordProtectedTransport","type":"int"},{"default":5,"id":"samlAuthnContextMapTLSClient","title":"samlAuthnContextMapTLSClient","type":"int"},{"default":4,"id":"samlAuthnContextMapKerberos","title":"samlAuthnContextMapKerberos","type":"int"}],"help":"samlservice.html#authentication-contexts","id":"samlAuthnContextMap","title":"samlAuthnContextMap","type":"simpleInputContainer"},{"_nodes":[{"default":"Example","id":"samlOrganizationDisplayName","title":"samlOrganizationDisplayName"},{"default":"Example","id":"samlOrganizationName","title":"samlOrganizationName"},{"default":"http://www.example.com","id":"samlOrganizationURL","title":"samlOrganizationURL"}],"help":"samlservice.html#organization","id":"samlOrganization","title":"samlOrganization","type":"simpleInputContainer"},{"_nodes":[{"default":1,"id":"samlSPSSODescriptorAuthnRequestsSigned","title":"samlSPSSODescriptorAuthnRequestsSigned","type":"bool"},{"default":1,"id":"samlSPSSODescriptorWantAssertionsSigned","title":"samlSPSSODescriptorWantAssertionsSigned","type":"bool"},{"_nodes":[{"default":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","id":"samlSPSSODescriptorSingleLogoutServiceHTTPRedirect","title":"samlSPSSODescriptorSingleLogoutServiceHTTPRedirect","type":"samlService"},{"default":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","id":"samlSPSSODescriptorSingleLogoutServiceHTTPPost","title":"samlSPSSODescriptorSingleLogoutServiceHTTPPost","type":"samlService"},{"default":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/proxySingleLogoutSOAP;","id":"samlSPSSODescriptorSingleLogoutServiceSOAP","title":"samlSPSSODescriptorSingleLogoutServiceSOAP","type":"samlService"}],"id":"samlSPSSODescriptorSingleLogoutService","title":"samlSPSSODescriptorSingleLogoutService"},{"_nodes":[{"default":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/proxySingleSignOnArtifact","id":"samlSPSSODescriptorAssertionConsumerServiceHTTPArtifact","title":"samlSPSSODescriptorAssertionConsumerServiceHTTPArtifact","type":"samlAssertion"},{"default":"0;1;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleSignOnPost","id":"samlSPSSODescriptorAssertionConsumerServiceHTTPPost","title":"samlSPSSODescriptorAssertionConsumerServiceHTTPPost","type":"samlAssertion"}],"id":"samlSPSSODescriptorAssertionConsumerService","title":"samlSPSSODescriptorAssertionConsumerService"},{"_nodes":[{"default":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","id":"samlSPSSODescriptorArtifactResolutionServiceArtifact","title":"samlSPSSODescriptorArtifactResolutionServiceArtifact","type":"samlAssertion"}],"id":"samlSPSSODescriptorArtifactResolutionService","title":"samlSPSSODescriptorArtifactResolutionService"}],"help":"samlservice.html#service-provider","id":"samlSPSSODescriptor","title":"samlSPSSODescriptor"},{"_nodes":[{"default":1,"id":"samlIDPSSODescriptorWantAuthnRequestsSigned","title":"samlIDPSSODescriptorWantAuthnRequestsSigned","type":"bool"},{"_nodes":[{"default":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleSignOn;","id":"samlIDPSSODescriptorSingleSignOnServiceHTTPRedirect","title":"samlIDPSSODescriptorSingleSignOnServiceHTTPRedirect","type":"samlService"},{"default":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleSignOn;","id":"samlIDPSSODescriptorSingleSignOnServiceHTTPPost","title":"samlIDPSSODescriptorSingleSignOnServiceHTTPPost","type":"samlService"},{"default":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/singleSignOnArtifact;","id":"samlIDPSSODescriptorSingleSignOnServiceHTTPArtifact","title":"samlIDPSSODescriptorSingleSignOnServiceHTTPArtifact","type":"samlService"}],"id":"samlIDPSSODescriptorSingleSignOnService","title":"samlIDPSSODescriptorSingleSignOnService"},{"_nodes":[{"default":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","id":"samlIDPSSODescriptorSingleLogoutServiceHTTPRedirect","title":"samlIDPSSODescriptorSingleLogoutServiceHTTPRedirect","type":"samlService"},{"default":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","id":"samlIDPSSODescriptorSingleLogoutServiceHTTPPost","title":"samlIDPSSODescriptorSingleLogoutServiceHTTPPost","type":"samlService"},{"default":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/singleLogoutSOAP;","id":"samlIDPSSODescriptorSingleLogoutServiceSOAP","title":"samlIDPSSODescriptorSingleLogoutServiceSOAP","type":"samlService"}],"id":"samlIDPSSODescriptorSingleLogoutService","title":"samlIDPSSODescriptorSingleLogoutService"},{"_nodes":[{"default":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","id":"samlIDPSSODescriptorArtifactResolutionServiceArtifact","title":"samlIDPSSODescriptorArtifactResolutionServiceArtifact","type":"samlAssertion"}],"id":"samlIDPSSODescriptorArtifactResolutionService","title":"samlIDPSSODescriptorArtifactResolutionService"}],"help":"samlservice.html#identity-provider","id":"samlIDPSSODescriptor","title":"samlIDPSSODescriptor"},{"_nodes":[{"_nodes":[{"default":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/AA/SOAP;","id":"samlAttributeAuthorityDescriptorAttributeServiceSOAP","title":"samlAttributeAuthorityDescriptorAttributeServiceSOAP","type":"samlService"}],"id":"samlAttributeAuthorityDescriptorAttributeService","title":"samlAttributeAuthorityDescriptorAttributeService"}],"help":"samlservice.html#attribute-authority","id":"samlAttributeAuthorityDescriptor","title":"samlAttributeAuthorityDescriptor"},{"_nodes":[{"default":1,"id":"samlMetadataForceUTF8","title":"samlMetadataForceUTF8","type":"bool"},{"default":600,"id":"samlRelayStateTimeout","title":"samlRelayStateTimeout","type":"int"},{"default":0,"id":"samlUseQueryStringSpecific","title":"samlUseQueryStringSpecific","type":"bool"},{"default":"","id":"samlOverrideIDPEntityID","title":"samlOverrideIDPEntityID"},{"id":"samlStorage","title":"samlStorage"},{"cnodes":"samlStorageOptions","id":"samlStorageOptions","title":"samlStorageOptions","type":"keyTextContainer"},{"_nodes":[{"default":0,"id":"samlCommonDomainCookieActivation","title":"samlCommonDomainCookieActivation","type":"bool"},{"id":"samlCommonDomainCookieDomain","title":"samlCommonDomainCookieDomain"},{"id":"samlCommonDomainCookieReader","title":"samlCommonDomainCookieReader"},{"id":"samlCommonDomainCookieWriter","title":"samlCommonDomainCookieWriter"}],"id":"samlCommonDomainCookie","title":"samlCommonDomainCookie","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"samlDiscoveryProtocolActivation","title":"samlDiscoveryProtocolActivation","type":"bool"},{"id":"samlDiscoveryProtocolURL","title":"samlDiscoveryProtocolURL"},{"id":"samlDiscoveryProtocolPolicy","title":"samlDiscoveryProtocolPolicy"},{"default":0,"id":"samlDiscoveryProtocolIsPassive","title":"samlDiscoveryProtocolIsPassive","type":"bool"}],"id":"samlDiscoveryProtocol","title":"samlDiscoveryProtocol","type":"simpleInputContainer"}],"help":"samlservice.html#advanced","id":"samlAdvanced","title":"samlAdvanced"}],"help":"samlservice.html","id":"samlServiceMetaData","title":"samlServiceMetaData"},{"cnodes":"samlIDPMetaDataNodes","help":"authsaml.html","id":"samlIDPMetaDataNodes","template":"samlIDPMetaDataNode","title":"samlIDPMetaDataNodes","type":"samlIDPMetaDataNodeContainer"},{"cnodes":"samlSPMetaDataNodes","help":"idpsaml.html","id":"samlSPMetaDataNodes","template":"samlSPMetaDataNode","title":"samlSPMetaDataNodes","type":"samlSPMetaDataNodeContainer"},{"_nodes":[{"id":"oidcServiceMetaDataIssuer","title":"oidcServiceMetaDataIssuer"},{"_nodes":[{"default":"authorize","id":"oidcServiceMetaDataAuthorizeURI","title":"oidcServiceMetaDataAuthorizeURI"},{"default":"token","id":"oidcServiceMetaDataTokenURI","title":"oidcServiceMetaDataTokenURI"},{"default":"userinfo","id":"oidcServiceMetaDataUserInfoURI","title":"oidcServiceMetaDataUserInfoURI"},{"default":"jwks","id":"oidcServiceMetaDataJWKSURI","title":"oidcServiceMetaDataJWKSURI"},{"default":"register","id":"oidcServiceMetaDataRegistrationURI","title":"oidcServiceMetaDataRegistrationURI"},{"default":"introspect","id":"oidcServiceMetaDataIntrospectionURI","title":"oidcServiceMetaDataIntrospectionURI"},{"default":"logout","id":"oidcServiceMetaDataEndSessionURI","title":"oidcServiceMetaDataEndSessionURI"},{"default":"checksession.html","id":"oidcServiceMetaDataCheckSessionURI","title":"oidcServiceMetaDataCheckSessionURI"},{"default":"flogout","id":"oidcServiceMetaDataFrontChannelURI","title":"oidcServiceMetaDataFrontChannelURI"},{"default":"blogout","id":"oidcServiceMetaDataBackChannelURI","title":"oidcServiceMetaDataBackChannelURI"}],"id":"oidcServiceMetaDataEndPoints","title":"oidcServiceMetaDataEndPoints","type":"simpleInputContainer"},{"cnodes":"oidcServiceMetaDataAuthnContext","default":[{"data":1,"id":"oidcServiceMetaDataAuthnContext/loa-1","title":"loa-1","type":"keyText"},{"data":2,"id":"oidcServiceMetaDataAuthnContext/loa-2","title":"loa-2","type":"keyText"},{"data":3,"id":"oidcServiceMetaDataAuthnContext/loa-3","title":"loa-3","type":"keyText"},{"data":4,"id":"oidcServiceMetaDataAuthnContext/loa-4","title":"loa-4","type":"keyText"},{"data":5,"id":"oidcServiceMetaDataAuthnContext/loa-5","title":"loa-5","type":"keyText"}],"id":"oidcServiceMetaDataAuthnContext","title":"oidcServiceMetaDataAuthnContext","type":"keyTextContainer"},{"_nodes":[{"get":["oidcServicePrivateKeySig","oidcServicePublicKeySig"],"id":"oidcServiceMetaDataKeys","title":"oidcServiceMetaDataKeys","type":"RSAKeyNoPassword"},{"id":"oidcServiceKeyIdSig","title":"oidcServiceKeyIdSig"},{"default":0,"id":"oidcServiceAllowDynamicRegistration","title":"oidcServiceAllowDynamicRegistration","type":"bool"},{"default":1,"id":"oidcServiceAllowAuthorizationCodeFlow","title":"oidcServiceAllowAuthorizationCodeFlow","type":"bool"},{"default":0,"id":"oidcServiceAllowImplicitFlow","title":"oidcServiceAllowImplicitFlow","type":"bool"},{"default":0,"id":"oidcServiceAllowHybridFlow","title":"oidcServiceAllowHybridFlow","type":"bool"},{"default":60,"id":"oidcServiceAuthorizationCodeExpiration","title":"oidcServiceAuthorizationCodeExpiration","type":"int"},{"default":3600,"id":"oidcServiceAccessTokenExpiration","title":"oidcServiceAccessTokenExpiration","type":"int"},{"default":3600,"id":"oidcServiceIDTokenExpiration","title":"oidcServiceIDTokenExpiration","type":"int"},{"default":2592000,"id":"oidcServiceOfflineSessionExpiration","title":"oidcServiceOfflineSessionExpiration","type":"int"}],"id":"oidcServiceMetaDataSecurity","title":"oidcServiceMetaDataSecurity"},{"_nodes":[{"id":"oidcStorage","title":"oidcStorage"},{"cnodes":"oidcStorageOptions","id":"oidcStorageOptions","title":"oidcStorageOptions","type":"keyTextContainer"}],"id":"oidcServiceMetaDataSessions","title":"oidcServiceMetaDataSessions"},{"cnodes":"oidcServiceDynamicRegistrationExportedVars","id":"oidcServiceDynamicRegistrationExportedVars","title":"oidcServiceDynamicRegistrationExportedVars","type":"keyTextContainer"},{"cnodes":"oidcServiceDynamicRegistrationExtraClaims","id":"oidcServiceDynamicRegistrationExtraClaims","title":"oidcServiceDynamicRegistrationExtraClaims","type":"keyTextContainer"}],"help":"openidconnectservice.html#service-configuration","id":"oidcServiceMetaData","title":"oidcServiceMetaData"},{"cnodes":"oidcOPMetaDataNodes","help":"authopenidconnect.html#declare-the-openid-connect-provider-in-ll-ng","id":"oidcOPMetaDataNodes","title":"oidcOPMetaDataNodes","type":"oidcOPMetaDataNodeContainer"},{"cnodes":"oidcRPMetaDataNodes","help":"idpopenidconnect.html#configuration-of-relying-party-in-ll-ng","id":"oidcRPMetaDataNodes","title":"oidcRPMetaDataNodes","type":"oidcRPMetaDataNodeContainer"},{"_nodes":[{"id":"casAttr","title":"casAttr"},{"default":"none","id":"casAccessControlPolicy","select":[{"k":"none","v":"None"},{"k":"error","v":"Display error on portal"},{"k":"faketicket","v":"Send a fake service ticket"}],"title":"casAccessControlPolicy","type":"select"},{"id":"casStorage","title":"casStorage"},{"cnodes":"casStorageOptions","id":"casStorageOptions","title":"casStorageOptions","type":"keyTextContainer"},{"cnodes":"casAttributes","id":"casAttributes","title":"casAttributes","type":"keyTextContainer"}],"help":"idpcas.html#configuring-the-cas-service","id":"casServiceMetadata","title":"casServiceMetadata"},{"cnodes":"casSrvMetaDataNodes","help":"authcas.html","id":"casSrvMetaDataNodes","template":"casSrvMetaDataNode","title":"casSrvMetaDataNodes","type":"casSrvMetaDataNodeContainer"},{"cnodes":"casAppMetaDataNodes","help":"idpcas.html#configuring-cas-applications","id":"casAppMetaDataNodes","template":"casAppMetaDataNode","title":"casAppMetaDataNodes","type":"casAppMetaDataNodeContainer"}] \ No newline at end of file +[{"_nodes":[{"_nodes":[{"default":"http://auth.example.com/","id":"portal","title":"portal"},{"_nodes":[{"_nodes":[{"default":1,"id":"portalDisplayLogout","title":"portalDisplayLogout","type":"boolOrExpr"},{"default":"$_auth =~ /^(LDAP|DBI|Demo)$/","id":"portalDisplayChangePassword","title":"portalDisplayChangePassword","type":"boolOrExpr"},{"default":1,"id":"portalDisplayAppslist","title":"portalDisplayAppslist","type":"boolOrExpr"},{"default":1,"id":"portalDisplayLoginHistory","title":"portalDisplayLoginHistory","type":"boolOrExpr"},{"default":"$_oidcConsents","id":"portalDisplayOidcConsents","title":"portalDisplayOidcConsents","type":"boolOrExpr"}],"id":"portalModules","title":"portalModules","type":"simpleInputContainer"},{"cnodes":"applicationList","default":[{"data":{"catname":"Default category","type":"category"},"id":"applicationList/default","title":"default","type":"catAndAppList"}],"help":"portalmenu.html#categories-and-applications","id":"applicationList","title":"applicationList","type":"catAndAppList"}],"help":"portalmenu.html","id":"portalMenu","title":"portalMenu"},{"_nodes":[{"default":"common/logos/logo_llng_400px.png","id":"portalMainLogo","title":"portalMainLogo"},{"default":1,"id":"showLanguages","title":"showLanguages","type":"bool"},{"id":"portalCustomCss","title":"portalCustomCss"},{"default":"bootstrap","id":"portalSkin","select":[{"k":"bootstrap","v":"Bootstrap"}],"title":"portalSkin","type":"portalskin"},{"id":"portalSkinBackground","select":[{"k":"","v":"None"},{"k":"1280px-Anse_Source_d'Argent_2-La_Digue.jpg","v":"Anse"},{"k":"1280px-Autumn-clear-water-waterfall-landscape_-_Virginia_-_ForestWander.jpg","v":"Waterfall"},{"k":"1280px-BrockenSnowedTrees.jpg","v":"Snowed Trees"},{"k":"1280px-Cedar_Breaks_National_Monument_partially.jpg","v":"National Monument"},{"k":"1280px-Parry_Peak_from_Winter_Park.jpg","v":"Winter"},{"k":"Aletschgletscher_mit_Pinus_cembra1.jpg","v":"Pinus"}],"title":"portalSkinBackground","type":"portalskinbackground"},{"cnodes":"portalSkinRules","help":"portalcustom.html","id":"portalSkinRules","title":"portalSkinRules","type":"keyTextContainer"},{"_nodes":[{"default":1,"id":"portalCheckLogins","title":"portalCheckLogins","type":"bool"},{"default":0,"id":"portalDisplayResetPassword","title":"portalDisplayResetPassword","type":"bool"},{"default":3,"id":"passwordResetAllowedRetries","title":"passwordResetAllowedRetries","type":"int"},{"default":1,"id":"portalDisplayRegister","title":"portalDisplayRegister","type":"bool"},{"default":0,"id":"portalDisplayCertificateResetByMail","title":"portalDisplayCertificateResetByMail","type":"boolOrExpr"}],"help":"portalcustom.html#buttons","id":"portalButtons","title":"portalButtons","type":"simpleInputContainer"},{"_nodes":[{"default":1,"id":"portalRequireOldPassword","title":"portalRequireOldPassword","type":"boolOrExpr"},{"default":0,"id":"hideOldPassword","title":"hideOldPassword","type":"bool"},{"default":0,"id":"mailOnPasswordChange","title":"mailOnPasswordChange","type":"bool"},{"default":0,"id":"passwordPolicyMinSize","title":"passwordPolicyMinSize","type":"int"},{"default":0,"id":"passwordPolicyMinLower","title":"passwordPolicyMinLower","type":"int"},{"default":0,"id":"passwordPolicyMinUpper","title":"passwordPolicyMinUpper","type":"int"},{"default":0,"id":"passwordPolicyMinDigit","title":"passwordPolicyMinDigit","type":"int"},{"default":0,"id":"passwordPolicyMinSpeChar","title":"passwordPolicyMinSpeChar","type":"int"},{"default":"! @ # $ % & * ( ) - = + [ ] { } ; : , . / ?","id":"passwordPolicySpecialChar","title":"passwordPolicySpecialChar"},{"default":0,"id":"portalDisplayPasswordPolicy","title":"portalDisplayPasswordPolicy","type":"bool"}],"help":"portalcustom.html#password-management","id":"passwordManagement","title":"passwordManagement","type":"simpleInputContainer"},{"_nodes":[{"default":"_user","id":"portalUserAttr","title":"portalUserAttr"},{"default":0,"id":"portalOpenLinkInNewWindow","title":"portalOpenLinkInNewWindow","type":"bool"},{"default":1,"id":"portalAntiFrame","title":"portalAntiFrame","type":"bool"},{"default":60000,"id":"portalPingInterval","title":"portalPingInterval","type":"int"},{"default":1,"id":"portalErrorOnExpiredSession","title":"portalErrorOnExpiredSession","type":"bool"},{"default":0,"id":"portalErrorOnMailNotFound","title":"portalErrorOnMailNotFound","type":"bool"},{"default":1,"id":"portalDisplayRefreshMyRights","title":"portalDisplayRefreshMyRights","type":"bool"}],"help":"portalcustom.html#other-parameters","id":"portalOther","title":"portalOther","type":"simpleInputContainer"}],"help":"portalcustom.html","id":"portalCustomization","title":"portalCustomization"},{"_nodes":[{"default":0,"id":"captcha_login_enabled","title":"captcha_login_enabled","type":"bool"},{"default":1,"id":"captcha_mail_enabled","title":"captcha_mail_enabled","type":"bool"},{"default":1,"id":"captcha_register_enabled","title":"captcha_register_enabled","type":"bool"},{"default":6,"id":"captcha_size","title":"captcha_size","type":"int"}],"help":"captcha.html","id":"portalCaptcha","title":"portalCaptcha","type":"simpleInputContainer"}],"help":"portal.html","id":"portalParams","title":"portalParams"},{"_nodes":[{"default":"Demo","id":"authentication","select":[{"k":"Apache","v":"Apache"},{"k":"AD","v":"Active Directory"},{"k":"DBI","v":"Database (DBI)"},{"k":"Facebook","v":"Facebook"},{"k":"GitHub","v":"GitHub"},{"k":"GPG","v":"GPG"},{"k":"Kerberos","v":"Kerberos"},{"k":"LDAP","v":"LDAP"},{"k":"LinkedIn","v":"LinkedIn"},{"k":"PAM","v":"PAM"},{"k":"Radius","v":"Radius"},{"k":"REST","v":"REST"},{"k":"SSL","v":"SSL"},{"k":"Twitter","v":"Twitter"},{"k":"WebID","v":"WebID"},{"k":"Demo","v":"Demonstration"},{"k":"Choice","v":"authChoice"},{"k":"Combination","v":"combineMods"},{"k":"CAS","v":"Central Authentication Service (CAS)"},{"k":"OpenID","v":"OpenID"},{"k":"OpenIDConnect","v":"OpenID Connect"},{"k":"SAML","v":"SAML v2"},{"k":"Proxy","v":"Proxy"},{"k":"Remote","v":"Remote"},{"k":"Slave","v":"Slave"},{"k":"Null","v":"None"},{"k":"Custom","v":"customModule"}],"title":"authentication","type":"select"},{"default":"Same","id":"userDB","select":[{"k":"Same","v":"Same"},{"k":"AD","v":"Active Directory"},{"k":"DBI","v":"Database (DBI)"},{"k":"LDAP","v":"LDAP"},{"k":"REST","v":"REST"},{"k":"Null","v":"None"},{"k":"Custom","v":"customModule"}],"title":"userDB","type":"select"},{"default":"Demo","id":"passwordDB","select":[{"k":"AD","v":"Active Directory"},{"k":"Choice","v":"authChoice"},{"k":"DBI","v":"Database (DBI)"},{"k":"Demo","v":"Demonstration"},{"k":"LDAP","v":"LDAP"},{"k":"REST","v":"REST"},{"k":"Null","v":"None"},{"k":"Custom","v":"customModule"}],"title":"passwordDB","type":"select"},{"default":"Null","id":"registerDB","select":[{"k":"AD","v":"Active Directory"},{"k":"Demo","v":"Demonstration"},{"k":"LDAP","v":"LDAP"},{"k":"Null","v":"None"},{"k":"Custom","v":"customModule"}],"title":"registerDB","type":"select"}],"_nodes_cond":[{"_nodes":[{"default":0,"id":"ADPwdMaxAge","title":"ADPwdMaxAge","type":"int"},{"default":0,"id":"ADPwdExpireWarning","title":"ADPwdExpireWarning","type":"int"}],"help":"authad.html","id":"adParams","show":false,"title":"adParams","type":"simpleInputContainer"},{"_nodes":[{"default":"lmAuth","id":"authChoiceParam","title":"authChoiceParam"},{"cnodes":"authChoiceModules","id":"authChoiceModules","select":[[{"k":"Apache","v":"Apache"},{"k":"AD","v":"Active Directory"},{"k":"CAS","v":"Central Authentication Service (CAS)"},{"k":"DBI","v":"Database (DBI)"},{"k":"Demo","v":"Demo"},{"k":"Facebook","v":"Facebook"},{"k":"GitHub","v":"GitHub"},{"k":"GPG","v":"GPG"},{"k":"Kerberos","v":"Kerberos"},{"k":"LDAP","v":"LDAP"},{"k":"LinkedIn","v":"LinkedIn"},{"k":"PAM","v":"PAM"},{"k":"Null","v":"None"},{"k":"OpenID","v":"OpenID"},{"k":"OpenIDConnect","v":"OpenID Connect"},{"k":"Proxy","v":"Proxy"},{"k":"Radius","v":"Radius"},{"k":"REST","v":"REST"},{"k":"Remote","v":"Remote"},{"k":"SAML","v":"SAML v2"},{"k":"Slave","v":"Slave"},{"k":"SSL","v":"SSL"},{"k":"Twitter","v":"Twitter"},{"k":"WebID","v":"WebID"},{"k":"Custom","v":"customModule"}],[{"k":"AD","v":"Active Directory"},{"k":"CAS","v":"Central Authentication Service (CAS)"},{"k":"DBI","v":"Database (DBI)"},{"k":"Demo","v":"Demo"},{"k":"Facebook","v":"Facebook"},{"k":"LDAP","v":"LDAP"},{"k":"Null","v":"None"},{"k":"OpenID","v":"OpenID"},{"k":"OpenIDConnect","v":"OpenID Connect"},{"k":"Proxy","v":"Proxy"},{"k":"REST","v":"REST"},{"k":"Remote","v":"Remote"},{"k":"SAML","v":"SAML v2"},{"k":"Slave","v":"Slave"},{"k":"WebID","v":"WebID"},{"k":"Custom","v":"customModule"}],[{"k":"AD","v":"Active Directory"},{"k":"DBI","v":"Database (DBI)"},{"k":"Demo","v":"Demo"},{"k":"LDAP","v":"LDAP"},{"k":"REST","v":"REST"},{"k":"Null","v":"None"},{"k":"Custom","v":"customModule"}]],"title":"authChoiceModules","type":"authChoiceContainer"},{"id":"authChoiceAuthBasic","title":"authChoiceAuthBasic"}],"help":"authchoice.html","id":"choiceParams","show":false,"title":"choiceParams"},{"_nodes":[{"default":3,"id":"apacheAuthnLevel","title":"apacheAuthnLevel","type":"int"}],"help":"authapache.html","id":"apacheParams","show":false,"title":"apacheParams","type":"simpleInputContainer"},{"_nodes":[{"default":1,"id":"casAuthnLevel","title":"casAuthnLevel","type":"int"}],"help":"authcas.html","id":"casParams","show":false,"title":"casParams","type":"simpleInputContainer"},{"_nodes":[{"default":2,"id":"dbiAuthnLevel","title":"dbiAuthnLevel","type":"int"},{"cnodes":"dbiExportedVars","default":[],"id":"dbiExportedVars","title":"dbiExportedVars","type":"keyTextContainer"},{"_nodes":[{"_nodes":[{"id":"dbiAuthChain","title":"dbiAuthChain"},{"id":"dbiAuthUser","title":"dbiAuthUser"},{"id":"dbiAuthPassword","title":"dbiAuthPassword","type":"password"}],"id":"dbiConnectionAuth","title":"dbiConnectionAuth","type":"simpleInputContainer"},{"_nodes":[{"id":"dbiUserChain","title":"dbiUserChain"},{"id":"dbiUserUser","title":"dbiUserUser"},{"id":"dbiUserPassword","title":"dbiUserPassword","type":"password"}],"id":"dbiConnectionUser","title":"dbiConnectionUser","type":"simpleInputContainer"}],"help":"authdbi.html#connection","id":"dbiConnection","title":"dbiConnection"},{"_nodes":[{"id":"dbiAuthTable","title":"dbiAuthTable"},{"id":"dbiUserTable","title":"dbiUserTable"},{"id":"dbiAuthLoginCol","title":"dbiAuthLoginCol"},{"id":"dbiAuthPasswordCol","title":"dbiAuthPasswordCol"},{"id":"dbiPasswordMailCol","title":"dbiPasswordMailCol"},{"id":"userPivot","title":"userPivot"}],"help":"authdbi.html#schema","id":"dbiSchema","title":"dbiSchema","type":"simpleInputContainer"},{"_nodes":[{"help":"authdbi.html#password","id":"dbiAuthPasswordHash","title":"dbiAuthPasswordHash"},{"_nodes":[{"help":"authdbi.html#password","id":"dbiDynamicHashEnabled","title":"dbiDynamicHashEnabled","type":"bool"},{"help":"authdbi.html#password","id":"dbiDynamicHashValidSchemes","title":"dbiDynamicHashValidSchemes"},{"help":"authdbi.html#password","id":"dbiDynamicHashValidSaltedSchemes","title":"dbiDynamicHashValidSaltedSchemes"},{"help":"authdbi.html#password","id":"dbiDynamicHashNewPasswordScheme","title":"dbiDynamicHashNewPasswordScheme"}],"help":"authdbi.html#password","id":"dbiDynamicHash","title":"dbiDynamicHash","type":"simpleInputContainer"}],"help":"authdbi.html#password","id":"dbiPassword","title":"dbiPassword"}],"help":"authdbi.html","id":"dbiParams","show":false,"title":"dbiParams"},{"_nodes":[{"cnodes":"demoExportedVars","default":[{"data":"cn","id":"demoExportedVars/cn","title":"cn","type":"keyText"},{"data":"mail","id":"demoExportedVars/mail","title":"mail","type":"keyText"},{"data":"uid","id":"demoExportedVars/uid","title":"uid","type":"keyText"}],"id":"demoExportedVars","title":"demoExportedVars","type":"keyTextContainer"}],"help":"authdemo.html","id":"demoParams","show":false,"title":"demoParams"},{"_nodes":[{"default":1,"id":"facebookAuthnLevel","title":"facebookAuthnLevel","type":"int"},{"cnodes":"facebookExportedVars","default":[],"id":"facebookExportedVars","title":"facebookExportedVars","type":"keyTextContainer"},{"id":"facebookAppId","title":"facebookAppId"},{"id":"facebookAppSecret","title":"facebookAppSecret"},{"default":"id","id":"facebookUserField","title":"facebookUserField"}],"help":"authfacebook.html","id":"facebookParams","show":false,"title":"facebookParams"},{"_nodes":[{"default":3,"id":"krbAuthnLevel","title":"krbAuthnLevel","type":"int"},{"id":"krbKeytab","title":"krbKeytab"},{"default":0,"id":"krbByJs","title":"krbByJs","type":"bool"},{"default":1,"id":"krbRemoveDomain","title":"krbRemoveDomain","type":"bool"}],"help":"authkerberos.html","id":"kerberosParams","show":false,"title":"kerberosParams","type":"simpleInputContainer"},{"_nodes":[{"default":2,"id":"ldapAuthnLevel","title":"ldapAuthnLevel","type":"int"},{"cnodes":"ldapExportedVars","default":[{"data":"cn","id":"ldapExportedVars/cn","title":"cn","type":"keyText"},{"data":"mail","id":"ldapExportedVars/mail","title":"mail","type":"keyText"},{"data":"uid","id":"ldapExportedVars/uid","title":"uid","type":"keyText"}],"id":"ldapExportedVars","title":"ldapExportedVars","type":"keyTextContainer"},{"_nodes":[{"default":"ldap://localhost","id":"ldapServer","title":"ldapServer"},{"id":"ldapPort","title":"ldapPort","type":"int"},{"default":"dc=example,dc=com","id":"ldapBase","title":"ldapBase"},{"default":"","id":"managerDn","title":"managerDn"},{"default":"","id":"managerPassword","title":"managerPassword","type":"password"},{"default":120,"id":"ldapTimeout","title":"ldapTimeout","type":"int"},{"default":3,"id":"ldapVersion","title":"ldapVersion","type":"int"},{"id":"ldapRaw","title":"ldapRaw"}],"help":"authldap.html#connection","id":"ldapConnection","title":"ldapConnection","type":"simpleInputContainer"},{"_nodes":[{"id":"LDAPFilter","title":"LDAPFilter"},{"id":"AuthLDAPFilter","title":"AuthLDAPFilter"},{"id":"mailLDAPFilter","title":"mailLDAPFilter"},{"default":"find","id":"ldapSearchDeref","select":[{"k":"never","v":"never"},{"k":"search","v":"search"},{"k":"find","v":"find"},{"k":"always","v":"always"}],"title":"ldapSearchDeref","type":"select"}],"help":"authldap.html#filters","id":"ldapFilters","title":"ldapFilters","type":"simpleInputContainer"},{"_nodes":[{"id":"ldapGroupBase","title":"ldapGroupBase"},{"default":"groupOfNames","id":"ldapGroupObjectClass","title":"ldapGroupObjectClass"},{"default":"member","id":"ldapGroupAttributeName","title":"ldapGroupAttributeName"},{"default":"dn","id":"ldapGroupAttributeNameUser","title":"ldapGroupAttributeNameUser"},{"default":"cn","id":"ldapGroupAttributeNameSearch","title":"ldapGroupAttributeNameSearch"},{"default":0,"id":"ldapGroupDecodeSearchedValue","title":"ldapGroupDecodeSearchedValue","type":"bool"},{"default":0,"id":"ldapGroupRecursive","title":"ldapGroupRecursive","type":"bool"},{"default":"dn","id":"ldapGroupAttributeNameGroup","title":"ldapGroupAttributeNameGroup"}],"help":"authldap.html#groups","id":"ldapGroups","title":"ldapGroups","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"ldapPpolicyControl","title":"ldapPpolicyControl","type":"bool"},{"default":0,"id":"ldapSetPassword","title":"ldapSetPassword","type":"bool"},{"default":0,"id":"ldapChangePasswordAsUser","title":"ldapChangePasswordAsUser","type":"bool"},{"default":"utf-8","id":"ldapPwdEnc","title":"ldapPwdEnc"},{"default":1,"id":"ldapUsePasswordResetAttribute","title":"ldapUsePasswordResetAttribute","type":"bool"},{"default":"pwdReset","id":"ldapPasswordResetAttribute","title":"ldapPasswordResetAttribute"},{"default":"TRUE","id":"ldapPasswordResetAttributeValue","title":"ldapPasswordResetAttributeValue"},{"default":0,"id":"ldapAllowResetExpiredPassword","title":"ldapAllowResetExpiredPassword","type":"bool"},{"default":0,"id":"ldapITDS","title":"ldapITDS","type":"bool"}],"help":"authldap.html#password","id":"ldapPassword","title":"ldapPassword","type":"simpleInputContainer"}],"help":"authldap.html","id":"ldapParams","show":false,"title":"ldapParams"},{"_nodes":[{"default":1,"id":"linkedInAuthnLevel","title":"linkedInAuthnLevel","type":"int"},{"id":"linkedInClientID","title":"linkedInClientID"},{"id":"linkedInClientSecret","title":"linkedInClientSecret","type":"password"},{"default":"id,first-name,last-name,email-address","id":"linkedInFields","title":"linkedInFields"},{"default":"emailAddress","id":"linkedInUserField","title":"linkedInUserField"},{"default":"r_liteprofile r_emailaddress","id":"linkedInScope","title":"linkedInScope"}],"help":"authlinkedin.html","id":"linkedinParams","show":false,"title":"linkedinParams","type":"simpleInputContainer"},{"_nodes":[{"default":1,"id":"githubAuthnLevel","title":"githubAuthnLevel","type":"int"},{"id":"githubClientID","title":"githubClientID"},{"id":"githubClientSecret","title":"githubClientSecret","type":"password"},{"default":"login","id":"githubUserField","title":"githubUserField"},{"default":"user:email","id":"githubScope","title":"githubScope"}],"help":"authgithub.html","id":"githubParams","show":false,"title":"githubParams","type":"simpleInputContainer"},{"_nodes":[{"id":"combination","title":"combination"},{"cnodes":"combModules","id":"combModules","select":[{"k":"Apache","v":"Apache"},{"k":"AD","v":"Active Directory"},{"k":"DBI","v":"Database (DBI)"},{"k":"Facebook","v":"Facebook"},{"k":"GitHub","v":"GitHub"},{"k":"GPG","v":"GPG"},{"k":"Kerberos","v":"Kerberos"},{"k":"LDAP","v":"LDAP"},{"k":"LinkedIn","v":"LinkedIn"},{"k":"PAM","v":"PAM"},{"k":"Radius","v":"Radius"},{"k":"REST","v":"REST"},{"k":"SSL","v":"SSL"},{"k":"Twitter","v":"Twitter"},{"k":"WebID","v":"WebID"},{"k":"Demo","v":"Demonstration"},{"k":"CAS","v":"Central Authentication Service (CAS)"},{"k":"OpenID","v":"OpenID"},{"k":"OpenIDConnect","v":"OpenID Connect"},{"k":"SAML","v":"SAML v2"},{"k":"Proxy","v":"Proxy"},{"k":"Remote","v":"Remote"},{"k":"Slave","v":"Slave"},{"k":"Null","v":"None"},{"k":"Custom","v":"customModule"}],"title":"combModules","type":"cmbModuleContainer"}],"help":"authcombination.html","id":"combinationParams","show":false,"title":"combinationParams"},{"_nodes":[{"default":0,"id":"nullAuthnLevel","title":"nullAuthnLevel","type":"int"}],"help":"authnull.html","id":"nullParams","show":false,"title":"nullParams","type":"simpleInputContainer"},{"_nodes":[{"default":1,"id":"openIdAuthnLevel","title":"openIdAuthnLevel","type":"int"},{"cnodes":"openIdExportedVars","default":[],"id":"openIdExportedVars","title":"openIdExportedVars","type":"keyTextContainer"},{"id":"openIdSecret","title":"openIdSecret"},{"default":"0;","id":"openIdIDPList","title":"openIdIDPList","type":"blackWhiteList"}],"help":"authopenid.html","id":"openidParams","show":false,"title":"openidParams"},{"_nodes":[{"default":1,"id":"oidcAuthnLevel","title":"oidcAuthnLevel","type":"int"},{"default":"openidconnectcallback","id":"oidcRPCallbackGetParam","title":"oidcRPCallbackGetParam"},{"default":600,"id":"oidcRPStateTimeout","title":"oidcRPStateTimeout","type":"int"}],"help":"authopenidconnect.html","id":"oidcParams","show":false,"title":"oidcParams","type":"simpleInputContainer"},{"_nodes":[{"default":5,"id":"gpgAuthnLevel","title":"gpgAuthnLevel","type":"int"},{"default":"","id":"gpgDb","title":"gpgDb"}],"help":"authgpg.html","id":"gpgParams","show":false,"title":"gpgParams","type":"simpleInputContainer"},{"_nodes":[{"default":2,"id":"proxyAuthnLevel","title":"proxyAuthnLevel","type":"int"},{"id":"proxyAuthService","title":"proxyAuthService"},{"id":"proxySessionService","title":"proxySessionService"},{"id":"remoteCookieName","title":"remoteCookieName"},{"default":0,"id":"proxyUseSoap","title":"proxyUseSoap","type":"bool"}],"help":"authproxy.html","id":"proxyParams","show":false,"title":"proxyParams","type":"simpleInputContainer"},{"_nodes":[{"default":2,"id":"pamAuthnLevel","title":"pamAuthnLevel","type":"int"},{"default":"login","id":"pamService","title":"pamService"}],"help":"authpam.html","id":"pamParams","show":false,"title":"pamParams","type":"simpleInputContainer"},{"_nodes":[{"default":3,"id":"radiusAuthnLevel","title":"radiusAuthnLevel","type":"int"},{"id":"radiusSecret","title":"radiusSecret"},{"id":"radiusServer","title":"radiusServer"}],"help":"authradius.html","id":"radiusParams","show":false,"title":"radiusParams","type":"simpleInputContainer"},{"_nodes":[{"default":2,"id":"restAuthnLevel","title":"restAuthnLevel","type":"int"},{"id":"restAuthUrl","title":"restAuthUrl"},{"id":"restUserDBUrl","title":"restUserDBUrl"},{"id":"restPwdConfirmUrl","title":"restPwdConfirmUrl"},{"id":"restPwdModifyUrl","title":"restPwdModifyUrl"}],"help":"authrest.html","id":"restParams","show":false,"title":"restParams","type":"simpleInputContainer"},{"_nodes":[{"id":"remotePortal","title":"remotePortal"},{"id":"remoteCookieName","title":"remoteCookieName"},{"default":"Lemonldap::NG::Common::Apache::Session::SOAP","id":"remoteGlobalStorage","title":"remoteGlobalStorage"},{"cnodes":"remoteGlobalStorageOptions","default":[{"data":"http://auth.example.com/Lemonldap/NG/Common/PSGI/SOAPService","id":"remoteGlobalStorageOptions/ns","title":"ns","type":"keyText"},{"data":"http://auth.example.com/sessions","id":"remoteGlobalStorageOptions/proxy","title":"proxy","type":"keyText"}],"id":"remoteGlobalStorageOptions","title":"remoteGlobalStorageOptions","type":"keyTextContainer"}],"help":"authremote.html","id":"remoteParams","show":false,"title":"remoteParams"},{"_nodes":[{"default":2,"id":"slaveAuthnLevel","title":"slaveAuthnLevel","type":"int"},{"id":"slaveUserHeader","title":"slaveUserHeader"},{"id":"slaveMasterIP","title":"slaveMasterIP"},{"id":"slaveHeaderName","title":"slaveHeaderName"},{"id":"slaveHeaderContent","title":"slaveHeaderContent"},{"default":0,"id":"slaveDisplayLogo","title":"slaveDisplayLogo","type":"bool"},{"cnodes":"slaveExportedVars","default":[],"id":"slaveExportedVars","title":"slaveExportedVars","type":"keyTextContainer"}],"help":"authslave.html","id":"slaveParams","show":false,"title":"slaveParams"},{"_nodes":[{"default":5,"id":"SSLAuthnLevel","title":"SSLAuthnLevel","type":"int"},{"default":"SSL_CLIENT_S_DN_Email","id":"SSLVar","title":"SSLVar"},{"cnodes":"SSLVarIf","default":[],"id":"SSLVarIf","title":"SSLVarIf","type":"keyTextContainer"},{"default":0,"id":"sslByAjax","title":"sslByAjax","type":"bool"},{"id":"sslHost","title":"sslHost"}],"help":"authssl.html","id":"sslParams","show":false,"title":"sslParams"},{"_nodes":[{"default":1,"id":"twitterAuthnLevel","title":"twitterAuthnLevel","type":"int"},{"id":"twitterKey","title":"twitterKey"},{"id":"twitterSecret","title":"twitterSecret"},{"id":"twitterAppName","title":"twitterAppName"},{"default":"screen_name","id":"twitterUserField","title":"twitterUserField"}],"help":"authtwitter.html","id":"twitterParams","show":false,"title":"twitterParams","type":"simpleInputContainer"},{"_nodes":[{"default":1,"id":"webIDAuthnLevel","title":"webIDAuthnLevel","type":"int"},{"cnodes":"webIDExportedVars","default":[],"id":"webIDExportedVars","title":"webIDExportedVars","type":"keyTextContainer"},{"id":"webIDWhitelist","title":"webIDWhitelist"}],"help":"authwebid.html","id":"webidParams","show":false,"title":"webidParams"},{"_nodes":[{"id":"customAuth","title":"customAuth"},{"id":"customUserDB","title":"customUserDB"},{"id":"customPassword","title":"customPassword"},{"id":"customRegister","title":"customRegister"},{"id":"customResetCertByMail","title":"customResetCertByMail"},{"cnodes":"customAddParams","id":"customAddParams","title":"customAddParams","type":"keyTextContainer"}],"help":"authcustom.html","id":"customParams","show":false,"title":"customParams"}],"_nodes_filter":"authParams","help":"start.html#authentication-users-and-password-databases","id":"authParams","title":"authParams","type":"authParams"},{"_nodes":[{"_nodes":[{"default":0,"id":"issuerDBSAMLActivation","title":"issuerDBSAMLActivation","type":"bool"},{"default":"^/saml/","id":"issuerDBSAMLPath","title":"issuerDBSAMLPath"},{"default":1,"id":"issuerDBSAMLRule","title":"issuerDBSAMLRule","type":"boolOrExpr"}],"help":"idpsaml.html","id":"issuerDBSAML","title":"issuerDBSAML","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"issuerDBCASActivation","title":"issuerDBCASActivation","type":"bool"},{"default":"^/cas/","id":"issuerDBCASPath","title":"issuerDBCASPath"},{"default":1,"id":"issuerDBCASRule","title":"issuerDBCASRule","type":"boolOrExpr"}],"help":"idpcas.html#enabling-cas","id":"issuerDBCAS","title":"issuerDBCAS","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"issuerDBOpenIDActivation","title":"issuerDBOpenIDActivation","type":"bool"},{"default":"^/openidserver/","id":"issuerDBOpenIDPath","title":"issuerDBOpenIDPath"},{"default":1,"id":"issuerDBOpenIDRule","title":"issuerDBOpenIDRule","type":"boolOrExpr"},{"_nodes":[{"id":"openIdIssuerSecret","title":"openIdIssuerSecret"},{"id":"openIdAttr","title":"openIdAttr"},{"default":"0;","id":"openIdSPList","title":"openIdSPList","type":"blackWhiteList"},{"_nodes":[{"default":"cn","id":"openIdSreg_fullname","title":"openIdSreg_fullname"},{"default":"uid","id":"openIdSreg_nickname","title":"openIdSreg_nickname"},{"id":"openIdSreg_language","title":"openIdSreg_language"},{"id":"openIdSreg_postcode","title":"openIdSreg_postcode"},{"default":"_timezone","id":"openIdSreg_timezone","title":"openIdSreg_timezone"},{"id":"openIdSreg_country","title":"openIdSreg_country"},{"id":"openIdSreg_gender","title":"openIdSreg_gender"},{"default":"mail","id":"openIdSreg_email","title":"openIdSreg_email"},{"id":"openIdSreg_dob","title":"openIdSreg_dob"}],"id":"openIdSreg","title":"openIdSreg","type":"simpleInputContainer"}],"id":"issuerDBOpenIDOptions","title":"issuerDBOpenIDOptions"}],"help":"idpopenid.html","id":"issuerDBOpenID","title":"issuerDBOpenID"},{"_nodes":[{"default":0,"id":"issuerDBOpenIDConnectActivation","title":"issuerDBOpenIDConnectActivation","type":"bool"},{"default":"^/oauth2/","id":"issuerDBOpenIDConnectPath","title":"issuerDBOpenIDConnectPath"},{"default":1,"id":"issuerDBOpenIDConnectRule","title":"issuerDBOpenIDConnectRule","type":"boolOrExpr"}],"help":"idpopenidconnect.html","id":"issuerDBOpenIDConnect","title":"issuerDBOpenIDConnect","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"issuerDBGetActivation","title":"issuerDBGetActivation","type":"bool"},{"default":"^/get/","id":"issuerDBGetPath","title":"issuerDBGetPath"},{"default":1,"id":"issuerDBGetRule","title":"issuerDBGetRule","type":"boolOrExpr"},{"default":[],"id":"issuerDBGetParameters","title":"issuerDBGetParameters","type":"doubleHash"}],"help":"issuerdbget.html","id":"issuerDBGet","title":"issuerDBGet"},{"_nodes":[{"default":120,"id":"issuersTimeout","title":"issuersTimeout","type":"int"}],"help":"start.html#options","id":"issuerOptions","title":"issuerOptions","type":"simpleInputContainer"}],"help":"start.html#identity-provider","id":"issuerParams","title":"issuerParams"},{"_nodes":[{"default":"uid","id":"whatToTrace","title":"whatToTrace"},{"id":"customToTrace","title":"customToTrace"},{"default":"_password _2fDevices","id":"hiddenAttributes","title":"hiddenAttributes"}],"help":"logs.html","id":"logParams","title":"logParams","type":"simpleInputContainer"},{"_nodes":[{"default":"lemonldap","id":"cookieName","title":"cookieName"},{"default":"example.com","id":"domain","title":"domain"},{"default":0,"id":"cda","title":"cda","type":"bool"},{"default":0,"id":"securedCookie","select":[{"k":"0","v":"unsecuredCookie"},{"k":"1","v":"securedCookie"},{"k":"2","v":"doubleCookie"},{"k":"3","v":"doubleCookieForSingleSession"}],"title":"securedCookie","type":"select"},{"default":1,"id":"httpOnly","title":"httpOnly","type":"bool"},{"id":"cookieExpiration","title":"cookieExpiration","type":"int"},{"default":"None","id":"sameSite","select":[{"k":"Strict","v":"Strict"},{"k":"Lax","v":"Lax"},{"k":"None","v":"None"}],"title":"sameSite","type":"select"}],"help":"ssocookie.html","id":"cookieParams","title":"cookieParams","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"storePassword","title":"storePassword","type":"bool"},{"default":72000,"id":"timeout","title":"timeout","type":"int"},{"default":0,"id":"timeoutActivity","title":"timeoutActivity","type":"int"},{"default":60,"id":"timeoutActivityInterval","title":"timeoutActivityInterval","type":"int"},{"cnodes":"grantSessionRules","default":[],"id":"grantSessionRules","title":"grantSessionRules","type":"grantContainer"},{"_nodes":[{"default":"Apache::Session::File","id":"globalStorage","title":"globalStorage"},{"cnodes":"globalStorageOptions","default":[{"data":"/var/lib/lemonldap-ng/sessions/","id":"globalStorageOptions/Directory","title":"Directory","type":"keyText"},{"data":"/var/lib/lemonldap-ng/sessions/lock/","id":"globalStorageOptions/LockDirectory","title":"LockDirectory","type":"keyText"},{"data":"Lemonldap::NG::Common::Apache::Session::Generate::SHA256","id":"globalStorageOptions/generateModule","title":"generateModule","type":"keyText"}],"id":"globalStorageOptions","title":"globalStorageOptions","type":"keyTextContainer"},{"default":"Cache::FileCache","id":"localSessionStorage","title":"localSessionStorage"},{"cnodes":"localSessionStorageOptions","default":[{"data":3,"id":"localSessionStorageOptions/cache_depth","title":"cache_depth","type":"keyText"},{"data":"/tmp","id":"localSessionStorageOptions/cache_root","title":"cache_root","type":"keyText"},{"data":600,"id":"localSessionStorageOptions/default_expires_in","title":"default_expires_in","type":"keyText"},{"data":"007","id":"localSessionStorageOptions/directory_umask","title":"directory_umask","type":"keyText"},{"data":"lemonldap-ng-sessions","id":"localSessionStorageOptions/namespace","title":"namespace","type":"keyText"}],"id":"localSessionStorageOptions","title":"localSessionStorageOptions","type":"keyTextContainer"}],"help":"start.html#sessions-database","id":"sessionStorage","title":"sessionStorage"},{"_nodes":[{"default":0,"id":"singleSession","title":"singleSession","type":"boolOrExpr"},{"default":0,"id":"singleIP","title":"singleIP","type":"boolOrExpr"},{"default":0,"id":"singleUserByIP","title":"singleUserByIP","type":"boolOrExpr"},{"default":1,"id":"notifyDeleted","title":"notifyDeleted","type":"bool"},{"default":0,"id":"notifyOther","title":"notifyOther","type":"bool"}],"id":"multipleSessions","title":"multipleSessions","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"disablePersistentStorage","title":"disablePersistentStorage","type":"bool"},{"id":"persistentStorage","title":"persistentStorage"},{"cnodes":"persistentStorageOptions","id":"persistentStorageOptions","title":"persistentStorageOptions","type":"keyTextContainer"}],"id":"persistentSessions","title":"persistentSessions"}],"help":"sessions.html","id":"sessionParams","title":"sessionParams"},{"_nodes":[{"default":5,"id":"reloadTimeout","title":"reloadTimeout","type":"int"},{"default":0,"id":"compactConf","title":"compactConf","type":"bool"},{"cnodes":"reloadUrls","help":"configlocation.html#configuration-reload","id":"reloadUrls","title":"reloadUrls","type":"keyTextContainer"}],"help":"configlocation.html#configuration-reload","id":"reloadParams","title":"reloadParams"},{"_nodes":[{"default":0,"id":"stayConnected","title":"stayConnected","type":"bool"},{"default":0,"help":"status.html","id":"portalStatus","title":"portalStatus","type":"bool"},{"default":1,"id":"upgradeSession","title":"upgradeSession","type":"bool"},{"id":"refreshSessions","title":"refreshSessions","type":"bool"},{"_nodes":[{"default":0,"id":"wsdlServer","title":"wsdlServer","type":"bool"},{"default":0,"id":"restExportSecretKeys","title":"restExportSecretKeys","type":"bool"},{"default":15,"id":"restClockTolerance","title":"restClockTolerance","type":"int"},{"default":0,"id":"restSessionServer","title":"restSessionServer","type":"bool"},{"default":0,"id":"restConfigServer","title":"restConfigServer","type":"bool"},{"default":0,"id":"restAuthServer","title":"restAuthServer","type":"bool"},{"default":0,"id":"restPasswordServer","title":"restPasswordServer","type":"bool"},{"default":0,"help":"soapservices.html","id":"soapSessionServer","title":"soapSessionServer","type":"bool"},{"default":0,"help":"soapservices.html","id":"soapConfigServer","title":"soapConfigServer","type":"bool"},{"id":"exportedAttr","title":"exportedAttr"}],"help":"portalservers.html","id":"portalServers","title":"portalServers","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"loginHistoryEnabled","title":"loginHistoryEnabled","type":"bool"},{"default":5,"id":"successLoginNumber","title":"successLoginNumber","type":"int"},{"default":5,"id":"failedLoginNumber","title":"failedLoginNumber","type":"int"},{"cnodes":"sessionDataToRemember","id":"sessionDataToRemember","title":"sessionDataToRemember","type":"keyTextContainer"}],"help":"loginhistory.html","id":"loginHistory","title":"loginHistory"},{"_nodes":[{"default":0,"id":"notification","title":"notification","type":"bool"},{"default":0,"id":"notificationsExplorer","title":"notificationsExplorer","type":"bool"},{"default":"allusers","id":"notificationWildcard","title":"notificationWildcard"},{"default":0,"id":"oldNotifFormat","title":"oldNotifFormat","type":"bool"},{"id":"notificationXSLTfile","title":"notificationXSLTfile"},{"default":"File","id":"notificationStorage","title":"notificationStorage"},{"cnodes":"notificationStorageOptions","default":[{"data":"/var/lib/lemonldap-ng/notifications","id":"notificationStorageOptions/dirName","title":"dirName","type":"keyText"}],"id":"notificationStorageOptions","title":"notificationStorageOptions","type":"keyTextContainer"},{"_nodes":[{"default":0,"id":"notificationServer","title":"notificationServer","type":"bool"},{"default":"","id":"notificationDefaultCond","title":"notificationDefaultCond"},{"default":"uid reference date title subtitle text check","id":"notificationServerSentAttributes","title":"notificationServerSentAttributes"},{"_nodes":[{"default":1,"id":"notificationServerPOST","title":"notificationServerPOST","type":"bool"},{"default":0,"id":"notificationServerGET","title":"notificationServerGET","type":"bool"},{"default":0,"id":"notificationServerDELETE","title":"notificationServerDELETE","type":"bool"}],"id":"notificationServerMethods","title":"notificationServerMethods","type":"simpleInputContainer"}],"help":"notifications.html#notification-server","id":"serverNotification","title":"serverNotification"}],"help":"notifications.html","id":"notifications","title":"notifications"},{"_nodes":[{"_nodes":[{"id":"mailSubject","title":"mailSubject"},{"id":"mailBody","title":"mailBody","type":"longtext"},{"id":"mailConfirmSubject","title":"mailConfirmSubject"},{"id":"mailConfirmBody","title":"mailConfirmBody","type":"longtext"}],"id":"mailContent","title":"mailContent","type":"simpleInputContainer"},{"_nodes":[{"default":"http://auth.example.com/resetpwd","id":"mailUrl","title":"mailUrl"},{"default":0,"id":"mailTimeout","title":"mailTimeout","type":"int"},{"default":1,"id":"portalDisplayGeneratePassword","title":"portalDisplayGeneratePassword","type":"bool"},{"default":"[A-Z]{3}[a-z]{5}.\\d{2}","id":"randomPasswordRegexp","title":"randomPasswordRegexp"}],"id":"mailOther","title":"mailOther","type":"simpleInputContainer"}],"help":"resetpassword.html","id":"passwordManagement","title":"passwordManagement"},{"_nodes":[{"_nodes":[{"id":"certificateResetByMailStep1Subject","title":"certificateResetByMailStep1Subject"},{"id":"certificateResetByMailStep1Body","title":"certificateResetByMailStep1Body","type":"longtext"},{"id":"certificateResetByMailStep2Subject","title":"certificateResetByMailStep2Subject"},{"id":"certificateResetByMailStep2Body","title":"certificateResetByMailStep2Body","type":"longtext"}],"id":"certificateMailContent","title":"certificateMailContent","type":"simpleInputContainer"},{"_nodes":[{"default":"http://auth.example.com/certificateReset","id":"certificateResetByMailURL","title":"certificateResetByMailURL"},{"default":"description","id":"certificateResetByMailCeaAttribute","title":"certificateResetByMailCeaAttribute"},{"default":"userCertificate;binary","id":"certificateResetByMailCertificateAttribute","title":"certificateResetByMailCertificateAttribute"},{"default":0,"id":"certificateResetByMailValidityDelay","title":"certificateResetByMailValidityDelay","type":"int"}],"id":"mailOther","title":"mailOther","type":"simpleInputContainer"}],"help":"resetcertificate.html","id":"certificateResetByMailManagement","title":"certificateResetByMailManagement"},{"_nodes":[{"default":"http://auth.example.com/register","id":"registerUrl","title":"registerUrl"},{"default":0,"id":"registerTimeout","title":"registerTimeout","type":"int"},{"id":"registerConfirmSubject","title":"registerConfirmSubject"},{"id":"registerDoneSubject","title":"registerDoneSubject"}],"help":"register.html","id":"register","title":"register","type":"simpleInputContainer"},{"_nodes":[{"cnodes":"autoSigninRules","id":"autoSigninRules","title":"autoSigninRules","type":"keyTextContainer"}],"help":"autosignin.html","id":"autoSignin","title":"autoSignin"},{"_nodes":[{"default":0,"id":"globalLogoutRule","title":"globalLogoutRule","type":"boolOrExpr"},{"default":1,"id":"globalLogoutTimer","title":"globalLogoutTimer","type":"bool"},{"id":"globalLogoutCustomParam","title":"globalLogoutCustomParam"}],"help":"globallogout.html","id":"globalLogout","title":"globalLogout","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"checkState","title":"checkState","type":"bool"},{"id":"checkStateSecret","title":"checkStateSecret"}],"help":"checkstate.html","id":"stateCheck","title":"stateCheck","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"checkUser","title":"checkUser","type":"bool"},{"default":1,"id":"checkUserIdRule","title":"checkUserIdRule"},{"id":"checkUserUnrestrictedUsersRule","title":"checkUserUnrestrictedUsersRule"},{"default":"_loginHistory _session_id hGroups","id":"checkUserHiddenAttributes","title":"checkUserHiddenAttributes"},{"id":"checkUserSearchAttributes","title":"checkUserSearchAttributes"},{"default":0,"id":"checkUserDisplayEmptyHeaders","title":"checkUserDisplayEmptyHeaders","type":"boolOrExpr"},{"default":0,"id":"checkUserDisplayEmptyValues","title":"checkUserDisplayEmptyValues","type":"boolOrExpr"},{"default":0,"id":"checkUserDisplayPersistentInfo","title":"checkUserDisplayPersistentInfo","type":"boolOrExpr"}],"help":"checkuser.html","id":"checkUsers","title":"checkUsers","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"impersonationRule","title":"impersonationRule","type":"boolOrExpr"},{"default":1,"id":"impersonationIdRule","title":"impersonationIdRule"},{"id":"impersonationUnrestrictedUsersRule","title":"impersonationUnrestrictedUsersRule"},{"default":"_2fDevices _loginHistory","id":"impersonationHiddenAttributes","title":"impersonationHiddenAttributes"},{"default":1,"id":"impersonationSkipEmptyValues","title":"impersonationSkipEmptyValues","type":"bool"},{"default":0,"id":"impersonationMergeSSOgroups","title":"impersonationMergeSSOgroups","type":"boolOrExpr"}],"help":"impersonation.html","id":"impersonation","title":"impersonation","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"contextSwitchingRule","title":"contextSwitchingRule","type":"boolOrExpr"},{"default":1,"id":"contextSwitchingIdRule","title":"contextSwitchingIdRule"},{"id":"contextSwitchingUnrestrictedUsersRule","title":"contextSwitchingUnrestrictedUsersRule"},{"default":1,"id":"contextSwitchingStopWithLogout","title":"contextSwitchingStopWithLogout","type":"bool"}],"help":"contextswitching.html","id":"contextSwitching","title":"contextSwitching","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"decryptValueRule","title":"decryptValueRule","type":"boolOrExpr"},{"id":"decryptValueFunctions","title":"decryptValueFunctions"}],"help":"decryptvalue.html","id":"decryptValue","title":"decryptValue","type":"simpleInputContainer"},{"_nodes":[{"id":"customPlugins","title":"customPlugins"},{"cnodes":"customPluginsParams","id":"customPluginsParams","title":"customPluginsParams","type":"keyTextContainer"}],"help":"plugincustom.html","id":"customPluginsNode","title":"customPluginsNode"}],"help":"start.html#plugins","id":"plugins","title":"plugins"},{"_nodes":[{"_nodes":[{"default":0,"id":"utotp2fActivation","title":"utotp2fActivation","type":"boolOrExpr"},{"id":"utotp2fAuthnLevel","title":"utotp2fAuthnLevel","type":"int"},{"id":"utotp2fLabel","title":"utotp2fLabel"},{"id":"utotp2fLogo","title":"utotp2fLogo"}],"help":"utotp2f.html","id":"utotp2f","title":"utotp2f","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"totp2fActivation","title":"totp2fActivation","type":"boolOrExpr"},{"default":0,"id":"totp2fSelfRegistration","title":"totp2fSelfRegistration","type":"boolOrExpr"},{"id":"totp2fIssuer","title":"totp2fIssuer"},{"default":30,"id":"totp2fInterval","title":"totp2fInterval","type":"int"},{"default":1,"id":"totp2fRange","title":"totp2fRange","type":"int"},{"default":6,"id":"totp2fDigits","title":"totp2fDigits","type":"int"},{"default":0,"id":"totp2fDisplayExistingSecret","title":"totp2fDisplayExistingSecret","type":"bool"},{"default":0,"id":"totp2fUserCanChangeKey","title":"totp2fUserCanChangeKey","type":"bool"},{"default":1,"id":"totp2fUserCanRemoveKey","title":"totp2fUserCanRemoveKey","type":"bool"},{"id":"totp2fTTL","title":"totp2fTTL","type":"int"},{"id":"totp2fAuthnLevel","title":"totp2fAuthnLevel","type":"int"},{"id":"totp2fLabel","title":"totp2fLabel"},{"id":"totp2fLogo","title":"totp2fLogo"}],"help":"totp2f.html","id":"totp2f","title":"totp2f","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"u2fActivation","title":"u2fActivation","type":"boolOrExpr"},{"default":0,"id":"u2fSelfRegistration","title":"u2fSelfRegistration","type":"boolOrExpr"},{"default":1,"id":"u2fUserCanRemoveKey","title":"u2fUserCanRemoveKey","type":"bool"},{"id":"u2fTTL","title":"u2fTTL","type":"int"},{"id":"u2fAuthnLevel","title":"u2fAuthnLevel","type":"int"},{"id":"u2fLabel","title":"u2fLabel"},{"id":"u2fLogo","title":"u2fLogo"}],"help":"u2f.html","id":"u2f","title":"u2f","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"yubikey2fActivation","title":"yubikey2fActivation","type":"boolOrExpr"},{"default":0,"id":"yubikey2fSelfRegistration","title":"yubikey2fSelfRegistration","type":"boolOrExpr"},{"id":"yubikey2fClientID","title":"yubikey2fClientID"},{"id":"yubikey2fSecretKey","title":"yubikey2fSecretKey"},{"id":"yubikey2fNonce","title":"yubikey2fNonce"},{"id":"yubikey2fUrl","title":"yubikey2fUrl"},{"default":12,"id":"yubikey2fPublicIDSize","title":"yubikey2fPublicIDSize","type":"int"},{"default":1,"id":"yubikey2fUserCanRemoveKey","title":"yubikey2fUserCanRemoveKey","type":"bool"},{"id":"yubikey2fFromSessionAttribute","title":"yubikey2fFromSessionAttribute"},{"id":"yubikey2fTTL","title":"yubikey2fTTL","type":"int"},{"id":"yubikey2fAuthnLevel","title":"yubikey2fAuthnLevel","type":"int"},{"id":"yubikey2fLabel","title":"yubikey2fLabel"},{"id":"yubikey2fLogo","title":"yubikey2fLogo"}],"help":"yubikey2f.html","id":"yubikey2f","title":"yubikey2f","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"mail2fActivation","title":"mail2fActivation","type":"boolOrExpr"},{"default":"\\d{6}","id":"mail2fCodeRegex","title":"mail2fCodeRegex"},{"id":"mail2fTimeout","title":"mail2fTimeout","type":"int"},{"id":"mail2fSubject","title":"mail2fSubject"},{"id":"mail2fBody","title":"mail2fBody","type":"longtext"},{"id":"mail2fAuthnLevel","title":"mail2fAuthnLevel","type":"int"},{"id":"mail2fLabel","title":"mail2fLabel"},{"id":"mail2fLogo","title":"mail2fLogo"}],"help":"mail2f.html","id":"mail2f","title":"mail2f","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"ext2fActivation","title":"ext2fActivation","type":"boolOrExpr"},{"default":"\\d{6}","id":"ext2fCodeActivation","title":"ext2fCodeActivation"},{"id":"ext2FSendCommand","title":"ext2FSendCommand"},{"id":"ext2FValidateCommand","title":"ext2FValidateCommand"},{"id":"ext2fAuthnLevel","title":"ext2fAuthnLevel","type":"int"},{"id":"ext2fLabel","title":"ext2fLabel"},{"id":"ext2fLogo","title":"ext2fLogo"}],"help":"external2f.html","id":"ext2f","title":"ext2f","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"radius2fActivation","title":"radius2fActivation","type":"boolOrExpr"},{"id":"radius2fServer","title":"radius2fServer"},{"id":"radius2fSecret","title":"radius2fSecret"},{"id":"radius2fUsernameSessionKey","title":"radius2fUsernameSessionKey"},{"default":20,"id":"radius2fTimeout","title":"radius2fTimeout","type":"int"},{"id":"radius2fAuthnLevel","title":"radius2fAuthnLevel","type":"int"},{"id":"radius2fLogo","title":"radius2fLogo"},{"id":"radius2fLabel","title":"radius2fLabel"}],"help":"radius2f.html","id":"radius2f","title":"radius2f","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"rest2fActivation","title":"rest2fActivation","type":"boolOrExpr"},{"id":"rest2fInitUrl","title":"rest2fInitUrl"},{"cnodes":"rest2fInitArgs","id":"rest2fInitArgs","title":"rest2fInitArgs","type":"keyTextContainer"},{"id":"rest2fVerifyUrl","title":"rest2fVerifyUrl"},{"cnodes":"rest2fVerifyArgs","id":"rest2fVerifyArgs","title":"rest2fVerifyArgs","type":"keyTextContainer"},{"id":"rest2fAuthnLevel","title":"rest2fAuthnLevel","type":"int"},{"id":"rest2fLabel","title":"rest2fLabel"},{"id":"rest2fLogo","title":"rest2fLogo"}],"help":"rest2f.html","id":"rest2f","title":"rest2f"},{"cnodes":"sfExtra","id":"sfExtra","select":[{"k":"Mail2F","v":"E-Mail"},{"k":"REST","v":"REST"},{"k":"Ext2F","v":"External"},{"k":"Radius","v":"Radius"}],"title":"sfExtra","type":"sfExtraContainer"},{"_nodes":[{"default":0,"help":"secondfactor.html","id":"sfRemovedMsgRule","title":"sfRemovedMsgRule","type":"boolOrExpr"},{"default":0,"id":"sfRemovedUseNotif","title":"sfRemovedUseNotif","type":"bool"},{"default":"RemoveSF","help":"secondfactor.html","id":"sfRemovedNotifRef","title":"sfRemovedNotifRef"},{"default":"Second factor notification","help":"secondfactor.html","id":"sfRemovedNotifTitle","title":"sfRemovedNotifTitle"},{"default":"_removedSF_ expired second factor(s) has/have been removed!","help":"secondfactor.html","id":"sfRemovedNotifMsg","title":"sfRemovedNotifMsg"}],"help":"secondfactor.html","id":"sfRemovedNotification","title":"sfRemovedNotification","type":"simpleInputContainer"},{"default":1,"help":"secondfactor.html","id":"sfManagerRule","title":"sfManagerRule","type":"boolOrExpr"},{"default":0,"help":"secondfactor.html","id":"sfRequired","title":"sfRequired","type":"boolOrExpr"}],"help":"secondfactor.html","id":"secondFactors","title":"secondFactors"},{"_nodes":[{"help":"customfunctions.html","id":"customFunctions","title":"customFunctions"},{"default":"; ","id":"multiValuesSeparator","title":"multiValuesSeparator","type":"authParamsText"},{"default":0,"id":"groupsBeforeMacros","title":"groupsBeforeMacros","type":"bool"},{"_nodes":[{"default":"mail","id":"mailSessionKey","title":"mailSessionKey"},{"default":"","id":"SMTPServer","title":"SMTPServer"},{"id":"SMTPPort","title":"SMTPPort","type":"int"},{"id":"SMTPAuthUser","title":"SMTPAuthUser"},{"id":"SMTPAuthPass","title":"SMTPAuthPass","type":"password"},{"default":"","id":"SMTPTLS","select":[{"k":"","v":"none"},{"k":"starttls","v":"SMTP + STARTTLS"},{"k":"ssl","v":"SMTPS"}],"title":"SMTPTLS","type":"select"},{"cnodes":"SMTPTLSOpts","id":"SMTPTLSOpts","title":"SMTPTLSOpts","type":"keyTextContainer"},{"_nodes":[{"default":"noreply@example.com","id":"mailFrom","title":"mailFrom"},{"id":"mailReplyTo","title":"mailReplyTo"},{"default":"utf-8","id":"mailCharset","title":"mailCharset"}],"id":"mailHeaders","title":"mailHeaders","type":"simpleInputContainer"}],"help":"smtp.html","id":"SMTP","title":"SMTP"},{"_nodes":[{"default":"^[\\w\\.\\-@]+$","id":"userControl","title":"userControl"},{"default":0,"id":"browsersDontStorePassword","title":"browsersDontStorePassword","type":"bool"},{"default":0,"help":"forcereauthn.html","id":"portalForceAuthn","title":"portalForceAuthn","type":"bool"},{"default":5,"id":"portalForceAuthnInterval","title":"portalForceAuthnInterval","type":"int"},{"id":"key","title":"key","type":"password"},{"id":"trustedDomains","title":"trustedDomains"},{"default":1,"help":"safejail.html","id":"useSafeJail","title":"useSafeJail","type":"bool"},{"default":1,"id":"checkXSS","title":"checkXSS","type":"bool"},{"default":1,"id":"requireToken","title":"requireToken","type":"boolOrExpr"},{"default":120,"id":"formTimeout","title":"formTimeout","type":"int"},{"default":0,"id":"tokenUseGlobalStorage","title":"tokenUseGlobalStorage","type":"bool"},{"_nodes":[{"default":0,"help":"bruteforceprotection.html","id":"bruteForceProtection","title":"bruteForceProtection","type":"bool"},{"default":0,"help":"bruteforceprotection.html","id":"bruteForceProtectionIncrementalTempo","title":"bruteForceProtectionIncrementalTempo","type":"bool"}],"help":"bruteforceprotection.html","id":"bruteForceAttackProtection","title":"bruteForceAttackProtection","type":"simpleInputContainer"},{"cnodes":"lwpOpts","id":"lwpOpts","title":"lwpOpts","type":"keyTextContainer"},{"cnodes":"lwpSslOpts","id":"lwpSslOpts","title":"lwpSslOpts","type":"keyTextContainer"},{"_nodes":[{"default":"'self'","id":"cspDefault","title":"cspDefault"},{"default":"'self' data:","id":"cspImg","title":"cspImg"},{"default":"'self'","id":"cspScript","title":"cspScript"},{"default":"'self'","id":"cspStyle","title":"cspStyle"},{"default":"'self'","id":"cspFont","title":"cspFont"},{"default":"*","id":"cspFormAction","title":"cspFormAction"},{"default":"'self'","id":"cspConnect","title":"cspConnect"},{"default":"","id":"cspFrameAncestors","title":"cspFrameAncestors"}],"help":"security.html#portal","id":"contentSecurityPolicy","title":"contentSecurityPolicy","type":"simpleInputContainer"},{"_nodes":[{"default":1,"id":"corsEnabled","title":"corsEnabled","type":"bool"},{"default":true,"id":"corsAllow_Credentials","title":"corsAllow_Credentials"},{"default":"*","id":"corsAllow_Headers","title":"corsAllow_Headers"},{"default":"POST,GET","id":"corsAllow_Methods","title":"corsAllow_Methods"},{"default":"*","id":"corsAllow_Origin","title":"corsAllow_Origin"},{"default":"*","id":"corsExpose_Headers","title":"corsExpose_Headers"},{"default":"86400","id":"corsMax_Age","title":"corsMax_Age"}],"help":"security.html#portal","id":"crossOrigineResourceSharing","title":"crossOrigineResourceSharing","type":"simpleInputContainer"}],"help":"security.html#configure-security-settings","id":"security","title":"security"},{"_nodes":[{"default":-1,"id":"https","title":"https","type":"trool"},{"default":-1,"id":"port","title":"port","type":"int"},{"default":0,"id":"useRedirectOnForbidden","title":"useRedirectOnForbidden","type":"bool"},{"default":1,"id":"useRedirectOnError","title":"useRedirectOnError","type":"bool"},{"default":0,"id":"maintenance","title":"maintenance","type":"bool"}],"help":"redirections.html","id":"redirection","title":"redirection","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"jsRedirect","title":"jsRedirect","type":"boolOrExpr"},{"default":0,"id":"noAjaxHook","title":"noAjaxHook","type":"bool"},{"default":0,"id":"skipRenewConfirmation","title":"skipRenewConfirmation","type":"bool"}],"help":"redirections.html#portal-redirections","id":"portalRedirection","title":"portalRedirection","type":"simpleInputContainer"},{"cnodes":"nginxCustomHandlers","help":"handlerarch.html","id":"nginxCustomHandlers","title":"nginxCustomHandlers","type":"keyTextContainer"},{"cnodes":"logoutServices","default":[],"help":"logoutforward.html","id":"logoutServices","title":"logoutServices","type":"keyTextContainer"},{"_nodes":[{"default":"get","id":"infoFormMethod","select":[{"k":"get","v":"GET"},{"k":"post","v":"POST"}],"title":"infoFormMethod","type":"select"},{"default":"post","id":"confirmFormMethod","select":[{"k":"get","v":"GET"},{"k":"post","v":"POST"}],"title":"confirmFormMethod","type":"select"},{"default":"get","id":"redirectFormMethod","select":[{"k":"get","v":"GET"},{"k":"post","v":"POST"}],"title":"redirectFormMethod","type":"select"},{"default":1,"id":"activeTimer","title":"activeTimer","type":"bool"}],"id":"forms","title":"forms","type":"simpleInputContainer"}],"help":"start.html#advanced-features","id":"advancedParams","title":"advancedParams"}],"id":"generalParameters","title":"generalParameters"},{"_nodes":[{"cnodes":"exportedVars","default":[{"data":"HTTP_USER_AGENT","id":"exportedVars/UA","title":"UA","type":"keyText"}],"help":"exportedvars.html","id":"exportedVars","title":"exportedVars","type":"keyTextContainer"},{"cnodes":"macros","default":[],"help":"exportedvars.html#extend-variables-using-macros-and-groups","id":"macros","title":"macros","type":"keyTextContainer"},{"cnodes":"groups","default":[],"help":"exportedvars.html#extend-variables-using-macros-and-groups","id":"groups","title":"groups","type":"keyTextContainer"}],"help":"variables.html","id":"variables","title":"variables"},{"cnodes":"virtualHosts","help":"configvhost.html","id":"virtualHosts","template":"virtualHost","title":"virtualHosts","type":"virtualHostContainer"},{"_nodes":[{"default":"#PORTAL#/saml/metadata","id":"samlEntityID","title":"samlEntityID"},{"_nodes":[{"get":["samlServicePrivateKeySig","samlServicePrivateKeySigPwd","samlServicePublicKeySig"],"id":"samlServiceSecuritySig","title":"samlServiceSecuritySig","type":"RSAKey"},{"get":["samlServicePrivateKeyEnc","samlServicePrivateKeyEncPwd","samlServicePublicKeyEnc"],"id":"samlServiceSecurityEnc","title":"samlServiceSecurityEnc","type":"RSAKey"},{"default":0,"id":"samlServiceUseCertificateInResponse","title":"samlServiceUseCertificateInResponse","type":"bool"},{"default":"RSA_SHA1","id":"samlServiceSignatureMethod","select":[{"k":"RSA_SHA1","v":"RSA SHA1"},{"k":"RSA_SHA256","v":"RSA SHA256"}],"title":"samlServiceSignatureMethod","type":"select"}],"help":"samlservice.html#security-parameters","id":"samlServiceSecurity","title":"samlServiceSecurity"},{"_nodes":[{"default":"mail","id":"samlNameIDFormatMapEmail","title":"samlNameIDFormatMapEmail"},{"default":"mail","id":"samlNameIDFormatMapX509","title":"samlNameIDFormatMapX509"},{"default":"uid","id":"samlNameIDFormatMapWindows","title":"samlNameIDFormatMapWindows"},{"default":"uid","id":"samlNameIDFormatMapKerberos","title":"samlNameIDFormatMapKerberos"}],"help":"samlservice.html#nameid-formats","id":"samlNameIDFormatMap","title":"samlNameIDFormatMap","type":"simpleInputContainer"},{"_nodes":[{"default":2,"id":"samlAuthnContextMapPassword","title":"samlAuthnContextMapPassword","type":"int"},{"default":3,"id":"samlAuthnContextMapPasswordProtectedTransport","title":"samlAuthnContextMapPasswordProtectedTransport","type":"int"},{"default":5,"id":"samlAuthnContextMapTLSClient","title":"samlAuthnContextMapTLSClient","type":"int"},{"default":4,"id":"samlAuthnContextMapKerberos","title":"samlAuthnContextMapKerberos","type":"int"}],"help":"samlservice.html#authentication-contexts","id":"samlAuthnContextMap","title":"samlAuthnContextMap","type":"simpleInputContainer"},{"_nodes":[{"default":"Example","id":"samlOrganizationDisplayName","title":"samlOrganizationDisplayName"},{"default":"Example","id":"samlOrganizationName","title":"samlOrganizationName"},{"default":"http://www.example.com","id":"samlOrganizationURL","title":"samlOrganizationURL"}],"help":"samlservice.html#organization","id":"samlOrganization","title":"samlOrganization","type":"simpleInputContainer"},{"_nodes":[{"default":1,"id":"samlSPSSODescriptorAuthnRequestsSigned","title":"samlSPSSODescriptorAuthnRequestsSigned","type":"bool"},{"default":1,"id":"samlSPSSODescriptorWantAssertionsSigned","title":"samlSPSSODescriptorWantAssertionsSigned","type":"bool"},{"_nodes":[{"default":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","id":"samlSPSSODescriptorSingleLogoutServiceHTTPRedirect","title":"samlSPSSODescriptorSingleLogoutServiceHTTPRedirect","type":"samlService"},{"default":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleLogout;#PORTAL#/saml/proxySingleLogoutReturn","id":"samlSPSSODescriptorSingleLogoutServiceHTTPPost","title":"samlSPSSODescriptorSingleLogoutServiceHTTPPost","type":"samlService"},{"default":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/proxySingleLogoutSOAP;","id":"samlSPSSODescriptorSingleLogoutServiceSOAP","title":"samlSPSSODescriptorSingleLogoutServiceSOAP","type":"samlService"}],"id":"samlSPSSODescriptorSingleLogoutService","title":"samlSPSSODescriptorSingleLogoutService"},{"_nodes":[{"default":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/proxySingleSignOnArtifact","id":"samlSPSSODescriptorAssertionConsumerServiceHTTPArtifact","title":"samlSPSSODescriptorAssertionConsumerServiceHTTPArtifact","type":"samlAssertion"},{"default":"0;1;urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/proxySingleSignOnPost","id":"samlSPSSODescriptorAssertionConsumerServiceHTTPPost","title":"samlSPSSODescriptorAssertionConsumerServiceHTTPPost","type":"samlAssertion"}],"id":"samlSPSSODescriptorAssertionConsumerService","title":"samlSPSSODescriptorAssertionConsumerService"},{"_nodes":[{"default":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","id":"samlSPSSODescriptorArtifactResolutionServiceArtifact","title":"samlSPSSODescriptorArtifactResolutionServiceArtifact","type":"samlAssertion"}],"id":"samlSPSSODescriptorArtifactResolutionService","title":"samlSPSSODescriptorArtifactResolutionService"}],"help":"samlservice.html#service-provider","id":"samlSPSSODescriptor","title":"samlSPSSODescriptor"},{"_nodes":[{"default":1,"id":"samlIDPSSODescriptorWantAuthnRequestsSigned","title":"samlIDPSSODescriptorWantAuthnRequestsSigned","type":"bool"},{"_nodes":[{"default":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleSignOn;","id":"samlIDPSSODescriptorSingleSignOnServiceHTTPRedirect","title":"samlIDPSSODescriptorSingleSignOnServiceHTTPRedirect","type":"samlService"},{"default":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleSignOn;","id":"samlIDPSSODescriptorSingleSignOnServiceHTTPPost","title":"samlIDPSSODescriptorSingleSignOnServiceHTTPPost","type":"samlService"},{"default":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact;#PORTAL#/saml/singleSignOnArtifact;","id":"samlIDPSSODescriptorSingleSignOnServiceHTTPArtifact","title":"samlIDPSSODescriptorSingleSignOnServiceHTTPArtifact","type":"samlService"}],"id":"samlIDPSSODescriptorSingleSignOnService","title":"samlIDPSSODescriptorSingleSignOnService"},{"_nodes":[{"default":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","id":"samlIDPSSODescriptorSingleLogoutServiceHTTPRedirect","title":"samlIDPSSODescriptorSingleLogoutServiceHTTPRedirect","type":"samlService"},{"default":"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST;#PORTAL#/saml/singleLogout;#PORTAL#/saml/singleLogoutReturn","id":"samlIDPSSODescriptorSingleLogoutServiceHTTPPost","title":"samlIDPSSODescriptorSingleLogoutServiceHTTPPost","type":"samlService"},{"default":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/singleLogoutSOAP;","id":"samlIDPSSODescriptorSingleLogoutServiceSOAP","title":"samlIDPSSODescriptorSingleLogoutServiceSOAP","type":"samlService"}],"id":"samlIDPSSODescriptorSingleLogoutService","title":"samlIDPSSODescriptorSingleLogoutService"},{"_nodes":[{"default":"1;0;urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/artifact","id":"samlIDPSSODescriptorArtifactResolutionServiceArtifact","title":"samlIDPSSODescriptorArtifactResolutionServiceArtifact","type":"samlAssertion"}],"id":"samlIDPSSODescriptorArtifactResolutionService","title":"samlIDPSSODescriptorArtifactResolutionService"}],"help":"samlservice.html#identity-provider","id":"samlIDPSSODescriptor","title":"samlIDPSSODescriptor"},{"_nodes":[{"_nodes":[{"default":"urn:oasis:names:tc:SAML:2.0:bindings:SOAP;#PORTAL#/saml/AA/SOAP;","id":"samlAttributeAuthorityDescriptorAttributeServiceSOAP","title":"samlAttributeAuthorityDescriptorAttributeServiceSOAP","type":"samlService"}],"id":"samlAttributeAuthorityDescriptorAttributeService","title":"samlAttributeAuthorityDescriptorAttributeService"}],"help":"samlservice.html#attribute-authority","id":"samlAttributeAuthorityDescriptor","title":"samlAttributeAuthorityDescriptor"},{"_nodes":[{"default":1,"id":"samlMetadataForceUTF8","title":"samlMetadataForceUTF8","type":"bool"},{"default":600,"id":"samlRelayStateTimeout","title":"samlRelayStateTimeout","type":"int"},{"default":0,"id":"samlUseQueryStringSpecific","title":"samlUseQueryStringSpecific","type":"bool"},{"default":"","id":"samlOverrideIDPEntityID","title":"samlOverrideIDPEntityID"},{"id":"samlStorage","title":"samlStorage"},{"cnodes":"samlStorageOptions","id":"samlStorageOptions","title":"samlStorageOptions","type":"keyTextContainer"},{"_nodes":[{"default":0,"id":"samlCommonDomainCookieActivation","title":"samlCommonDomainCookieActivation","type":"bool"},{"id":"samlCommonDomainCookieDomain","title":"samlCommonDomainCookieDomain"},{"id":"samlCommonDomainCookieReader","title":"samlCommonDomainCookieReader"},{"id":"samlCommonDomainCookieWriter","title":"samlCommonDomainCookieWriter"}],"id":"samlCommonDomainCookie","title":"samlCommonDomainCookie","type":"simpleInputContainer"},{"_nodes":[{"default":0,"id":"samlDiscoveryProtocolActivation","title":"samlDiscoveryProtocolActivation","type":"bool"},{"id":"samlDiscoveryProtocolURL","title":"samlDiscoveryProtocolURL"},{"id":"samlDiscoveryProtocolPolicy","title":"samlDiscoveryProtocolPolicy"},{"default":0,"id":"samlDiscoveryProtocolIsPassive","title":"samlDiscoveryProtocolIsPassive","type":"bool"}],"id":"samlDiscoveryProtocol","title":"samlDiscoveryProtocol","type":"simpleInputContainer"}],"help":"samlservice.html#advanced","id":"samlAdvanced","title":"samlAdvanced"}],"help":"samlservice.html","id":"samlServiceMetaData","title":"samlServiceMetaData"},{"cnodes":"samlIDPMetaDataNodes","help":"authsaml.html","id":"samlIDPMetaDataNodes","template":"samlIDPMetaDataNode","title":"samlIDPMetaDataNodes","type":"samlIDPMetaDataNodeContainer"},{"cnodes":"samlSPMetaDataNodes","help":"idpsaml.html","id":"samlSPMetaDataNodes","template":"samlSPMetaDataNode","title":"samlSPMetaDataNodes","type":"samlSPMetaDataNodeContainer"},{"_nodes":[{"id":"oidcServiceMetaDataIssuer","title":"oidcServiceMetaDataIssuer"},{"_nodes":[{"default":"authorize","id":"oidcServiceMetaDataAuthorizeURI","title":"oidcServiceMetaDataAuthorizeURI"},{"default":"token","id":"oidcServiceMetaDataTokenURI","title":"oidcServiceMetaDataTokenURI"},{"default":"userinfo","id":"oidcServiceMetaDataUserInfoURI","title":"oidcServiceMetaDataUserInfoURI"},{"default":"jwks","id":"oidcServiceMetaDataJWKSURI","title":"oidcServiceMetaDataJWKSURI"},{"default":"register","id":"oidcServiceMetaDataRegistrationURI","title":"oidcServiceMetaDataRegistrationURI"},{"default":"introspect","id":"oidcServiceMetaDataIntrospectionURI","title":"oidcServiceMetaDataIntrospectionURI"},{"default":"logout","id":"oidcServiceMetaDataEndSessionURI","title":"oidcServiceMetaDataEndSessionURI"},{"default":"checksession.html","id":"oidcServiceMetaDataCheckSessionURI","title":"oidcServiceMetaDataCheckSessionURI"},{"default":"flogout","id":"oidcServiceMetaDataFrontChannelURI","title":"oidcServiceMetaDataFrontChannelURI"},{"default":"blogout","id":"oidcServiceMetaDataBackChannelURI","title":"oidcServiceMetaDataBackChannelURI"}],"id":"oidcServiceMetaDataEndPoints","title":"oidcServiceMetaDataEndPoints","type":"simpleInputContainer"},{"cnodes":"oidcServiceMetaDataAuthnContext","default":[{"data":1,"id":"oidcServiceMetaDataAuthnContext/loa-1","title":"loa-1","type":"keyText"},{"data":2,"id":"oidcServiceMetaDataAuthnContext/loa-2","title":"loa-2","type":"keyText"},{"data":3,"id":"oidcServiceMetaDataAuthnContext/loa-3","title":"loa-3","type":"keyText"},{"data":4,"id":"oidcServiceMetaDataAuthnContext/loa-4","title":"loa-4","type":"keyText"},{"data":5,"id":"oidcServiceMetaDataAuthnContext/loa-5","title":"loa-5","type":"keyText"}],"id":"oidcServiceMetaDataAuthnContext","title":"oidcServiceMetaDataAuthnContext","type":"keyTextContainer"},{"_nodes":[{"get":["oidcServicePrivateKeySig","oidcServicePublicKeySig"],"id":"oidcServiceMetaDataKeys","title":"oidcServiceMetaDataKeys","type":"RSAKeyNoPassword"},{"id":"oidcServiceKeyIdSig","title":"oidcServiceKeyIdSig"},{"default":0,"id":"oidcServiceAllowDynamicRegistration","title":"oidcServiceAllowDynamicRegistration","type":"bool"},{"default":1,"id":"oidcServiceAllowAuthorizationCodeFlow","title":"oidcServiceAllowAuthorizationCodeFlow","type":"bool"},{"default":0,"id":"oidcServiceAllowImplicitFlow","title":"oidcServiceAllowImplicitFlow","type":"bool"},{"default":0,"id":"oidcServiceAllowHybridFlow","title":"oidcServiceAllowHybridFlow","type":"bool"},{"default":60,"id":"oidcServiceAuthorizationCodeExpiration","title":"oidcServiceAuthorizationCodeExpiration","type":"int"},{"default":3600,"id":"oidcServiceAccessTokenExpiration","title":"oidcServiceAccessTokenExpiration","type":"int"},{"default":3600,"id":"oidcServiceIDTokenExpiration","title":"oidcServiceIDTokenExpiration","type":"int"},{"default":2592000,"id":"oidcServiceOfflineSessionExpiration","title":"oidcServiceOfflineSessionExpiration","type":"int"}],"id":"oidcServiceMetaDataSecurity","title":"oidcServiceMetaDataSecurity"},{"_nodes":[{"id":"oidcStorage","title":"oidcStorage"},{"cnodes":"oidcStorageOptions","id":"oidcStorageOptions","title":"oidcStorageOptions","type":"keyTextContainer"}],"id":"oidcServiceMetaDataSessions","title":"oidcServiceMetaDataSessions"},{"cnodes":"oidcServiceDynamicRegistrationExportedVars","id":"oidcServiceDynamicRegistrationExportedVars","title":"oidcServiceDynamicRegistrationExportedVars","type":"keyTextContainer"},{"cnodes":"oidcServiceDynamicRegistrationExtraClaims","id":"oidcServiceDynamicRegistrationExtraClaims","title":"oidcServiceDynamicRegistrationExtraClaims","type":"keyTextContainer"}],"help":"openidconnectservice.html#service-configuration","id":"oidcServiceMetaData","title":"oidcServiceMetaData"},{"cnodes":"oidcOPMetaDataNodes","help":"authopenidconnect.html#declare-the-openid-connect-provider-in-ll-ng","id":"oidcOPMetaDataNodes","title":"oidcOPMetaDataNodes","type":"oidcOPMetaDataNodeContainer"},{"cnodes":"oidcRPMetaDataNodes","help":"idpopenidconnect.html#configuration-of-relying-party-in-ll-ng","id":"oidcRPMetaDataNodes","title":"oidcRPMetaDataNodes","type":"oidcRPMetaDataNodeContainer"},{"_nodes":[{"id":"casAttr","title":"casAttr"},{"default":"none","id":"casAccessControlPolicy","select":[{"k":"none","v":"None"},{"k":"error","v":"Display error on portal"},{"k":"faketicket","v":"Send a fake service ticket"}],"title":"casAccessControlPolicy","type":"select"},{"id":"casStorage","title":"casStorage"},{"cnodes":"casStorageOptions","id":"casStorageOptions","title":"casStorageOptions","type":"keyTextContainer"},{"cnodes":"casAttributes","id":"casAttributes","title":"casAttributes","type":"keyTextContainer"}],"help":"idpcas.html#configuring-the-cas-service","id":"casServiceMetadata","title":"casServiceMetadata"},{"cnodes":"casSrvMetaDataNodes","help":"authcas.html","id":"casSrvMetaDataNodes","template":"casSrvMetaDataNode","title":"casSrvMetaDataNodes","type":"casSrvMetaDataNodeContainer"},{"cnodes":"casAppMetaDataNodes","help":"idpcas.html#configuring-cas-applications","id":"casAppMetaDataNodes","template":"casAppMetaDataNode","title":"casAppMetaDataNodes","type":"casAppMetaDataNodeContainer"}] \ No newline at end of file diff --git a/lemonldap-ng-manager/t/04-menu-api.t b/lemonldap-ng-manager/t/04-menu-api.t new file mode 100644 index 0000000000000000000000000000000000000000..1a34cbf051945025cb6481df9ac277c98c2e9dff --- /dev/null +++ b/lemonldap-ng-manager/t/04-menu-api.t @@ -0,0 +1,473 @@ +# Test Providers API + +use Test::More; +use strict; +use JSON; +use IO::String; +require 't/test-lib.pm'; + +our $_json = JSON->new->allow_nonref; + +sub check201 { + my ( $test, $res ) = splice @_; + + #diag Dumper($res); + is( $res->[0], "201", "$test: Result code is 201" ) + or diag explain $res->[2]; + count(1); + checkJson( $test, $res ); +} + +sub check204 { + my ( $test, $res ) = splice @_; + + #diag Dumper($res); + is( $res->[0], "204", "$test: Result code is 204" ) + or diag explain $res->[2]; + count(1); + is( $res->[2]->[0], undef, "204 code returns no content" ); +} + +sub check200 { + my ( $test, $res ) = splice @_; + + #diag Dumper($res); + is( $res->[0], "200", "$test: Result code is 200" ) + or diag explain $res->[2]; + count(1); + checkJson( $test, $res ); + +} + +sub check409 { + my ( $test, $res ) = splice @_; + + #diag Dumper($res); + is( $res->[0], "409", "$test: Result code is 409" ) + or diag explain $res->[2]; + count(1); + checkJson( $test, $res ); +} + +sub check404 { + my ( $test, $res ) = splice @_; + + #diag Dumper($res); + is( $res->[0], "404", "$test: Result code is 404" ) + or diag explain $res->[2]; + count(1); + checkJson( $test, $res ); +} + +sub check400 { + my ( $test, $res ) = splice @_; + is( $res->[0], "400", "$test: Result code is 400" ) + or diag explain $res->[2]; + count(1); + count(1); + checkJson( $test, $res ); +} + +sub checkJson { + my ( $test, $res ) = splice @_; + my $key; + + #diag Dumper($res->[2]->[0]); + ok( $key = from_json( $res->[2]->[0] ), "$test: Response is JSON" ); + count(1); +} + +sub add { + my ( $test, $type, $obj ) = splice @_; + my $j = $_json->encode($obj); + my $res; + + #diag Dumper($j); + ok( + $res = &client->_post( + "/api/v1/menu/$type", '', + IO::String->new($j), 'application/json', + length($j) + ), + "$test: Request succeed" + ); + count(1); + return $res; +} + +sub checkAdd { + my ( $test, $type, $add ) = splice @_; + check201( $test, add( $test, $type, $add ) ); +} + +sub checkAddFailsIfExists { + my ( $test, $type, $add ) = splice @_; + check409( $test, add( $test, $type, $add ) ); +} + +sub checkAddWithUnknownAttributes { + my ( $test, $type, $add ) = splice @_; + check400( $test, add( $test, $type, $add ) ); +} + +sub get { + my ( $test, $type, $confKey ) = splice @_; + my $res; + ok( $res = &client->_get( "/api/v1/menu/$type/$confKey", '' ), + "$test: Request succeed" ); + count(1); + return $res; +} + +sub checkGet { + my ( $test, $type, $confKey, $attrPath, $expectedValue ) = splice @_; + my $res = get( $test, $type, $confKey ); + check200( $test, $res ); + my @path = split '/', $attrPath; + my $key = from_json( $res->[2]->[0] ); + for (@path) { + if ( ref($key) eq 'ARRAY' ) { + $key = $key->[$_]; + } + else { + $key = $key->{$_}; + } + } + ok( + $key eq $expectedValue, +"$test: check if $attrPath value \"$key\" matches expected value \"$expectedValue\"" + ); + count(1); +} + +sub checkGetNotFound { + my ( $test, $type, $confKey ) = splice @_; + check404( $test, get( $test, $type, $confKey ) ); +} + +sub checkGetList { + my ( $test, $type, $confKey, $expectedHits ) = splice @_; + my $res = get( $test, $type, $confKey ); + check200( $test, $res ); + my $hits = from_json( $res->[2]->[0] ); + my $counter = @{$hits}; + ok( + $counter eq $expectedHits, +"$test: check if nb of hits returned ($counter) matches expectation ($expectedHits)" + ); + count(1); +} + +sub update { + my ( $test, $type, $confKey, $obj ) = splice @_; + my $j = $_json->encode($obj); + + #diag Dumper($j); + my $res; + ok( + $res = &client->_patch( + "/api/v1/menu/$type/$confKey", '', + IO::String->new($j), 'application/json', + length($j) + ), + "$test: Request succeed" + ); + count(1); + return $res; +} + +sub checkUpdate { + my ( $test, $type, $confKey, $update ) = splice @_; + check204( $test, update( $test, $type, $confKey, $update ) ); +} + +sub checkUpdateNotFound { + my ( $test, $type, $confKey, $update ) = splice @_; + check404( $test, update( $test, $type, $confKey, $update ) ); +} + +sub checkUpdateFailsIfExists { + my ( $test, $type, $confKey, $update ) = splice @_; + check409( $test, update( $test, $type, $confKey, $update ) ); +} + +sub checkUpdateWithUnknownAttributes { + my ( $test, $type, $confKey, $update ) = splice @_; + check400( $test, update( $test, $type, $confKey, $update ) ); +} + +sub replace { + my ( $test, $type, $confKey, $obj ) = splice @_; + my $j = $_json->encode($obj); + my $res; + ok( + $res = &client->_put( + "/api/v1/menu/$type/$confKey", '', + IO::String->new($j), 'application/json', + length($j) + ), + "$test: Request succeed" + ); + count(1); + return $res; +} + +sub checkReplace { + my ( $test, $type, $confKey, $replace ) = splice @_; + check204( $test, replace( $test, $type, $confKey, $replace ) ); +} + +sub checkReplaceAlreadyThere { + my ( $test, $type, $confKey, $replace ) = splice @_; + check400( $test, replace( $test, $type, $confKey, $replace ) ); +} + +sub checkReplaceNotFound { + my ( $test, $type, $confKey, $update ) = splice @_; + check404( $test, replace( $test, $type, $confKey, $update ) ); +} + +sub checkReplaceWithInvalidAttribute { + my ( $test, $type, $confKey, $replace ) = splice @_; + check400( $test, replace( $test, $type, $confKey, $replace ) ); +} + +sub findByConfKey { + my ( $test, $type, $confKey ) = splice @_; + my $res; + ok( + $res = &client->_get( + "/api/v1/menu/$type/findByConfKey", + "pattern=$confKey" + ), + "$test: Request succeed" + ); + count(1); + return $res; +} + +sub checkFindByConfKeyError { + my ( $test, $type, $pattern ) = splice @_; + my $res = findByConfKey( $test, $type, $pattern ); + check400( $test, $res ); +} + +sub checkFindByConfKey { + my ( $test, $type, $confKey, $expectedHits ) = splice @_; + my $res = findByConfKey( $test, $type, $confKey ); + check200( $test, $res ); + my $hits = from_json( $res->[2]->[0] ); + my $counter = @{$hits}; + ok( + $counter eq $expectedHits, +"$test: check if nb of hits returned ($counter) matches expectation ($expectedHits)" + ); + count(1); +} + +sub deleteMenu { + my ( $test, $type, $confKey ) = splice @_; + my $res; + ok( + $res = &client->_del( + "/api/v1/menu/$type/$confKey", '', '', 'application/json', 0 + ), + "$test: Request succeed" + ); + count(1); + return $res; +} + +sub checkDelete { + my ( $test, $type, $confKey ) = splice @_; + check204( $test, deleteMenu( $test, $type, $confKey ) ); +} + +sub checkDeleteNotFound { + my ( $test, $type, $confKey ) = splice @_; + check404( $test, deleteMenu( $test, $type, $confKey ) ); +} + +my $test; + +my $cat1 = { + confKey => 'mycat1', + catname => 'My Cat 1', + order => 1 +}; +my $cat2 = { + confKey => 'mycat2', + catname => 'My Cat 2', + order => 2 +}; + +$test = "Cat - Add should succeed"; +checkAdd( $test, 'cat', $cat1 ); +checkGet( $test, 'cat', 'mycat1', 'catname', 'My Cat 1' ); +checkGet( $test, 'cat', 'mycat1', 'order', 1 ); + +$test = "Cat - Add should fail on duplicate confKey"; +checkAddFailsIfExists( $test, 'cat', $cat1 ); + +$test = "Cat - Update should succeed and keep existing values"; +$cat1->{order} = 3; +delete $cat1->{catname}; +checkUpdate( $test, 'cat', 'mycat1', $cat1 ); +checkGet( $test, 'cat', 'mycat1', 'catname', 'My Cat 1' ); +checkGet( $test, 'cat', 'mycat1', 'order', 3 ); + +$test = "Cat - Update should fail if confKey not found"; +$cat1->{confKey} = 'mycat3'; +checkUpdateNotFound( $test, 'cat', 'mycat3', $cat1 ); + +$test = "Cat - 2nd add should succeed"; +checkAdd( $test, 'cat', $cat2 ); + +$test = "Cat - Replace should succeed"; +delete $cat2->{order}; +checkReplace( $test, 'cat', 'mycat2', $cat2 ); + +$test = "Cat - Replace should fail if confKey not found"; +$cat2->{confKey} = 'mycat3'; +checkReplaceNotFound( $test, 'cat', 'mycat3', $cat2 ); + +$test = "Cat - FindByConfKey should find 2 hits"; +checkFindByConfKey( $test, 'cat', 'mycat', 2 ); + +$test = "Cat - FindByConfKey should find 1 hits"; +checkFindByConfKey( $test, 'cat', 'mycat1', 1 ); + +$test = "Cat - FindByConfKey should find 1 hits"; +checkFindByConfKey( $test, 'cat', 'mycat2', 1 ); + +$test = "Cat - FindByConfKey should find 0 hits"; +checkFindByConfKey( $test, 'cat', 'mycat3', 0 ); + +$test = "Cat - FindByConfKey should err on invalid patterns"; +checkFindByConfKeyError( $test, 'cat', '' ); +checkFindByConfKeyError( $test, 'cat', '$' ); + +my $app1 = { + confKey => 'myapp1', + options => { + name => 'My App 1', + description => 'My app 1 description', + tooltip => 'My app 1 tooltip', + uri => 'http://app1.example.com/' + }, + order => 1 +}; +my $app2 = { + confKey => 'myapp2', + options => { + name => 'My App 2', + description => 'My app 2 description', + display => 'enabled', + logo => 'demo.png', + tooltip => 'My app 2 tooltip', + uri => 'http://app2.example.com/' + }, + order => 2 +}; +my $app3 = { + confKey => 'myapp3', + options => { + name => 'My App 3', + description => 'My app 3 description', + display => "\$uid eq 'dwho'", + logo => 'attach.png', + tooltip => 'My app 3 tooltip', + uri => 'http://app3.example.com/' + }, + order => 1 +}; + +$test = "App - Add app1 to cat1 should succeed"; +checkAdd( $test, 'app/mycat1', $app1 ); +checkGet( $test, 'app/mycat1', 'myapp1', 'order', '1' ); +checkGet( $test, 'app/mycat1', 'myapp1', 'options/name', 'My App 1' ); +checkGet( $test, 'app/mycat1', 'myapp1', 'options/description', + 'My app 1 description' ); +checkGet( $test, 'app/mycat1', 'myapp1', 'options/tooltip', + 'My app 1 tooltip' ); +checkGet( $test, 'app/mycat1', 'myapp1', 'options/uri', + 'http://app1.example.com/' ); + +$test = "App - Add app2 to cat1 should succeed"; +checkAdd( $test, 'app/mycat1', $app2 ); +checkGet( $test, 'app/mycat1', 'myapp2', 'order', '2' ); +checkGet( $test, 'app/mycat1', 'myapp2', 'options/name', 'My App 2' ); +checkGet( $test, 'app/mycat1', 'myapp2', 'options/logo', 'demo.png' ); + +$test = "App - Add app3 to cat2 should succeed"; +checkAdd( $test, 'app/mycat2', $app3 ); +checkGet( $test, 'app/mycat2', 'myapp3', 'order', '1' ); +checkGet( $test, 'app/mycat2', 'myapp3', 'options/display', "\$uid eq 'dwho'" ); + +$test = "App - Add should fail on duplicate confKey"; +checkAddFailsIfExists( $test, 'app/mycat1', $app1 ); + +$test = "App - Check default value were set"; +checkGet( $test, 'app/mycat1', 'myapp1', 'options/logo', 'network.png' ); +checkGet( $test, 'app/mycat1', 'myapp1', 'options/display', 'auto' ); + +$test = "App - Category 1 should return 2 apps"; +checkGetList( $test, 'app', 'mycat1', 2 ); + +$test = "App - Category 2 should return 1 app"; +checkGetList( $test, 'app', 'mycat2', 1 ); + +$test = "App - FindByConfKey should find 2 hits"; +checkFindByConfKey( $test, 'app/mycat1', '*', 2 ); + +$test = "App - FindByConfKey should find 1 hit"; +checkFindByConfKey( $test, 'app/mycat1', 'app1', 1 ); + +$test = "App - FindByConfKey should err on invalid patterns"; +checkFindByConfKeyError( $test, 'app/mycat1', '' ); +checkFindByConfKeyError( $test, 'app/mycat1', '$' ); + +$test = "App - Update should succeed and keep existing values"; +$app1->{options}->{name} = 'My App 1 updated'; +delete $app1->{options}->{tooltip}; +delete $app1->{order}; +checkUpdate( $test, 'app/mycat1', 'myapp1', $app1 ); +checkGet( $test, 'app/mycat1', 'myapp1', 'options/name', 'My App 1 updated' ); +checkGet( $test, 'app/mycat1', 'myapp1', 'options/tooltip', + 'My app 1 tooltip' ); +checkGet( $test, 'app/mycat1', 'myapp1', 'order', 1 ); + +$test = "App - Update should fail if confKey not found"; +checkUpdateNotFound( $test, 'app/mycat4', 'myapp1', $app1 ); +$app1->{confKey} = 'myapp4'; +checkUpdateNotFound( $test, 'app/mycat1', 'myapp4', $app1 ); + +$test = "App - Replace should succeed"; +$app3->{options}->{name} = 'My App 3 updated'; +checkReplace( $test, 'app/mycat2', 'myapp3', $app3 ); +checkGet( $test, 'app/mycat2', 'myapp3', 'options/name', 'My App 3 updated' ); + +$test = "App - Replace should fail if confKey not found"; +checkReplaceNotFound( $test, 'app/mycat4', 'myapp3', $app3 ); +$app3->{confKey} = 'myapp4'; +checkReplaceNotFound( $test, 'app/mycat2', 'myapp4', $app3 ); + +$test = "App - Delete should succeed"; +checkDelete( $test, 'app/mycat1', 'myapp2' ); + +$test = "App - Entity should not be found after deletion"; +checkDeleteNotFound( $test, 'app/mycat1', 'myapp2' ); + +$test = "App - Category 1 should return 1 app"; +checkGetList( $test, 'app', 'mycat1', 1 ); + +$test = "Cat - Clean up"; +checkDelete( $test, 'cat', 'mycat1' ); +checkDelete( $test, 'cat', 'mycat2' ); +$test = "cat - Entity should not be found after clean up"; +checkDeleteNotFound( $test, 'cat', 'mycat1' ); + +# Clean up generated conf files, except for "lmConf-1.json" +unlink grep { $_ ne "t/conf/lmConf-1.json" } glob "t/conf/lmConf-*.json"; + +done_testing(); diff --git a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Issuer/CAS.pm b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Issuer/CAS.pm index 460f3144308143ad94ef9b55526e59a003a9a3ad..5785862d07475f0034c6cc420d1ed1f5231bbb2c 100644 --- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Issuer/CAS.pm +++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Issuer/CAS.pm @@ -14,7 +14,7 @@ use Lemonldap::NG::Portal::Main::Constants qw( PE_SENDRESPONSE ); -our $VERSION = '2.0.8'; +our $VERSION = '2.0.9'; extends 'Lemonldap::NG::Portal::Main::Issuer', 'Lemonldap::NG::Portal::Lib::CAS'; @@ -195,7 +195,7 @@ sub run { else { $self->userLogger->warn( 'User ' . $req->sessionInfo->{ $self->conf->{whatToTrace} } - . " is not authorized to access to $service" ); + . " is not authorized to access to $app" ); if ( $casAccessControlPolicy =~ /^(error)$/i ) { $self->logger->debug( @@ -213,9 +213,16 @@ sub run { } } - $self->userLogger->notice( 'User ' - . $req->sessionInfo->{ $self->conf->{whatToTrace} } - . " is authorized to access to $service" ); + if ($app) { + $self->userLogger->notice( 'User ' + . $req->sessionInfo->{ $self->conf->{whatToTrace} } + . " is authorized to access to $app" ); + } + else { + $self->userLogger->notice( 'User ' + . $req->sessionInfo->{ $self->conf->{whatToTrace} } + . " is redirected to $service" ); + } unless ($casServiceTicket) { diff --git a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Issuer/Get.pm b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Issuer/Get.pm index a3faf0e92637336907d072a5e03e371e219aa4e3..4f56c403c68027d52702cfc87af55a1536acf7e2 100644 --- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Issuer/Get.pm +++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Issuer/Get.pm @@ -7,7 +7,7 @@ use Lemonldap::NG::Common::FormEncode; use Lemonldap::NG::Portal::Main::Constants qw(PE_OK PE_BADURL PE_GET_SERVICE_NOT_ALLOWED); -our $VERSION = '2.0.8'; +our $VERSION = '2.0.9'; extends 'Lemonldap::NG::Portal::Main::Issuer'; @@ -97,6 +97,9 @@ sub computeGetParams { $value =~ s/[\r\n\t]//; $getPrms{$param} = $value; } + $self->userLogger->notice( 'User ' + . $req->sessionInfo->{ $self->conf->{whatToTrace} } + . " is authorized to access to $vhost" ); } else { $self->logger->warn("IssuerGet: no configuration"); diff --git a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Issuer/OpenIDConnect.pm b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Issuer/OpenIDConnect.pm index 6b22ae1be3308be2992f31a46ec5e31871b9dd08..eede3b65cb7d55fc1169ca3e44c6b249e5b669b8 100644 --- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Issuer/OpenIDConnect.pm +++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Issuer/OpenIDConnect.pm @@ -18,7 +18,7 @@ use Lemonldap::NG::Portal::Main::Constants qw( ); use String::Random qw/random_string/; -our $VERSION = '2.0.8'; +our $VERSION = '2.0.9'; extends 'Lemonldap::NG::Portal::Main::Issuer', 'Lemonldap::NG::Portal::Lib::OpenIDConnect', @@ -707,7 +707,7 @@ sub run { $session_state ); - return $self->_redirectToUrl($req, $response_url); + return $self->_redirectToUrl( $req, $response_url ); } # Implicit Flow @@ -777,7 +777,7 @@ sub run { $session_state ); - return $self->_redirectToUrl($req, $response_url); + return $self->_redirectToUrl( $req, $response_url ); } # Hybrid Flow @@ -879,7 +879,7 @@ sub run { $session_state ); - return $self->_redirectToUrl($req, $response_url); + return $self->_redirectToUrl( $req, $response_url ); } $self->logger->debug("None flow has been selected"); @@ -961,7 +961,7 @@ sub run { $self->buildLogoutResponse( $post_logout_redirect_uri, $state ); - return $self->_redirectToUrl($req, $response_url); + return $self->_redirectToUrl( $req, $response_url ); } return $req->param('confirm') == 1 ? ( $err ? $err : PE_LOGOUT_OK ) @@ -2064,6 +2064,13 @@ sub metadata { push( @$grant_types, "password" ); } + # If one of the RPs has refresh tokens enabled + if ( grep { $self->oidcRPList->{$_}->{oidcRPMetaDataOptionsRefreshToken} } + keys %{ $self->oidcRPList } ) + { + push( @$grant_types, "refresh_token" ); + } + if ( $self->conf->{oidcServiceAllowHybridFlow} ) { push( @$response_types, "code id_token", @@ -2314,7 +2321,7 @@ sub _generateIDToken { } sub _redirectToUrl { - my ($self, $req, $response_url) = @_; + my ( $self, $req, $response_url ) = @_; # We must clear hidden form fields saved from the request (#2085) $self->p->clearHiddenFormValue($req); diff --git a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Issuer/SAML.pm b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Issuer/SAML.pm index 08ee55b12c9178861b61f31b8cb921578002d785..71fec2837c94184c606b9c9876c7e69c22404cb2 100644 --- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Issuer/SAML.pm +++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Issuer/SAML.pm @@ -18,7 +18,7 @@ use Lemonldap::NG::Portal::Main::Constants qw( PE_UNAUTHORIZEDPARTNER ); -our $VERSION = '2.0.8'; +our $VERSION = '2.0.9'; extends 'Lemonldap::NG::Portal::Main::Issuer', 'Lemonldap::NG::Portal::Lib::SAML'; @@ -393,14 +393,14 @@ sub run { unless ( $rule->( $req, $req->sessionInfo ) ) { $self->userLogger->warn( 'User ' . $req->sessionInfo->{ $self->conf->{whatToTrace} } - . " is not authorized to access to $sp" ); + . " is not authorized to access to $spConfKey" ); return PE_UNAUTHORIZEDPARTNER; } } $self->userLogger->notice( 'User ' . $req->sessionInfo->{ $self->conf->{whatToTrace} } - . " is authorized to access to $sp" ); + . " is authorized to access to $spConfKey" ); # Do we check signature? my $checkSSOMessageSignature = @@ -473,7 +473,7 @@ sub run { { $self->userLogger->info( - "SAML SP $sp ask to refresh session of " + "SAML SP $spConfKey ask to refresh session of " . $req->sessionInfo->{ $self->conf->{whatToTrace} } ); # Replay authentication process diff --git a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Run.pm b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Run.pm index 3219c552db5a1fa47f024ce70ee2756e1caab113..908e40fa8513e5e215780a2aff8b89bb170aa780 100644 --- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Run.pm +++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Run.pm @@ -1120,6 +1120,18 @@ sub sendJSONresponse { my ( $self, $req, $j, %args ) = @_; my $res = Lemonldap::NG::Common::PSGI::sendJSONresponse(@_); + # Handle caching + if ( $args{ttl} and $args{ttl} =~ /^\d+$/ ) { + push @{ $res->[1] }, + 'Cache-Control' => 'public, max-age=' . $args{ttl}; + } + else { + push @{ $res->[1] }, + 'Cache-Control' => 'no-cache, no-store, must-revalidate', + 'Pragma' => 'no-cache', + 'Expires' => '0'; + } + # If this is a cross-domain request from the portal itself # (Ajax SSL to a different VHost) # we allow CORS