Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
centos:mail_c6:horde_5 [21.02.2013 14:34. ]
django Seite neu angelegt
centos:mail_c6:horde_5 [20.04.2018 10:40. ] (aktuell)
Zeile 1: Zeile 1:
 +====== Horde Adressbuch: Turba ======
 +Als nächste [[http://​www.horde.org/​apps|Applikation]] installieren wir uns die Anwendung **[[http://​www.horde.org/​apps/​turba|Turba]]**. Diese Anwendung stellt uns zentrale und auch persönliche Adressbücher zur Verfügung. ​
 +Informationen zu Installation und Konfiguration findet amn auch auf der offiziellen [[http://​www.horde.org/​apps/​turba/​docs/​INSTALL|Doku-Seite]].
 +
 +===== Installation =====
 +Wie auch schon bei der [[centos:​mail_c6:​horde_1|Grund-Installation]] des Horde-Frameworks,​ werden wir hier auf **PHP Extension and Application Repository** oder kurz **PEAR** zurück.
 +
 +Das Programmpaket holen wir und nun erst einmal auf unseren Web-Server.
 +    # pear install -a -B horde/turba
 +
 +  Starting to download turba-4.0.2.tgz (1,942,828 bytes)
 +  .........................................................................done:​ 1,942,828 bytes
 +  install ok: channel://​pear.horde.org/​turba-4.0.2
 +
 +===== vorbereitende Konfiguration =====
 +Die Konfiguration des Moduls **Turba** erfolgt, wie auch bereits bei der Grundkonfiguration des Horde-Frameworks,​ erfolgt über die GUI des Horde-Framworks. Bevor wir uns daran machen können, benötigen wir noch eine entsprechende (//leere//) Backupdatei für die mitgelieferte Vorgabekonfigurationsdatei. Ferner müssen wir dafür sorgen, dass unser Apache-Webserver die Änderungen im Konfigurationsverzeichnis ablegen kann.
 +Zunächst kopieren wir uns die Vorlagedatei für die Anbindung an unser Datenbank-Backendsystem,​ die bei der Hordeinstallation mit kam.
 +   # cp -a /​var/​www/​horde/​turba/​config/​backends.php /​var/​www/​horde/​turba/​config/​backends.local.php
 +
 +Anschließend legen wir noch die besagte Backup-Datei für die Konfiguration an.
 +   # touch /​var/​www/​horde/​turba/​config/​conf.php.bak
 +
 +Zum Schluß weisen wir noch die Datei und Besitzrechte für die Konfigurationsdatei- und dessen Verzeichnis zu.
 +   # chown -R root:apache /​var/​www/​horde/​turba/​config
 +
 +   # chmod g+w -R /​var/​www/​horde/​turba/​config
 +
 +
 +===== Konfiguration des MySQL-Datenbankbackendserver =====
 +Neben der Konfiguration der Anwendung selbst, müssen wir der Anwendung **Turba** auch noch mitteilen, wie und zu welchem Datenbankbackend-System sich die Anwendung verbinden soll.
 +
 +<WRAP round tip>Die mitgelieferte Konfigurationsdatei **backends.php** lassen wir unangetastet. Die Konfiguration nehmen wir über die zuvor kopierte Datei **backends.local.php** vor.</​WRAP>​
 +
 +Als erstes deaktivieren wir den ersten Standardeintrag und ergänzen dann den Eintrag für die Anbindung an unseren MySQL Datenbankserver-Server.
 +   # vim /​var/​www/​horde/​turba/​config/​backends.local.php
 +
 +
 +<file php /​var/​www/​horde/​turba/​config/​backends.local.php><?​php
 +/**
 + * This file is where you specify the sources of contacts available to users
 + * at your installation. It contains a large number of EXAMPLES. Please
 + * remove or comment out those examples that YOU DON'T NEED. There are a
 + * number of properties that you can set for each server, including:
 + *
 + * IMPORTANT: DO NOT EDIT THIS FILE!
 + * Local overrides MUST be placed in backends.local.php or backends.d/​.
 + * If the '​vhosts'​ setting has been enabled in Horde'​s configuration,​ you can
 + * use backends-servername.php.
 + *
 + * Example backends.local.php configuration file that enables the LDAP address
 + * book and adds a composite field to the SQL address book:
 + *
 + * <​code>​
 + * <?php
 + * $cfgSources['​localldap'​]['​disabled'​] = false;
 + * $cfgSources['​localldap'​]['​params'​]['​server'​] = '​localhost';​
 + * $cfgSources['​localldap'​]['​params'​]['​root'​] = '​cn=contacts,​dc=horde,​dc=org';​
 + * $cfgSources['​localldap'​]['​params'​]['​bind_dn'​] = '​cn=admin,​ou=users,​dc=horde,​dc=org';​
 + * $cfgSources['​localldap'​]['​params'​]['​bind_password'​] = '​somesecret';​
 + * $cfgSources['​localsql'​]['​map'​]['​homeAddress'​] = array(
 + ​* ​    '​fields'​ => array(
 + ​* ​        '​homeStreet',​
 + ​* ​        '​homePostalCode',​
 + ​* ​        '​homeCity',​
 + ​* ​        '​homeCountry'​
 + ​* ​    ),
 + ​* ​    '​format'​ => "​%s\n%s %s\n%s"​
 + * );
 + * </​code>​
 + *
 + * Properties that can be set for each server:
 + *
 + * disabled: (boolean) If true, the config entry is disabled.
 + *
 + * title: (string) This is the common (user-visible) name that you want
 + ​* ​       displayed in the contact source drop-down box.
 + *
 + * type: (string) The types '​ldap',​ '​sql',​ '​kolab',​ '​imsp',​ '​group',​
 + ​* ​      '​favourites'​ and '​prefs'​ are currently supported. Kolab address books
 + ​* ​      can be used with any IMAP server that supports METADATA.
 + ​* ​      ​Preferences-based address books are not intended for production
 + ​* ​      ​installs unless you really know what you're doing - they are not
 + ​* ​      ​searchable,​ and they won't scale well if a user has a large number of
 + ​* ​      ​entries.
 + *
 + * params: (array) These are the connection parameters specific to the contact
 + ​* ​        ​source.
 + *
 + ​* ​        ​General settings:
 + ​* ​          - charset: (string) The character set that the backend stores
 + ​* ​                     data in. Many LDAP servers use utf-8. Database servers
 + ​* ​                     typically use iso-8859-1.
 + ​* ​          - filter: (string) Filter your result based on certain condition
 + ​* ​                    in SQL and LDAP backends. A filter can be specified to
 + ​* ​                    avoid some unwanted data. For example, if the source is
 + ​* ​                    an external SQQL database, to select records with the
 + ​* ​                    ​delete flag = 0: '​filter'​ => '​deleted=0'​.
 + ​* ​                    ​Don'​t enclose '​filter'​ in brackets - this will done
 + ​* ​                    ​automatically. Also keep in mind that a full filter
 + ​* ​                    line will be built from '​filter'​ and '​objectclass'​
 + ​* ​                    ​parameters.
 + *
 + ​* ​        ​Settings that only apply to LDAP servers:
 + ​* ​          - bind_dn: (string) Only applies to LDAP servers which do not
 + ​* ​                     allow anonymous connections. Active Directory servers
 + ​* ​                     do not allow it by default, so before using one as a
 + ​* ​                     Turba source, you must create a "​rightless"​ user,
 + ​* ​                     which is only allowed to connect to the server, and
 + ​* ​                     set the '​bind_dn'​ parameter like
 + ​* ​                     '​rightless@example.com'​ (not
 + ​* ​                     '​cn=rightless,​dc=example,​dc=com'​).
 + ​* ​          - bind_password:​ (string) Only applies to LDAP servers which do
 + ​* ​                           not allow anonymous connection. You should set
 + ​* ​                           this to the cleartext password for the user
 + ​* ​                           specified in '​bind_dn'​.
 + ​* ​          - checkrequired:​ (boolean) If true, consult the LDAP schema for
 + ​* ​                           any attributes that are required by the given
 + ​* ​                           objectclass(es). Required attributes will be
 + ​* ​                           provided automatically if the
 + ​* ​                           '​checkrequired_string'​ parameter is present.
 + ​* ​                           *NOTE:* You must have the Net_LDAP PEAR library
 + ​* ​                           installed for this to work.
 + ​* ​          - checksyntax:​ (boolean) If present, inspect the LDAP schema for
 + ​* ​                         particular attributes by the type defined in the
 + ​* ​                         corresponding schema.
 + ​* ​                         *NOTE:* You must have the Net_LDAP PEAR library
 + ​* ​                         installed for this to work.
 + ​* ​          - deref: (integer) One of:
 + ​* ​                     - LDAP_DEREF_NEVER
 + ​* ​                     - LDAP_DEREF_SEARCHING
 + ​* ​                     - LDAP_DEREF_FINDING
 + ​* ​                     - LDAP_DEREF_ALWAYS
 + ​* ​                    This setting tells the LDAP server when to dereference
 + ​* ​                    ​aliases. See http://​www.php.net/​ldap for more
 + ​* ​                    ​information.
 + ​* ​          - dn: (array) Defines the list of LDAP attributes that build a
 + ​* ​                valid DN.
 + ​* ​          - objectclass:​ (array) Defines a list of objectclasses that
 + ​* ​                         contacts must belong to, and that new objects will
 + ​* ​                         be created with.
 + ​* ​          - referrals: (integer) Either 0 or 1. See the LDAP documentation
 + ​* ​                       about the corresponding parameter REFERRALS. Windows
 + ​* ​                       2003 Server requires that you set this parameter to
 + ​* ​                       0.
 + ​* ​          - root: (string) Defines the base DN where to start the search
 + ​* ​                  (i.e. dc=example,​dc=com).
 + ​* ​          - scope: (string) Can be set to '​one'​ to search one level of the
 + ​* ​                   LDAP directory, or '​sub'​ to search all levels. '​one'​
 + ​* ​                   will work for most setups and should be much faster.
 + ​* ​                   However we default to '​sub'​ for backwards compatibility.
 + ​* ​          - sizelimit: (integer) Limit the search to this number of
 + ​* ​                       entries. Empty value or 0 means no limit. Keep in
 + ​* ​                       mind that servers can impose their own search
 + ​* ​                       limits.
 + ​* ​          - tls: (boolean) If true, try to use a TLS connection to the
 + ​* ​                 server.
 + ​* ​          - version: (integer) Specifies LDAP server version: either 2 or
 + ​* ​                     3. Active Directory servers require version 3.
 + *
 + * map: (array) A list of mappings from the Turba attribute names (keys) to
 + ​* ​             the attribute names by which they are known in this contact
 + ​* ​             source (values).
 + *
 + ​* ​             Turba also supports composite fields. A composite field is
 + ​* ​             defined by mapping the field name to an array containing a
 + ​* ​             list of component fields and a format string (similar to a
 + ​* ​             printf() format string; however, note that positioned
 + ​* ​             parameters like %1$s will NOT work).
 + *
 + ​* ​             '​attribute'​ defines where the composed value is saved, and is
 + ​* ​             optional.
 + *
 + ​* ​             '​parse'​ defines a list of format strings and field names that
 + ​* ​             should be used for splitting up composite fields, in the order
 + ​* ​             of precedence, and is optional.
 + *
 + ​* ​             An example:
 + ​* ​               ...
 + ​* ​               '​name'​ => array(
 + ​* ​                   '​fields'​ => array('​firstname',​ '​lastname'​),​
 + ​* ​                   '​format'​ => '%s %s',
 + ​* ​                   '​attribute'​ => '​object_name'​
 + ​* ​               ),
 + ​* ​               '​firstname'​ => '​object_firstname',​
 + ​* ​               '​lastname'​ => '​object_lastname',​
 + ​* ​               ...
 + *
 + ​* ​             Standard Turba attributes are:
 + ​* ​               - __key: [REQUIRED] A backend-specific ID for the entry (any
 + ​* ​                        value as long as it is unique inside that source).
 + ​* ​               - __members: Serialized PHP array with list of Group
 + ​* ​                            ​members.
 + ​* ​               - __owner: User name of the contact'​s owner
 + ​* ​               - __type: Either '​Object'​ or '​Group'​
 + ​* ​               - __uid: Globally unique ID of the entry (used for
 + ​* ​                        ​synchronizing and must be able to be set to any
 + ​* ​                        ​value).
 + *
 + ​* ​             More Turba attributes are defined in config/​attributes.php.
 + *
 + * tabs: (array) All fields can be grouped into tabs with this optional entry.
 + ​* ​      This list is multidimensional hash; keys are the tab titles.
 + *
 + ​* ​      ​Example:​
 + ​* ​        '​tabs'​ => array(
 + ​* ​            '​Addresses'​ => array(
 + ​* ​                '​homeAddress',​
 + ​* ​                '​workAddress'​
 + ​* ​            ),
 + ​* ​            '​Names'​ => array(
 + ​* ​                '​firstname',​
 + ​* ​                '​lastname',​
 + ​* ​                '​alias'​
 + ​* ​            )
 + ​* ​        );
 + *
 + * search: (array) A list of Turba attribute names that can be searched for
 + ​* ​        this source.
 + *
 + * strict: (array) A list of native field/​attribute names that must always be
 + ​* ​             matched exactly in a search.
 + *
 + * approximate:​ (array) Only applies to LDAP servers. If set, should be an
 + ​* ​             array of native field/​attribute names to search
 + ​* ​             "​approximately"​ (for example, "​S�nchez",​ "​Sanchez",​ and
 + ​* ​             "​Sanch�z"​ will all match a search string of "​sanchez"​).
 + *
 + * export: (boolean) If true, this source will appear on the Export menu,
 + ​* ​        ​allowing users to export the contacts to a CSV (etc.) file.
 + *
 + * browse: (boolean) If true, this source will be browseable via the Browse
 + ​* ​        menu item, and empty searches against the source will return all
 + ​* ​        ​contacts.
 + *
 + * use_shares: (boolean) If true, Horde_Share functionality will be enabled
 + ​* ​            for this source - allowing users to share their personal
 + ​* ​            ​address books as well as to create new ones.
 + *
 + ​* ​            Since Turba only supports having one backend configured for
 + ​* ​            ​creating new shares, use the '​shares'​ configuration option to
 + ​* ​            ​specify which backend will be used for creating new shares. ​ All
 + ​* ​            ​permission checking will be done against Horde_Share,​ but note
 + ​* ​            that any '​extended'​ permissions (such as max_contacts) will
 + ​* ​            still be enforced. Also note that the backend driver must have
 + ​* ​            ​support for using this. Supported: SQL, IMAP/Kolab, and IMSP.
 + *
 + * all_shares: (boolean) If true (and '​use_shares'​is true) the corresponding
 + ​* ​            ​source will be assumed to handle all shares that are not
 + ​* ​            ​explicitly assigned to another source. Supported: IMAP/Kolab.
 + *
 + * list_name_field:​ (string) Taken as the field to store contact list names
 + ​* ​                 in. This is required when using a composite field as the
 + ​* ​                 '​name'​ field.
 + *
 + * alternative_name:​ (string) Taken as the field to use an alternative in case
 + ​* ​                  the name field is empty.
 + */
 +
 +/**
 + * A local address book in an SQL database. This implements a private
 + * per-user address book. Sharing of this source with other users may be
 + * accomplished by enabling Horde_Share for this source by setting
 + * '​use_shares'​ => true.
 + *
 + * Be sure to create a turba_objects table in your Horde database from the
 + * schema in turba/​scripts/​db/​turba.sql if you use this source.
 + */
 +$cfgSources['​localsql'​] = array(
 +    // ENABLED by default
 +    '​disabled'​ => false,
 +    // Django : 2013-01-25 Adressbuch personalisiert
 +    // default: '​title'​ => _("​Shared Address Books"​),​
 +    '​title'​ => _("​gemeinsames Adressbuch"​),​
 +    '​type'​ => '​sql',​
 +    '​params'​ => array(
 +        // The default connection details are pulled from the Horde-wide SQL
 +        // connection configuration.
 +        // To use another DB connection, you must provide configuration
 +        // information here - for example,
 +        //'​sql'​ => array(
 +        //    '​persistent'​ => false,
 +        //    '​username'​ => '​horde',​
 +        //    '​password'​ => '​secret',​
 +        //    '​socket'​ => '/​var/​run/​mysqld/​mysqld.sock',​
 +        //    '​protocol'​ => '​unix',​
 +        //    '​database'​ => '​horde',​
 +        //    '​charset'​ => '​utf-8',​
 +        //    '​ssl'​ => false,
 +        //    '​splitread'​ => false,
 +        //    '​phptype'​ => '​mysql'​
 +        //),
 +        '​table'​ => '​turba_objects'​
 +    ),
 +    '​map'​ => array(
 +        '​__key'​ => '​object_id',​
 +        '​__owner'​ => '​owner_id',​
 +        '​__type'​ => '​object_type',​
 +        '​__members'​ => '​object_members',​
 +        '​__uid'​ => '​object_uid',​
 +        '​firstname'​ => '​object_firstname',​
 +        '​lastname'​ => '​object_lastname',​
 +        '​middlenames'​ => '​object_middlenames',​
 +        '​namePrefix'​ => '​object_nameprefix',​
 +        '​nameSuffix'​ => '​object_namesuffix',​
 +        '​name'​ => array('​fields'​ => array('​namePrefix',​ '​firstname',​
 +                                          '​middlenames',​ '​lastname',​
 +                                          '​nameSuffix'​),​
 +                        '​format'​ => '%s %s %s %s %s',
 +                        '​parse'​ => array(
 +                            array('​fields'​ => array('​firstname',​ '​middlenames',​
 +                                                    '​lastname'​),​
 +                                  '​format'​ => '%s %s %s'),
 +                            array('​fields'​ => array('​firstname',​ '​lastname'​),​
 +                                  '​format'​ => '%s %s'​))),​
 +        // This is a shorter version of a "​name"​ composite field which only
 +        // consists of the first name and last name.
 +        // '​name'​ => array('​fields'​ => array('​firstname',​ '​lastname'​),​
 +        //                 '​format'​ => '%s %s'),
 +        '​alias'​ => '​object_alias',​
 +        '​birthday'​ => '​object_bday',​
 +        '​anniversary'​ => '​object_anniversary',​
 +        '​spouse'​ => '​object_spouse',​
 +        '​photo'​ => '​object_photo',​
 +        '​phototype'​ => '​object_phototype',​
 +        '​homeStreet'​ => '​object_homestreet',​
 +        '​homePOBox'​ => '​object_homepob',​
 +        '​homeCity'​ => '​object_homecity',​
 +        '​homeProvince'​ => '​object_homeprovince',​
 +        '​homePostalCode'​ => '​object_homepostalcode',​
 +        '​homeCountry'​ => '​object_homecountry',​
 +        '​homeAddress'​ => array('​fields'​ => array('​homeStreet',​ '​homeCity',​
 +                                                 '​homeProvince',​
 +                                                 '​homePostalCode'​),​
 +                               '​format'​ => "%s \n %s, %s  %s"),
 +        '​workStreet'​ => '​object_workstreet',​
 +        '​workPOBox'​ => '​object_workpob',​
 +        '​workCity'​ => '​object_workcity',​
 +        '​workProvince'​ => '​object_workprovince',​
 +        '​workPostalCode'​ => '​object_workpostalcode',​
 +        '​workCountry'​ => '​object_workcountry',​
 +        '​workAddress'​ => array('​fields'​ => array('​workStreet',​ '​workCity',​
 +                                                 '​workProvince',​
 +                                                 '​workPostalCode'​),​
 +                               '​format'​ => "%s \n %s, %s  %s"),
 +        '​department'​ => '​object_department',​
 +        '​timezone'​ => '​object_tz',​
 +        '​email'​ => '​object_email',​
 +        '​homePhone'​ => '​object_homephone',​
 +        '​homeFax'​ => '​object_homefax',​
 +        '​workPhone'​ => '​object_workphone',​
 +        '​cellPhone'​ => '​object_cellphone',​
 +        '​assistPhone'​ => '​object_assistantphone',​
 +        '​fax'​ => '​object_fax',​
 +        '​pager'​ => '​object_pager',​
 +        '​title'​ => '​object_title',​
 +        '​role'​ => '​object_role',​
 +        '​company'​ => '​object_company',​
 +        '​logo'​ => '​object_logo',​
 +        '​logotype'​ => '​object_logotype',​
 +        '​category'​ => '​object_category',​
 +        '​notes'​ => '​object_notes',​
 +        '​website'​ => '​object_url',​
 +        '​freebusyUrl'​ => '​object_freebusyurl',​
 +        '​pgpPublicKey'​ => '​object_pgppublickey',​
 +        '​smimePublicKey'​ => '​object_smimepublickey',​
 +        '​imaddress'​ => '​object_imaddress',​
 +        '​imaddress2'​ => '​object_imaddress2',​
 +        '​imaddress3'​ => '​object_imaddress3'​
 +    ),
 +    '​tabs'​ => array(
 +        _("​Personal"​) => array('​firstname',​ '​lastname',​ '​middlenames',​
 +                               '​namePrefix',​ '​nameSuffix',​ '​name',​ '​alias',​
 +                               '​birthday',​ '​spouse',​ '​anniversary',​ '​photo'​),​
 +        _("​Location"​) => array('​homeStreet',​ '​homePOBox',​ '​homeCity',​
 +                               '​homeProvince',​ '​homePostalCode',​ '​homeCountry',​
 +                               '​homeAddress',​ '​workStreet',​ '​workPOBox',​
 +                               '​workCity',​ '​workProvince',​ '​workPostalCode',​
 +                               '​workCountry',​ '​workAddress',​ '​timezone'​),​
 +        _("​Communications"​) => array('​email',​ '​homePhone',​ '​workPhone',​
 +                                     '​assistPhone',​ '​homeFax',​
 +                                     '​cellPhone',​ '​fax',​ '​pager',​ '​imaddress',​
 +                                     '​imaddress2',​ '​imaddress3'​),​
 +        _("​Organization"​) => array('​title',​ '​role',​ '​company',​ '​department',​ '​logo'​),​
 +        _("​Other"​) => array('​category',​ '​notes',​ '​website',​ '​freebusyUrl',​
 +                            '​pgpPublicKey',​ '​smimePublicKey'​),​
 +    ),
 +    '​search'​ => array(
 +        '​name',​
 +        '​email'​
 +    ),
 +    '​strict'​ => array(
 +        '​object_id',​
 +        '​owner_id',​
 +        '​object_type',​
 +        '​object_uid'​
 +    ),
 +    '​export'​ => true,
 +    '​browse'​ => true,
 +    '​use_shares'​ => true,
 +    '​list_name_field'​ => '​lastname',​
 +    '​alternative_name'​ => '​company',​
 +);
 +
 +/**
 + * A local address book in an LDAP directory. This implements a public
 + * (shared) address book.
 + *
 + * To store distribution lists in the LDAP directory, you'll need to include
 + * horde.schema from Horde in your LDAP configuration.
 + *
 + * To store freebusy information in the LDAP directory, you'll need to include
 + * rfc2739.schema from Horde in your LDAP configuration.
 + */
 +$cfgSources['​localldap'​] = array(
 +    // Disabled by default
 +    '​disabled'​ => true,
 +    '​title'​ => _("​Shared Directory"​),​
 +    '​type'​ => '​ldap',​
 +    '​params'​ => array(
 +        '​server'​ => '​ldap.example.com',​
 +        '​port'​ => 389,
 +        '​tls'​ => false,
 +        '​root'​ => '​dc=example,​dc=com',​
 +        '​bind_dn'​ => '​cn=admin,​ou=users,​dc=example,​dc=com',​
 +        // For Active Directory:
 +        // '​bind_dn'​ => '​username@example.com',​
 +        '​bind_password'​ => '​********',​
 +        '​sizelimit'​ => 200,
 +        // For Active Directory:
 +        // '​sizelimit'​ => 0,
 +        '​dn'​ => array('​cn'​),​
 +        '​objectclass'​ => array('​top',​
 +                               '​person',​
 +                               '​organizationalPerson',​
 +                               '​inetOrgPerson'​),​
 +                               // Add '​turbaContact'​ to this array if using
 +                               // '​turbaType'​ attribute below, and '​calEntry'​
 +                               // if using '​freebusyUrl'​.
 +        // For Active Directory:
 +        // '​objectclass'​ => array('​organizationalPerson',​
 +        //                        '​user',​
 +        //                        '​group',​
 +        //                        '​contact'​),​
 +        '​scope'​ => '​one',​
 +        // For Active Directory:
 +        // '​scope'​ => '​sub',​
 +        '​charset'​ => '​utf-8',​
 +        // Consult the LDAP schema to verify that all required attributes for
 +        // an entry are set and add them if needed.
 +        '​checkrequired'​ => false,
 +        // Value used to fill in missing required attributes.
 +        '​checkrequired_string'​ => ' ',
 +        // Check LDAP schema for valid syntax. If this is false an address
 +        // field is assumed to have postalAddress syntax; otherwise the schema
 +        // is consulted for the syntax to use.
 +        '​checksyntax'​ => false,
 +        '​version'​ => 3,
 +
 +        // For Active Directory you probably want to also set the following
 +        // parameters:
 +        // '​deref'​ => LDAP_DEREF_ALWAYS,​
 +        // '​filter'​ => '&​(SAMAccountName=*)(mail=*)',​
 +        // '​referrals'​ => 0,
 +    ),
 +    '​map'​ => array(
 +        '​__key'​ => '​dn',​
 +
 +        // Remove this mapping if using Active Directory server:
 +        '​__uid'​ => '​uid',​
 +
 +        // From horde.schema. ​ Make sure you have '​turbaContact'​ objectClass
 +        // included above:
 +        // '​__type'​ => '​turbaType',​
 +        // '​__members'​ => '​turbaMembers',​
 +
 +        '​name'​ => '​cn',​
 +        '​email'​ => '​mail',​
 +        '​homePhone'​ => '​homephone',​
 +        '​workPhone'​ => '​telephonenumber',​
 +        '​cellPhone'​ => '​mobiletelephonenumber',​
 +        '​homeAddress'​ => '​homepostaladdress',​
 +
 +        // From rfc2739.schema:​
 +        // '​freebusyUrl'​ => '​calFBURL',​
 +
 +        // For Active Directory servers:
 +        // '​name'​ => '​displayname',​
 +        // '​title'​ => '​title',​
 +        // '​cellPhone'​ => '​mobile',​
 +        // '​department'​ => '​department',​
 +        // '​company'​ => '​company',​
 +    ),
 +    '​search'​ => array(
 +        '​name',​
 +        '​email',​
 +        '​homePhone',​
 +        '​workPhone',​
 +        '​cellPhone',​
 +        '​homeAddress'​
 +    ),
 +    '​strict'​ => array(
 +        '​dn',​ '​uid'​
 +    ),
 +    '​approximate'​ => array(
 +        '​cn',​
 +    ),
 +    // For Active Directory servers:
 +    // '​approximate'​ => array(
 +    //     '​displayname',​
 +    //     '​samaccountname',​
 +    // ),
 +    '​export'​ => true,
 +    '​browse'​ => true,
 +);
 +
 +/**
 + * A personal LDAP address book. This assumes that the login is
 + * <​username>​@domain.com and that the users are stored on the same LDAP
 + * server. Thus it is possible to bind with the username and password from the
 + * user. For more info; please refer to the docs/LDAP file in the Turba
 + * distribution.
 + *
 + * To store distribution lists in the LDAP directory, you'll need to include
 + * horde.schema from Horde in your LDAP configuration.
 + *
 + * To store freebusy information in the LDAP directory, you'll need to include
 + * rfc2739.schema from Horde in your LDAP configuration.
 + */
 +/* First we need to get the uid. */
 +$_ldap_uid = $GLOBALS['​registry'​]->​getAuth('​bare'​);​
 +$_ldap_basedn = '​dc=example,​dc=com';​
 +$cfgSources['​personal_ldap'​] = array(
 +    // Disabled by default
 +    '​disabled'​ => true,
 +    '​title'​ => _("My Address Book"​),​
 +    '​type'​ => '​ldap',​
 +    '​params'​ => array(
 +        '​server'​ => '​localhost',​
 +        '​tls'​ => false,
 +        '​root'​ => '​ou='​ . $_ldap_uid . ',​ou=personal_addressbook,'​ . $_ldap_basedn,​
 +        '​bind_dn'​ => '​uid='​ . $_ldap_uid . ',​ou=People,'​ . $_ldap_basedn,​
 +        '​bind_password'​ => $GLOBALS['​registry'​]->​getAuthCredential('​password'​),​
 +        '​dn'​ => array('​uid'​),​
 +        '​objectclass'​ => array('​top',​
 +                               '​person',​
 +                               // '​turbaContact',​
 +                               '​inetOrgPerson',​
 +                               // '​calEntry',​
 +                               '​organizationalPerson'​),​
 +        '​scope'​ => '​one',​
 +        '​charset'​ => '​utf-8',​
 +        '​version'​ => 3
 +    ),
 +    '​map'​ => array(
 +        '​__key'​ => '​dn',​
 +        '​__uid'​ => '​uid',​
 +
 +        // From horde.schema:​
 +        // '​__type'​ => '​turbaType',​
 +        // '​__members'​ => '​turbaMembers',​
 +
 +        '​name'​ => '​cn',​
 +        '​email'​ => '​mail',​
 +        '​lastname'​ => '​sn',​
 +        '​title'​ => '​title',​
 +        '​company'​ => '​organizationname',​
 +        '​businessCategory'​ => '​businesscategory',​
 +        '​workAddress'​ => '​postaladdress',​
 +        '​workPostalCode'​ => '​postalcode',​
 +        '​workPhone'​ => '​telephonenumber',​
 +        '​fax'​ => '​facsimiletelephonenumber',​
 +        '​homeAddress'​ => '​homepostaladdress',​
 +        '​homePhone'​ => '​homephone',​
 +        '​cellPhone'​ => '​mobile',​
 +        '​notes'​ => '​description',​
 +
 +        // Evolution interopt attributes: (those that do not require the
 +        // evolution.schema)
 +        '​office'​ => '​roomNumber',​
 +        '​department'​ => '​ou',​
 +        '​nickname'​ => '​displayName',​
 +        '​website'​ => '​labeledURI',​
 +
 +        // These are not stored on the LDAP server.
 +        '​pgpPublicKey'​ => '​object_pgppublickey',​
 +        '​smimePublicKey'​ => '​object_smimepublickey',​
 +
 +        // From rfc2739.schema:​
 +        // '​freebusyUrl'​ => '​calFBURL',​
 +    ),
 +    '​search'​ => array(
 +        '​name',​
 +        '​email',​
 +        '​businessCategory',​
 +        '​title',​
 +        '​homePhone',​
 +        '​workPhone',​
 +        '​cellPhone',​
 +        '​homeAddress'​
 +    ),
 +    '​strict'​ => array(
 +        '​dn',​ '​uid'​
 +    ),
 +    '​approximate'​ => array(
 +        '​cn',​
 +    ),
 +    '​export'​ => true,
 +    '​browse'​ => true,
 +);
 +
 +/**
 + * A local address book on a IMAP or Kolab server. This implements a private
 + * per-user address book. Sharing of this source with other users is
 + * accomplished by IMAP ACLs and by setting '​use_shares'​ => true.
 + */
 +$cfgSources['​kolab'​] = array(
 +    // DISABLED by default
 +    '​disabled'​ => true,
 +    '​title'​ => _("​Shared Address Books"​),​
 +    '​type'​ => '​kolab',​
 +    '​params'​ => array(
 +    ),
 +    '​map'​ => array(
 +        '​__key'​ => '​__key',​
 +        '​__uid'​ => '​uid',​
 +        '​__type'​ => '​__type',​
 +        '​__members'​ => '​__members',​
 +        /* Personal */
 +        '​name'​ => array('​fields'​ => array('​namePrefix',​ '​firstname',​
 +                                          '​middlenames',​ '​lastname',​
 +                                          '​nameSuffix'​),​
 +                        '​format'​ => '%s %s %s %s %s',
 +                        '​parse'​ => array(
 +                            array('​fields'​ => array('​firstname',​ '​middlenames',​
 +                                                    '​lastname'​),​
 +                                  '​format'​ => '%s %s %s'),
 +                            array('​fields'​ => array('​lastname',​ '​firstname'​),​
 +                                  '​format'​ => '%s, %s'),
 +                            array('​fields'​ => array('​firstname',​ '​lastname'​),​
 +                                  '​format'​ => '%s %s'​))),​
 +        '​firstname'​ => '​given-name',​
 +        '​lastname'​ => '​last-name',​
 +        '​middlenames'​ => '​middle-names',​
 +        '​namePrefix'​ => '​prefix',​
 +        '​nameSuffix'​ => '​suffix',​
 +        // This is a shorter version of a "​name"​ composite field which only
 +        // consists of the first name and last name.
 +        // '​name'​ => array('​fields'​ => array('​firstname',​ '​lastname'​),​
 +        //                 '​format'​ => '%s %s'),
 +        '​initials' ​         => '​initials',​
 +        '​nickname' ​         => '​nick-name',​
 +        '​photo' ​            => '​photo',​
 +        '​phototype' ​        => '​phototype',​
 +        '​gender' ​           => '​gender',​
 +        '​birthday' ​         => '​birthday',​
 +        '​spouse' ​           => '​spouse-name',​
 +        '​anniversary' ​      => '​anniversary',​
 +        '​children' ​         => '​children',​
 +        /* Location */
 +        '​workStreet' ​       => '​addr-business-street',​
 +        '​workCity' ​         => '​addr-business-locality',​
 +        '​workProvince' ​     => '​addr-business-region',​
 +        '​workPostalCode' ​   => '​addr-business-postal-code',​
 +        '​workCountryFree' ​  => '​addr-business-country',​
 +        '​homeStreet' ​       => '​addr-home-street',​
 +        '​homeCity' ​         => '​addr-home-locality',​
 +        '​homeProvince' ​     => '​addr-home-region',​
 +        '​homePostalCode' ​   => '​addr-home-postal-code',​
 +        '​homeCountryFree' ​  => '​addr-home-country',​
 +        /* Communications */
 +        '​emails' ​           => '​emails',​
 +        '​homePhone' ​        => '​phone-home1',​
 +        '​workPhone' ​        => '​phone-business1',​
 +        '​cellPhone' ​        => '​phone-mobile',​
 +        '​fax' ​              => '​phone-businessfax',​
 +        '​instantMessenger' ​ => '​im-address',​
 +        /* Organization */
 +        '​title' ​            => '​job-title',​
 +        '​role' ​             => '​profession',​
 +        '​company' ​          => '​organization',​
 +        '​department' ​       => '​department',​
 +        '​office' ​           => '​office-location',​
 +        '​manager' ​          => '​manager-name',​
 +        '​assistant' ​        => '​assistant',​
 +        /* Other */
 +        '​category' ​         => '​categories',​
 +        '​notes' ​            => '​body',​
 +        '​website' ​          => '​web-page',​
 +        '​freebusyUrl' ​      => '​free-busy-url',​
 +        '​language' ​         => '​language',​
 +        '​latitude' ​         => '​latitude',​
 +        '​longitude' ​        => '​longitude',​
 +        /* Invisible */
 +        '​pgpPublicKey' ​     => '​pgp-publickey',​
 +    ),
 +    '​tabs'​ => array(
 +        _("​Personal"​) => array('​firstname',​ '​lastname',​ '​middlenames',​
 +                               '​namePrefix',​ '​nameSuffix',​ '​name',​ '​initials',​
 +                               '​nickname',​ '​gender',​ '​birthday',​ '​spouse',​
 +                               '​anniversary',​ '​children',​ '​photo'​),​
 +        _("​Location"​) => array('​workStreet',​ '​workCity',​ '​workProvince',​
 +                               '​workPostalCode',​ '​workCountryFree',​
 +                               '​homeStreet',​ '​homeCity',​ '​homeProvince',​
 +                               '​homePostalCode',​ '​homeCountryFree'​),​
 +        _("​Communications"​) => array('​emails',​ '​homePhone',​ '​workPhone',​
 +                                     '​cellPhone',​ '​fax',​ '​instantMessenger'​),​
 +        _("​Organization"​) => array('​title',​ '​role',​ '​company',​ '​department',​
 +                                   '​office',​ '​manager',​ '​assistant'​),​
 +        _("​Other"​) => array('​category',​ '​notes',​ '​website',​ '​freebusyUrl',​
 +                            '​language',​ '​latitude',​ '​longitude'​),​
 +    ),
 +    '​search'​ => array(
 +        '​name',​
 +        '​emails'​
 +    ),
 +    '​strict'​ => array(
 +        '​uid',​
 +    ),
 +    '​export'​ => true,
 +    '​browse'​ => true,
 +    '​list_name_field'​ => '​lastname',​
 +    '​use_shares'​ => true,
 +    '​all_shares'​ => true,
 +);
 +
 +/**
 + * A preferences-based address book. This will always be private. You can add
 + * any attributes you like to the map and it will just work; you can also
 + * create multiple prefs-based address books by changing the '​name'​ parameter.
 + * This is best for address books that are expected to remain small; it's not
 + * the most efficient, but it can't be beat for getting up and running
 + * quickly, especially if you already have Horde preferences working. Note
 + * that it is not searchable, though - searches will simply return the whole
 + * address book.
 + */
 +$cfgSources['​prefs'​] = array(
 +    // Disabled by default
 +    '​disabled'​ => true,
 +    '​title'​ => _("​Private Address Book"​),​
 +    '​type'​ => '​prefs',​
 +    '​params'​ => array(
 +        '​name'​ => '​prefs',​
 +        '​charset'​ => '​UTF-8'​
 +    ),
 +    '​map'​ => array(
 +        '​__key'​ => '​id',​
 +        '​__type'​ => '​_type',​
 +        '​__members'​ => '​_members',​
 +        '​__uid'​ => '​uid',​
 +        '​name'​ => '​name',​
 +        '​email'​ => '​mail',​
 +        '​alias'​ => '​alias'​
 +    ),
 +    '​search'​ => array(
 +        '​name',​
 +        '​email',​
 +        '​alias'​
 +    ),
 +    '​strict'​ => array(
 +        '​id',​
 +        '​_type',​
 +        '​uid'​
 +    ),
 +    '​export'​ => true,
 +    '​browse'​ => true,
 +);
 +
 +/**
 + * An address book based on message recipients. This will always be private and
 + * read-only. The address book content is provided by the
 + * contacts/​favouriteRecipients API method which should be implemented by a
 + * mail client that collects the most regular message recipients, like IMP
 + * 4.2.
 + */
 +$cfgSources['​favourites'​] = array(
 +    // ENABLED by default
 +    '​disabled'​ => false,
 +    // Django : 2013-01-25 Adressbuch personalisiert
 +    // default: '​title'​ => _("​Favourite Recipients"​),​
 +    '​title'​ => _("​pers. Adressbuch (Favoriten)"​),​
 +    '​type'​ => '​favourites',​
 +    '​params'​ => array(
 +        '​limit'​ => 10
 +    ),
 +    '​map'​ => array(
 +        '​__key'​ => '​email',​
 +        '​name'​ => '​email',​
 +        '​email'​ => '​email'​
 +    ),
 +    '​search'​ => array(
 +        '​email'​
 +    ),
 +    '​strict'​ => array(
 +        '​id',​
 +    ),
 +    '​export'​ => true,
 +    '​browse'​ => true,
 +);
 +
 +/**
 + * A driver to show a user's Facebook friends as a turba address book. Some
 + * data (like email) is not readily available via the API, but other data, like
 + * birthdays (which will show up via the listTimeObjects API) may still be
 + * useful to some
 + */
 +if (!empty($GLOBALS['​conf'​]['​facebook'​]['​id'​])) {
 +    $cfgSources['​facebook'​] = array(
 +        // Disabled if no provisioning with the Facebook API.
 +        '​disabled'​ => !$GLOBALS['​injector'​]->​getInstance('​Horde_Service_Facebook'​)->​auth->​getSessionKey(),​
 +        '​title'​ => _("​Facebook Friends"​),​
 +        '​type'​ => '​facebook',​
 +        '​params'​ => array(
 +            '​limit'​ => 10
 +        ),
 +        '​map'​ => array(
 +            '​__key'​ => '​uid',​
 +            '​name'​ => '​name',​
 +            '​lastname'​ => '​last_name',​
 +            '​firstname'​ => '​first_name',​
 +            '​middlenames'​ => '​middle_name',​
 +            // '​email'​ => '​email',​
 +            '​birthday'​ => '​birthday_date',​
 +            '​homeCity'​ => '​current_location.city',​
 +            '​homeProvince'​ => '​current_location.state',​
 +            '​homePostalCode'​ => '​current_location.zip',​
 +            '​homeCountry'​ => '​current_location.country',​
 +            '​homeAddress'​ => array('​fields'​ => array('​homeCity',​
 +                                                     '​homeProvince',​
 +                                                     '​homePostalCode'​),​
 +                                   '​format'​ => "%s, %s  %s"),
 +            '​notes'​ => '​about_me',​
 +            // '​website'​ => '​website',​
 +        ),
 +        '​search'​ => array(
 +            '​name',​
 +            '​email',​
 +        ),
 +        '​export'​ => true,
 +        '​browse'​ => true,
 +    );
 +}
 +
 +/**
 + * This source creates an address book for each group the current user is a
 + * member in.  The address book will always be read only, and the group members
 + * must have an email address entered in their default identity. ​ No email
 + * address will result in that member not being included in the address book.
 + */
 +//​$grpSource = array(
 +//    '​title'​ => _("​Group"​),​
 +//    '​type'​ => '​group',​
 +//    '​params'​ => array(
 +//       '​name'​ => ''​
 +//    ),
 +//    '​map'​ => array(
 +//        '​__key'​ => '​email',​
 +//        '​name'​ => '​name',​
 +//        '​email'​ => '​email'​
 +//    ),
 +//    '​search'​ => array(
 +//        '​name',​
 +//        '​email'​
 +//    ),
 +//    '​export'​ => true,
 +//    '​browse'​ => true,
 +//);
 +
 +//foreach ($GLOBALS['​injector'​]->​getInstance('​Horde_Group'​)->​listGroups($GLOBALS['​registry'​]->​getAuth()) as $_group_id => $_group_name) {
 +//    $cfgSources['​group_'​ . $_group_id] = $grpSource;
 +//    $cfgSources['​group_'​ . $_group_id]['​params'​] = array('​gid'​ => $_group_id);​
 +//    $cfgSources['​group_'​ . $_group_id]['​title'​] = $_group_name;​
 +//}
 +
 +/**
 + * IMSP based address book.
 + *
 + * Communicates with an IMSP backend server.
 + *
 + * Notes:
 + * You should configure the user's "​main"​ address book here. The name of the
 + * address book is set in the '​name'​ element of the params array. It should
 + * be configured to be the same as the IMSP server username. Any other
 + * address books the user has access to will automatically be configured at
 + * runtime.
 + *
 + * In the params array, accepted values for auth_method are '​cram_md5',​
 + * '​imtest',​ and '​plaintext'​ - these must match a IMSP_Auth_ driver. If you
 + * are using the imtest driver for Cyrus, please read the
 + * framework/​Net_IMSP/​Auth/​imtest.php file for more configuration information.
 + *
 + * Groups in other IMSP-aware applications are just entries with multiple
 + * email addresses in the email field and a '​group'​ field set to flag the
 + * entry as a group. (The Cyrusoft applications,​ Mulberry and Silkymail both
 + * use a field named '​group'​ set to equal '​group'​ to signify this). A
 + * Turba_Object_Group is basically a List of existing Turba_Objects. The IMSP
 + * driver will map between these two structures when reading and writing
 + * groups.
 + * The only caveat is that IMSP groups that contain email addresses which do
 + * not have a cooresponding contact entry will be ignored. The group_id_field
 + * should be set to the IMSP field that flags the entry as a '​group'​ entry and
 + * the group_id_value should be set to the value given to that field.
 + *
 + * By default, the username and password that were used to login to Horde is
 + * used to login to the IMSP server. If these credentials are different,
 + * there is a user preference in Horde to allow another username / password to
 + * be entered. The alternate credentials are always used if present.
 + *
 + * In the map array, since IMSP uses the '​name'​ attribute as a key, this is
 + * what __key is mapped to ... and a dynamic field '​fullname'​ is added and
 + * mapped to the horde '​name'​ field. This is populated with the IMSP '​name'​
 + * field when the object is read from the server.
 + *
 + * If you wish to keep track of ownership of individual contacts, set
 + * '​contact_ownership'​ = true. Note that entries created using other clients
 + * will not be created this way and will therefore have no '​owner'​. Set
 + * '​contact_ownership'​ = false and the __owner field will be automatically
 + * populated with the current username.
 + *
 + * To integrate with Horde_Share,​ set use_shares to true and uncomment the
 + * IMSP Horde_Share hooks in horde/​config/​hooks.php.
 + */
 +// Check that IMSP is configured in Horde but fall through if there is no
 +// configuration at all.
 +if (!empty($GLOBALS['​conf'​]['​imsp'​]['​enabled'​])) {
 +    // First, get the user name to login to IMSP server with.
 +    $_imsp_auth_user = $GLOBALS['​prefs'​]->​getValue('​imsp_auth_user'​);​
 +    $_imsp_auth_pass = $GLOBALS['​prefs'​]->​getValue('​imsp_auth_pass'​);​
 +    if (!strlen($_imsp_auth_user)) {
 +        $_imsp_auth_user = $GLOBALS['​registry'​]->​getAuth('​bare'​);​
 +        $_imsp_auth_pass = $GLOBALS['​registry'​]->​getAuthCredential('​password'​);​
 +    }
 +    $cfgSources['​imsp'​] = array(
 +        // ENABLED by default
 +        '​disabled'​ => false,
 +        '​title'​ => _("​IMSP"​),​
 +        '​type'​ => '​imsp',​
 +        '​params'​ => array(
 +            '​server' ​ => $GLOBALS['​conf'​]['​imsp'​]['​server'​],​
 +            '​port' ​   => $GLOBALS['​conf'​]['​imsp'​]['​port'​],​
 +            '​auth_method'​ => $GLOBALS['​conf'​]['​imsp'​]['​auth_method'​],​
 +            // socket, command, and auth_mechanism are for imtest driver.
 +            '​socket' ​ => isset($GLOBALS['​conf'​]['​imsp'​]['​socket'​]) ?
 +                         ​$GLOBALS['​conf'​]['​imsp'​]['​socket'​] . $_imsp_auth_user . '​.sck'​ :
 +                         '',​
 +            '​command'​ => isset($GLOBALS['​conf'​]['​imsp'​]['​command'​]) ?
 +                         ​$GLOBALS['​conf'​]['​imsp'​]['​command'​] : ''​ ,
 +            '​auth_mechanism'​ => isset($GLOBALS['​conf'​]['​imsp'​]['​auth_mechanism'​]) ?
 +                                $GLOBALS['​conf'​]['​imsp'​]['​auth_mechanism'​] : '',​
 +            '​username'​ => $_imsp_auth_user,​
 +            '​password'​ => $_imsp_auth_pass,​
 +            '​name'​ => $_imsp_auth_user,​
 +            '​group_id_field'​ => '​group',​
 +            '​group_id_value'​ => '​group',​
 +            '​contact_ownership'​ => false,
 +            // Dynamically generated acl rights for current user.
 +            '​my_rights'​ => '',​
 +            ),
 +        '​map'​ => array(
 +            '​__key'​ => '​name',​
 +            '​__type'​ => '​__type',​
 +            '​__members'​ => '​__members',​
 +            '​__owner'​ => '​__owner',​
 +            '​__uid'​ => '​__uid',​
 +            '​name'​ => '​fullname',​
 +            '​email'​ => '​email',​
 +            '​alias'​ => '​alias',​
 +            '​company'​ => '​company',​
 +            '​notes'​ => '​notes',​
 +            '​workPhone'​ => '​phone-work',​
 +            '​fax'​ => '​fax',​
 +            '​homePhone'​ => '​phone-home',​
 +            '​cellPhone'​ => '​cellphone',​
 +            '​freebusyUrl'​ => '​freebusyUrl'​
 +            ),
 +        '​search'​ => array(
 +            '​name',​
 +            '​email',​
 +            '​alias',​
 +            '​company',​
 +            '​homePhone'​
 +            ),
 +        '​strict'​ => array('​__uid'​),​
 +        '​export'​ => true,
 +        '​browse'​ => true,
 +        '​use_shares'​ => false,
 +        );
 +
 +    /**
 +     * Get any other address books this user might be privy to.
 +     * The values for attributes such as '​export'​ and '​browse'​ for books
 +     * that are added below will be the same as the values set in the default
 +     * book above. Any entries defined explicitly in cfgSources[]
 +     * will override any entries gathered dynamically below.
 +     */
 +     if (empty($cfgSources['​imsp'​]['​use_shares'​]) && !empty($cfgSources['​imsp'​]['​enabled'​])) {
 +         try {
 +            $result = Horde_Core_Imsp_Utils::​getAllBooks($cfgSources['​imsp'​]);​
 +            $resultCount = count($result);​
 +            for ($i = 0; $i < $resultCount;​ ++$i) {
 +                // Make sure we didn't define this source explicitly,
 +                // but set the acls from the server regardless.
 +                $dup = false;
 +                foreach ($cfgSources as $key => $thisSource) {
 +                    if (($thisSource['​type'​] == '​imsp'​) &&
 +                        ($thisSource['​params'​]['​name'​] == $result[$i]['​params'​]['​name'​])) {
 +
 +                        $dup = true;
 +                        $acl = $result[$i]['​params'​]['​my_rights'​];​
 +                        $cfgSources[$key]['​params'​]['​my_rights'​] = $acl;
 +                        break;
 +                    }
 +                }
 +                if (!$dup) {
 +                    $cfgSources[$result[$i]['​params'​]['​name'​]] = $result[$i];​
 +                }
 +            }
 +        } catch (Horde_Imsp_Exception $e) {
 +            $GLOBALS['​notification'​]->​push($e->​getMessage());​
 +        }
 +     }
 +}
 +/* End IMSP sources. */
 +</​file>​
 +
 +===== Konfiguration über die WEB-GUI =====
 +Die Konfiguration der Applikation **Turba** erfolgt dann über die GUI des Web-Frameworks. Dazu rufen wir unseren angelegten VHOST im Webbrowser auf.
 +   $ firefox https://​buero.nausch.org
 +
 +{{ :​centos:​mail_c6:​horde-5.png?​direct&​500 |Bild: Bildschirmhardcopy Horde "​Erstanmeldung"​}}
 +
 +Mit einem Klick auf das Zahnradsysmbol {{:​centos:​mail_c6:​horde-4.png?​nolink|Bild:​ Horde Menüpunkt Administration}} erreichen wir den Menüpunkt //​**Administration**//​.
 +
 +{{ :​centos:​mail_c6:​horde-6.png?​direct&​480 |Bild: Bildschirmhardcopy Horde "​Menüpunkt Administration"​}}
 +
 +Hier wählen wir den Menüpunkt **//​Configuration//​** aus.
 +
 +{{ :​centos:​mail_c6:​horde-21.png?​direct&​750 |Bild: Bildschirmhardcopy Horde "​Configuration"​}}
 +
 +Da wir die Anwendung **//IMP//** noch nicht konfiguriert haben und auch die nötigen mySQL-Datenbanktabellen angelegt haben, sind die beiden Fehlermeldungen normal. ​
 +
 +Als erstes legen wir die notwendigen Datenbanktabellen an. Hierzu klicken wir auf den Punkt **DB schema is out of date**. Die Aktion wird uns entsprechend positiv quittiert.
 +
 +{{ :​centos:​mail_c6:​horde-22.png?​direct&​750 |Bild: Bildschirmhardcopy Horde "​Configuration"​}}
 +
 +Um zur Konfiguration von **Turba** zu gelangen, klicken wir nun auf den Punkt **Adressbuch (turba)**. ​
 +
 +{{ :​centos:​mail_c6:​horde-23.png?​direct&​750 |Bild: Bildschirmhardcopy Horde "​Configuration"​}}
 +
 +Auf den nun zur Verfügung stehenden Reitern, erfolgt die Konfiguration der Horde-Applikation **Turba**. ​
 +
 +=== Menu Settings ===
 +  $conf[menu][import_export] ​                                                    [✔]
 +
 +=== Clients ===
 +  $conf[client][addressbook] ​                                                    None
 +
 +=== Exchange GAL ===
 +  $conf[gal][addressbook] ​                                                       None
 +
 +=== Shares ===
 +  $conf[shares][source] ​                                                         localsql
 +
 +=== Comments ===
 +  $conf[comments][allow] ​                                                        [✔]
 +
 +=== Virtual File Storage ===
 +   ​$conf[documents][type] ​                                                       Horde defaults
 +
 +
 +Am Ende unserer Konfigurationsarbeit,​ sichern wir die Konfiguration mit einem Klick auf die Schaltfläche: ​
 +{{:​centos:​mail_c6:​111-turba.png?​nolink&​170|Bild:​ Schaltfläche "​Adressbuch-Konfiguration erzeugen"​}}
 +Die erfolgreiche Sicherung wird uns entsprechend angezeigt.
 +{{ :​centos:​mail_c6:​222-turba.png?​nolink&​250 |Bild: Bestätigung der erfolgreichen Sicherung}}
 +
 +
 +====== Links ======
 +  * **[[centos:​mail_c6:​start|Zurück zum Kapitel >>​Mailserverinstallation unter CentOS 6<<​]]**
 +  * **[[centos:​mail_c6:​start#​horde_groupware_server|Zurück zum Kapitel >>​horde Groupware Server<<​]]**
 +  * **[[wiki:​start|Zurück zu >>​Projekte und Themenkapitel<<​]]**
 +  * **[[http://​dokuwiki.nausch.org/​doku.php/​|Zurück zur Startseite]]**
 +
 +
 +
 +
 +
  
  • centos/mail_c6/horde_5.txt
  • Zuletzt geändert: 20.04.2018 10:40.
  • (Externe Bearbeitung)