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)