[horde] hangs up when trying to access Turba

Robert Abbate director at ispconcepts.com
Wed Feb 2 20:58:26 PST 2005


Hi. I have the new, latest Horde and I cannot get Turba to load in the
browser. I am trying to get it to work without Ldap and just use MySQL. I
have set it up according to INSTALL, and I have enabled debug level in the
logs, and it shows:

Feb 02 23:21:52 HORDE [notice] [imp] Login success for
director at ispconcepts.com [68.94.244.37] to {localhost:143} [on line 150 of
"/home/spamsnag/html/horde/imp/redirect.php"]
Feb 02 23:22:03 HORDE [debug] [] SQL Query by Prefs_sql::retrieve(): SELECT
pref_scope, pref_name, pref_value FROM horde_prefs WHERE pref_uid =
'director at ispconcepts.com' AND (pref_scope = 'turba' OR pref_scope =
'horde') ORDER BY pref_scope [on line 147 of
"/home/spamsnag/html/horde/lib/Horde/Prefs/sql.php"]


and seems to be connecting to mysql fine.

I see a similar thread:

http://marc.free.net.ph/message/20050107.164422.f0ebac96.en.html

but I have checked the settings, and still no go. Does anyone have an
example sources.php file that works with mysql only?

below is my sources.php file:


<?php
/**
 * $Horde: turba/config/sources.php.dist,v 1.97 2004/11/17 20:36:41 chuck
Exp $
 *
 * 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:
 *
 * title:    This is the common (user-visible) name that you want displayed
in
 *           the contact source drop-down box.
 *
 * type:     The types 'ldap', 'sql', 'imsp' and 'prefs' are currently
 *           supported.  Preferences-based addressbooks 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:   These are the connection parameters specific to the contact
 *           source.  See below for examples of how to set these.
 *
 * map:      This is a list of mappings from the standard Turba attribute
names
 *           (on the left) to the attribute names by which they are known in
 *           this contact source (on the right).  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).  Here is an example:
 *           ...
 *           'name' => array('fields' => array('firstname', 'lastname'),
 *                           'format' => '%s %s'),
 *           'firstname' => 'object_firstname',
 *           'lastname' => 'object_lastname',
 *           ...
 *
 * tabs:     All fields can be grouped into tabs with this optional entry.
This
 *           list is multidimensional hash, the keys are the tab titles.
Here
 *           is an example:
 *           'tabs' => array(
 *               'Names' => array('firstname', 'lastname', 'alias'),
 *               'Addresses' => array('homeAddress', 'workAddress')
 *           );
 *
 * search:   A list of Turba attribute names that can be searched for this
 *           source.
 *
 * strict:   A list of native field/attribute names that must always be
matched
 *           exactly in a search.
 *
 * public:   If set to true, this source will be available to all users.
See
 *           also 'readonly' -- public=true readonly=false means writable by
 *           all users!
 *
 * readonly: If set to true, this source can only be modified by users on
the
 *           'admin' list.
 *
 * admin:    A list (array) of users that are allowed to modify this source,
if
 *           it's marked 'readonly'.
 *
 * export:   If set to true, this source will appear on the Export menu,
 *           allowing users to export the contacts to a CSV (etc.) file.
 *
 * charset:  Some LDAP servers use UTF8 for encoding. See below for
examples.
 *
 * Here are some example configurations:
 */

/**
 * Public netcenter and bigfoot addressbooks.
 */
$cfgSources['netcenter'] = array(
    'title' => _("Netcenter Member Directory"),
    'type' => 'ldap',
    'params' => array(
        'server' => 'memberdir.netscape.com',
        'port' => 389,
        'root' => 'ou=member_directory,o=netcenter.com',
        'dn' => array('cn'),
        'objectclass' => 'person',
        'filter' => '',
        'charset' => 'iso-8859-1'
    ),
    'map' => array(
        '__key' => 'dn',
        'name' => 'cn',
        'email' => 'mail',
        'alias' => 'givenname'
    ),
    'search' => array(
        'name',
        'email',
        'alias'
    ),
    'strict' => array(
        'dn'
    ),
    'public' => true,
    'readonly' => true,
    'export' => false
);

$cfgSources['bigfoot'] = array(
    'title' => 'Bigfoot',
    'type' => 'ldap',
    'params' => array(
        'server' => 'ldap.bigfoot.com',
        'port' => 389,
        'root' => '',
        'charset' => 'iso-8859-1'
    ),
    'map' => array(
        '__key' => 'dn',
        'name' => 'cn',
        'email' => 'mail',
        'alias' => 'givenname'
    ),
    'search' => array(
        'name',
        'email',
        'alias'
    ),
    'strict' => array(
        'dn'
    ),
    'public' => true,
    'readonly' => true,
    'export' => false
);

$cfgSources['verisign'] = array(
    'title' => _("Verisign Directory"),
    'type' => 'ldap',
    'params' => array(
        'server' => 'directory.verisign.com',
        'port' => 389,
        'root' => '',
        'charset' => 'iso-8859-1'
    ),
    'map' => array(
        '__key' => 'dn',
        'name' => 'cn',
        'email' => 'mail'
    ),
    'search' => array(
        'name',
        'email'
    ),
    'strict' => array(
        'dn'
    ),
    'public' => true,
    'readonly' => true,
    'export' => false
);

/**
 * A local address book in an SQL database. This implements a per-user
 * address book.
 *
 * 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(
    'title' => _("My Addressbook"),
    'type' => 'sql',
    // The default connection details are pulled from the Horde-wide
    // SQL connection configuration.
    //
    // The old example illustrates how to use an alternate database
    // configuration.
    //
    // New Example:
    //'params' => array_merge($conf['sql'], array('table' =>
'turba_objects')),

    // Old Example:
     'params' => array(
         'phptype' => 'mysql',
         'hostspec' => 'localhost',
         'username' => 'horde',
         'password' => 'password',
         'database' => 'horde',
         'table' => 'turba_objects',
         'charset' => 'iso-8859-1'
     ),
    'map' => array(
        '__key' => 'object_id',
        '__owner' => 'owner_id',
        '__type' => 'object_type',
        '__members' => 'object_members',
        '__uid' => 'object_uid',
        'name' => 'object_name',
        'email' => 'object_email',
        'alias' => 'object_alias',
        'homeAddress' => 'object_homeaddress',
        'workAddress' => 'object_workaddress',
        'homePhone' => 'object_homephone',
        'workPhone' => 'object_workphone',
        'cellPhone' => 'object_cellphone',
        'fax' => 'object_fax',
        'title' => 'object_title',
        'company' => 'object_company',
        'notes' => 'object_notes',
        'pgpPublicKey' => 'object_pgppublickey',
        'smimePublicKey' => 'object_smimepublickey',
        'freebusyUrl' => 'object_freebusyurl'
    ),
    'search' => array(
        'name',
        'email'
    ),
    'strict' => array(
        'object_id',
        'owner_id',
        'object_type',
    ),
    'public' => false,
    'readonly' => false,
    'admin' => array(),
    'export' => true
);

/**
 * A local address book in an LDAP directory. This implements a public
 * (shared) address book.
 * To store freebusy information in the ldapdirectory, you'll need
 * the rfc2739.schema from
ftp://kalamazoolinux.org/pub/projects/awilliam/misc-ldap/.
 */

/*
$cfgSources['localldap'] = array(
    'title' => _("Shared Directory"),
    'type' => 'ldap',
    'params' => array(
        'server' => 'ldap.example.com',
        'port' => 389,
        'root' => 'dc=example,dc=com',
        'bind_dn' => 'cn=admin,ou=users,dc=example,dc=com',
        'bind_password' => '********',
        'sizelimit' => 200,
        'dn' => array('cn'),
        'objectclass' => array('top',
                               'person',
                               'organizationalPerson','inetOrgPerson'),
        'charset' => 'iso-8859-1',
        // check if all required attributes for an entry are set and add
them
        // if needed.
        'checkrequired' => false,
        // string to put in missing required attributes.
        'checkrequired_string' => ' ',
        'version' => 3
    ),
    'map' => array(
        '__key' => 'dn',
        '__uid' => 'uid',
        'name' => 'cn',
        'email' => 'mail',
        'homePhone' => 'homephone',
        'workPhone' => 'telephonenumber',
        'cellPhone' => 'mobiletelephonenumber',
        'homeAddress' => 'homepostaladdress'
        // 'freebusyUrl' => 'calFBURL'
    ),
    'search' => array(
        'name',
        'email',
        'homePhone',
        'workPhone',
        'cellPhone',
        'homeAddress'
    ),
    'strict' => array(
        'dn',
    ),
    'public' => true,
    'readonly' => false,
    'admin' => array(),
    'export' => true
);

*/

/**
 * A personal adressbook. 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 freebusy information in the ldapdirectory, you'll need
 * the rfc2739.schema from
ftp://kalamazoolinux.org/pub/projects/awilliam/misc-ldap/.
 */

// First we need to get the uid.
$uid = Auth::getBareAuth();
$basedn = 'dc=example, dc=com';
$cfgSources['personal_ldap'] = array(
    'title' => _("My Addressbook"),
    'type' => 'sql',
    'params' => array(
        'server' => 'localhost',
        'root' => 'ou=' . $uid . ',ou=personal_addressbook,' . $basedn,
        'bind_dn' => 'uid=' . $uid . ',ou=People,' . $basedn,
        'bind_password' => Auth::getCredential('password'),
        'dn' => array('cn', 'uid'),
        'objectclass' => array('top',
                               'person',
                               'inetOrgPerson',
                               // 'calEntry',
                               'organizationalPerson'),
        'charset' => 'utf-8',
        'version' => 3
    ),
    'map' => array(
        '__key' => 'dn',
        '__uid' => 'uid',
        'name' => 'cn',
        'email' => 'mail',
        'lastname' => 'sn',
        'title' => 'title',
        'company' => 'organizationname',
        'businessCategory' => 'businesscategory',
        'companyAddress' => 'postaladdress',
        'zip' => '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 ldapserver!
        'pgpPublicKey' => 'object_pgppublickey',
        'smimePublicKey' => 'object_smimepublickey',

        // From rfc2739.schema:
        // 'freebusyUrl' => 'calFBURL',

    ),
    'search' => array(
        'name',
        'email',
        'businessCategory',
        'title',
        'homePhone',
        'workPhone',
        'cellPhone',
        'homeAddress'
    ),
    'strict' => array(
        'dn',

    ),
    'public' => true,
    'readonly' => false,
    'admin' => array($uid),
    'export' => true
);

/**
 * A preferences-based adressbook. 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 addressbooks by changing
 * the 'name' parameter. This is best for addressbooks 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
 * addressbook.
 */
$cfgSources['prefs'] = array(
    'title' => _("Private Address Book"),
    'type' => 'prefs',
    'params' => array(
        'name' => 'prefs',
        'charset' => NLS::getCharset()
    ),
    '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',
    ),
    'public' => false,
    'readonly' => false,
    'export' => true
);

/**
 * IMSP Based Addressbook.
 *
 * Communicates with an IMSP backend server.
 *
 * Notes:
 * You should configure the user's "main" addressbook here.  The name
 * of the addressbook is set in the 'name' element of the params array.
 * It is configured by default to be the same as the username.
 * Any other addressbooks the user has access to will automatically be
 * configured at runtime.
 *
 * In the params array, accepted values for auth_method are 'cram_md5'
 * and 'plaintext' - these must match a IMSP_Auth_ driver.
 *
 * 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_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.
 */

/*

// First, get the user name
$uid = $GLOBALS['prefs']->getValue('imsp_auth_user');
$pass = $GLOBALS['prefs']->getValue('imsp_auth_pass');
if (!strlen($uid)) {
    $uid = Auth::getAuth();
    if (preg_match('/(^.*)@/', $uid, $matches)) {
        $uid = $matches[1];
    }
    $pass = Auth::getCredential('password');
}

$cfgSources['imsp'] = array(
    'title' => _("IMSP"),
    'type' => 'imsp',
    'params' => array(
        'server'   => 'localhost',
        'port'     => '406',
        'username' => $uid,
        'password' => $pass,
        'name' => $uid,
        'auth_method' => 'cram_md5',
        'group_id_field' => 'group',
        'group_id_value' => 'group',
	    'contact_ownership' => false
        ),
    '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(),
    'public' => false,
    'readonly' => false,
    'export' => true
    );

*/

/**
 * Get any other addressbooks this user might be privy to.
 */

/*

require_once 'Net/IMSP/Utils.php';
$result = Net_IMSP_Utils::getAllBooks($cfgSources['imsp']);
if (!is_a($result, 'PEAR_Error')) {
    for ($i = 0; $i < count($result); $i++) {
        $cfgSources[sprintf('imsp%d', $i + 1)] = $result[$i];
    }
} else {
    $notification->push($result);
}

*/

/* Begin Kolab sources. */
if (!empty($GLOBALS['conf']['kolab']['enabled'])) {

    /* A global address book for a Kolab Server. This is typically a
     * read-only public directory, stored in the default Kolab LDAP
     * server. The user accessing this should have read permissions to
     * the shared directory in LDAP. */
    $cfgSources['kolab_global'] = array(
        'title' => _("Global Address Book"),
        'type' => 'ldap',
        'params' => array(
            'server' => $GLOBALS['conf']['kolab']['ldap']['server'],
            'port' => $GLOBALS['conf']['kolab']['ldap']['port'],
            'root' => $GLOBALS['conf']['kolab']['ldap']['basedn'],
            'sizelimit' => 200,
            'dn' => array('cn'),
            'objectclass' => array(
                'top',
                'inetOrgPerson'
            ),
            'charset' => 'iso-8859-1',
            'version' => 3,
            'bind_dn' => $GLOBALS['conf']['kolab']['ldap']['binddn'],
            'bind_password' => $GLOBALS['conf']['kolab']['ldap']['bindpw'],
        ),
        'map' => array(
            '__key'             => 'dn',
            'name'              => 'cn',
            'firstname'         => 'givenName',
            'lastname'          => 'sn',
            'email'             => 'mail',
            'alias'             => 'alias',
            'title'             => 'title',
            'company'           => 'o',
            'workAddress'       => 'street',
            'workCity'          => 'l',
            'workProvince'      => 'st',
            'workPostalCode'    => 'postalCode',
            'workCountry'       => 'c',
            'homePhone'         => 'homePhone',
            'workPhone'         => 'telephoneNumber',
            'cellPhone'         => 'mobile',
            'fax'               => 'fax',
            'notes'             => 'description',
        ),
        'search' => array(
            'name',
            'firstname',
            'lastname',
            'email',
            'title',
            'company',
            'workAddress',
            'workCity',
            'workProvince',
            'workPostalCode',
            'workCountry',
            'homePhone',
            'workPhone',
            'cellPhone',
            'fax',
            'notes',
        ),
        'strict' => array(
            'dn',
        ),
        'public' => true,
        'readonly' => true,
        'admin' => array(),
        'export' => true
    );

    /**
     * A local address book for a Kolab user. This is stored in a
     * specially flagged 'Contacts' folder within the users Cyrus IMAP
     * mailbox. By default this folder can only be accessed by its
     * owner, however it can be shared via Cyrus ACLs.
     */

    // We need to sync our (dummy) share list for Turba, and as Turba
    // does not use Horde_Share we can't rely on a
    // _horde_hook_share_init() call, so we perform the same task
    // here.
    require_once 'Horde/Kolab.php';
    $dummy = null;
    Kolab::synchroniseShares($dummy, 'turba');

    // TODO: auto-generate a $cfgSources[] entry for every contact
    // folder that the user has access to, setting 'title' to the name
    // of the specific folder.
    $cfgSources['kolab_local'] = array(
        'title' => 'My Contacts',
        'type' => 'kolab',
        'params' => array(
            'share' => Auth::getAuth(),
        ),
        'map' => array(
            '__key'             => 'uid',
            '__owner'           => 'owner',
            '__uid'             => 'uid',
            'name'              => 'full-name',
            'firstname'         => 'given-name',
            'lastname'          => 'last-name',
            'title'             => 'job-title',
            'company'           => 'organization',
            'notes'             => 'body',
            'website'           => 'web-page',
            'nickname'          => 'nick-name',
            'email'             => 'smtp-address',
            'homeAddress'       => 'home-street',
            'homeCity'          => 'home-locality',
            'homeProvince'      => 'home-region',
            'homePostalCode'    => 'home-postal-code',
            'homeCountry'       => 'home-country',
            'workAddress'       => 'business-street',
            'workCity'          => 'business-locality',
            'workProvince'      => 'business-region',
            'workPostalCode'    => 'business-postal-code',
            'workCountry'       => 'business-country',
            'homePhone'         => 'home1',
            'workPhone'         => 'business1',
            'cellPhone'         => 'mobile',
            'fax'               => 'businessfax',
        ),
        'search' => array(
            'name',
            'firstname',
            'lastname',
            'email',
            'title',
            'company',
            'homeAddress',
            'homeCity',
            'homeProvince',
            'homePostalCode',
            'homeCountry',
            'workAddress',
            'workCity',
            'workProvince',
            'workPostalCode',
            'workCountry',
            'homePhone',
            'workPhone',
            'cellPhone',
            'fax',
            'notes',
            'website',
            'nickname',
        ),
        'strict' => array(
            '__uid'
        ),
        'public' => false,
        'readonly' => false,
        'admin' => array(),
        'export' => true
    );

    // End Kolab sources.
}





More information about the horde mailing list