lost global address book on schema update

Sebastian Birnbach <[email protected]> Fri, 19 Aug 2016 13:15:39 +0200
Newsgroups gmane.comp.horde.turba
Message-ID <CACTNBFP-VtL9CdHcgxR4b41B7YL8LqC27b3aJHYFW0zVrUQR2Q@mail.gmail.com>
Dear all,

I just updated my db schemas for all the applications I updated a couple of
weeks ago. Upon this, many things stopped working. I needed to introduce a
bunch of new permissions to get most applications going again.

However, I still have serious trouble with Turba. The global address book
does not show up anymore, for any user. I can see that the data is still in
the mySQL database but access from Horde is off.

I am using a configuration where everybody is working on a global
addressbook (living in the local mySQL database). Private databases are
disabled by setting use_shares in backends.local.php to false. I enclose
the backends.local.php file for reference.

I rarely touch the horde configuration so I may be overlooking something
very basic or very stupid. Any help is much appreciated!

Kind regards

  Sebastian

-- 
turba mailing list
Frequently Asked Questions: http://wiki.horde.org/FAQ
To unsubscribe, mail: [email protected]
backends.local.php (application/x-httpd-php, 17.7 KB)
<?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:
 *
 * EDITABLE LOCAL COPY
 *
 * Example backends.local.php configuration file that enables the LDAP address
 * book and adds a composite field to the SQL address book:
 *
 * <?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"
 * );
 *
 * 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 SQL 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
 *                      '[email protected]' (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.
 *           - checksyntax: (boolean) If present, inspect the LDAP schema for
 *                          particular attributes by the type defined in the
 *                          corresponding schema.
 *           - 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,
    'title' => _("Shared Address Books"),
    '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', // removed 2015-04-24 to permit all-users-access
        '__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',
                                          'lastname',
                                          'nameSuffix'),
                        'format' => '%s %s %s, %s',
                        'parse' => array(
                            array('fields' => array('firstname',
                                                    'lastname'),
                                  'format' => '%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',
        //'yomifirstname' => 'object_yomifirstname',
        //'yomilastname' => 'object_yomilastname',
        //'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', 'homePostalCode', 'homeCity', 'homeCountry'),
                               'format' => "%s\n%s %s\n%s"),
        'workStreet' => 'object_workstreet',
        'workPOBox' => 'object_workpob',
        'workCity' => 'object_workcity',
        //'workProvince' => 'object_workprovince',
        'workPostalCode' => 'object_workpostalcode',
        'workCountry' => 'object_workcountry',
        'workAddress' => array('fields' => array('workStreet', 'workPostalCode', 'workCity', 'workCountry'),
                               'format' => "%s\n%s %s\n%s"),
        //'otherStreet' => 'object_otherstreet',
        //'otherPOBox' => 'object_otherpob',
        //'otherCity' => 'object_othercity',
        //'otherProvince' => 'object_otherprovince',
        //'otherPostalCode' => 'object_otherpostalcode',
        //'otherCountry' => 'object_othercountry',
        /*'otherAddress' => array('fields' => array('otherStreet', 'otherCity',
                                                  'otherProvince',
                                                  'otherPostalCode'),
                                'format' => "%s\n%s, %s  %s"), */
        'department' => 'object_department',
        'manager' => 'object_manager',
        'assistant' => 'object_assistant',
        'timezone' => 'object_tz',
        //'email' => 'object_email',
        'homeEmail' => 'object_homeemail',
        'workEmail' => 'object_workemail',
        'homePhone' => 'object_homephone',
        'homePhone2' => 'object_homephone2', // *
        'homeFax' => 'object_homefax',
        'workPhone' => 'object_workphone',
        'workPhone2' => 'object_workphone2',  // *
        'cellPhone' => 'object_cellphone',
        //'carPhone' => 'object_carphone',
        //'radioPhone' => 'object_radiophone',
        //'companyPhone' => 'object_companyphone',
        'assistPhone' => 'object_assistantphone',  // *
        'fax' => 'object_fax',
        //'pager' => 'object_pager',
        'title' => 'object_title',
        'role' => 'object_role',
        'company' => 'object_company',
        'logo' => 'object_logo',
        'logotype' => 'object_logotype',
        '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('namePrefix', 'name', 'firstname', 'lastname', 'workPhone', 'fax', 'workEmail'),
        _("Communications") => array('homeEmail',
                                     'homePhone', 'homePhone2',
                                     'carPhone',
                                     'radioPhone', 'companyPhone',
                                     'assistPhone',
                                     'cellPhone'),
        _("Location") => array('homeStreet', 'homeCity',
                               'homePostalCode', 'homeCountry',
                               'homeAddress', 'workStreet', 'workPOBox',
                               'workCity', 'workPostalCode',
                               'workCountry', 'workAddress', 'timezone'),
        _("Organization") => array('title', 'role', 'company', 'department', 'logo', 'manager'),
        _("Other") => array('notes', 'website'),
    ),
    'search' => array(
        'name',
        'email',
        'company'
    ),
    'strict' => array(
        'object_id',
        'owner_id',
        'object_type',
        'object_uid'
    ),
    'export' => true,
    'browse' => true,
    'use_shares' => false,
    'list_name_field' => 'lastname',
    'alternative_name' => 'company',
);