debops.roundcube default variables

Packages and installation

roundcube__required_php_packages

List of PHP packages required by Roundcube. Refer to the official Roundcube documentation for details.

roundcube__required_php_packages:
  - 'iconv'
  - 'openssl'
  - 'session'
  - 'sockets'
  - 'xml'
  # Included in the xml package
  #- 'dom'
  - 'mbstring'
  - 'json'
  - 'intl'
roundcube__optional_php_packages

List of recommended/optional PHP packages for Roundcube. Refer to the official Roundcube documentation for details.

roundcube__optional_php_packages:
  - '{{ "ldap" if roundcube__ldap_enabled | bool else [] }}'
  - '{{ "memcached" if roundcube__memcached_enabled | bool else [] }}'
  - '{{ "redis" if roundcube__redis_enabled | bool else [] }}'
  - 'fileinfo'
  - 'enchant'
  - 'zip'
roundcube__custom_php_packages

List of user defined PHP packages for Roundcube.

roundcube__custom_php_packages: []
roundcube__base_php_packages

List of base PHP packages required by Roundcube.

roundcube__base_php_packages:
  - '{{ roundcube__required_php_packages }}'
  - '{{ roundcube__apt_php_packages }}'
  - '{{ roundcube__optional_php_packages }}'
  - '{{ ["mysql"] if (roundcube__database_map[roundcube__database].dbtype == "mysql") else [] }}'
  - '{{ ["pgsql"] if (roundcube__database_map[roundcube__database].dbtype == "postgresql") else [] }}'
  - '{{ ["sqlite3"] if (roundcube__database_map[roundcube__database].dbtype == "sqlite") else [] }}'
roundcube__apt_php_packages

PHP packages which are installed via APT repository if they are available in a sufficiently new version in the current distribution. The required minimal versions are taken from the file:composer.json.dist of the Roundcube 1.3.0 release. If you install an older version of Roundcube you may want to adjust this list.

roundcube__apt_php_packages: '{{ ["mail-mime", "net-smtp", "pear"]
                                 if ansible_distribution_release in ["stretch", "buster", "sid", "xenial", "yakkety", "zesty", "artful"]
                                 else [] }}'
roundcube__packages

List of additional APT packages (e. g. language dictionaries) that should be installed with Roundcube.

roundcube__packages: []
roundcube__base_packages

APT packages required for the Roundcube installation.

roundcube__base_packages: [ 'curl', 'file', 'unzip', 'aspell', 'aspell-en' ]

Roundcube user account

roundcube__user

Roundcube system user account.

roundcube__user: 'roundcube'
roundcube__group

Roundcube system user group.

roundcube__group: 'roundcube'
roundcube__home

Path to the home directory of the Roundcube system account.

roundcube__home: '{{ (ansible_local.fhs.home | d("/var/local"))
                     + "/" + roundcube__user }}'
roundcube__comment

The GECOS string set for the Roundcube account.

roundcube__comment: 'Roundcube Webmail'
roundcube__shell

The default shell of the Roundcube account.

roundcube__shell: '/usr/sbin/nologin'

Roundcube source and deployment

roundcube__git_gpg_key

The GPG key used to sign Roundcube releases.

roundcube__git_gpg_key: '4295 5C9D 6F2A CA9D 3E96  D55F 3E54 28D0 262C 54F8'
roundcube__git_additional_gpg_keys

List of additional GPG keys to add to the Roundcue user account. This might be needed if multiple people/organizations sign git commits or tags in the Roundcube repository, or installation from a private repository is used instead of a public one.

roundcube__git_additional_gpg_keys: []
roundcube__git_repo

Roundcube source repository. You can specify a public or private git repository using the https:// protocol. See Deployment from private or internal git repository for more details.

roundcube__git_repo: 'https://github.com/roundcube/roundcubemail.git'
roundcube__git_dir

Roundcube source directory on the host.

roundcube__git_dir: '{{ roundcube__src + "/"
                        + roundcube__git_repo.split("@"
                                                    if ("@" in roundcube__git_repo)
                                                    else "://")[1] }}'
roundcube__git_version

Roundcube release tag to deploy.

roundcube__git_version: '1.6.0'
roundcube__git_dest

Default path where Roundcube source files will be deployed.

roundcube__git_dest: '{{ roundcube__www + "/sites/" + roundcube__user + "/public" }}'
roundcube__src

Base path for git bare repository with Roundcube source.

roundcube__src: '{{ (ansible_local.fhs.src | d("/usr/local/src"))
                    + "/" + roundcube__user }}'
roundcube__www

Base web root directory for Roundcube website.

roundcube__www: '{{ ansible_local.nginx.www
                    if (ansible_local | d() and ansible_local.nginx | d())
                    else "/srv/www" }}'
roundcube__webserver_user

Roundcube webserver user (needs read-only access to the website code).

roundcube__webserver_user: '{{ ansible_local.nginx.user | d("www-data") }}'

Database configuration

roundcube__database

Database definition to use from the roundcube__database_map.

roundcube__database: 'sqlite-default'
roundcube__database_user

Database user account to use for Roundcube.

roundcube__database_user: 'roundcube'
roundcube__database_password_path

Path to the database password file.

roundcube__database_password_path: '{{ secret + "/credentials/" + inventory_hostname
                                       + "/roundcube/" + roundcube__database
                                       + "/" + roundcube__database_user + "/password" }}'
roundcube__database_password

Database password for the account given in roundcube__database_user.

roundcube__database_password: '{{ lookup("password", roundcube__database_password_path + " length=30") }}'
roundcube__database_name

Name of the database to use for Roundcube.

roundcube__database_name: '{{ roundcube__database_user
                              if roundcube__database == "postgresql-default"
                              else "roundcubemail" }}'
roundcube__database_map

Database connection definitions. Select the database connection to use in roundcube__database.

roundcube__database_map:

  sqlite-default:
    dbtype: 'sqlite'
    dbname: 'db/roundcube.db'

  mysql-default:
    dbtype: 'mysql'
    dbname: '{{ roundcube__database_name }}'
    dbuser: '{{ roundcube__database_user }}'
    dbpass: '{{ roundcube__database_password }}'
    dbhost: 'localhost'
    dbtableprefix: ''

  postgresql-default:
    dbtype: 'postgresql'
    dbname: '{{ roundcube__database_name }}'
    dbuser: '{{ roundcube__database_user }}'
    dbpass: '{{ roundcube__database_password }}'
    dbhost: 'localhost'
    dbtableprefix: ''
roundcube__database_schema_map

Database type to schema mapping.

roundcube__database_schema_map:
  mysql:      '{{ roundcube__git_dest + "/SQL/mysql.initial.sql" }}'
  postgresql: '{{ roundcube__git_dest + "/SQL/postgres.initial.sql" }}'
roundcube__database_schema

Initial Roundcube database schema loaded by Ansible.

roundcube__database_schema: '{{ roundcube__database_schema_map[roundcube__database_map[roundcube__database].dbtype]
                                if roundcube__database_schema_map[roundcube__database_map[roundcube__database].dbtype] | d()
                                else "" }}'

Cache configuration

roundcube__memcached_enabled

Enable or disable support for memcached service. It will be enabled automatically if local instance of memcached is detected.

roundcube__memcached_enabled: '{{ True
                                  if (ansible_local | d() and ansible_local.memcached | d() and
                                      (ansible_local.memcached.installed | d()) | bool)
                                  else False }}'
roundcube__memcached_hosts

List of the memcached instances to use by Roundcube. By default only the local instance will be used, if detected. See debops.memcached for more details.

roundcube__memcached_hosts: [ 'localhost:11211' ]
roundcube__redis_enabled

Enable or disable support for redis service. It will be enabled automatically if local instance of redis is detected.

roundcube__redis_enabled: '{{ True
                              if (ansible_local | d() and ansible_local.redis_server | d() and
                                  (ansible_local.redis_server.installed | d()) | bool)
                              else False }}'
roundcube__redis_host

The address of the Redis server instance to use. Currently only a single server is supported by Roundcube. By default the Redis instance on the same host will be used, if it's detected via Ansible local facts.

roundcube__redis_server: 'localhost'
roundcube__redis_port

The TCP port to use for Redis connections.

roundcube__redis_port: '{{ ansible_local.redis_server.port | d("6379") }}'
roundcube__redis_database

The Redis "database" number to use.

roundcube__redis_database: '1'
roundcube__redis_password

Specify the password required for authentication to Redis.

roundcube__redis_password: '{{ ansible_local.redis_server.password | d("") }}'
roundcube__redis_hosts

List of the Redis instances which should be used by Roundcube. Currently only a single instance is supported, but the variable expects a list.

roundcube__redis_hosts: [ '{{ ([roundcube__redis_server,
                                roundcube__redis_port,
                                roundcube__redis_database,
                                roundcube__redis_password])
                              | join(":") }}' ]
roundcube__session_storage

Select the session storage type to use. Currently supported are redis and memcached. The session storage will be selected automatically by detecting available cache services via Ansible local facts. If the variable is empty, session storage will not be configured and will fall back to the db storage type.

roundcube__session_storage: '{{ "redis"
                                if roundcube__redis_enabled | bool
                                else ("memcached"
                                      if roundcube__memcached_enabled | bool
                                      else "") }}'

LDAP configuration

These variables configure the access to the LDAP address book managed by DebOps. See debops.ldap and debops.slapd role documentation to learn more about managing LDAP infrastructure with DebOps, and Roundcube LDAP Address Books documentation to learn more about configuring LDAP access in Roundcube.

roundcube__ldap_enabled

Enable or disable LDAP integration in Roundcube.

roundcube__ldap_enabled: '{{ ansible_local.ldap.enabled
                             if (ansible_local | d() and ansible_local.ldap | d() and
                                 ansible_local.ldap.enabled is defined)
                             else False }}'
roundcube__ldap_password_enabled

Enable or disable support for changing user passwords using the "password" Roundcube plugin. The plugin will be configured to use LDAP Password Modify Extended Operation (RFC 3062).

If the password change support is disabled, the "password" plugin will be disabled as well. Password change via other mechanisms can be configured separately via Ansible inventory variables.

roundcube__ldap_password_enabled: '{{ roundcube__ldap_enabled }}'
roundcube__ldap_addressbook_name

The name of the LDAP address book. It will be visible on the address book list and as the source of the search results.

roundcube__ldap_addressbook_name: 'LDAP Address Book'
roundcube__ldap_hosts

List of the FQDN addresses of the LDAP directory servers which should be used by Roundcube.

roundcube__ldap_hosts: '{{ ansible_local.ldap.hosts | d([]) }}'
roundcube__ldap_port

The TCP port to use to connect to the LDAP directory.

roundcube__ldap_port: '{{ ansible_local.ldap.port | d("389") }}'
roundcube__ldap_use_tls

Enable or disable support for STARTTLS extension while connecting to the LDAP directory.

roundcube__ldap_use_tls: '{{ ansible_local.ldap.start_tls | d(True) }}'
roundcube__ldap_base_dn

The Base Distinguished Name of the LDAP directory, defined as a YAML list.

roundcube__ldap_base_dn: '{{ ansible_local.ldap.base_dn | d([]) }}'
roundcube__ldap_device_dn

The Distinguished Name of the current host LDAP object, defined as a YAML list. It will be used as a base for the Roundcube application account LDAP object. If the list is empty, the role will not create the account LDAP object automatically.

roundcube__ldap_device_dn: '{{ ansible_local.ldap.device_dn | d([]) }}'
roundcube__ldap_self_rdn

The Relative Distinguished Name of the account LDAP object used by the Roundcube application to access the LDAP directory.

roundcube__ldap_self_rdn: '{{ "uid=" + roundcube__user }}'
roundcube__ldap_self_object_classes

List of the LDAP object classes which will be used to create the LDAP object used by the Roundcube application to access the LDAP directory.

roundcube__ldap_self_object_classes: [ 'account', 'simpleSecurityObject' ]
roundcube__ldap_self_attributes

YAML dictionary that defines the attributes of the LDAP object used by the Roundcube application to access the LDAP directory.

roundcube__ldap_self_attributes:
  uid: '{{ roundcube__ldap_self_rdn.split("=")[1] }}'
  userPassword: '{{ roundcube__ldap_bindpw }}'
  host: '{{ [ansible_fqdn, ansible_hostname] | unique }}'
  description: 'Account used by the "Roundcube" application to access the LDAP directory'
roundcube__ldap_binddn

The Distinguished Name of the account LDAP object used by the Roundcube application to bind to the LDAP directory.

roundcube__ldap_binddn: '{{ ([roundcube__ldap_self_rdn] + roundcube__ldap_device_dn) | join(",") }}'
roundcube__ldap_bindpw

The password stored in the account LDAP object used by the Roundcube application to bind to the LDAP directory.

roundcube__ldap_bindpw: '{{ (lookup("password", secret + "/ldap/credentials/"
                                    + roundcube__ldap_binddn | to_uuid + ".password length=32"))
                            if roundcube__ldap_enabled | bool
                            else "" }}'
roundcube__ldap_people_rdn

The Relative Distinguished Name of the people subtree which contains personal LDAP entries.

roundcube__ldap_people_rdn: '{{ ansible_local.ldap.people_rdn | d([]) }}'
roundcube__ldap_people_dn

The Distinguished Name of the people subtree which will be used for LDAP address book searches.

roundcube__ldap_people_dn: '{{ [roundcube__ldap_people_rdn]
                               + roundcube__ldap_base_dn }}'
roundcube__ldap_groups_rdn

The Relative Distinguished Name of the groups subtree which contains group LDAP entries.

roundcube__ldap_groups_rdn: '{{ ansible_local.ldap.groups_rdn | d([]) }}'
roundcube__ldap_groups_dn

The Distinguished Name of the groups subtree which will be used for LDAP address book searches.

roundcube__ldap_groups_dn: '{{ [roundcube__ldap_groups_rdn]
                               + roundcube__ldap_base_dn }}'
roundcube__ldap_hidden

Show or hide the LDAP address book in the Address Books interface. Hiding the LDAP address book still allows for searching its contents and autocompletion of recipient e-mail addresses.

Since the default LDAP address book configuration disables direct browsing of the contents and is read-only, displaying an entry for it is not very useful. Therefore it will be hidden by default.

roundcube__ldap_hidden: True
roundcube__ldap_field_map

YAML dictionary which defines mapping between Roundcube address book fields and LDAP entry attributes. Some of the fields are not mapped yet because they don't work or there are currently no good LDAP equivalents.

roundcube__ldap_field_map:
  name: 'cn'
  firstname: 'givenName'
  #middlename
  #prefix
  #suffix
  surname: 'sn'
  #nicname
  #maidenname
  #gender
  #spouse
  #organization
  #department
  jobtitle: 'title'
  #assistant
  #manager
  email: 'mail:*'
  'phone:home': 'homePhone'
  'phone:work': 'telephoneNumber'
  'phone:mobile': 'mobile'
  'phone:pager': 'pager'
  'phone:workfax': 'facsimileTelephoneNumber'
  street: 'street'
  zipcode: 'postalCode'
  region: 'st'
  locality: 'l'
  #address
  #birthday
  #anniversary
  #website
  #im
  notes: 'description:*'
  photo: 'jpegPhoto'

Roundcube application options

roundcube__fqdn

The default DNS address of the RoundCube web application, used in the HTTP server configuration.

roundcube__fqdn: 'webmail.{{ roundcube__domain }}'
roundcube__domain

The DNS domain of the RoundCube installation.

roundcube__domain: '{{ ansible_domain }}'
roundcube__imap_srv_rr

List which contains the result of the DNS query for IMAP server SRV resource records in the host's domain. See RFC 6186 for details.

If there are no resource records, the role checks if a local Dovecot installation is present and uses the host FQDN as the IMAP server address. Finally, imap.<domain> is used as a fallback.

roundcube__imap_srv_rr: '{{ q("debops.debops.dig_srv", "_imaps._tcp." + roundcube__domain,
                              ansible_fqdn
                              if (ansible_local | d() and ansible_local.dovecot | d() and
                                  (ansible_local.dovecot.installed | d()) | bool)
                              else "imap." + roundcube__domain, 993) }}'
roundcube__imap_fqdn

The FQDN address of the IMAP server which stores user mailboxes.

The use of the FQDN instead of localhost is required for X.509 certificate verification and for correct information in system logs.

roundcube__imap_fqdn: '{{ roundcube__imap_srv_rr[0]["target"] }}'
roundcube__imap_port

The TCP port to use for IMAP connections.

roundcube__imap_port: '{{ roundcube__imap_srv_rr[0]["port"] }}'
roundcube__imap_server

The IMAP host chosen to perform the log-in. This variable is also called default_server by Roundcube .

Leave blank to show a textbox at login, give a list of hosts to display a pulldown menu or set one host as string. To use SSL/TLS connection, enter hostname with prefix ssl:// or tls:// Supported replacement variables: %n - hostname ($_SERVER['SERVER_NAME']) %t - hostname without the first part %d - domain (http hostname $_SERVER['HTTP_HOST'] without the first part) %s - domain name after the '@' from e-mail address provided at login screen For example %n = mail.domain.tld, %t = domain.tld

roundcube__imap_server: '{{ ("ssl://"
                             if (roundcube__imap_port == "993")
                             else ("tls://"
                                   if (roundcube__imap_port == "143")
                                   else "tls://"))
                             + roundcube__imap_fqdn
                             + ":" + roundcube__imap_port }}'
roundcube__smtp_srv_rr

List which contains the result of the DNS query for the SMTP (submission) server SRV resource records in the host's domain. See RFC 6186 for details.

If there are no resource records, the role checks if a local Postfix installation is present and uses the host FQDN as the SMTP server address. Finally, smtp.<domain> is used as a fallback.

roundcube__smtp_srv_rr: '{{ q("debops.debops.dig_srv", "_submissions._tcp." + roundcube__domain,
                              ansible_fqdn
                              if (ansible_local | d() and ansible_local.postfix | d() and
                                  (ansible_local.postfix.installed | d()) | bool)
                              else ("smtp." + roundcube__domain), 465) }}'
roundcube__smtp_fqdn

The FQDN address of the SMTP (submission) server which will be used to send e-mail messages.

The use of the FQDN instead of localhost is required for X.509 certificate verification and for correct information in system logs.

roundcube__smtp_fqdn: '{{ roundcube__smtp_srv_rr[0]["target"] }}'
roundcube__smtp_port

The TCP port to use for SMTP connections.

Common values include 25 for unencrypted communication, 587 for STARTTLS, or 465 for SMTP over SSL (aka SMTPS).

roundcube__smtp_port: '{{ roundcube__smtp_srv_rr[0]["port"] }}'
roundcube__smtp_server

SMTP server host (for sending mails).

Enter hostname with prefix tls:// to use STARTTLS, or use prefix ssl:// to use the deprecated SSL over SMTP (aka SMTPS) Supported replacement variables: %h - user's IMAP hostname %n - hostname ($_SERVER['SERVER_NAME']) %t - hostname without the first part %d - domain (http hostname $_SERVER['HTTP_HOST'] without the first part) %z - IMAP domain (IMAP hostname without the first part) For example %n = mail.domain.tld, %t = domain.tld

roundcube__smtp_server: '{{ ("ssl://"
                             if (roundcube__smtp_port == "465")
                             else ("tls://"
                                   if (roundcube__smtp_port == "587")
                                   else "tls://"))
                             + roundcube__smtp_fqdn
                             + ":" + roundcube__smtp_port }}'
roundcube__smtp_user

SMTP username (if required) if you use %u as the username Roundcube will use the current username for login.

roundcube__smtp_user: '%u'
roundcube__smtp_pass

SMTP password (if required) if you use %p as the password Roundcube will use the current user's password for login.

roundcube__smtp_pass: '%p'
roundcube__sieve_srv_rr

List which contains the result of the DNS query for Sieve server SRV resource records in the host's domain. See RFC 5804 for details.

If there are no resource records, the role checks if a local Dovecot installation is present and uses the host FQDN as the Sieve server address. Finally, sieve.<domain> is used as a fallback.

roundcube__sieve_srv_rr: '{{ q("debops.debops.dig_srv", "_sieve._tcp." + roundcube__domain,
                               ansible_fqdn
                               if (ansible_local | d() and ansible_local.dovecot | d() and
                                   (ansible_local.dovecot.installed | d()) | bool)
                               else ("sieve." + roundcube__domain), 4190) }}'
roundcube__sieve_fqdn

The FQDN address of the Sieve server which allows management of the Sieve filter scripts.

The use of the FQDN instead of localhost is required for X.509 certificate verification and for correct information in system logs.

roundcube__sieve_fqdn: '{{ roundcube__sieve_srv_rr[0]["target"] }}'
roundcube__sieve_port

The TCP port used for Sieve connections.

roundcube__sieve_port: '{{ roundcube__sieve_srv_rr[0]["port"] }}'
roundcube__sieve_server

The Sieve host chosen to access the Sieve configuration interface. Replacement variables supported in host name: %h - user's IMAP hostname %n - http hostname ($_SERVER['SERVER_NAME']) %d - domain (http hostname without the first part) For example %n = mail.domain.tld, %d = domain.tld

roundcube__sieve_server: '{{ "tls://" + roundcube__sieve_fqdn }}'
roundcube__product_name

Name your service. This is displayed on the login screen and in the window title

roundcube__product_name: '{{ ansible_local.machine.organization | d("Roundcube") + " Webmail" }}'
roundcube__des_key

Encryption key for the users imap password which is stored in the session record (and the client cookie if remember password is enabled).

roundcube__des_key: '{{ lookup("password", secret + "/credentials/" + inventory_hostname + "/roundcube/des_key chars=hexdigits length=24") }}'
roundcube__username_domain

Specify a domain (realm) to add to usernames without a specified domain. Defining a default domain helps avoid creating separate RoundCube profiles when users use logins with and without a domain specified.

The default is to create a domain based on the host DNS domain.

roundcube__username_domain: '%d'
roundcube__log_driver

Define the log driver. Currently available: syslog, stdout, file.

roundcube__log_driver: 'syslog'

Roundcube configuration file

These variables define the contents of the config/config.inc.php local configuration file. See roundcube__configuration for more details.

roundcube__original_configuration

The list defines the Roundcube configuration options stored in the config.inc.php.sample configuration file. Modifications to these configuration options should be done using the subsequent variables.

roundcube__original_configuration:

    # [[[ init
  - name: 'init_config'
    raw: |
      $config = array();
    section: 'init'

    # [[[  sql
  - name: 'db_dsnw'
    comment: |
      Database connection string (DSN) for read+write operations
      Format (compatible with PEAR MDB2): db_provider://user:password@host/database
      Currently supported db_providers: mysql, pgsql, sqlite, mssql, sqlsrv, oracle
      For examples see https://pear.php.net/manual/en/package.database.mdb2.intro-dsn.php
      Note: for SQLite use absolute path (Linux): 'sqlite:////full/path/to/sqlite.db?mode=0646'
            or (Windows): 'sqlite:///C:/full/path/to/sqlite.db'
      Note: Various drivers support various additional arguments for connection,
            for Mysql: key, cipher, cert, capath, ca, verify_server_cert,
            for Postgres: application_name, sslmode, sslcert, sslkey,
            sslrootcert, sslcrl, sslcompression, service.
            e.g. 'mysql://roundcube:@localhost/roundcubemail?verify_server_cert=false'
    value: 'mysql://roundcube:pass@localhost/roundcubemail'
    section: 'sql'

  - name: 'db_dsnr'
    comment: |
      Database DSN for read-only operations (if empty write database will be used)
      useful for database replication
    value: ''
    section: 'sql'
    state: 'init'

  - name: 'db_dsnw_noread'
    comment: 'Disable the use of already established dsnw connections for subsequent reads'
    value: False
    section: 'sql'
    state: 'init'

  - name: 'db_persistent'
    comment: |
      use persistent db-connections
      beware this will not "always" work as expected
      see: http://www.php.net/manual/en/features.persistent-connections.php
    value: False
    section: 'sql'
    state: 'init'

  - name: 'db_prefix'
    comment: 'You can define specific table (and sequence) names prefix'
    value: ''
    section: 'sql'
    state: 'init'

  - name: 'db_table_dsn'
    comment: |
      Mapping of table names and connections to use for ALL operations.
      This can be used in a setup with replicated databases and a DB master
      where read/write access to cache tables should not go to master.
    array:
      - 'cache':          'r'
        'cache_index':    'r'
        'cache_thread':   'r'
        'cache_messages': 'r'
    section: 'sql'
    state: 'init'

  - name: 'db_max_allowed_packet'
    comment: |
      It is possible to specify database variable values e.g. some limits here.
      Use them if your server is not MySQL or for better performance.
      For example Roundcube uses max_allowed_packet value (in bytes)
      which limits query size for database cache operations.
    value: null
    section: 'sql'
    state: 'init'

    # [[[ logging
  - name: 'log_driver'
    comment: |
      Log driver: 'syslog', 'stdout' or 'file'.
    value: 'file'
    section: 'logging'
    state: 'init'

  - name: 'log_date_format'
    comment: |
      Date format for log entries
      (read https://php.net/manual/en/function.date.php for all format characters)
    value: 'd-M-Y H:i:s O'
    section: 'logging'
    state: 'init'

  - name: 'log_session_id'
    comment: |
      Length of the session ID to prepend each log line with
      set to 0 to avoid session IDs being logged.
    value: 8
    section: 'logging'
    state: 'init'

  - name: 'log_file_ext'
    comment: 'Default extension used for log file name'
    value: '.log'
    section: 'logging'
    state: 'init'

  - name: 'syslog_id'
    comment: 'Syslog ident string to use, if using the "syslog" log driver.'
    value: 'roundcube'
    section: 'logging'
    state: 'init'

  - name: 'syslog_facility'
    comment: |
      Syslog facility to use, if using the 'syslog' log driver.
      For possible values see installer or https://php.net/manual/en/function.openlog.php
    value: 'LOG_USER'
    quotes: False
    section: 'logging'
    state: 'init'

  - name: 'per_user_logging'
    comment: |
      Activate this option if logs should be written to per-user directories.
      Data will only be logged if a directory <log_dir>/<username>/ exists and is writable.
    value: False
    section: 'logging'
    state: 'init'

  - name: 'smtp_log'
    comment: 'Log sent messages to <log_dir>/sendmail.log or to syslog'
    value: True
    section: 'logging'
    state: 'init'

  - name: 'log_logins'
    comment: 'Log successful/failed logins to <log_dir>/userlogins.log or to syslog'
    value: False
    section: 'logging'
    state: 'init'

  - name: 'session_debug'
    comment: |
      Log session debug information/authentication errors to <log_dir>/session.log or to syslog
    value: False
    section: 'logging'
    state: 'init'

  - name: 'sql_debug'
    comment: 'Log SQL queries to <log_dir>/sql.log or to syslog'
    value: False
    section: 'logging'
    state: 'init'

  - name: 'imap_debug'
    comment: 'Log IMAP conversation to <log_dir>/imap.log or to syslog'
    value: False
    section: 'logging'
    state: 'init'

  - name: 'ldap_debug'
    comment: 'Log LDAP conversation to <log_dir>/ldap.log or to syslog'
    value: False
    section: 'logging'
    state: 'init'

  - name: 'smtp_debug'
    comment: 'Log SMTP conversation to <log_dir>/smtp.log or to syslog'
    value: False
    section: 'logging'
    state: 'init'

  - name: 'memcache_debug'
    comment: 'Log Memcache conversation to <log_dir>/memcache.log or to syslog'
    value: False
    section: 'logging'
    state: 'init'

  - name: 'apc_debug'
    comment: 'Log APC conversation to <log_dir>/apc.log or to syslog'
    value: False
    section: 'logging'
    state: 'init'

  - name: 'redis_debug'
    comment: 'Log Redis conversation to <log_dir>/redis.log or to syslog'
    value: False
    section: 'logging'
    state: 'init'

    # [[[ imap
  - name: 'imap_host'
    comment: |
      IMAP host chosen to perform the log-in.
      See defaults.inc.php for the option description.
    value: 'localhost:143'
    section: 'imap'

  - name: 'imap_auth_type'
    comment: |
      IMAP authentication method (DIGEST-MD5, CRAM-MD5, LOGIN, PLAIN or null).
      Use 'IMAP' to authenticate with IMAP LOGIN command.
      By default the most secure method (from supported) will be selected.
    value: null
    section: 'imap'
    state: 'init'

  - name: 'imap_conn_options'
    comment: |
      IMAP socket context options
      See https://php.net/manual/en/context.ssl.php
      The example below enables server certificate validation
      Note: These can be also specified as an array of options indexed by hostname
    array:
      - ssl:
          - verify_peer: True
            verify_depth: 3
            cafile: '/etc/ssl/certs/ca-certificates.crt'
    section: 'imap'
    state: 'init'

  - name: 'imap_timeout'
    comment: 'IMAP connection timeout, in seconds. Default: 0 (use default_socket_timeout)'
    value: 0
    section: 'imap'
    state: 'init'

  - name: 'imap_auth_cid'
    comment: 'Optional IMAP authentication identifier to be used as authorization proxy'
    value: null
    section: 'imap'
    state: 'init'

  - name: 'imap_auth_pw'
    comment: 'Optional IMAP authentication password to be used for imap_auth_cid'
    value: null
    section: 'imap'
    state: 'init'

  - name: 'imap_delimiter'
    comment: |
      If you know your imap's folder delimiter, you can specify it here.
      Otherwise it will be determined automatically
    value: null
    section: 'imap'
    state: 'init'

  - name: 'imap_vendor'
    comment: |
      If you know your imap's folder vendor, you can specify it here.
      Otherwise it will be determined automatically. Use lower-case
      identifiers, e.g. 'dovecot', 'cyrus', 'gimap', 'hmail', 'uw-imap'.
    value: null
    section: 'imap'
    state: 'init'

  - name: 'imap_ns_personal'
    comment: |
      If IMAP server doesn't support NAMESPACE extension, but you're
      using shared folders or personal root folder is non-empty, you'll need to
      set these options. All can be strings or arrays of strings.
      Note: Folders need to be ended with directory separator, e.g. "INBOX."
            (special directory "~" is an exception to this rule)
      Note: These can be used also to overwrite server's namespaces
      Note: Set these to FALSE to disable access to specified namespace
    value: null
    section: 'imap'
    state: 'init'

  - name: 'imap_ns_other'
    value: null
    section: 'imap'
    state: 'init'

  - name: 'imap_ns_shared'
    value: null
    section: 'imap'
    state: 'init'

  - name: 'imap_force_caps'
    comment: |
      By default IMAP capabilities are read after connection to IMAP server
      In some cases, e.g. when using IMAP proxy, there's a need to refresh the list
      after login. Set to True if you've got this case.
    value: False
    section: 'imap'
    state: 'init'

  - name: 'imap_force_lsub'
    comment: |
      By default list of subscribed folders is determined using LIST-EXTENDED
      extension if available. Some servers (dovecot 1.x) returns wrong results
      for shared namespaces in this case. https://github.com/roundcube/roundcubemail/issues/2474
      Enable this option to force LSUB command usage instead.
      Deprecated: Use imap_disabled_caps = array('LIST-EXTENDED')
    value: False
    section: 'imap'
    state: 'init'

  - name: 'imap_force_ns'
    comment: |
      Some server configurations (e.g. Courier) doesn't list folders in all namespaces
      Enable this option to force listing of folders in all namespaces
    value: False
    section: 'imap'
    state: 'init'

  - name: 'imap_skip_hidden_folders'
    comment: |
      Some servers return hidden folders (name starting with a dot)
      from user home directory. IMAP RFC does not forbid that.
      Enable this option to hide them and disable possibility to create such.
    value: False
    section: 'imap'
    state: 'init'

  - name: 'imap_dual_use_folders'
    comment: |
      Some servers do not support folders with both folders and messages inside
      If your server supports that use true, if it does not, use false.
      By default it will be determined automatically (once per user session).
    value: null
    section: 'imap'
    state: 'init'

  - name: 'imap_disabled_caps'
    comment: |
      List of disabled imap extensions.
      Use if your IMAP server has broken implementation of some feature
      and you can't remove it from CAPABILITY string on server-side.
      For example UW-IMAP server has broken ESEARCH.
      Note: Because the list is cached, re-login is required after change.
    value: []
    section: 'imap'
    state: 'init'

  - name: 'imap_log_session'
    comment: |
      Log IMAP session identifiers after each IMAP login.
      This is used to relate IMAP session with Roundcube user sessions
    value: False
    section: 'imap'
    state: 'init'

  - name: 'imap_cache'
    comment: |
      Type of IMAP indexes cache. Supported values: 'db', 'apc' and 'memcache' or 'memcached'.
    value: null
    section: 'imap'
    state: 'init'

  - name: 'messages_cache'
    comment: |
      Enables messages cache. Only 'db' cache is supported.
      This requires an IMAP server that supports QRESYNC and CONDSTORE
      extensions (RFC7162). See synchronize() in program/lib/Roundcube/rcube_imap_cache.php
      for further info, or if you experience syncing problems.
    value: False
    section: 'imap'
    state: 'init'

  - name: 'imap_cache_ttl'
    comment: 'Lifetime of IMAP indexes cache. Possible units: s, m, h, d, w'
    value: '10d'
    section: 'imap'
    state: 'init'

  - name: 'messages_cache_ttl'
    comment: 'Lifetime of messages cache. Possible units: s, m, h, d, w'
    value: '10d'
    section: 'imap'
    state: 'init'

  - name: 'messages_cache_threshold'
    comment: |
      Maximum cached message size in kilobytes.
      Note: On MySQL this should be less than (max_allowed_packet - 30%)
    value: 50
    section: 'imap'
    state: 'init'

    # [[[ smtp
  - name: 'smtp_host'
    comment: |
      SMTP server host (for sending mails).
      See defaults.inc.php for the option description.
    value: 'localhost:587'
    section: 'smtp'

  - name: 'smtp_user'
    comment: |
      SMTP username (if required) if you use %u as the username Roundcube
      will use the current username for login
    value: '%u'
    section: 'smtp'

  - name: 'smtp_pass'
    comment: |
      SMTP password (if required) if you use %p as the password Roundcube
      will use the current user's password for login
    value: '%p'
    section: 'smtp'

  - name: 'smtp_auth_type'
    comment: |
      SMTP AUTH type (DIGEST-MD5, CRAM-MD5, LOGIN, PLAIN or empty to use
      best server supported one)
    value: null
    section: 'smtp'
    state: 'init'

  - name: 'smtp_auth_cid'
    comment: |
      Optional SMTP authentication identifier to be used as authorization proxy
    value: null
    section: 'smtp'
    state: 'init'

  - name: 'smtp_auth_pw'
    comment: |
      Optional SMTP authentication password to be used for smtp_auth_cid
    value: null
    section: 'smtp'
    state: 'init'

  - name: 'smtp_helo_host'
    comment: |
      SMTP HELO host
      Hostname to give to the remote server for SMTP 'HELO' or 'EHLO' messages
      Leave this blank and you will get the server variable 'server_name' or
      localhost if that isn't defined.
    value: ''
    section: 'smtp'
    state: 'init'

  - name: 'smtp_timeout'
    comment: |
      SMTP connection timeout, in seconds. Default: 0 (use default_socket_timeout)
      Note: There's a known issue where using ssl connection with
      timeout > 0 causes connection errors (https://bugs.php.net/bug.php?id=54511)
    value: 0
    section: 'smtp'
    state: 'init'

  - name: 'smtp_conn_options'
    comment: |
      SMTP socket context options
      See https://php.net/manual/en/context.ssl.php
      The example below enables server certificate validation, and
      requires 'smtp_timeout' to be non zero.
      Note: These can be also specified as an array of options indexed by hostname
    array:
      - ssl:
          - verify_peer: True
            verify_depth: 3
            cafile: '/etc/ssl/certs/ca-certificates.crt'
    section: 'smtp'
    state: 'init'

    # [[[ ldap
  - name: 'ldap_cache'
    comment: |
      Type of LDAP cache. Supported values: 'db', 'apc' and 'memcache' or 'memcached'.
    value: 'db'
    section: 'ldap'
    state: 'init'

  - name: 'ldap_cache_ttl'
    comment: 'Lifetime of LDAP cache. Posibble units: s, m, h, d, w'
    value: '10m'
    section: 'ldap'
    state: 'init'

    # [[[ cache
  - name: 'memcache_hosts'
    comment: |
      Use these hosts for accessing memcached
      Define any number of hosts in the form of hostname:port or unix:///path/to/socket.file
      Example: array('localhost:11211', '192.168.1.12:11211', 'unix:///var/tmp/memcached.sock');
    value: null
    section: 'cache'
    state: 'init'

  - name: 'memcache_pconnect'
    comment: |
      Controls the use of a persistent connections to memcache servers
      See https://php.net/manual/en/memcache.addserver.php
    value: True
    section: 'cache'
    state: 'init'

  - name: 'memcache_timeout'
    comment: |
      Value in seconds which will be used for connecting to the daemon
      See https://php.net/manual/en/memcache.addserver.php
    value: 1
    section: 'cache'
    state: 'init'

  - name: 'memcache_retry_interval'
    comment: |
      Controls how often a failed server will be retried (value in seconds).
      Setting this parameter to -1 disables automatic retry.
      See https://php.net/manual/en/memcache.addserver.php
    value: 15
    section: 'cache'
    state: 'init'

  - name: 'redis_hosts'
    comment: |
      Use these hosts for accessing Redis.
      Currently only one host is supported. Cluster support may come in a future release.
      You can pass 4 fields, host, port (optional), database (optional) and password (optional).
      Unset fields will be set to the default values host=127.0.0.1, port=6379.
      Examples:
          array('localhost:6379');
          array('192.168.1.1:6379:1:secret');
          array('unix:///var/run/redis/redis-server.sock:1:secret');
    value: null
    section: 'cache'
    state: 'init'

  - name: 'memcache_max_allowed_packet'
    comment: 'Maximum size of an object in memcache (in bytes). Default: 2MB'
    value: '2M'
    section: 'cache'
    state: 'init'

  - name: 'apc_mac_allowed_packet'
    comment: 'Maximum size of an object in APC cache (in bytes). Default: 2MB'
    value: '2M'
    section: 'cache'
    state: 'init'

  - name: 'redis_max_allowed_packet'
    comment: 'Maximum size of an object in Redis cache (in bytes). Default: 2MB'
    value: '2M'
    section: 'cache'
    state: 'init'

    # [[[ system
  - name: 'enable_installer'
    comment: |
      THIS OPTION WILL ALLOW THE INSTALLER TO RUN AND CAN EXPOSE SENSITIVE CONFIG DATA.
      ONLY ENABLE IT IF YOU'RE REALLY SURE WHAT YOU'RE DOING!
    value: False
    section: 'system'
    state: 'init'

  - name: 'dont_override'
    comment: "Don't allow these settings to be overridden by the user"
    value: []
    section: 'system'
    state: 'init'

  - name: 'disabled_actions'
    comment: 'List of disabled UI elements/actions'
    value: []
    section: 'system'
    state: 'init'

  - name: 'advanced_prefs'
    comment: |
      Define which settings should be listed under the 'advanced' block
      which is hidden by default
    value: []
    section: 'system'
    state: 'init'

  - name: 'support_url'
    comment: |
      Provide an URL where a user can get support for this Roundcube installation
      PLEASE DO NOT LINK TO THE ROUNDCUBE.NET WEBSITE HERE!
    value: ''
    section: 'system'

  - name: 'skin_logo'
    comment: |
      Logo image replacement. Specifies location of the image as:
      - URL relative to the document root of this Roundcube installation
      - full URL with http:// or https:// prefix
      - URL relative to the current skin folder (when starts with a '/')

      An array can be used to specify different logos for specific template files
      The array key specifies the place(s) the logo should be applied to and
      is made up of (up to) 3 parts:
      - skin name prefix (always with colon, can be replaced with *)
      - template name (or * for all templates)
      - logo type - it is used for logos used on multiple templates
        the available types include '[favicon]' for favicon, '[print]' for logo on all print
        templates (e.g. messageprint, contactprint) and '[small]' for small screen logo in supported skins

      Example config for skin_logo

      array(
        // show the image /images/logo_login_small.png for the Login screen in the Elastic skin on small screens
        "elastic:login[small]" => "/images/logo_login_small.png",
        // show the image /images/logo_login.png for the Login screen in the Elastic skin
        "elastic:login" => "/images/logo_login.png",
        // show the image /images/logo_small.png in the Elastic skin
        "elastic:*[small]" => "/images/logo_small.png",
        // show the image /images/larry.png in the Larry skin
        "larry:*" => "/images/larry.png",
        // show the image /images/logo_login.png on the login template in all skins
        "login" => "/images/logo_login.png",
        // show the image /images/logo_print.png for all print type logos in all skins
        "[print]" => "/images/logo_print.png",
      );
    value: null
    section: 'system'
    state: 'init'

  - name: 'auto_create_user'
    comment: |
      Automatically create a new Roundcube user when log-in the first time.
      A new user will be created once the IMAP login succeeds.
      Set to false if only registered users can use this service
    value: True
    section: 'system'
    state: 'init'

  - name: 'user_aliases'
    comment: 'Enables possibility to log in using email address from user identities'
    value: False
    section: 'system'
    state: 'init'

  - name: 'log_dir'
    comment: |
      use this folder to store log files
      must be writeable for the user who runs PHP process (Apache user if mod_php is being used)
      This is used by the 'file' log driver.
    value: "RCUBE_INSTALL_PATH . 'logs/'"
    quotes: False
    section: 'system'
    state: 'init'

  - name: 'temp_dir'
    comment: |
      Use this folder to store temp files
      Must be writeable for the user who runs PHP process (Apache user if mod_php is being used)
    value: "RCUBE_INSTALL_PATH . 'temp/'"
    quotes: False
    section: 'system'
    state: 'init'

  - name: 'temp_dir_ttl'
    comment: |
      Expire files in temp_dir after 48 hours
      Possible units: s, m, h, d, w
    value: '48h'
    section: 'system'
    state: 'init'

  - name: 'force_https'
    comment: |
      Enforce connections over https
      With this option enabled, all non-secure connections will be redirected.
      It can be also a port number, hostname or hostname:port if they are
      different than default HTTP_HOST:443
    value: False
    section: 'system'
    state: 'init'

  - name: 'use_https'
    comment: |
      Tell PHP that it should work as under secure connection
      even if it doesn't recognize it as secure ($_SERVER['HTTPS'] is not set)
      e.g. when you're running Roundcube behind a https proxy
      This option is mutually exclusive to 'force_https' and only either one of
      them should be set to true.
    value: False
    section: 'system'
    state: 'init'

  - name: 'login_autocomplete'
    comment: |
      Allow browser-autocompletion on login form.
      0 - disabled, 1 - username and host only, 2 - username, host, password
    value: 0
    section: 'system'
    state: 'init'

  - name: 'login_lc'
    comment: |
      Forces conversion of logins to lower case.
      0 - disabled, 1 - only domain part, 2 - domain and local part.
      If users authentication is case-insensitive this must be enabled.
      Note: After enabling it all user records need to be updated, e.g. with query:
            UPDATE users SET username = LOWER(username);
    value: 2
    section: 'system'
    state: 'init'

  - name: 'login_username_maxlen'
    comment: 'Maximum length (in bytes) of logon username and password.'
    value: 1024
    section: 'system'
    state: 'init'

  - name: 'login_password_maxlen'
    value: 1024
    section: 'system'
    state: 'init'

  - name: 'login_username_filter'
    comment: |
      Logon username filter. Regular expression for use with preg_match().
      Example: '/^[a-z0-9_@.-]+$/'
    value: null
    section: 'system'
    state: 'init'

  - name: 'login_rate_limit'
    comment: |
      Brute-force attacks prevention.
      The value specifies maximum number of failed logon attempts per minute.
    value: 3
    section: 'system'
    state: 'init'

  - name: 'skin_include_php'
    comment: 'Includes should be interpreted as PHP files'
    value: False
    section: 'system'
    state: 'init'

  - name: 'display_product_info'
    comment: |
      Display product name and software version on login screen
      0 - hide product name and version number,
      1 - show product name only,
      2 - show product name and version number
    value: 1
    section: 'system'
    state: 'init'

  - name: 'session_lifetime'
    comment: 'Session lifetime in minutes'
    value: 10
    section: 'system'
    state: 'init'

  - name: 'session_domain'
    comment: 'Session domain: .example.org'
    value: ''
    section: 'system'
    state: 'init'

  - name: 'session_name'
    comment: |
      Session name. Default: 'roundcube_sessid'
    value: null
    section: 'system'
    state: 'init'

  - name: 'session_auth_name'
    comment: |
      Session authentication cookie name. Default: 'roundcube_sessauth'
    value: null
    section: 'system'
    state: 'init'

  - name: 'session_path'
    comment: |
      Session path. Defaults to PHP session.cookie_path setting.
    value: null
    section: 'system'
    state: 'init'

  - name: 'session_storage'
    comment: |
      Backend to use for session storage. Can either be 'db' (default), 'redis', 'memcache', or 'php'

      If set to 'memcache' or 'memcached', a list of servers need to be specified in 'memcache_hosts'
      Make sure the Memcache extension (https://pecl.php.net/package/memcache) version >= 2.0.0
      or the Memcached extension (https://pecl.php.net/package/memcached) version >= 2.0.0 is installed.

      If set to 'redis', a server needs to be specified in 'redis_hosts'
      Make sure the Redis extension (https://pecl.php.net/package/redis) version >= 2.0.0 is installed.

      Setting this value to 'php' will use the default session save handler configured in PHP
    value: 'db'
    section: 'system'
    state: 'init'

  - name: 'proxy_whitelist'
    comment: |
      List of trusted proxies
      X_FORWARDED_* and X_REAL_IP headers are only accepted from these IPs
    value: []
    section: 'system'
    state: 'init'

  - name: 'trusted_host_pattern'
    comment: |
      List of trusted host names
      Attackers can modify Host header of the HTTP request causing $_SERVER['SERVER_NAME']
      or $_SERVER['HTTP_HOST'] variables pointing to a different host, that could be used
      to collect user names and passwords. Some server configurations prevent that, but not all.
      An empty list accepts any host name. The list can contain host names
      or PCRE patterns (without // delimiters, that will be added automatically).
    value: []
    section: 'system'
    state: 'init'

  - name: 'ip_check'
    comment: 'Check client IP in session authorization'
    value: False
    section: 'system'
    state: 'init'

  - name: 'x_frame_options'
    comment: |
      X-Frame-Options HTTP header value sent to prevent from Clickjacking.
      Possible values: sameorigin|deny|allow-from <uri>.
      Set to false in order to disable sending the header.
    value: 'sameorigin'
    section: 'system'
    state: 'init'

  - name: 'des_key'
    comment: |
      this key is used to encrypt the users imap password which is stored
      in the session record (and the client cookie if remember password is enabled).
      please provide a string of exactly 24 chars.
      YOUR KEY MUST BE DIFFERENT THAN THE SAMPLE VALUE FOR SECURITY REASONS
    value: 'rcmail-!24ByteDESkey*Str'
    section: 'system'

  - name: 'cipher_method'
    comment: |
      Encryption algorithm. You can use any method supported by OpenSSL.
      Default is set for backward compatibility to DES-EDE3-CBC,
      but you can choose e.g. AES-256-CBC which we consider a better choice.
    value: 'DES-EDE3-CBC'
    section: 'system'
    state: 'init'

  - name: 'username_domain'
    comment: |
      Automatically add this domain to user names for login
      Only for IMAP servers that require full e-mail addresses for login
      Specify an array with 'host' => 'domain' values to support multiple hosts
      Supported replacement variables:
      %h - user's IMAP hostname
      %n - hostname ($_SERVER['SERVER_NAME'])
      %t - hostname without the first part
      %d - domain (http hostname $_SERVER['HTTP_HOST'] without the first part)
      %z - IMAP domain (IMAP hostname without the first part)
      For example %n = mail.domain.tld, %t = domain.tld
    value: ''
    section: 'system'
    state: 'init'

  - name: 'username_domain_forced'
    comment: |
      Force domain configured in username_domain to be used for login.
      Any domain in username will be replaced by username_domain.
    value: False
    section: 'system'
    state: 'init'

  - name: 'mail_domain'
    comment: |
      This domain will be used to form e-mail addresses of new users
      Specify an array with 'host' => 'domain' values to support multiple hosts
      Supported replacement variables:
      %h - user's IMAP hostname
      %n - http hostname ($_SERVER['SERVER_NAME'])
      %d - domain (http hostname without the first part)
      %z - IMAP domain (IMAP hostname without the first part)
      For example %n = mail.domain.tld, %t = domain.tld
    value: ''
    section: 'system'
    state: 'init'

  - name: 'password_charset'
    comment: |
      Password character set, to change the password for user
      authentication or for password change operations
    value: 'UTF-8'
    section: 'system'
    state: 'init'

  - name: 'sendmail_delay'
    comment: 'How many seconds must pass between emails sent by a user'
    value: 0
    section: 'system'
    state: 'init'

  - name: 'max_message_size'
    comment: |
      Message size limit. Note that SMTP server(s) may use a different value.
      This limit is verified when user attaches files to a composed message.
      Size in bytes (possible unit suffix: K, M, G)
    value: '100M'
    section: 'system'
    state: 'init'

  - name: 'max_recipients'
    comment: |
      Maximum number of recipients per message (including To, Cc, Bcc).
      Default: 0 (no limit)
    value: 0
    section: 'system'
    state: 'init'

  - name: 'max_disclosed_recipients'
    comment: |
      Maximum number of recipients per message excluding Bcc header.
      This is a soft limit, which means we only display a warning to the user.
      Default: 5
    value: 5
    section: 'system'
    state: 'init'

  - name: 'max_group_members'
    comment: |
      Maximum allowed number of members of an address group. Default: 0 (no limit)
      If 'max_recipients' is set this value should be less or equal
    value: 0
    section: 'system'
    state: 'init'

  - name: 'product_name'
    comment: |
      Name your service. This is displayed on the login screen and in the window title
    value: 'Roundcube Webmail'
    section: 'system'

  - name: 'useragent'
    comment: 'Add this user-agent to message headers when sending'
    value: "'Roundcube Webmail/'.RCUBE_VERSION"
    quotes: False
    section: 'system'
    state: 'init'

  - name: 'include_host_config'
    comment: |
      Try to load host-specific configuration
      See https://github.com/roundcube/roundcubemail/wiki/Configuration:-Multi-Domain-Setup
      for more details
    value: False
    section: 'system'
    state: 'init'

  - name: 'generic_message_footer'
    comment: |
      Path to a text file which will be added to each sent message
      Paths are relative to the Roundcube root folder
    value: ''
    section: 'system'
    state: 'init'

  - name: 'generic_message_footer_html'
    comment: |
      Path to a text file which will be added to each sent HTML message
      Paths are relative to the Roundcube root folder
    value: ''
    section: 'system'
    state: 'init'

  - name: 'http_received_header'
    comment: |
      Add a received header to outgoing mails containing the creators IP and hostname
    value: False
    section: 'system'
    state: 'init'

  - name: 'http_received_header_encrypt'
    comment: |
      Whether or not to encrypt the IP address and the host name
      these could, in some circles, be considered as sensitive information;
      however, for the administrator, these could be invaluable help
      when tracking down issues.
    value: False
    section: 'system'
    state: 'init'

  - name: 'line_length'
    comment: |
      Number of chars allowed for line when wrapping text.
      Text wrapping is done when composing/sending messages
    value: 72
    section: 'system'
    state: 'init'

  - name: 'send_format_flowed'
    comment: 'Send plaintext messages as format=flowed'
    value: True
    section: 'system'
    state: 'init'

  - name: 'mdn_use_from'
    comment: |
      According to RFC2298, return receipt envelope sender address must be
      empty. If this option is true, Roundcube will use user's identity as
      envelope sender for MDN responses.
    value: False
    section: 'system'
    state: 'init'

  - name: 'identities_level'
    comment: |
      Set identities access level:
      0 - many identities with possibility to edit all params
      1 - many identities with possibility to edit all params but not email address
      2 - one identity with possibility to edit all params
      3 - one identity with possibility to edit all params but not email address
      4 - one identity with possibility to edit only signature
    value: 0
    section: 'system'
    state: 'init'

  - name: 'identity_image_size'
    comment: |
      Maximum size of uploaded image in kilobytes
      Images (in html signatures) are stored in database as data URIs
    value: 64
    section: 'system'
    state: 'init'

  - name: 'client_mimetypes'
    comment: |
      Mimetypes supported by the browser.
      Attachments of these types will open in a preview window
      Either a comma-separated list or an array: 'text/plain,text/html,text/xml,image/jpeg,image/gif,image/png,application/pdf'
    value: null
    section: 'system'
    state: 'init'

  - name: 'mime_magic'
    comment: |
      Path to a local mime magic database file for PHPs finfo extension.
      Set to null if the default path should be used.
    value: null
    section: 'system'
    state: 'init'

  - name: 'mime_types'
    comment: |
      Absolute path to a local mime.types mapping table file.
      This is used to derive mime-types from the filename extension or vice versa.
      Such a file is usually part of the apache webserver. If you don't find a file named mime.types on your system,
      download it from https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
    value: null
    section: 'system'
    state: 'init'

  - name: 'im_identify_path'
    comment: |
      Path to imagemagick identify binary (if not set we'll use Imagick or GD extensions)
    value: null
    section: 'system'
    state: 'init'

  - name: 'im_convert_path'
    comment: |
      Path to imagemagick convert binary (if not set we'll use Imagick or GD extensions)
    value: null
    section: 'system'
    state: 'init'

  - name: 'image_thumbnail_size'
    comment: |
      Size of thumbnails from image attachments displayed below the message content.
      Note: whether images are displayed at all depends on the 'inline_images' option.
      Set to 0 to display images in full size.
    value: 240
    section: 'system'
    state: 'init'

  - name: 'contact_photo_size'
    comment: 'Maximum size of uploaded contact photos in pixel'
    value: 160
    section: 'system'
    state: 'init'

  - name: 'email_dns_check'
    comment: 'Enable DNS checking for e-mail address validation'
    value: False
    section: 'system'
    state: 'init'

  - name: 'no_save_sent_messages'
    comment: |
      Disables saving sent messages in Sent folder (like gmail) (Default: false)
      Note: useful when SMTP server stores sent mail in user mailbox
    value: False
    section: 'system'
    state: 'init'

  - name: 'use_secure_urls'
    comment: |
      Improve system security by using special URL with security token.
      This can be set to a number defining token length. Default: 16.
      Warning: This requires http server configuration. Sample:
         RewriteRule ^/roundcubemail/[a-zA-Z0-9]{16}/(.*) /roundcubemail/$1 [PT]
         Alias /roundcubemail /var/www/roundcubemail/
      Note: Use assets_path to not prevent the browser from caching assets
    value: False
    section: 'system'
    state: 'init'

  - name: 'assets_path'
    comment: |
      Allows to define separate server/path for image/js/css files
      Warning: If the domain is different cross-domain access to some
      resources need to be allowed
      Sample:
         <FilesMatch ".(eot|ttf|woff)">
         Header set Access-Control-Allow-Origin "*"
         </FilesMatch>
    value: ''
    section: 'system'
    state: 'init'

  - name: 'assets_dir'
    comment: |
      While assets_path is for the browser, assets_dir informs
      PHP code about the location of asset files in filesystem
    value: ''
    section: 'system'
    state: 'init'

    # [[[ plugins
  - name: 'plugins'
    comment: 'List of active plugins (in plugins/ directory)'
    value: [ 'archive', 'zipdownload' ]
    section: 'plugins'

    # [[[ ui
  - name: 'message_sort_col'
    comment: |
      Default messages sort column. Use empty value for default server's sorting,
      or 'arrival', 'date', 'subject', 'from', 'to', 'fromto', 'size', 'cc'
    value: ''
    section: 'ui'
    state: 'init'

  - name: 'message_sort_order'
    comment: 'Default messages sort order'
    value: 'DESC'
    section: 'ui'
    state: 'init'

  - name: 'list_cols'
    comment: |
      These cols are shown in the message list. Available cols are:
      subject, from, to, fromto, cc, replyto, date, size, status, flag, attachment, priority
    value: [ 'subject', 'status', 'fromto', 'date', 'size', 'flag', 'attachment' ]
    section: 'ui'
    state: 'init'

  - name: 'language'
    comment: |
      The default locale setting (leave empty for auto-detection)
      RFC1766 formatted language name like en_US, de_DE, de_CH, fr_FR, pt_BR
    value: null
    section: 'ui'
    state: 'init'

  - name: 'date_format'
    comment: 'Use this format for date display (date or strftime format)'
    value: 'Y-m-d'
    section: 'ui'
    state: 'init'

  - name: 'date_formats'
    comment: |
      Give this choice of date formats to the user to select from
      Note: do not use ambiguous formats like m/d/Y
    value: [ 'Y-m-d', 'Y/m/d', 'Y.m.d', 'd-m-Y', 'd/m/Y', 'd.m.Y', 'j.n.Y' ]
    section: 'ui'
    state: 'init'

  - name: 'time_format'
    comment: 'Use this format for time display (date or strftime format)'
    value: 'H:i'
    section: 'ui'
    state: 'init'

  - name: 'time_formats'
    comment: 'Give this choice of time formats to the user to select from'
    value: [ 'G:i', 'H:i', 'g:i a', 'h:i A' ]
    section: 'ui'
    state: 'init'

  - name: 'date_short'
    comment: |
      Use this format for short date display (derived from date_format and
      time_format)
    value: 'D H:i'
    section: 'ui'
    state: 'init'

  - name: 'date_long'
    comment: |
      Use this format for detailed date/time formatting (derived from
      date_format and time_format)
    value: 'Y-m-d H:i'
    section: 'ui'
    state: 'init'

  - name: 'drafts_mbox'
    comment: |
      Store draft message is this mailbox
      Leave blank if draft messages should not be stored
      NOTE: Use folder names with namespace prefix (INBOX. on Courier-IMAP)
    value: 'Drafts'
    section: 'ui'
    state: 'init'

  - name: 'junk_mbox'
    comment: |
      Store spam messages in this mailbox
      NOTE: Use folder names with namespace prefix (INBOX. on Courier-IMAP)
    value: 'Junk'
    section: 'ui'
    state: 'init'

  - name: 'sent_mbox'
    comment: |
      Store sent message is this mailbox
      Leave blank if sent messages should not be stored
      NOTE: Use folder names with namespace prefix (INBOX. on Courier-IMAP)
    value: 'Sent'
    section: 'ui'
    state: 'init'

  - name: 'trash_mbox'
    comment: |
      Move messages to this folder when deleting them
      Leave blank if they should be deleted directly
      NOTE: Use folder names with namespace prefix (INBOX. on Courier-IMAP)
    value: 'Trash'
    section: 'ui'
    state: 'init'

  - name: 'create_default_folders'
    comment: |
      Automatically create the above listed default folders on user login
    value: False
    section: 'ui'
    state: 'init'

  - name: 'protect_default_folders'
    comment: |
      Protect the default folders from renames, deletes, and subscription changes
    value: True
    section: 'ui'
    state: 'init'

  - name: 'show_real_foldernames'
    comment: |
      Disable localization of the default folder names listed above
    value: False
    section: 'ui'
    state: 'init'

  - name: 'quota_zero_as_unlimited'
    comment: |
      If in your system 0 quota means no limit set this option to true
    value: False
    section: 'ui'
    state: 'init'

  - name: 'enable_spellcheck'
    comment: |
      Make use of the built-in spell checker. It is based on GoogieSpell.
    value: True
    section: 'ui'
    state: 'init'

  - name: 'spellcheck_engine'
    comment: |
      Set the spell checking engine. Possible values:
      - 'googie'  - the default (also used for connecting to Nox Spell Server, see 'spellcheck_uri' setting)
      - 'pspell'  - requires the PHP Pspell module and aspell installed
      - 'enchant' - requires the PHP Enchant module
      - 'atd'     - install your own After the Deadline server or check with
                    the people at http://www.afterthedeadline.com before using their API
      Since Google shut down their public spell checking service, the default settings
      connect to https://spell.roundcube.net/ which is a hosted service provided by Roundcube.
      You can connect to any other googie-compliant service by setting 'spellcheck_uri' accordingly.
    value: 'googie'
    section: 'ui'
    state: 'init'

  - name: 'spellcheck_uri'
    comment: |
      For locally installed Nox Spell Server or After the Deadline services,
      please specify the URI to call it.
      Get Nox Spell Server from http://orangoo.com/labs/?page_id=72 or
      the After the Deadline package from http://www.afterthedeadline.com.
      Leave empty to use the public API of service.afterthedeadline.com
    value: ''
    section: 'ui'
    state: 'init'

  - name: 'spellcheck_languages'
    comment: |
      These languages can be selected for spell checking.
      Configure as a PHP style hash array: array('en'=>'English', 'de'=>'Deutsch');
      Leave empty for default set of available language.
    value: null
    section: 'ui'
    state: 'init'

  - name: 'spellcheck_ignore_caps'
    comment: |
      Makes that words with all letters capitalized will be ignored (e.g. GOOGLE)
    value: False
    section: 'ui'
    state: 'init'

  - name: 'spellcheck_ignore_nums'
    comment: |
      Makes that words with numbers will be ignored (e.g. g00gle)
    value: False
    section: 'ui'
    state: 'init'

  - name: 'spellcheck_ignore_syms'
    comment: |
      Makes that words with symbols will be ignored (e.g. g@@gle)
    value: False
    section: 'ui'
    state: 'init'

  - name: 'sig_max_lines'
    comment: |
      Number of lines at the end of a message considered to contain the signature.
      Increase this value if signatures are not properly detected and colored
    value: 15
    section: 'ui'
    state: 'init'

  - name: 'max_pagesize'
    comment: |
      Don't let users set pagesize to more than this value if set
    value: 200
    section: 'ui'
    state: 'init'

  - name: 'min_refresh_interval'
    comment: |
      Minimal value of user's 'refresh_interval' setting (in seconds)
    value: 60
    section: 'ui'
    state: 'init'

  - name: 'undo_timeout'
    comment: |
      Specifies for how many seconds the Undo button will be available
      after object delete action. Currently used with supporting address book sources.
      Setting it to 0, disables the feature.
    value: 0
    section: 'ui'
    state: 'init'

  - name: 'compose_responses_static'
    comment: |
      A static list of canned responses which are immutable for the user
    array:
      - [ 'name': 'Canned Response 1', 'text': 'Static Response One' ]
      - [ 'name': 'Canned Response 2', 'text': 'Static Response Two' ]
    section: 'ui'
    state: 'init'

  - name: 'keyservers'
    comment: |
      List of HKP key servers for PGP public key lookups in Enigma/Mailvelope
      Default: array("keys.fedoraproject.org", "keybase.io")
    value: []
    section: 'ui'
    state: 'init'

    # [[[ addressbook
  - name: 'address_book_type'
    comment: |
      This indicates which type of address book to use. Possible choices:
      'sql' - built-in sql addressbook enabled (default),
      ''    - built-in sql addressbook disabled.
              Still LDAP or plugin-added addressbooks will be available.
              BC Note: The value can actually be anything except 'sql', it does not matter.
    value: 'sql'
    section: 'addressbook'
    state: 'init'

  - name: 'ldap_public'
    comment: |
      In order to enable public ldap search, configure an array like the Verisign
      example further below. if you would like to test, simply uncomment the example.
      Array key must contain only safe characters, ie. a-zA-Z0-9_
    value: []
    section: 'addressbook'
    state: 'init'

  - name: 'ldap_public_verisign'
    option: [ 'ldap_public', 'Verisign' ]
    comment: |
      If you are going to use LDAP for individual address books, you will need to
      set 'user_specific' to true and use the variables to generate the appropriate DNs to access it.

      The recommended directory structure for LDAP is to store all the address book entries
      under the users main entry, e.g.:

       o=root
        ou=people
         uid=user@domain
       mail=contact@contactdomain

      So the base_dn would be uid=%fu,ou=people,o=root
      The bind_dn would be the same as based_dn or some super user login.
    array:
      - name: 'Verisign.com'
        # Replacement variables supported in host names:
        # %h - user's IMAP hostname
        # %n - hostname ($_SERVER['SERVER_NAME'])
        # %t - hostname without the first part
        # %d - domain (http hostname $_SERVER['HTTP_HOST'] without the first part)
        # %z - IMAP domain (IMAP hostname without the first part)
        # For example %n = mail.domain.tld, %t = domain.tld
        hosts: [ 'directory.verisign.com' ]
        port: 389
        use_tls: False
        ldap_version: 3  # using LDAPv3
        # The timeout (in seconds) for connect + bind arrempts. This is only
        # supported in PHP >= 5.3.0 with OpenLDAP 2.x
        network_timeout: 10
        # If true the base_dn, bind_dn and bind_pass default to the user's IMAP login.
        user_specific: False
        # When 'user_specific' is enabled following variables can be used in base_dn/bind_dn config:
        # %fu - The full username provided, assumes the username is an email
        #       address, uses the username_domain value if not an email address.
        # %u  - The username prior to the '@'.
        # %d  - The domain name after the '@'.
        # %dc - The domain name hierarchal string e.g. "dc=test,dc=domain,dc=com"
        # %dn - DN found by ldap search when search_filter/search_base_dn are used
        base_dn: ''
        bind_dn: ''
        bind_pass: ''
        # It's possible to bind for an individual address book
        # The login name is used to search for the DN to bind with
        search_base_dn: ''
        search_filter: ''  # e.g. '(& (objectClass=posixAccount) (uid=%u) )'
        # DN and password to bind as before searching for bind DN, if anonymous search is not allowed
        search_bind_dn: ''
        search_bind_pw: ''
        # Base DN and filter used for resolving the user's domain root DN which feeds the %dc variables
        # Leave empty to skip this lookup and derive the root DN from the username domain
        domain_base_dn: ''
        domain_filter: ''
        # Optional map of replacement strings => attributes used when binding for an individual address book
        search_bind_attrib: []  # e.g. array('%udc' => 'ou')
        # Default for %dn variable if search doesn't return DN value
        search_dn_default: ''
        # Optional authentication identifier to be used as SASL authorization proxy
        # bind_dn need to be empty
        auth_cid: ''
        # SASL authentication method (for proxy auth), e.g. DIGEST-MD5
        auth_method: ''
        # Indicates if the addressbook shall be hidden from the list.
        # With this option enabled you can still search/view contacts.
        hidden: False
        # Indicates if the addressbook shall not list contacts but only allows searching.
        searchonly: False
        # Indicates if we can write to the LDAP directory or not.
        # If writable is true then these fields need to be populated:
        # LDAP_Object_Classes, required_fields, LDAP_rdn
        writable: False
        # To create a new contact these are the object classes to specify
        # (or any other classes you wish to use).
        LDAP_Object_Classes: [ 'top', 'inetOrgPerson' ]
        # The RDN field that is used for new entries, this field needs
        # to be one of the search_fields, the base of base_dn is appended
        # to the RDN to insert into the LDAP directory.
        LDAP_rdn: 'cn'
        # The required fields needed to build a new contact as required by
        # the object classes (can include additional fields not required by the object classes).
        required_fields: [ 'cn', 'sn', 'mail' ]
        search_fields: [ 'mail', 'cn' ]  # Fields to search in
        # Mapping of contact fields to directory attributes
        #   1. for every attribute one can specify the number of values (limit) allowed.
        #      default is 1, a wildcard * means unlimited
        #   2. another possible parameter is separator character for composite fields
        #   3. it's possible to define field format for write operations, e.g. for date fields
        #      example: 'birthday:date[YmdHis\\Z]'
        fieldmap:
          # Roundcube        LDAP:limit
          - 'name':          'cn'
            'surname':       'sn'
            'firstname':     'givenName'
            'jobtitle':      'title'
            'email':         'mail:*'
            'phone:home':    'homePhone'
            'phone:work':    'telephoneNumber'
            'phone:mobile':  'mobile'
            'phone:pager':   'pager'
            'phone:workfax': 'facsimileTelephoneNumber'
            'street':        'street'
            'zipcode':       'postalCode'
            'region':        'st'
            'locality':      'l'
            # If you country is a complex object, you need to configure 'sub_fields' below
            'country':       'c'
            'organization':  'o'
            'department':    'ou'
            'notes':         'description'
            'photo':         'jpegPhoto'
            # These currently don't work
            #'manager':      'manager'
            #'assistant':    'secretary'
        # Map of contact sub-objects (attribute name => objectClass(es)), e.g. 'c' => 'country'
        sub_fields: []
        # Generate values for the following LDAP attributes automatically when creating a new record
        autovalues:
          - 'uid':  'md5(microtime())'               # You may specify PHP code snippets which are then eval'ed
            'mail': '{givenname}.{sn}@mydomain.com'  # or composite strings with placeholders for existing attributes
        sort: 'cn'    # The field to sort the listing by.
        scope: 'sub'  # Search mode sub|base | list
        # Used for basic listing (if not empty) and will be &'d with search queries. Example: status=act
        filter: '(objectClass=inetOrgPerson)'
        fuzzy_search: True  # Server allows wildcard search
        # Enable Virtual List View to more efficiently fetch paginated data (if server supports it)
        vlv: False
        # Use Virtual List View functions for autocompletion searches (if server supports it)
        vlv_search: False
        # With VLV, we also use numSubOrdinates to query the total number of
        # records. Set this filter to get all numSubOrdinates attributes for
        # counting
        numsub_filter: '(objectClass=organizationalUnit)'
        # Root DN to search config entries (e.g. vlv indexes)
        config_root_dn: 'cn=config'
        # Enables you to limit the count of entries fetched. Setting this to 0 means no limit.
        sizelimit: '0'
        # Sets the number of seconds how long is spend on the search. Setting this to 0 means no limit.
        timelimit: '0'
        # Sets the LDAP_OPT_REFERRALS option. Mostly used in multi-domain Active Directory setups
        referrals: False
        # Sets the LDAP_OPT_DEREF option. One of: LDAP_DEREF_NEVER, LDAP_DEREF_SEARCHING, LDAP_DEREF_FINDING, LDAP_DEREF_ALWAYS
        # Used where addressbook contains aliases to objects elsewhere in the LDAP tree.
        dereference: 0

        # Definition for contact groups (uncomment if no groups are supported)
        # for the groups base_dn, the user replacements %fu, %u, %d and %dc work as for base_dn (see above)
        # if the groups base_dn is empty, the contact base_dn is used for the groups as well
        # -> in this case, assure that groups and contacts are separated due to the concernig filters!
        groups:
          - 'base_dn': ''
            'scope': 'sub'  # Search mode: sub|base | list
            'filter': '(objectClass=groupOfNames)'
            'object_classes': [ 'top', 'groupOfNames' ]  # Object classes to be assigned to new groups
            'member_attr':   'member'           # Name of the default member attribute, e.g. uniqueMember
            'name_attr':     'cn'               # Attribute to be used as group name
            'email_attr':    'mail'             # Group email address attribute (e.g. for mailing lists)
            'member_filter': '(objectClass=*)'  # Optional filter to use when querying for group members
            'vlv': False                        # Use VLV controls to list groups
            'class_member_attr':                # Mapping of group object class to member attribute used in these objects
              - 'groupOfNames': 'member'
                'groupOfUniqueNames': 'uniqueMember'

        # This configuration replaces the regular groups listing in the directory tree with
        # a hard-conoded list of groups, each listing entries with the configured base DN and filter.
        # if the 'groups' option from above is set, it'll be shown as the first entry with the name 'Groups'
        group_filters:
          - departments:
              - 'name':      'Company Departments'
                'scope':     'list'
                'base_dn':   'ou=Groups,dc=mydomain,dc=com'
                'filter':    '(| (objectclass=groupOfUniqueNames) (objectclass=groupOfURLs) )'
                'name_attr': 'cn'
          - customers:
              - 'name':      'Customers'
                'scope':     'sub'
                'base_dn':   'ou=Customers,dc=mydomain,dc=com'
                'filter':    '(objectClass=inetOrgPerson)'
                'name_attr': 'sn'
    section: 'addressbook'
    state: 'init'

  - name: 'autocomplete_addressbooks'
    comment: |
      An ordered array of the ids of the addressbooks that should be searched
      when populating address autocomplete fields server-side. ex: array('sql','Verisign');
    value: [ 'sql' ]
    section: 'addressbook'
    state: 'init'

  - name: 'autocomplete_min_length'
    comment: |
      The minimum number of characters required to be typed in an autocomplete field
      before address books will be searched. Most useful for LDAP directories that
      may need to do lengthy results building given overly-broad searches
    value: 1
    section: 'addressbook'
    state: 'init'

  - name: 'autocomplete_threads'
    comment: |
      Number of parallel autocomplete requests.
      If there's more than one address book, n parallel (async) requests will be created,
      where each request will search in one address book. By default (0), all address
      books are searched in one request.
    value: 0
    section: 'addressbook'
    state: 'init'

  - name: 'autocomplete_max'
    comment: 'Max. number of entries in autocomplete popup. Default: 15.'
    value: 15
    section: 'addressbook'
    state: 'init'

  - name: 'address_template'
    comment: |
      Show address fields in this order
      Available placeholders: {street}, {locality}, {zipcode}, {country}, {region}
    value: '{street}<br/>{locality} {zipcode}<br/>{country} {region}'
    section: 'addressbook'
    state: 'init'

  - name: 'addressbook_search_mode'
    comment: |
      Matching mode for addressbook search (including autocompletion)
      0 - partial (*abc*), default
      1 - strict (abc)
      2 - prefix (abc*)
      Note: For LDAP sources fuzzy_search must be enabled to use 'partial' or 'prefix' mode
    value: 0
    section: 'addressbook'
    state: 'init'

  - name: 'contactlist_fields'
    comment: |
      List of fields used on contacts list and for autocompletion searches
      Warning: These are field names not LDAP attributes (see 'fieldmap' setting)!
    value: [ 'name', 'firstname', 'surname', 'email' ]
    section: 'addressbook'
    state: 'init'

  - name: 'contact_search_name'
    comment: |
      Template of contact entry on the autocompletion list.
      You can use contact fields as: name, email, organization, department, etc.
      See program/steps/addressbook/func.inc for a list
    value: '{name} <{email}>'
    section: 'addressbook'
    state: 'init'

    # [[[ userprefs
  - name: 'default_charset'
    comment: 'Use this charset as fallback for message decoding'
    value: 'ISO-8859-1'
    section: 'userprefs'
    state: 'init'

  - name: 'skin'
    comment: 'Skin name: folder from skins/'
    value: 'elastic'
    section: 'userprefs'

  - name: 'skins_allowed'
    comment: 'Limit skins available/shown in the settings section'
    value: []
    section: 'userprefs'
    state: 'init'

  - name: 'standard_windows'
    comment: |
      Enables using standard browser windows (that can be handled as tabs)
      instead of popup windows
    value: False
    section: 'userprefs'
    state: 'init'

  - name: 'mail_pagesize'
    comment: 'Show up to X items in messages list view'
    value: 50
    section: 'userprefs'
    state: 'init'

  - name: 'addressbook_pagesize'
    comment: 'Show up to X items in contacts list view'
    value: 50
    section: 'userprefs'
    state: 'init'

  - name: 'addressbook_sort_col'
    comment: |
      Sort contacts by this col (preferably either one of name, firstname, surname)
    value: 'surname'
    section: 'userprefs'
    state: 'init'

  - name: 'addressbook_name_listing'
    comment: |
      The way how contact names are displayed in the list.
      0: prefix firstname middlename surname suffix (only if display name is not set)
      1: firstname middlename surname
      2: surname firstname middlename
      3: surname, firstname middlename
    value: 0
    section: 'userprefs'
    state: 'init'

  - name: 'timezone'
    comment: |
      Use this timezone to display date/time
      Valid timezone identifiers are listed here: php.net/manual/en/timezones.php
      'auto' will use the browser's timezone settings
    value: 'auto'
    section: 'userprefs'
    state: 'init'

  - name: 'prefer_html'
    comment: 'Prefer displaying HTML messages'
    value: True
    section: 'userprefs'
    state: 'init'

  - name: 'show_images'
    comment: |
      Display remote resources (inline images, styles)
      0 - Never, always ask
      1 - Ask if sender is not in address book
      2 - Always allow
    value: 0
    section: 'userprefs'
    state: 'init'

  - name: 'message_extwin'
    comment: 'Open messages in new window'
    value: False
    section: 'userprefs'
    state: 'init'

  - name: 'compose_extwin'
    comment: 'Open message compose form in new window'
    value: False
    section: 'userprefs'
    state: 'init'

  - name: 'htmleditor'
    comment: |
      Compose html formatted messages by default
       0 - never,
       1 - always,
       2 - on reply to HTML message,
       3 - on forward or reply to HTML message
       4 - always, except when replying to plain text message
    value: 0
    section: 'userprefs'
    state: 'init'

  - name: 'compose_save_localstorage'
    comment: |
      Save copies of compose messages in the browser's local storage
      for recovery in case of browser crashes and session timeout.
    value: True
    section: 'userprefs'
    state: 'init'

  - name: 'prettydate'
    comment: 'Show pretty dates as standard'
    value: True
    section: 'userprefs'
    state: 'init'

  - name: 'draft_autosave'
    comment: 'Save compose message every 300 seconds (5min)'
    value: 300
    section: 'userprefs'
    state: 'init'

  - name: 'layout'
    comment: |
      Interface layout. Default: 'widescreen'.
       'widescreen' - three columns
       'desktop'    - two columns, preview on bottom
       'list'       - two columns, no preview
    value: 'widescreen'
    section: 'userprefs'
    state: 'init'

  - name: 'mail_read_time'
    comment: |
      Mark as read when viewing a message (delay in seconds)
      Set to -1 if messages should not be marked as read
    value: 0
    section: 'userprefs'
    state: 'init'

  - name: 'logout_purge'
    comment: 'Clear Trash on logout'
    value: False
    section: 'userprefs'
    state: 'init'

  - name: 'logout_expunge'
    comment: 'Compact INBOX on logout'
    value: False
    section: 'userprefs'
    state: 'init'

  - name: 'inline_images'
    comment: 'Display attached images below the message body'
    value: True
    section: 'userprefs'
    state: 'init'

  - name: 'mime_param_folding'
    comment: |
      Encoding of long/non-ascii attachment names:
      0 - Full RFC 2231 compatible
      1 - RFC 2047 for 'name' and RFC 2231 for 'filename' parameter (Thunderbird's default)
      2 - Full 2047 compatible
    value: 1
    section: 'userprefs'
    state: 'init'

  - name: 'skip_deleted'
    comment: |
      Set true if deleted messages should not be displayed
      This will make the application run slower
    value: False
    section: 'userprefs'
    state: 'init'

  - name: 'read_when_deleted'
    comment: |
      Set true to Mark deleted messages as read as well as deleted
      False means that a message's read status is not affected by marking it as deleted
    value: True
    section: 'userprefs'
    state: 'init'

  - name: 'flag_for_deletion'
    comment: |
      Set to true to never delete messages immediately
      Use 'Purge' to remove messages marked as deleted
    value: False
    section: 'userprefs'
    state: 'init'

  - name: 'refresh_interval'
    comment: |
      Default interval for auto-refresh requests (in seconds)
      These are requests for system state updates e.g. checking for new messages, etc.
      Setting it to 0 disables the feature.
    value: 60
    section: 'userprefs'
    state: 'init'

  - name: 'check_all_folders'
    comment: 'If true all folders will be checked for recent messages'
    value: False
    section: 'userprefs'
    state: 'init'

  - name: 'display_next'
    comment: |
      If true, after message/contact delete/move, the next message/contact will be displayed
    value: True
    section: 'userprefs'
    state: 'init'

  - name: 'default_list_mode'
    comment: |
      Default messages listing mode. One of 'threads' or 'list'.
    value: 'list'
    section: 'userprefs'
    state: 'init'

  - name: 'autoexpand_threads'
    comment: |
      0 - Do not expand threads
      1 - Expand all threads automatically
      2 - Expand only threads with unread messages
    value: 0
    section: 'userprefs'
    state: 'init'

  - name: 'reply_mode'
    comment: |
      When replying:
      -1 - don't cite the original message
      0  - place cursor below the original message
      1  - place cursor above original message (top posting)
      2  - place cursor above original message (top posting), but do not indent the quote
    value: 0
    section: 'userprefs'
    state: 'init'

  - name: 'strip_existing_sig'
    comment: 'When replying strip original signature from message'
    value: True
    section: 'userprefs'
    state: 'init'

  - name: 'show_sig'
    comment: |
      Show signature:
      0 - Never
      1 - Always
      2 - New messages only
      3 - Forwards and Replies only
    value: 1
    section: 'userprefs'
    state: 'init'

  - name: 'sig_below'
    comment: |
      By default the signature is placed depending on cursor position (reply_mode).
      Sometimes it might be convenient to start the reply on top but keep
      the signature below the quoted text (sig_below = true).
    value: False
    section: 'userprefs'
    state: 'init'

  - name: 'sig_separator'
    comment: |
      Enables adding of standard separator to the signature
    value: True
    section: 'userprefs'
    state: 'init'

  - name: 'force_7bit'
    comment: |
      Use MIME encoding (quoted-printable) for 8bit characters in message body
    value: False
    section: 'userprefs'
    state: 'init'

  - name: 'search_mods'
    comment: |
      Defaults of the search field configuration.
      The array can contain a per-folder list of header fields which should be considered when searching
      The entry with key '*' stands for all folders which do not have a specific list set.
      Please note that folder names should to be in sync with $config['*_mbox'] options
      Example: array('*' => array('subject'=>1, 'from'=>1), 'Sent' => array('subject'=>1, 'to'=>1));
    value: null
    section: 'userprefs'
    state: 'init'

  - name: 'addressbook_search_mods'
    comment: |
      Defaults of the addressbook search field configuration.
      Example: array('name'=>1, 'firstname'=>1, 'surname'=>1, 'email'=>1, '*'=>1);
    value: null
    section: 'userprefs'
    state: 'init'

  - name: 'delete_junk'
    comment: 'Directly delete messages in Junk instead of moving to Trash'
    value: False
    section: 'userprefs'
    state: 'init'

  - name: 'mdn_requests'
    comment: |
      Behavior if a received message requests a message delivery notification (read receipt)
      0 = ask the user, 1 = send automatically, 2 = ignore (never send or ask)
      3 = send automatically if sender is in addressbook, otherwise ask the user
      4 = send automatically if sender is in addressbook, otherwise ignore
    value: 0
    section: 'userprefs'
    state: 'init'

  - name: 'mdn_default'
    comment: 'Return receipt checkbox default state'
    value: 0
    section: 'userprefs'
    state: 'init'

  - name: 'dsn_default'
    comment: |
      Delivery Status Notification checkbox default state
    value: 0
    section: 'userprefs'
    state: 'init'

  - name: 'reply_same_folder'
    comment: |
      Place replies in the folder of the message being replied to
    value: False
    section: 'userprefs'
    state: 'init'

  - name: 'forward_attachment'
    comment: |
      Sets default mode of Forward feature to "forward as attachment"
    value: False
    section: 'userprefs'
    state: 'init'

  - name: 'default_addressbook'
    comment: |
      Defines address book (internal index) to which new contacts will be added
      By default it is the first writeable addressbook.
      Note: Use '0' for built-in address book.
    value: null
    section: 'userprefs'
    state: 'init'

  - name: 'spellcheck_before_send'
    comment: 'Enables spell checking before sending a message.'
    value: False
    section: 'userprefs'
    state: 'init'

  - name: 'autocomplete_single'
    comment: |
      Skip alternative email addresses in autocompletion (show one address per contact)
    value: False
    section: 'userprefs'
    state: 'init'

  - name: 'default_font'
    comment: |
      Default font for composed HTML message.
      Supported values: Andale Mono, Arial, Arial Black, Book Antiqua, Courier New,
      Georgia, Helvetica, Impact, Tahoma, Terminal, Times New Roman, Trebuchet MS, Verdana
    value: 'Verdana'
    section: 'userprefs'
    state: 'init'

  - name: 'default_font_size'
    comment: |
      Default font size for composed HTML message.
      Supported sizes: 8pt, 10pt, 12pt, 14pt, 18pt, 24pt, 36pt
    value: '10pt'
    section: 'userprefs'
    state: 'init'

  - name: 'message_show_email'
    comment: |
      Enables display of email address with name instead of a name (and address in title)
    value: False
    section: 'userprefs'
    state: 'init'

  - name: 'reply_all_mode'
    comment: |
      Default behavior of Reply-All button:
      0 - Reply-All always
      1 - Reply-List if mailing list is detected
    value: 0
    section: 'userprefs'
    state: 'init'
roundcube__default_configuration

This list defines Roundcube configuration options which are defined by the role and override the original configuration options.

roundcube__default_configuration:

  - name: 'db_dsnw'
    value: '{{ "sqlite:///" + roundcube__git_dest + "/"
                            + roundcube__database_map[roundcube__database].dbname | d()
                            + "?mode=640" }}'
    state: '{{ "present"
               if (roundcube__database_map[roundcube__database].dbtype == "sqlite")
               else "ignore" }}'

  - name: 'db_dsnw'
    value: '{{ "mysql://" + roundcube__database_map[roundcube__database].dbuser | d() + ":"
                          + roundcube__database_map[roundcube__database].dbpass | d() + "@"
                          + roundcube__database_map[roundcube__database].dbhost | d() + "/"
                          + roundcube__database_map[roundcube__database].dbname | d() }}'
    state: '{{ "present"
               if (roundcube__database_map[roundcube__database].dbtype == "mysql")
               else "ignore" }}'

  - name: 'db_dsnw'
    value: '{{ "pgsql://" + roundcube__database_map[roundcube__database].dbuser | d() + ":"
                          + roundcube__database_map[roundcube__database].dbpass | d() + "@"
                          + roundcube__database_map[roundcube__database].dbhost | d() + "/"
                          + roundcube__database_map[roundcube__database].dbname | d() }}'
    state: '{{ "present"
               if (roundcube__database_map[roundcube__database].dbtype == "postgresql")
               else "ignore" }}'

  - name: 'log_driver'
    comment: |
      Log driver: "syslog", "stdout" or "file"
    value: '{{ roundcube__log_driver }}'

  - name: 'imap_host'
    value: '{{ roundcube__imap_server }}'

    # Enable use of memcached to cache IMAP indexes, if local memcached
    # instance is detected
  - name: 'imap_cache'
    value: 'memcached'
    state: '{{ "present" if roundcube__memcached_enabled | bool else "ignore" }}'

    # Enable message caching in the database if the IMAP server is remote
  - name: 'messages_cache'
    value: True
    state: '{{ "ignore"
               if (ansible_local | d() and ansible_local.dovecot | d() and
                   (ansible_local.dovecot.installed | d()) | bool)
               else "present" }}'

  - name: 'smtp_host'
    value: '{{ roundcube__smtp_server }}'

  - name: 'smtp_user'
    value: '{{ roundcube__smtp_user }}'

  - name: 'smtp_pass'
    value: '{{ roundcube__smtp_pass }}'

    # Enable use of memcached to cache LDAP data, if local memcached instance
    # is detected
  - name: 'ldap_cache'
    value: 'memcached'
    state: '{{ "present" if roundcube__memcached_enabled | bool else "ignore" }}'

    # Enable support for memcached on localhost if it's detected
  - name: 'memcache_hosts'
    value: '{{ roundcube__memcached_hosts }}'
    state: '{{ "present" if roundcube__memcached_enabled | bool else "ignore" }}'

    # Enable support for Redis on localhost if it's detected
  - name: 'redis_hosts'
    value: '{{ roundcube__redis_hosts }}'
    state: '{{ "present" if roundcube__redis_enabled | bool else "ignore" }}'

  - name: 'skin_logo'
    value: '{{ roundcube__skin_logo }}'

    # Ensure that all communication to the client is encrypted
  - name: 'force_https'
    value: True

    # Configure preferred session storage backend
  - name: 'session_storage'
    value: '{{ roundcube__session_storage }}'
    state: '{{ "present" if roundcube__session_storage | d() else "ignore" }}'

  - name: 'des_key'
    value: '{{ roundcube__des_key }}'

    # Roundcube developers consider this a better choice
  - name: 'cipher_method'
    value: 'AES-256-CBC'

  - name: 'username_domain'
    value: '{{ roundcube__username_domain }}'

    # Slow down potential bots
  - name: 'sendmail_delay'
    value: 5

  - name: 'product_name'
    value: '{{ roundcube__product_name }}'

    # Use the system-wide MIME database from the 'mime-support' APT package
  - name: 'mime_types'
    value: '/etc/mime.types'

    # Help mitigate mails to non-existent DNS domains
  - name: 'email_dns_check'
    value: True

  - name: 'plugins'
    value: '{{ roundcube__combined_plugins | debops.debops.parse_kv_items
               | selectattr("state", "equalto", "enabled")
               | map(attribute="name") | list | unique }}'

    # Create Special Folders automatically. This will ensure that the Junk
    # folder is present and selected in the preferences.
  - name: 'create_default_folders'
    value: True

    # Set minimum refresh interval available to users to 5 minutes, to lower
    # the IMAP server load.
  - name: 'min_refresh_interval'
    value: 300

    # Enable autocompletion for the LDAP address book.
  - name: 'autocomplete_addressbooks'
    value: '{{ (["sql"] + (["People"] if roundcube__ldap_enabled | bool else []))
               | flatten }}'
    state: '{{ "present" if roundcube__ldap_enabled | bool else "ignore" }}'

    # Set the default number of autocompletion characters for lower sever load.
  - name: 'autocomplete_min_length'
    value: 3

    # Only pick single e-mail address in autocomplete, this reduces the number
    # of entries shown to the user.
  - name: 'autocomplete_single'
    value: True

    # Configure the access to the default LDAP address book managed by DebOps.
    # Roundcube will use user credentials to login to the LDAP directory.
  - name: 'ldap_public_people'
    option: [ 'ldap_public', 'People' ]
    section: 'addressbook'
    state: '{{ "present" if roundcube__ldap_enabled | bool else "ignore" }}'
    array:
      - name: '{{ roundcube__ldap_addressbook_name }}'
        hosts: '{{ (["tls://"] if roundcube__ldap_use_tls else [""])
                   | product(roundcube__ldap_hosts) | map("join")
                   | product([roundcube__ldap_port]) | map("join") }}'
        ldap_version: 3
        user_specific: True
        base_dn: '{{ roundcube__ldap_people_dn | join(",") }}'
        bind_dn: '{{ "uid=%u," + roundcube__ldap_people_dn | join(",") }}'
        bind_pass: ''
        search_base_dn: '{{ roundcube__ldap_base_dn | join(",") }}'
        search_filter: '(&
                          (objectClass=mailRecipient)
                          (|
                            (uid=%u)
                            (mail=%fu)
                          )
                        )'
        search_bind_dn: '{{ roundcube__ldap_binddn }}'
        search_bind_pw: '{{ roundcube__ldap_bindpw }}'
        filter: '(objectClass=inetOrgPerson)'
        scope: 'sub'
        searchonly: True
        vlv: False
        sort: 'sn'
        search_fields: [ 'sn', 'cn', 'mail', 'telephoneNumber' ]
        hidden: '{{ roundcube__ldap_hidden }}'
        writable: False
        groups:
          - base_dn: '{{ roundcube__ldap_groups_dn | join(",") }}'
            filter: '(objectClass=groupOfNames)'
            object_classes: [ 'groupOfNames' ]
        fieldmap: [ '{{ roundcube__ldap_field_map }}' ]

    # Set the default mail charset to Unicode
  - name: 'default_charset'
    value: 'UTF-8'

  - name: 'skin'
    value: '{{ roundcube__skin_folder }}'

    # Don't prefer HTML message view by default
  - name: 'prefer_html'
    value: False

    # Refresh the mail status in longer intervals (15 minutes) by default, to
    # make the IMAP server load lower.
  - name: 'refresh_interval'
    value: 900

    # Delete spam messages without moving them to Trash first
  - name: 'delete_junk'
    value: True

    # Forward e-mails as attachments by default
  - name: 'forward_attachment'
    value: True

    # Display the sender e-mail address by default to help users detect forged
    # senders
  - name: 'message_show_email'
    value: True

    # Better support for mailing lists
  - name: 'reply_all_mode'
    value: 1

  - name: 'swipe_actions'
    comment: |
      Configuration for the 'swipe' Roundcube plugin
    array:
      - messagelist:
          - left:  'swipe-read'
            right: 'move'
            down:  'checkmail'
      - contactlist:
          - left:  'none'
            right: 'compose'
            down:  'none'

  - name: 'enable_spellcheck'
    value: True
    state: 'present'

  - name: 'spellcheck_engine'
    value: 'enchant'
    state: 'present'

  - name: 'spellcheck_ignore_caps'
    value: True
    state: 'present'

  - name: 'spellcheck_ignore_nums'
    value: True
    state: 'present'

  - name: 'spellcheck_ignore_syms'
    value: True
    state: 'present'
roundcube__configuration

This list defines Roundcube configuration options which should be present on all hosts in the Ansible inventory.

roundcube__configuration: []
roundcube__group_configuration

This list defines Roundcube configuration options which should be present on hosts in a specific Ansible inventory group.

roundcube__group_configuration: []
roundcube__host_configuration

This list defines Roundcube configuration options which should be present on specific hosts in the Ansible inventory.

roundcube__host_configuration: []
roundcube__combined_configuration

This variable combines all Roundcube configuration lists and is used in role tasks and templates.

roundcube__combined_configuration: '{{ roundcube__original_configuration
                                       + roundcube__default_configuration
                                       + roundcube__configuration
                                       + roundcube__group_configuration
                                       + roundcube__host_configuration }}'

Configuration file sections

These variables define the sections in the Roundcube config/config.inc.php configuration file. See roundcube__configuration_sections for more details.

roundcube__default_configuration_sections

The list of the default configuration sections defined by the role.

roundcube__default_configuration_sections:

  - name: 'init'
    state: 'hidden'

  - name: 'sql'
    title: 'SQL DATABASE'

  - name: 'logging'
    title: 'LOGGING/DEBUGGING'

  - name: 'imap'

  - name: 'smtp'

  - name: 'ldap'

  - name: 'cache'
    title: 'CACHE(S)'

  - name: 'system'

  - name: 'plugins'

  - name: 'ui'
    title: 'USER INTERFACE'

  - name: 'addressbook'
    title: 'ADDRESSBOOK SETTINGS'

  - name: 'userprefs'
    title: 'USER PREFERENCES'

  - name: 'unknown'
    title: 'OTHER OPTIONS'
roundcube__configuration_sections

List of configuration sections defined by the user.

roundcube__configuration_sections: []
roundcube__combined_configuration_sections

Variable which combines all of the configuration section lists and is used in role tasks and templates.

roundcube__combined_configuration_sections: '{{ roundcube__default_configuration_sections
                                                + roundcube__configuration_sections }}'

Roundcube plugins

The variables below contain configuration of Roundcube plugins installed using PHP Composer. See roundcube__plugins for more details.

roundcube__default_plugins

List of Roundcube plugins configured by the role.

roundcube__default_plugins:

    # Plugin that adds a new button to the toolbar to move messages to a (user
    # selectable) archive folder.
  - name: 'archive'
    state: 'enabled'

    # This is a core plugin which provides support for handling attachments
    # through the filesystem. It might be required by other plugins.
  - name: 'filesystem_attachments'
    state: 'enabled'

    # This plugin provides jQuery library and features for other plugins.
  - name: 'jqueryui'
    state: 'enabled'

    # This plugin adds an option to download all attachments to a message in
    # one zip file, when a message has multiple attachments. The plugin also
    # allows the download of a selection of messages in 1 zip file.
  - name: 'zipdownload'
    state: 'enabled'
    options:

      - name: 'zipdownload_attachments'
        comment: |
          Zip attachments
          Only show the link when there are more than this many attachments
          -1 to prevent downloading of attachments as zip
        value: 1

      - name: 'zipdownload_selection'
        comment: |
          Zip selection of mail messages
          This option enables downloading of multiple messages as one zip archive.
          The number or string value specifies maximum total size of all messages
          in the archive (not the size of the archive itself).
        value: '50MB'

      - name: 'zipdownload_charset'
        comment: |
          Charset to use for filenames inside the zip
        value: 'UTF-8'

    # This entry installs the libraries required for LDAP support in Roundcube.
    # It's not a real plugin.
  - name: 'ldap_support'
    package: 'kolab/net_ldap3'
    state: '{{ "present" if roundcube__ldap_enabled | bool else "ignore" }}'

    # This plugin adds right-click context menus to various parts of the
    # Roundcube interface.
  - name: 'contextmenu'
    package: 'johndoh/contextmenu{{ ":3.2.1"
              if roundcube__git_version is version("1.5", "<") else "" }}'
    state: 'enabled'

    # This plugin provides a toolbar button and folder menu option which
    # calculates and displays the sizes of the message folders.
  - name: 'show_folder_size'
    package: 'jfcherng/show-folder-size'
    state: 'enabled'
    options:

      - name: 'auto_show_folder_size'
        comment: |
          Automatically show the folder size without clicking on the toolbar button.
          This could be a serious performance penalty if there are many users
        value: False

      - name: 'show_mailboxoptions_button'
        comment: 'Show mailbox options button'
        value: True

      - name: 'show_toolbar_button'
        comment: 'Show the toolbar button'
        value: False

    # This plugin adds a button on the main toolbar which opens the
    # Nextcloud/ownCloud instance at specified URL.
  - name: 'cloud_button'
    package: 'san4op/cloud_button'
    state: 'enabled'
    options:

      - name: 'cloud_button_url'
        comment: 'URL to cloud storage'
        value: '{{ "https://cloud." + ansible_domain + "/" }}'

    # This plugin uses the LDAP directory to create the user identity at login.
    # Roundcube 1.4.x might need to be patched for this to work correctly.
    # See: https://github.com/roundcube/roundcubemail/issues/7667
  - name: 'new_user_identity'
    state: '{{ "enabled" if roundcube__ldap_enabled | bool else "ignore" }}'
    options:

      - name: 'new_user_identity_addressbook'
        comment: |
          The id of the address book to use to automatically set a
          user's full name in their new identity. (This should be an
          string, which refers to the $config['ldap_public'] array.)
        value: 'People'

      - name: 'new_user_identity_match'
        comment: |
          When automatically setting a user's full name in their
          new identity, match the user's login name against this field.
        value: 'mail'

      - name: 'new_user_identity_onlogin'
        comment: |
          Determine whether to import user's identities on each login.
          New user identity will be created for each e-mail address
          present in address book, but not assigned to any identity.
        value: True

  - name: 'password'
    state: '{{ "enabled" if roundcube__ldap_password_enabled | bool else "absent" }}'
    options:

      - name: 'password_driver'
        comment: |
          Password Plugin options
          -----------------------
          A driver to use for password change. Default: "sql".
          See README file for list of supported driver names.
        value: '{{ "ldap_exop" if roundcube__ldap_password_enabled | bool else "sql" }}'

      - name: 'password_strength_driver'
        comment: |
          A driver to use for checking password strength. Default: null (disabled).
          See README file for list of supported driver names.
        value: null

      - name: 'password_confirm_current'
        comment: |
          Determine whether current password is required to change password.
          Default: false.
        value: True

      - name: 'password_minimum_length'
        comment: |
          Require the new password to be a certain length.
          set to blank to allow passwords of any length
        value: 0

      - name: 'password_minimum_score'
        comment: |
          Require the new password to have at least the specified strength score.
          Note: Password strength is scored from 1 (week) to 5 (strong).
        value: 0

      - name: 'password_log'
        comment: |
          Enables logging of password changes into logs/password
        value: False

      - name: 'password_login_exceptions'
        comment: |
          Comma-separated list of login exceptions for which password change
          will be not available (no Password tab in Settings)
        value: null

      - name: 'password_hosts'
        comment: |
          Array of hosts that support password changing.
          Listed hosts will feature a Password option in Settings; others will not.
          Example: array('mail.example.com', 'mail2.example.org');
          Default is NULL (all hosts supported).
        value: null

      - name: 'password_force_save'
        comment: |
          Enables saving the new password even if it matches the old password. Useful
          for upgrading the stored passwords after the encryption scheme has changed.
        value: False

      - name: 'password_force_new_user'
        comment: |
          Enables forcing new users to change their password at their first login.
        value: False

      - name: 'password_algorithm'
        comment: |
          Default password hashing/crypting algorithm.
          Possible options: des-crypt, ext-des-crypt, md5-crypt, blowfish-crypt,
          sha256-crypt, sha512-crypt, md5, sha, smd5, ssha, ssha512, samba, ad, dovecot, clear.
          For details see password::hash_password() method.
        value: 'clear'

      - name: 'password_algorithm_prefix'
        comment: |
          Password prefix (e.g. {CRYPT}, {SHA}) for passwords generated
          using password_algorithm above. Default: empty.
        value: ''

      - name: 'password_dovecotpw'
        comment: |
          Path for dovecotpw/doveadm-pw (if not in the $PATH).
          Used for password_algorithm = 'dovecot'.
          $config['password_dovecotpw'] = '/usr/local/sbin/dovecotpw'; // for dovecot-1.x
        value: '/usr/bin/doveadm pw'  # for dovecot-2.x

      - name: 'password_dovecotpw_method'
        comment: |
          Dovecot password scheme.
          Used for password_algorithm = 'dovecot'.
        value: 'CRAM-MD5'

      - name: 'password_dovecotpw_with_method'
        comment: |
          Enables use of password with method prefix, e.g. {MD5}$1$LUiMYWqx$fEkg/ggr/L6Mb2X7be4i1/
          when using password_algorithm=dovecot
        value: False

      - name: 'password_blowfish_cost'
        comment: |
          Iteration count parameter for Blowfish-based hashing algo.
          It must be between 4 and 31. Default: 12.
          Be aware, the higher the value, the longer it takes to generate the password hashes.
        value: 12

      - name: 'password_crypt_rounds'
        comment: |
          Number of rounds for the sha256 and sha512 crypt hashing algorithms.
          Must be at least 1000. If not set, then the number of rounds is left up
          to the crypt() implementation. On glibc this defaults to 5000.
          Be aware, the higher the value, the longer it takes to generate the password hashes.
        value: 50000

      - name: 'password_disabled'
        comment: |
          This option temporarily disables the password change functionality.
          Use it when the users database server is in maintenance mode or sth like that.
          You can set it to TRUE/FALSE or a text describing the reason
          which will replace the default.
        value: False

      - name: 'password_username_format'
        comment: |
          Various drivers/setups use different format of the username.
          This option allows you to force specified format use. Default: '%u'.
          Supported variables:
              %u - full username,
              %l - the local part of the username (in case the username is an email address)
              %d - the domain part of the username (in case the username is an email address)
          Note: This may no apply to some drivers implementing their own rules, e.g. sql.
        value: '%u'

      - name: 'password_db_dsn'
        comment: |
          SQL Driver options
          ------------------
          PEAR database DSN for performing the query. By default
          Roundcube DB settings are used.
          Supported replacement variables:
          %h - user's IMAP hostname
          %n - hostname ($_SERVER['SERVER_NAME'])
          %t - hostname without the first part
          %d - domain (http hostname $_SERVER['HTTP_HOST'] without the first part)
          %z - IMAP domain (IMAP hostname without the first part)
        value: ''

      - name: 'password_query'
        comment: |
          The SQL query used to change the password.
          The query can contain the following macros that will be expanded as follows:
               %p is replaced with the plaintext new password
               %P is replaced with the encrypted/hashed new password
                  according to configured password_method
               %o is replaced with the old (current) password
               %O is replaced with the encrypted/hashed old (current) password
                  according to configured password_method
               %h is replaced with the imap host (from the session info)
               %u is replaced with the username (from the session info)
               %l is replaced with the local part of the username
                  (in case the username is an email address)
               %d is replaced with the domain part of the username
                  (in case the username is an email address)
          Deprecated macros:
               %c is replaced with the crypt version of the new password, MD5 if available
                  otherwise DES. More hash function can be enabled using the password_crypt_hash
                  configuration parameter.
               %D is replaced with the dovecotpw-crypted version of the new password
               %n is replaced with the hashed version of the new password
               %q is replaced with the hashed password before the change
          Escaping of macros is handled by this module.
          Default: "SELECT update_passwd(%c, %u)"
        value: 'SELECT update_passwd(%c, %u)'

      - name: 'password_crypt_hash'
        comment: |
          By default the crypt() function which is used to create the %c
          parameter uses the md5 algorithm (deprecated, use %P).
          You can choose between: des, md5, blowfish, sha256, sha512.
        value: 'md5'

      - name: 'password_idn_ascii'
        comment: |
          By default domains in variables are using unicode.
          Enable this option to use punycoded names
        value: False

      - name: 'password_hash_algorithm'
        comment: |
          Using a password hash for %n and %q variables (deprecated, use %P).
          Determine which hashing algorithm should be used to generate
          the hashed new and current password for using them within the
          SQL query. Requires PHP's 'hash' extension.
        value: 'sha1'

      - name: 'password_hash_base64'
        comment: |
          You can also decide whether the hash should be provided
          as hex string or in base64 encoded format.
        value: False

      - name: 'password_pop_host'
        comment: |
          Poppassd Driver options
          -----------------------
          The host which changes the password (default: localhost)
          Supported replacement variables:
            %n - hostname ($_SERVER['SERVER_NAME'])
            %t - hostname without the first part
            %d - domain (http hostname $_SERVER['HTTP_HOST'] without the first part)
            %h - IMAP host
            %z - IMAP domain without first part
            %s - domain name after the '@' from e-mail address provided at login screen
        value: 'localhost'

      - name: 'password_pop_port'
        comment: |
          TCP port used for poppassd connections (default: 106)
        value: 106

      - name: 'password_saslpasswd_args'
        comment: |
          SASL Driver options
          -------------------
          Additional arguments for the saslpasswd2 call
        value: ''

      - name: 'password_ldap_host'
        comment: |
          LDAP, LDAP_SIMPLE and LDAP_EXOP Driver options
          -----------------------------------
          LDAP server name to connect to.
          You can provide one or several hosts in an array in which case the hosts are tried from left to right.
          Example: array('ldap1.example.com', 'ldap2.example.com');
          Default: 'localhost'
        value: '{{ (roundcube__ldap_hosts | first)
                   if roundcube__ldap_hosts | d()
                   else "" }}'

      - name: 'password_ldap_port'
        comment: |
          LDAP server port to connect to
          Default: '389'
        value: '{{ roundcube__ldap_port }}'

      - name: 'password_ldap_starttls'
        comment: |
          TLS is started after connecting
          Using TLS for password modification is recommended.
          Default: false
        value: '{{ roundcube__ldap_use_tls | bool }}'

      - name: 'password_ldap_version'
        comment: |
          LDAP version
          Default: '3'
        value: '3'

      - name: 'password_ldap_basedn'
        comment: |
          LDAP base name (root directory)
          Example: 'dc=example,dc=com'
        value: '{{ roundcube__ldap_base_dn | join(",") }}'

      - name: 'password_ldap_method'
        comment: |
          LDAP connection method
          There are two connection methods for changing a user's LDAP password.
          'user': use user credential (recommended, require password_confirm_current=true)
          'admin': use admin credential (this mode require password_ldap_adminDN and password_ldap_adminPW)
          Default: 'user'
        value: 'user'

      - name: 'password_ldap_adminDN'
        comment: |
          LDAP Admin DN
          Used only in admin connection mode
          Default: null
        value: null

      - name: 'password_ldap_adminPW'
        comment: |
          LDAP Admin Password
          Used only in admin connection mode
          Default: null
        value: null

      - name: 'password_ldap_userDN_mask'
        comment: |
          LDAP user DN mask
          The user's DN is mandatory and as we only have his login,
          we need to re-create his DN using a mask
          '%login' will be replaced by the current roundcube user's login
          '%name' will be replaced by the current roundcube user's name part
          '%domain' will be replaced by the current roundcube user's domain part
          '%dc' will be replaced by domain name hierarchal string e.g. "dc=test,dc=domain,dc=com"
          Example: 'uid=%login,ou=people,dc=example,dc=com'
        value: 'uid=%login,ou=people,dc=example,dc=com'
        state: 'comment'  # use searches instead

      - name: 'password_ldap_searchDN'
        comment: |
          LDAP search DN
          The DN roundcube should bind with to find out user's DN
          based on his login. Note that you should comment out the default
          password_ldap_userDN_mask setting for this to take effect.
          Use this if you cannot specify a general template for user DN with
          password_ldap_userDN_mask. You need to perform a search based on
          users login to find his DN instead. A common reason might be that
          your users are placed under different ou's like engineering or
          sales which cannot be derived from their login only.
        value: '{{ roundcube__ldap_binddn }}'

      - name: 'password_ldap_searchPW'
        comment: |
          LDAP search password
          If password_ldap_searchDN is set, the password to use for
          binding to search for user's DN. Note that you should comment out the default
          password_ldap_userDN_mask setting for this to take effect.
          Warning: Be sure to set appropriate permissions on this file so this password
          is only accessible to roundcube and don't forget to restrict roundcube's access to
          your directory as much as possible using ACLs. Should this password be compromised
          you want to minimize the damage.
        value: '{{ roundcube__ldap_bindpw }}'

      - name: 'password_ldap_search_base'
        comment: |
          LDAP search base
          If password_ldap_searchDN is set, the base to search in using the filter below.
          Note that you should comment out the default password_ldap_userDN_mask setting
          for this to take effect.
        value: '{{ roundcube__ldap_base_dn | join(",") }}'

      - name: 'password_ldap_search_filter'
        comment: |
          LDAP search filter
          If password_ldap_searchDN is set, the filter to use when
          searching for user's DN. Note that you should comment out the default
          password_ldap_userDN_mask setting for this to take effect.
          '%login' will be replaced by the current roundcube user's login
          '%name' will be replaced by the current roundcube user's name part
          '%domain' will be replaced by the current roundcube user's domain part
          '%dc' will be replaced by domain name hierarchal string e.g. "dc=test,dc=domain,dc=com"
          Example: '(uid=%login)'
          Example: '(&(objectClass=posixAccount)(uid=%login))'
        value: '(&
                  (objectClass=mailRecipient)
                  (|
                    (uid=%name)
                    (mail=%login)
                  )
                )'

      - name: 'password_ldap_encodage'
        comment: |
          LDAP password hash type
          Standard LDAP encryption type which must be one of: crypt,
          ext_des, md5crypt, blowfish, md5, sha, smd5, ssha, ad, cram-md5 (dovecot style) or clear.
          Set to 'default' if you want to use method specified in password_algorithm option above.
          Multiple password Values can be generated by concatenating encodings with a +. E.g. 'cram-md5+crypt'
          Default: 'crypt'.
        value: 'clear'  # default: crypt

      - name: 'password_ldap_pwattr'
        comment: |
          LDAP password attribute
          Name of the ldap's attribute used for storing user password
          Default: 'userPassword'
        value: 'userPassword'

      - name: 'password_ldap_force_replace'
        comment: |
          LDAP password force replace
          Force LDAP replace in cases where ACL allows only replace not read
          See https://pear.php.net/package/Net_LDAP2/docs/latest/Net_LDAP2/Net_LDAP2_Entry.html#methodreplace
          Default: true
        value: True

      - name: 'password_ldap_lchattr'
        comment: |
          LDAP Password Last Change Date
          Some places use an attribute to store the date of the last password change
          The date is measured in "days since epoch" (an integer value)
          Whenever the password is changed, the attribute will be updated if set (e.g. shadowLastChange)
        value: ''

      - name: 'password_ldap_samba_pwattr'
        comment: |
          LDAP Samba password attribute, e.g. sambaNTPassword
          Name of the LDAP's Samba attribute used for storing user password
        value: ''

      - name: 'password_ldap_samba_lchattr'
        comment: |
          LDAP Samba Password Last Change Date attribute, e.g. sambaPwdLastSet
          Some places use an attribute to store the date of the last password change
          The date is measured in "seconds since epoch" (an integer value)
          Whenever the password is changed, the attribute will be updated if set
        value: ''

      - name: 'password_ldap_ppolicy_cmd'
        comment: |
          LDAP PPolicy Driver options
          -----------------------------------
          LDAP Change password command - filename of the perl script
          Example: 'change_ldap_pass.pl'
        value: 'change_ldap_pass.pl'

      - name: 'password_ldap_ppolicy_uri'
        comment: |
          LDAP URI
          Example: 'ldap://ldap.example.com/ ldaps://ldap2.example.com:636/'
        value: 'ldap://localhost/'

      - name: 'password_ldap_ppolicy_basedn'
        comment: |
          LDAP base name (root directory)
          Example: 'dc=example,dc=com'
        value: 'dc=example,dc=com'

      - name: 'password_ldap_ppolicy_searchDN'
        value: 'cn=someuser,dc=example,dc=com'

      - name: 'password_ldap_ppolicy_searchPW'
        value: 'secret'

      - name: 'password_ldap_policy_search_filter'
        comment: |
          LDAP search filter
          Example: '(uid=%login)'
          Example: '(&(objectClass=posixAccount)(uid=%login))'
        value: '(uid=%login)'

      - name: 'password_ldap_ppolicy_cafile'
        comment: |
          CA Certificate file if in URI is LDAPS connection
        value: '/etc/ssl/certs/ca-certificates.crt'

      - name: 'password_directadmin_host'
        comment: |
          DirectAdmin Driver options
          --------------------------
          The host which changes the password
          Use 'ssl://host' instead of 'tcp://host' when running DirectAdmin over SSL.
          The host can contain the following macros that will be expanded as follows:
              %h is replaced with the imap host (from the session info)
              %d is replaced with the domain part of the username (if the username is an email)
        value: 'tcp://localhost'

      - name: 'password_directadmin_port'
        comment: |
          TCP port used for DirectAdmin connections
        value: 2222

      - name: 'password_vpopmaild_host'
        comment: |
          vpopmaild Driver options
          -----------------------
          The host which changes the password
        value: 'localhost'

      - name: 'password_vpopmaild_port'
        comment: |
          TCP port used for vpopmaild connections
        value: 89

      - name: 'password_vpopmaild_timeout'
        comment: |
          Timeout used for the connection to vpopmaild (in seconds)
        value: 10

      - name: 'password_cpanel_host'
        comment: |
          cPanel Driver options
          --------------------------
          The cPanel Host name
        value: 'host.domain.com'

      - name: 'password_cpanel_username'
        comment: |
          The cPanel admin username
        value: 'username'

      - name: 'password_cpanel_password'
        comment: |
          The cPanel admin password
        value: 'password'

      - name: 'password_cpanel_hash'
        comment: |
          The cPanel admin hash
          If you prefer to use a hash (Remote Access Key) instead of plain password, enter it below.
          Hash takes precedence over password auth.
          You can generate a Remote Access Key in WHM -> Clusters -> Remote Access Key
        value: ''

      - name: 'password_cpanel_port'
        comment: |
          The cPanel port to use
        value: 2087

      - name: 'password_cpanel_webmail_host'
        comment: |
          cPanel Webmail Driver options
          -----------------------------
          The cPanel Host name
        value: 'host.domain.com'

      - name: 'password_cpanel_webmail_port'
        comment: |
          The cPanel port to use
        value: 2096

      - name: 'password_ximss_host'
        comment: |
          XIMSS (Communigate server) Driver options
          -----------------------------------------
          Host name of the Communigate server
        value: 'mail.example.com'

      - name: 'password_ximss_port'
        comment: |
          XIMSS port on Communigate server
        value: 11024

      - name: 'password_chpasswd_cmd'
        comment: |
          chpasswd Driver options
          ---------------------
          Command to use (see "Sudo setup" in README)
        value: 'sudo /usr/sbin/chpasswd 2> /dev/null'

      - name: 'xmail_host'
        comment: |
          XMail Driver options
          ---------------------
        value: 'localhost'

      - name: 'xmail_user'
        value: 'YourXmailControlUser'

      - name: 'xmail_pass'
        value: 'YourXmailControlPass'

      - name: 'xmail_port'
        value: 6017

      - name: 'hmailserver_remote_dcom'
        comment: |
          hMail Driver options
          -----------------------
          Remote hMailServer configuration
          true:  HMailserver is on a remote box (php.ini: com.allow_dcom = true)
          false: Hmailserver is on same box as PHP
        value: False

      - name: 'hmailserver_server'
        comment: 'Windows credentials'
        array:
          - Server: 'localhost'
          - Username: 'administrator'
          - Password: 'password'

      - name: 'password_pw_usermod_cmd'
        comment: |
          pw_usermod Driver options
          --------------------------
          Use comma delimited exlist to disable password change for users.
          See "Sudo setup" in README file.
        value: 'sudo /usr/sbin/pw usermod -h 0 -n'

      - name: 'password_dbmail_args'
        comment: |
          DBMail Driver options
          -------------------
          Additional arguments for the dbmail-users call
        value: '-p sha512'

      - name: 'password_expect_bin'
        comment: |
          Expect Driver options
          ---------------------
          Location of expect binary
        value: '/usr/bin/expect'

      - name: 'password_expect_script'
        comment: |
          Location of expect script (see helpers/passwd-expect)
        value: ''

      - name: 'password_expect_params'
        comment: |
          Arguments for the expect script. See the helpers/passwd-expect file for details.
          This is probably a good starting default:
            -telent -host localhost -output /tmp/passwd.log -log /tmp/passwd.log
        value: ''

      - name: 'password_smb_host'
        comment: |
          smb Driver options
          ---------------------
          Samba host (default: localhost)
          Supported replacement variables:
          %n - hostname ($_SERVER['SERVER_NAME'])
          %t - hostname without the first part
          %d - domain (http hostname $_SERVER['HTTP_HOST'] without the first part)
        value: 'localhost'

      - name: 'password_smb_cmd'
        comment: |
          Location of smbpasswd binary (default: /usr/bin/smbpasswd)
        value: '/usr/bin/smbpasswd'

      - name: 'password_gearman_host'
        comment: |
          gearman driver options
          ---------------------
          Gearman host (default: localhost)
        value: 'localhost'

      - name: 'password_plesk_host'
        comment: |
          Plesk/PPA Driver options
          --------------------
          You need to allow RCP for IP of roundcube-server in Plesk/PPA Panel

          Plesk RCP Host
        value: '10.0.0.5'

      - name: 'password_plesk_user'
        comment: 'Plesk RPC Username'
        value: 'admin'

      - name: 'password_plesk_pass'
        comment: 'Plesk RPC Password'
        value: 'password'

      - name: 'password_plesk_rpc_port'
        comment: 'Plesk RPC Port'
        value: '8443'

      - name: 'password_plesk_rpc_path'
        comment: 'Plesk RPC Path'
        value: 'enterprise/control/agent.php'

      - name: 'password_kpasswd_cmd'
        comment: |
          kasswd Driver options
          ---------------------
          Command to use
        value: '/usr/bin/kpasswd'

      - name: 'password_modoboa_api_token'
        comment: |
          Modoboa Driver options
          ---------------------
          put token number from Modoboa server
        value: ''

  - name: 'help'
    state: 'enabled'
    options:

      - name: 'help_source'
        comment: |
          Help content iframe source
          %l will be replaced by the language code resolved using the 'help_language_map' option
          If you are serving roundcube via https, then change this URL to https also.
        value: 'https://docs.roundcube.net/doc/help/1.1/%l/'

      - name: 'help_index_map'
        comment: |
          Map task/action combinations to deep-links
          Use '<task>/<action>' or only '<task>' strings as keys
          The values will be appended to the 'help_source' URL
        array:
          - 'login':                'login.html'
            'mail':                 'mail/index.html'
            'mail/compose':         'mail/compose.html'
            'addressbook':          'addressbook/index.html'
            'settings':             'settings/index.html'
            'settings/preferences': 'settings/preferences.html'
            'settings/folders':     'settings/folders.html'
            'settings/identities':  'settings/identities.html'

      - name: 'help_language_map'
        comment: |
          Map to translate Roundcube language codes into help document languages
          The '*' entry will be used as default
        array:
          - '*': 'en_US'

      - name: 'help_about_url'
        comment: |
          Enter an absolute URL to a page displaying information about this webmail
          Alternatively, create a HTML file under <this-plugin-dir>/content/about.html
        value: null

      - name: 'help_license_url'
        comment: |
          Enter an absolute URL to a page displaying information about this webmail
          Alternatively, put your license text to <this-plugin-dir>/content/license.html
        value: null

      - name: 'help_open_extwin'
        comment: 'Determine whether to open the elp in a new window'
        value: False

      - name: 'help_csrf_info'
        comment: 'URL to additional information about CSRF protection'
        value: null

  - name: 'markasjunk'
    state: 'enabled'
    options:

      - name: 'markasjunk_learning_driver'
        comment: |
          Learning driver
          Use an external process such as sa-learn to learn from spam/ham messages. Default: null.
          Please see the README for more information
        value: null

      - name: 'markasjunk_ham_mbox'
        comment: |
          Ham mailbox
          Mailbox messages should be moved to when they are marked as ham. null = INBOX
          set to FALSE to disable message moving
        value: null

      - name: 'markasjunk_spam_mbox'
        comment: |
          Spam mailbox
          Mailbox messages should be moved to when they are marked as spam.
          null = the mailbox assigned as the spam folder in Roundcube settings
          set to FALSE to disable message moving
        value: null

      - name: 'markasjunk_read_spam'
        comment: 'Mark messages as read when reporting them as spam'
        value: True  # original: False

      - name: 'markasjunk_unread_ham'
        comment: 'Mark messages as unread when reporting them as ham'
        value: True  # original: False

      - name: 'markasjunk_spam_flag'
        comment: |
          Add flag to messages marked as spam (flag will be removed when marking as ham)
          If you do not want to use message flags set this to false
        value: 'Junk'

      - name: 'markasjunk_ham_flag'
        comment: |
          Add flag to messages marked as ham (flag will be removed when marking as spam)
          If you do not want to use message flags set this to false
        value: 'NonJunk'

      - name: 'markasjunk_debug'
        comment: 'Write output from spam/ham commands to the log for debug'
        value: False

      - name: 'markasjunk_toolbar'
        comment: |
          The mark as spam/ham icon can either be displayed on the toolbar or as part of the mark messages menu.
          Set to False to use Mark menu instead of the toolbar. Default: true.
        value: True

      - name: 'markasjunk_move_spam'
        comment: |
          Learn any message moved to the spam mailbox as spam (not just when the button is pressed)
        value: True  # original: False

      - name: 'markasjunk_move_ham'
        comment: |
          Learn any message moved from the spam mailbox to the ham mailbox as ham (not just when the button is pressed)
        value: True  # original: False

      - name: 'markasjunk_permanently_remove'
        comment: |
          Some drivers create new copies of the target message(s), in this case the original message(s) will be deleted
          Rather than deleting the message(s) (moving to Trash) setting this option true will cause the original message(s) to be permanently removed
        value: False

      - name: 'markasjunk_spam_only'
        comment: 'Display only a mark as spam button'
        value: False

      - name: 'markasjunk_allowed_hosts'
        comment: |
          Activate markasjunk for selected mail hosts only. If this is not set all mail hosts are allowed.
          Example: $config['markasjunk_allowed_hosts'] = array('mail1.domain.tld', 'mail2.domain.tld');
        value: null

      - name: 'markasjunk_host_config'
        comment: |
          Load specific config for different mail hosts
          Example: $config['markasjunk_host_config'] = array(
             'mail1.domain.tld' => 'mail1_config.inc.php',
             'mail2.domain.tld' => 'mail2_config.inc.php',
          );
        value: null

      - name: 'markasjunk_spam_cmd'
        comment: |
          cmd_learn Driver options
          ------------------------
          The command used to learn that a message is spam
          The command can contain the following macros that will be expanded as follows:
               %u is replaced with the username (from the session info)
               %l is replaced with the local part of the username (if the username is an email address)
               %d is replaced with the domain part of the username (if the username is an email address or default mail domain if not)
               %i is replaced with the email address from the user's default identity
               %s is replaced with the email address the message is from
               %f is replaced with the path to the message file
               %h:<header name> is replaced with the content of that header from the message (lower case) eg: %h:x-dspam-signature
          If you do not want to run the command set this to null
        value: null

      - name: 'markasjunk_ham_cmd'
        comment: |
          The command used to learn that a message is ham
          The command can contain the following macros that will be expanded as follows:
               %u is replaced with the username (from the session info)
               %l is replaced with the local part of the username (if the username is an email address)
               %d is replaced with the domain part of the username (if the username is an email address or default mail domain if not)
               %i is replaced with the email address from the user's default identity
               %s is replaced with the email address the message is from
               %f is replaced with the path to the message file
               %h:<header name> is replaced with the content of that header from the message (lower case) eg: %h:x-dspam-signature
          If you do not want to run the command set this to null
        value: null

      - name: 'markasjunk_spam_dir'
        comment: |
          dir_learn Driver options
          ------------------------
          The full path of the directory used to store spam (must be writable by webserver)
        value: null

      - name: 'markasjunk_ham_dir'
        comment: |
          The full path of the directory used to store ham (must be writable by webserver)
        value: null

      - name: 'markasjunk_filename'
        comment: |
          The filename prefix
          The filename can contain the following macros that will be expanded as follows:
               %u is replaced with the username (from the session info)
               %l is replaced with the local part of the username (if the username is an email address)
               %d is replaced with the domain part of the username (if the username is an email address or default mail domain if not)
               %t is replaced with the type of message (spam/ham)
        value: null

      - name: 'markasjunk_email_spam'
        comment: |
          email_learn Driver options
          --------------------------
          The email address that spam messages will be sent to
          The address can contain the following macros that will be expanded as follows:
               %u is replaced with the username (from the session info)
               %l is replaced with the local part of the username (if the username is an email address)
               %d is replaced with the domain part of the username (if the username is an email address or default mail domain if not)
               %i is replaced with the email address from the user's default identity
          If you do not want to send an email set this to null
        value: null

      - name: 'markasjunk_email_ham'
        comment: |
          The email address that ham messages will be sent to
          The address can contain the following macros that will be expanded as follows:
               %u is replaced with the username (from the session info)
               %l is replaced with the local part of the username (if the username is an email address)
               %d is replaced with the domain part of the username (if the username is an email address or default mail domain if not)
               %i is replaced with the email address from the user's default identity
          If you do not want to send an email set this to null
        value: null

      - name: 'markasjunk_email_attach'
        comment: 'Should the spam/ham message be sent as an attachment'
        value: True

      - name: 'markasjunk_email_subject'
        comment: |
          The email subject (when sending as attachment)
          The subject can contain the following macros that will be expanded as follows:
               %u is replaced with the username (from the session info)
               %l is replaced with the local part of the username (if the username is an email address)
               %d is replaced with the domain part of the username (if the username is an email address or default mail domain if not)
               %t is replaced with the type of message (spam/ham)
        value: 'learn this message as %t'

      - name: 'markasjunk_sauserprefs_config'
        comment: |
          sa_blacklist Driver options
          ---------------------------
          Path to SAUserPrefs config file
        value: '../sauserprefs/config.inc.php'

      - name: 'markasjunk_amacube_config'
        comment: |
          amavis_blacklist Driver options
          ---------------------------
          Path to amacube config file
        value: '../amacube/config.inc.php'

      - name: 'markasjunk_spam_patterns'
        comment: |
          edit_headers Driver options
          ---------------------------
          Patterns to match and replace headers for spam messages
          Replacement method uses preg_replace - http://www.php.net/manual/function.preg-replace.php
          WARNING: Be sure to match the entire header line, including the name of the header, also use ^ and $ and the 'm' flag
          see the README for an example
          TEST CAREFULLY BEFORE USE ON REAL MESSAGES
        array:
          - patterns:     []
            replacements: []

      - name: 'markasjunk_ham_patterns'
        comment: |
          Patterns to match and replace headers for spam messages
          Replacement method uses preg_replace - http://www.php.net/manual/function.preg-replace.php
          WARNING: Be sure to match the entire header line, including the name of the header, also use ^ and $ and the 'm' flag
          see the README for an example
          TEST CAREFULLY BEFORE USE ON REAL MESSAGES
        array:
          - patterns:     []
            replacements: []

    # This plugin adds additional commands in the header of the message if
    # Roundcube detects it's a mailing list message.
  - name: 'listcommands'
    package: 'cor/listcommands'
    state: 'enabled'

    # This plugin provides support for swipe gestures on mobile devices in the
    # Elastic skin.
  - name: 'swipe'
    package: 'johndoh/swipe:0.1.0'
    state: 'enabled'

    # This plugin includes additional information in Dovecot connections to
    # provide better logging capabilities.
  - name: 'dovecot_ident'
    package: 'cor/dovecot-ident'
    state: 'enabled'

    # This plugin adds support for parsing vCard attachments in e-mail
    # messages.
  - name: 'vcard_attachments'
    state: 'enabled'

    # This plugin adds support for generating Identicon avatars for contacts
    # without images.
  - name: 'identicon'
    state: 'enabled'

  - name: 'managesieve'
    state: 'enabled'
    options:

      - name: 'managesieve_host'
        comment: |
          managesieve server address, default is localhost.
          Replacement variables supported in host name:
          %h - user's IMAP hostname
          %n - http hostname ($_SERVER['SERVER_NAME'])
          %d - domain (http hostname without the first part)
          For example %n = mail.domain.tld, %d = domain.tld
        value: '{{ roundcube__sieve_server }}'

      - name: 'managesieve_auth_type'
        comment: |
          Authentication method. Can be CRAM-MD5, DIGEST-MD5, PLAIN, LOGIN, EXTERNAL
          or none. Optional, defaults to best method supported by server.
        value: null

      - name: 'managesieve_auth_cid'
        comment: |
          Optional managesieve authentication identifier to be used as authorization proxy.
          Authenticate as a different user but act on behalf of the logged in user.
          Works with PLAIN and DIGEST-MD5 auth.
        value: null

      - name: 'managesieve_auth_pw'
        comment: |
          Optional managesieve authentication password to be used for imap_auth_cid
        value: null

      - name: 'managesieve_conn_options'
        comment: |
          Connection scket context options
          See https://php.net/manual/en/context.ssl.php
          The example below enables server certificate validation
        array:
          - ssl:
              - verify_peer: True
                verify_depth: 3
                cafile: '/etc/ssl/certs/ca-certificates.crt'
        state: 'comment'

      - name: 'managesieve_default'
        comment: |
          A file with default script content (eg. spam filter)
        value: '/etc/dovecot/sieve/global'

      - name: 'managesieve_script_name'
        comment: |
          The name of the script which will be used when there's no user script
        value: 'managesieve'

      - name: 'managesieve_mbox_encoding'
        comment: |
          Sieve RFC says that we should use UTF-8 encoding for mailbox names,
          but some implementations does not convert UTF-8 to modified UTF-7.
          Defaults to UTF7-IMAP
        value: 'UTF-8'

      - name: 'managesieve_replace_delimiter'
        comment: |
          I need this because my dovecot (with listescape plugin) uses
          ':' delimiter, but creates folders with dot delimiter
        value: ''

      - name: 'managesieve_disabled_extensions'
        comment: |
          Disabled sieve extensions (body, copy, date, editheader, encoded-character,
          envelope, environment, ereject, fileinto, ihave, imap4flags, index,
          mailbox, mboxmetadata, regex, reject, relational, servermetadata,
          spamtest, spamtestplus, subaddress, vacation, variables, virustest, etc.
          Note: not all extensions are implemented
        value: []

      - name: 'managesieve_debug'
        comment: |
          Enables debugging of conversation with sieve server. Logs it into <log_dir>/sieve
        value: False

      - name: 'managesieve_kolab_master'
        comment: |
          Enables features described in http://wiki.kolab.org/KEP:14
        value: False

      - name: 'managesieve_filename_extension'
        comment: |
          Script name extension used for scripts including. Dovecot uses '.sieve',
          Cyrus uses '.siv'. Doesn't matter if you have managesieve_kolab_master disabled.
        value: '.sieve'

      - name: 'managesieve_filename_exceptions'
        comment: |
          List of reserved script names (without extension).
          Scripts listed here will be not presented to the user.
        value: []

      - name: 'managesieve_domains'
        comment: |
          List of domains limiting destination emails in redirect action
          If not empty, user will need to select domain from a list
        value: []

      - name: 'managesieve_default_headers'
        comment: |
          Default list of entries in header selector
        value: [ 'Subject', 'From', 'To' ]

      - name: 'managesieve_vacation'
        comment: |
          Enables separate management interface for vacation responses (out-of-office)
          0 - no separate section (default),
          1 - add Vacation section,
          2 - add Vacation section, but hide Filters section
        value: 1

      - name: 'managesieve_forward'
        comment: |
          Enables separate management interface for setting forwards (redirect to and copy to)
          0 - no separate section (default),
          1 - add Forward section,
          2 - add Forward section, but hide Filters section
        value: 1

      - name: 'managesieve_vacation_interval'
        comment: |
          Default vacation interval (in days).
          Note: If server supports vacation-seconds extension it is possible
          to define interval in seconds here (as a string), e.g. "3600s".
        value: 0

      - name: 'managesieve_vacation_addresses_init'
        comment: |
          Some servers require vacation :addresses to be filled with all
          user addresses (aliases). This option enables automatic filling
          of these on initial vacation form creation.
        value: True

      - name: 'managesieve_vacation_from_init'
        comment: |
          Sometimes you want to always reply with mail email address
          This option enables automatic filling of :from field on initial
          vacation form creation.
        value: True

      - name: 'managesieve_notify_methods'
        comment: |
          Supported methods of notify extension. Default: 'mailto'
        value: [ 'mailto' ]

      - name: 'managesieve_raw_editor'
        comment: 'Enables scripts RAW editor feature'
        value: True

      - name: 'managesieve_disabled_actions'
        comment: |
          Disabled actions
          Prevent user from performing specific actions:
          list_sets, enable_disable_set, delete_set, new_set, download_set, new_rule, delete_rule
          Note: disabling list_sets removes the Filter sets widget from the UI and means
                the set defined in managesieve_script_name will always be used (and activated)
        value: []

      - name: 'managesieve_allowed_hosts'
        comment: |
          List of hosts that support managesieve.
          Activate managesieve for selected hosts only. If this is not set all hosts are allowed.
          Example: $config['managesieve_allowed_hosts'] = array('host1.mydomain.com','host2.mydomain.com');
        value: null
roundcube__plugins

List of Roundcube plugins configured on all hosts in the Ansible inventory.

roundcube__plugins: []
roundcube__group_plugins

List of Roundcube plugins configured on hosts in a specific Ansible inventory group.

roundcube__group_plugins: []
roundcube__host_plugins

List of Roundcube plugins configured on specific hosts in the Ansible inventory.

roundcube__host_plugins: []
roundcube__combined_plugins

Varlabie which combines all Roundcube plugin lists and is used in role tasks and templates.

roundcube__combined_plugins: '{{ roundcube__default_plugins
                                 + roundcube__plugins
                                 + roundcube__group_plugins
                                 + roundcube__host_plugins }}'

Skins

roundcube__skin_folder

skin name: folder from /skins Currently available:

  • classic

  • elastic [default] (mobile-ready, requires nodejs dependency, due to CSS-LESS syntax)

  • larry

roundcube__skin_folder: 'elastic'

Logo image replacement. Specifies location of the image as:

  • URL relative to the document root of this Roundcube installation

  • full URL with http:// or https:// prefix

  • URL relative to the current skin folder (when starts with a '/')

roundcube__skin_logo: null

Other variables

roundcube__max_file_size

Maximum upload size, in MB.

roundcube__max_file_size: '30'

Role-dependent configuration

roundcube__keyring__dependent_gpg_user

The UNIX account which will be used to install additional GPG keys by the debops.keyring role.

roundcube__keyring__dependent_gpg_user: '{{ roundcube__user }}'
roundcube__keyring__dependent_gpg_keys

GPG key configuration for the debops.keyring Ansible role.

roundcube__keyring__dependent_gpg_keys:

  - user: '{{ roundcube__user }}'
    group: '{{ roundcube__group }}'
    home: '{{ roundcube__home }}'
    id: '{{ roundcube__git_gpg_key }}'

  - '{{ roundcube__git_additional_gpg_keys }}'
roundcube__ldap__dependent_tasks

Configuration for the debops.ldap Ansible role.

roundcube__ldap__dependent_tasks:

  - name: 'Create roundcube account for {{ roundcube__ldap_device_dn | join(",") }}'
    dn: '{{ roundcube__ldap_binddn }}'
    objectClass: '{{ roundcube__ldap_self_object_classes }}'
    attributes: '{{ roundcube__ldap_self_attributes }}'
    no_log: '{{ debops__no_log | d(True) }}'
    state: '{{ "present" if roundcube__ldap_password_enabled and
                            roundcube__ldap_device_dn | d() else "ignore" }}'
roundcube__nginx__dependent_servers

nginx server configuration managed by the debops.nginx role.

roundcube__nginx__dependent_servers:

  - name: '{{ roundcube__fqdn }}'
    filename: 'debops.roundcube'
    by_role: 'debops.roundcube'
    type: 'php'
    root: '{{ roundcube__git_dest }}'
    webroot_create: False
    access_policy: '{{ roundcube__nginx_access_policy }}'
    index: 'index.php'

    options: |
      autoindex off;
      client_max_body_size {{ roundcube__max_file_size }}M;
      client_body_buffer_size 128k;

    location_list:
      - pattern: '/'
        options: |
          try_files $uri $uri/ @roundcube;

      - pattern: '@roundcube'
        options: |
          rewrite ^/favicon\.ico$ skins/{{ roundcube__skin_folder }}/images/favicon.ico last;

      - pattern: '~ ^/?(installer|[A-Z0-9]+$)'
        options: |
          deny all;

      - pattern: '~ ^/?(\.git|\.tx|SQL|bin|config|logs|temp|tests|program\/(include|lib|localization|steps))'
        options: |
          deny all;

      - pattern: '~ /(README\.md|composer\.json-dist|composer\.json|package\.xml|Dockerfile)$'
        options: |
          deny all;

    php_options: |
      fastcgi_intercept_errors        on;
      fastcgi_ignore_client_abort     off;
      fastcgi_connect_timeout         60;
      fastcgi_send_timeout            180;
      fastcgi_read_timeout            180;
      fastcgi_buffer_size             128k;
      fastcgi_buffers               4 256k;
      fastcgi_busy_buffers_size       256k;
      fastcgi_temp_file_write_size    256k;

    php_upstream: 'php_roundcube'
roundcube__nginx_access_policy

Name of the "nginx access policy" for Roundcube webpage. See debops.nginx Ansible role for more details.

roundcube__nginx_access_policy: ''
roundcube__nginx__dependent_upstreams

PHP upstream server configuration managed by the debops.nginx role.

roundcube__nginx__dependent_upstreams:

  - name: 'php_roundcube'
    by_role: 'debops.roundcube'
    enabled: True
    type: 'php'
    php_pool: 'roundcube'
roundcube__php__dependent_packages

List of PHP packages to install using the debops.php role.

roundcube__php__dependent_packages:
  - '{{ roundcube__base_php_packages }}'
  - '{{ roundcube__optional_php_packages }}'
  - '{{ roundcube__custom_php_packages }}'
roundcube__php__dependent_pools

PHP pools managed by the debops.php role.

roundcube__php__dependent_pools:
  name: 'roundcube'
  by_role: 'debops.roundcube'
  user: '{{ roundcube__user }}'
  group: '{{ roundcube__group }}'
  owner: '{{ roundcube__user }}'
  home: '{{ roundcube__home }}'

  php_values:
    ## https://secure.php.net/manual/en/info.configuration.php#ini.upload-max-filesize
    upload_max_filesize:        '{{ roundcube__max_file_size }}M'

    ## https://secure.php.net/manual/en/ini.core.php#ini.post-max-size
    post_max_size:              '{{ roundcube__max_file_size }}M'

    ## https://github.com/roundcube/roundcubemail/wiki/Install-Requirements
    file_uploads:               'on'
    mbstring.func_overload:     'off'
    memory_limit:               '64M'
    magic_quotes_runtime:       'off'
    magic_quotes_sybase:        'off'
    session.auto_start:         'off'
    suhosin.session.encrypt:    'off'
roundcube__nodejs__npm_dependent_packages

Configuration for the debops.nodejs Ansible role.

roundcube__nodejs__npm_dependent_packages:
  # Dependency for the 'elastic' skin to compile the CSS files
  - 'less'
  - 'tslib'