bookmark_borderHorde 4.0.6 brings user-specific admin privileges

Traditionally, Horde only knows two kinds of users: Users with administration flag and users without. The list of admins is a static entry in the horde config file. It’s all or nothing – either a user gets access to all admin functions or to none. At least until recently.

Last October I wrote about a patch for Horde 3 which allows permission-based access to individual admin privileges. This patch has now been ported to Horde 4 and is incorporated in Horde 4.0.6. You can now assign a user the task of managing groups without allowing him to use the permissions admin and grant himself additional privileges. Or you can delegate emergency password resets to a group of trusted people without confusing them with icons like the PHP Shell. Only those admin functions are shown which the user has access to. Another side effect: Even if a user has all admin permissions, he is still not recognised as an admin and won’t be shown things that admins always have to see regardless of their permissions and settings.

In theory, you can now give yourself all admin permissions and safely delete yourself out of the admin list – as long as you have the “configuration” permission, you can always go back and restore without manually editing the conf.php file.

The Administration permissions are handled in the permissions screen just like any other user permissions. They live under the “horde” component. Currently only the “show” flag is actually recognized but this will be expanded later.

bookmark_borderMigrating Horde 3 to Horde 4 – Top 6 ways to mess up

There have been some migrations of Horde 3 to Horde 4 recently – not all went smooth from the start.

Some top issues of messing things up and how to avoid it:

  1. initial application dimpIn Horde 3 dimp was a separate application which provided an ajax interface to imp. It has since been merged into the imp application. If your Horde installation had dimp before migration to Horde 4, this might create runtime issues for your users when
    • when you locked the initial application to dimp
    • when your users decided that their initial application should be dimp

    To get around this you should

    • make sure you didn’t blindly copy your locked settings from horde 3 to horde 4
    • run a mysql update statement on the horde_prefs table to update column pref_value to “imp” if it was “dimp” before (Consider hiring a professional admin for the migration if you don’t know how that looks like)
  2. Making changes in backends.php or prefs.php
    In Horde 3 admins used to edit prefs.php or backends.php/servers.php to change values. Horde 4 ships backends.php and prefs.php as default values. Admins are supposed to copy these to backends.local.php and prefs.local.php and make their changes there. Changes to the original files will be overridden with the next rpm or pear update of the horde apps.
  3. Not unchecking utc time in kronolith
    The Horde 3 Calendaring app defaulted to store calendar events in local user time. The Horde 4 default is UTC timestamps. If you migrate from horde 3 you either have to uncheck that setting or run a migration script on the data.
    Warning: You might end up with an unrecoverable state if you add new data in UTC mode to a calendar backend which has not been converted to UTC timestamps
  4. Not converting turba and kronolith databases to utf8
    In Horde 3 installations, the calendar app kronolith and the addressbook turba often had their database tables encoded in latin1. The system wide default in Horde 4 is utf8. Not adapting this setting to the tables or the tables to this setting results in corrupted display of international characters and symbols.
    Warning: You might end up with an unrecoverable state if you add new data to addressbooks or calendars where backend encoding does not match the set horde encoding
  5. Relying on menu.php’s javascript onclick handler or target attribute
    In the ajax views of kronolith and imp there is currently no support for the target and onclick handler attributes. I do not know of any plans to re-add this support. If you want to link external sites into the iframe, consider creating a custom portal block. There was a recent blog post on creating this kind of blocks on The Upstairs Room
  6. Using the ldap prefs backend
    The ldap backend for preferences is currently not yet ported to horde 4. If you want to migrate, you first have to extract your prefs from ldap and then convert them to sql. If you need ldap prefs, consider hiring a consultant or sponsoring the development of this feature.
Tres consejos principales para ejercicios de entrenamiento de culturismo nvrzone ranbaxy drogas en venta mejor mezcla de musica ncs gym workout.

bookmark_borderHorde 4 submit-requested into OpenSUSE 12.1

Today I submit-requested the Horde 4 Application Framework and the stable apps for openSUSE Factory.
This is becoming openSUSE 12.1 if the packages get accepted on time. They are currently in review.

openSUSE Legal team wants to review all packages’ licensing – I’m sure that’s NOT the fun part of their job.

If everything works fine, openSUSE 12.1 will be the first distribution to feature horde 4 in their mainstream repositories.

Continue reading “Horde 4 submit-requested into OpenSUSE 12.1”

bookmark_borderHorde Team announces RC1 of Horde Groupware 4.0

Since the release of Horde 4 and select applications, people kept asking for a new release of the popular Horde Groupware and Horde Groupware Webmail Edition bundles.

Horde is now about to release such a bundle, which features new ajax frontends for calendaring, tasks and improved mobile frontend for mail.

The new bundles will be released as pear collections. Gone are the tarballs.

bookmark_borderLatest, Greatest – B1 Systems and Horde LLC on LinuxTag – passwd unofficial H4 package

This weekend, I visited the LinuxTag exhibition in Berlin, both to support my company’s booth and to talk to the horde guys whose booth was just on the opposite side, allowing easy coordination. As a result, I adopted the passwd tool which hasn’t yet been released for H4. It’s been packaged for the SUSE server:php:applications repository and will be part of the next pre-release of the upcoming Horde 4 Demo VM. First effort was adding a new backend driver ‘horde’ which is just a proxy to horde’s configured authentication backend.

Tux all about LinuxTag

bookmark_borderHorde 4 Alpha 1 released (pear)

Yesterday the horde project released alpha versions of Horde Framework 4 and the Groupware apps (Notes, Calendar, Email, Filter,Address Book, Tasks)

I did a test drive and they basically work. IMP has been improved a lot and now integrates the mobile and ajax interface versions which came as separate apps in Horde 3. DIMP (Ajax version) now plays more nicely together with classic non-Ajax horde applications.

I will begin distribution packaging for SUSE Linux around the official release on April 05, 2011.

See also:

bookmark_borderDeveloping Hort password safe: Horde 4 Shares

I recently decided I wanted to drop the Horde 3 password safe eleusis and build something new which uses Horde 4 API and features right from the start.

Thus I got the horde skeleton from git and created a new horde app called “hort”. Hort is an old German word for treasure as well as the place where the treasure is kept. Hort should keep safes which hold user/password pairs or other secret credentials. Those safes should be shareable among users. This is where horde_shares comes into play.

Horde Shares provides an API for sharing access rights like SHOW, READ, EDIT, CREATE or DELETE on objects or containers of objects with other users. Shares is used in the Calendaring App for sharing calendars with other users and in many other places.

basic setup in Application.php _init()

We want to add an injector for the shares API whenever the app is initialized and we want to auto-create an initial “home” share for users which do not yet own one.

 

protected function _init()
{
// Create a share instance.
$GLOBALS['hort_shares'] = $GLOBALS['injector']->getInstance('Horde_Core_Factory_Share')->create();

/* If the user doesn't own a safe, create one. */
if (!empty($GLOBALS['conf']['share']['auto_create']) &&
$GLOBALS['registry']->getAuth() &&
!$GLOBALS['hort_shares']->countShares($GLOBALS['registry']->getAuth())) {
$identity = $GLOBALS['injector']->getInstance('Horde_Core_Factory_Identity')->create();
$share = $GLOBALS['hort_shares']->newShare(
$GLOBALS['registry']->getAuth(),
strval(new Horde_Support_Randomid()),
sprintf(_("Default safe of %s"), $identity->getName())
);
$GLOBALS['hort_shares']->addShare($share);
}

}

And now let’s create the database schema. In Horde 4, this is done by creating a php script in the app’s /migrations/ sub-directory


class HortBaseTables extends Horde_Db_Migration_Base
{
/**
* Upgrade.
*/
public function up()
{
$tableList = $this->tables();

$t = $this->createTable('hort_sharesng', array('primaryKey' => 'share_id'));
$t->column('share_name', 'string', array('limit' => 255, 'null' => false));
$t->column('share_owner', 'string', array('limit' => 255));
$t->column('share_flags', 'integer', array('default' => 0, 'null' => false));
$t->column('perm_creator_' . Horde_Perms::SHOW, 'boolean', array('default' => false, 'null' => false));
$t->column('perm_creator_' . Horde_Perms::READ, 'boolean', array('default' => false, 'null' => false));
$t->column('perm_creator_' . Horde_Perms::EDIT, 'boolean', array('default' => false, 'null' => false));
$t->column('perm_creator_' . Horde_Perms::DELETE, 'boolean', array('default' => false, 'null' => false));
$t->column('perm_default_' . Horde_Perms::SHOW, 'boolean', array('default' => false, 'null' => false));
$t->column('perm_default_' . Horde_Perms::READ, 'boolean', array('default' => false, 'null' => false));
$t->column('perm_default_' . Horde_Perms::EDIT, 'boolean', array('default' => false, 'null' => false));
$t->column('perm_default_' . Horde_Perms::DELETE, 'boolean', array('default' => false, 'null' => false));
$t->column('perm_guest_' . Horde_Perms::SHOW, 'boolean', array('default' => false, 'null' => false));
$t->column('perm_guest_' . Horde_Perms::READ, 'boolean', array('default' => false, 'null' => false));
$t->column('perm_guest_' . Horde_Perms::EDIT, 'boolean', array('default' => false, 'null' => false));
$t->column('perm_guest_' . Horde_Perms::DELETE, 'boolean', array('default' => false, 'null' => false));
$t->column('attribute_name', 'string', array('limit' => 255, 'null' => false));
$t->column('attribute_desc', 'string', array('limit' => 255));
$t->column('attribute_params', 'text');
$t->column('share_parents','text');
$t->end();

$this->addIndex('hort_sharesng', array('share_name'));
$this->addIndex('hort_sharesng', array('share_owner'));
$this->addIndex('hort_sharesng', array('perm_creator_' . Horde_Perms::SHOW));
$this->addIndex('hort_sharesng', array('perm_creator_' . Horde_Perms::READ));
$this->addIndex('hort_sharesng', array('perm_creator_' . Horde_Perms::EDIT));
$this->addIndex('hort_sharesng', array('perm_creator_' . Horde_Perms::DELETE));
$this->addIndex('hort_sharesng', array('perm_default_' . Horde_Perms::SHOW));
$this->addIndex('hort_sharesng', array('perm_default_' . Horde_Perms::READ));
$this->addIndex('hort_sharesng', array('perm_default_' . Horde_Perms::EDIT));
$this->addIndex('hort_sharesng', array('perm_default_' . Horde_Perms::DELETE));
$this->addIndex('hort_sharesng', array('perm_guest_' . Horde_Perms::SHOW));
$this->addIndex('hort_sharesng', array('perm_guest_' . Horde_Perms::READ));
$this->addIndex('hort_sharesng', array('perm_guest_' . Horde_Perms::EDIT));
$this->addIndex('hort_sharesng', array('perm_guest_' . Horde_Perms::DELETE));

$t = $this->createTable('hort_sharesng_groups', array('primaryKey' => false));
$t->column('share_id', 'integer', array('null' => false));
$t->column('group_uid', 'string', array('limit' => 255, 'null' => false));
$t->column('perm_' . Horde_Perms::SHOW, 'boolean', array('default' => false, 'null' => false));
$t->column('perm_' . Horde_Perms::READ, 'boolean', array('default' => false, 'null' => false));
$t->column('perm_' . Horde_Perms::EDIT, 'boolean', array('default' => false, 'null' => false));
$t->column('perm_' . Horde_Perms::DELETE, 'boolean', array('default' => false, 'null' => false));
$t->end();

$this->addIndex('hort_sharesng_groups', array('share_id'));
$this->addIndex('hort_sharesng_groups', array('group_uid'));
$this->addIndex('hort_sharesng_groups', array('perm_' . Horde_Perms::SHOW));
$this->addIndex('hort_sharesng_groups', array('perm_' . Horde_Perms::READ));
$this->addIndex('hort_sharesng_groups', array('perm_' . Horde_Perms::EDIT));
$this->addIndex('hort_sharesng_groups', array('perm_' . Horde_Perms::DELETE));

$t = $this->createTable('hort_sharesng_users', array('primaryKey' => false));
$t->column('share_id', 'integer', array('null' => false));
$t->column('user_uid', 'string', array('limit' => 255, 'null' => false));
$t->column('perm_' . Horde_Perms::SHOW, 'boolean', array('default' => false, 'null' => false));
$t->column('perm_' . Horde_Perms::READ, 'boolean', array('default' => false, 'null' => false));
$t->column('perm_' . Horde_Perms::EDIT, 'boolean', array('default' => false, 'null' => false));
$t->column('perm_' . Horde_Perms::DELETE, 'boolean', array('default' => false, 'null' => false));
$t->end();

$this->addIndex('hort_sharesng_users', array('share_id'));
$this->addIndex('hort_sharesng_users', array('user_uid'));
$this->addIndex('hort_sharesng_users', array('perm_' . Horde_Perms::SHOW));
$this->addIndex('hort_sharesng_users', array('perm_' . Horde_Perms::READ));
$this->addIndex('hort_sharesng_users', array('perm_' . Horde_Perms::EDIT));
$this->addIndex('hort_sharesng_users', array('perm_' . Horde_Perms::DELETE));

if (!in_array('hort_shares', $tableList)) {
$t = $this->createTable('hort_shares', array('primaryKey' => false));
$t->column('share_id', 'integer', array('null' => false));
$t->column('share_name', 'string', array('limit' => 255, 'null' => false));
$t->column('share_owner', 'string', array('limit' => 255, 'null' => false));
$t->column('share_flags', 'integer', array('default' => 0, 'null' => false));
$t->column('perm_creator', 'integer', array('default' => 0, 'null' => false));
$t->column('perm_default', 'integer', array('default' => 0, 'null' => false));
$t->column('perm_guest', 'integer', array('default' => 0, 'null' => false));
$t->column('attribute_name', 'string', array('limit' => 255, 'null' => false));
$t->column('attribute_desc', 'string', array('limit' => 255));
$t->primaryKey(array('share_id'));
$t->end();

$this->addIndex('hort_shares', array('share_name'));
$this->addIndex('hort_shares', array('share_owner'));
$this->addIndex('hort_shares', array('perm_creator'));
$this->addIndex('hort_shares', array('perm_default'));
$this->addIndex('hort_shares', array('perm_guest'));
}

if (!in_array('hort_shares_groups', $tableList)) {
$t = $this->createTable('hort_shares_groups');
$t->column('share_id', 'integer', array('null' => false));
$t->column('group_uid', 'string', array('limit' => 255, 'null' => false));
$t->column('perm', 'integer', array('null' => false));
$t->end();

$this->addIndex('hort_shares_groups', array('share_id'));
$this->addIndex('hort_shares_groups', array('group_uid'));
$this->addIndex('hort_shares_groups', 'perm');
}

if (!in_array('hort_shares_users', $tableList)) {
$t = $this->createTable('hort_shares_users');
$t->column('share_id', 'integer', array('null' => false));
$t->column('user_uid', 'string', array('limit' => 255, 'null' => false));
$t->column('perm', 'integer', array('null' => false));
$t->end();

$this->addIndex('hort_shares_users', array('share_id'));
$this->addIndex('hort_shares_users', array('user_uid'));
$this->addIndex('hort_shares_users', array('perm'));
}

}

/**
* Downgrade
*
*/
public function down()
{
$this->dropTable('hort_shares');
$this->dropTable('hort_shares_groups');
$this->dropTable('hort_shares_users');
$this->dropTable('hort_sharesng');
$this->dropTable('hort_sharesng_groups');
$this->dropTable('hort_sharesng_users');
}

}

bookmark_borderThe Horde Project announces new monthly newsletter.

Gunnar Wrobel today announced the new monthly horde newsletter:

Last month the Horde project sent out a first newsletter:
http://eepurl.com/ct4tP

The letter is meant to be sent monthly and summarizes progress and
plans concerning the Horde project.

You can subscribe to the newletter here:

http://horde.us2.list-manage.com

Of course, following this blog is an option, too 😉

 

 

Bodybuilding movies and series, newest first moviehaku clomid online culturism and fitness forum.

bookmark_borderHorde 4 Preview – Calendar Kronolith now supports resources

Horde 4 is due for April 05 2011 – and sports a new release of the major groupware applications. Among them, the time-tracking app hermes sees its 2.0 release. DIMP (ajax webmailer) and MIMP (mobile devices webmailer) have been integrated into IMP, the webmailer. The task tracker nag has been integrated into the new (optional) ajax frontend of the kronolith calendar app. By the way, Kronolith now allows assigning resources like rooms or beamers to events and provides resource scheduling just as if they were persons. The classic non-ajax interface is still available as a user preference though. Horde 4 won’t be compatible with the generic inventory app sesha anymore. The horde team has decided to abandon some other applications, too Currently, the Horde 4 git repository houses more than 20 applications, ranging from enhanced versions of long-running mainstream apps like the file manager gollem or the VCS chora to Horde Folks, the bleeding edge Facebook-like personal dashboard. Horde 4 will sport the ActiveSync protocol, opening synchronisation options for iPhone 4, Windows Phones and Android smartphones like the Motorola Milestone (Euro Brand) / Droid (US Brand) .

I will be dropping maintainence of Andre Pawlowski’s password safe eleusis in favor of a complete Horde4 rewrite, Hort.

bookmark_borderMaking horde3 run on php5.3 + (openSUSE 11.3+)

Horde3 has been designed to work with PHP 4 and aims to stay compatible till end of life. That is why some parts of Horde3 still rely on features or behaviour which is not default anymore in PHP5. It it still possible to make horde3 run on PHP5.3 as shipped by OpenSUSE 11.3 and factory:

in php.ini, please make sure that date.timezone has been set to any valid value:

linux-aggv:/srv/www/htdocs/horde # cat /etc/php5/apache2/php.ini |grep date.timezone
; http://php.net/date.timezone
date.timezone = Europe/Berlin

Please also make sure that your error log doesn’t get spammed by deprecated warnings:

cat /etc/php5/apache2/php.ini |grep E_DEPRECATED
; Production Value: E_ALL & ~E_DEPRECATED
; E_DEPRECATED – warn about code that will not work in future versions
; Production Value: E_ALL & ~E_DEPRECATED
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

This should enable Horde3 to run on your bleeding edge openSUSE platform. Horde 4, scheduled April 5 2010, has been designed for PHP 5.x and won’t have any limitations.

If you are experiencing additional troubles, please check the “classics”:

* The Horde Cookie Path must be set to your webroot in /srv/www/htdocs/horde3/config/conf.php

* Do not turn on PHP safe mode (it isn’t actually “safe” anyway and about to be removed)

This article assumes that you are running the openSUSE Horde3 packages from factory or server:php:applications