Table of Contents

Sogo Groupware with Thunderbird

SOGo is a groupware application that has the unique capability of being able to share calendars and contacts between users via the webmail interface or the Thunderbird client. To date this is the only application that I have found that comes close to providing the most commonly used features of MS Outlook and Exchange for no software cost. It can also push Thunderbird plug-ins and settings to the Thunderbird clients.

These are the steps I used (most of this is cut and paste into a putty shell) to install this software. If you have any comments or improvements please let me know.

More details can be found here: http://www.sogo.nu/downloads/documentation.html

Requirements

Minimum required ClearOS packages

External packages

Steps

Install the server software

groupadd -r sogo
useradd -mr -g sogo sogo
mkdir rpm
cd rpm
wget "http://vault.centos.org/5.5/updates/i386/RPMS/openldap-2.3.43-12.el5_5.3.i386.rpm"
rpm2cpio openldap-2.3.43-12.el5_5.3.i386.rpm | cpio -idmv
cp -r ./usr/lib/* /usr/lib/
rm -rf ./usr
rm -rf ./etc
nano /etc/yum.repos.d/SOGo.repo
[sogo]
name=Inverse SOGo Repository
baseurl=http://inverse.ca/downloads/SOGo/CentOS5/$basearch
enabled=1
gpgcheck=0

[epel]
name=EPEL Repository
baseurl=http://download.fedora.redhat.com/pub/epel/5/$basearch
enabled=1
gpgcheck=0
includepkgs=memcached*
yum install sogo sope49-gdl1-mysql
nano /etc/httpd/conf.d/SOGo.conf
RequestHeader set "x-webobjects-server-port" "443"
RequestHeader set "x-webobjects-server-name" "<your server external name or IP>"
RequestHeader set "x-webobjects-server-url" "https://<your server external name or IP>"
mysql --user=root --password=<mysqlpassword> mysql
CREATE DATABASE `sogo`;
CREATE USER 'sogo'@'localhost' IDENTIFIED BY '<mysqlpassword>';
GRANT ALL PRIVILEGES ON `sogo`.* TO 'sogo'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
exit
service sogod stop
su sogo
defaults write sogod SOGoTimeZone "America/Phoenix"
defaults write sogod SOGoMailDomain "<youremaildomain>"
defaults write sogod SOGoLanguage English>
defaults write sogod SOGoAppointmentSendEMailNotifications YES
defaults write sogod SOGoFoldersSendEMailNotifications YES
defaults write sogod SOGoACLsSendEMailNotifications YES
defaults write sogod SOGoAppointmentSendEMailReceipts YES
defaults write sogod SOGoCalendarDefaultRoles '("PublicViewer", “ConfidentialDandTViewer”)'
defaults write sogod SOGoSuperUsernames '(<user1>,<user2>)'
defaults write sogod SOGoEnablePublicAccess YES
defaults write sogod SOGoUserSources '({filter="(objectClass = 'pcnMailAccount')"; CNFieldName=cn; IDFieldName=cn; UIDFieldName=uid; bindFields=(uid); baseDN="ou=Accounts,dc=<yourdomain>,dc=<yourdomainsuffix>"; bindDN="cn=manager,cn=internal,dc=<yourdomain>,dc=<yourdomainsuffix>"; bindPassword=<LDAP password fromGUI>; canAuthenticate=YES; displayName="Local Addresses"; hostname="localhost"; id=public; isAddressBook=YES; port=389})'
defaults write sogod SOGoProfileURL 'mysql://sogo:<mysqlpassword>@localhost:3306/sogo/sogo_user_profile'
defaults write sogod OCSFolderInfoURL 'mysql://sogo:<mysqlpassword>@localhost:3306/sogo/sogo_folder_info'
defaults write sogod SOGoMailingMechanism smtp
defaults write sogod SOGoSMTPServer localhost
defaults write sogod SOGoDraftsFolderName INBOX/Drafts
defaults write sogod SOGoSentFolderName INBOX/Sent
defaults write sogod SOGoTrashFolderName INBOX/Trash
defaults write sogod SOGoOtherUsersFolderName INBOX/user
defaults write sogod SOGoSharedFolderName INBOX/shared
defaults write sogod SOGoIMAPServer localhost
defaults write sogod SOGoMailShowSubscribedFoldersOnly NO
defaults write sogod SOGoVacationEnabled YES
defaults write sogod SOGoForwardEnabled YES
defaults write sogod SOGoSieveScriptsEnabled YES
defaults write sogod SOGoMailMessageCheck every_10_minutes
defaults write sogod SOGoMailReplyPlacement above
defaults write sogod SOGoMailSignaturePlacement above
defaults write sogod SOGoMailComposeMessageType html
defaults write sogod SOGoEnableEMailAlarms NO
defaults write sogod SOGoTimeFormat "%I:%M %p"
exit
service memcached start
chkconfig memcached on
service sogod restart
chkconfig sogod on
service httpd restart
https://<yourservername or IP>/SOGo

Syncing with Thunderbird

Server Side

mkdir -p /var/www/html/SOGo-configs/WINNT_x86-msvc/temp
cd /var/www/html/SOGo-configs/WINNT_x86-msvc

wget http://www.sogo.nu/files/downloads/extensions/lightning-1.0b2.104i_win32.xpi
wget http://www.sogo.nu/files/downloads/extensions/sogo-connector-3.104.xpi
mv lightning-1.0b2.104i_win32.xpi lightning.xpi
mv sogo-connector-3.104.xpi connector.xpi

cd temp
wget http://www.sogo.nu/files/downloads/extensions/sogo-integrator-3.104-sogo-demo.xpi
mv sogo-integrator-3.104-sogo-demo.xpi integrator.xpi
unzip -oq integrator.xpi
rm -f integrator.xpi
nano -w ./chrome/content/extensions.rdf
isi:updateURL="http://sogo-demo.inverse.ca/plugins/updates.php?plugin=%ITEM_ID%&amp;version=%ITEM_VERSION%&amp;platform=%PLATFORM%">
<li>
  <Description
    em:id="sogo-integrator@inverse.ca"
    em:name="SOGo Integrator"/>
</li>
<li>
  <Description
    em:id="sogo-connector@inverse.ca"
    em:name="SOGo Connector"/>
</li>
isi:updateURL="http://<your server external FQDN or IP>/SOGo-configs/updates.php?plugin=%ITEM_ID%&amp;version=%ITEM_VERSION%&amp;platform=%PLATFORM%">
<li>
  <Description
    em:id="{e2fda1a4-762b-4020-b5ad-a41df1933103}"
    em:name="Lightning"/>
</li>
<li>
  <Description
    em:id="sogo-integrator@inverse.ca"
    em:name="SOGo Integrator"/>
</li>
<li>
  <Description
    em:id="sogo-connector@inverse.ca"
    em:name="SOGo Connector"/>
</li>
zip -qr integrator *
mv integrator.zip /var/www/html/SOGo-configs/WINNT_x86-msvc/integrator.xpi

cd /var/www/html/SOGo-configs
rm -rf /var/www/html/SOGo-configs/WINNT_x86-msvc/temp
nano -w updates.php
<?php
  /* updates.php - this file is part of SOGo
   *
   * Copyright (C) 2006-2010 Inverse inc.
   * 
   * Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
   * 
   * This file is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2, or (at your option)
   * any later version.
   * 
   * This file is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; see the file COPYING.  If not, write to
   * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
   * Boston, MA 02111-1307, USA.
   */
  
  /* This script handles the automatic propagation of extensions pertaining to a SOGo site. It requires PHP 4.1.0 or later. 
  */
  $plugins = array(
    "sogo-connector@inverse.ca"
    => array( "application" => "thunderbird",
      "version" => "3.104",
      "filename" => "sogo-connector.xpi" ),
    "sogo-integrator@inverse.ca"
    => array( "application" => "thunderbird",
      "version" => "3.104",
      "filename" => "sogo-integrator.xpi" ),
    "{e2fda1a4-762b-4020-b5ad-a41df1933103}"
    => array( "application" => "thunderbird",
      "version" => "1.0b2.104i",
      "filename" => "lightning.xpi" ) );
$applications
= array( "thunderbird" => "<em:id>{3550f703-e582-4d05-9a08-453d09bdfdc6}
/em:id>
  <em:minVersion>3.1.0</em:minVersion>
  <em:maxVersion>3.1.*</em:maxVersion>" );
$pluginname = $_GET["plugin"];
$plugin =& $plugins[$pluginname];
$application =& $applications[$plugin["application"]];
if ( $plugin ) {
  $platform = $_GET["platform"];
  if ( $platform
    && file_exists( $platform . "/" . $plugin["filename"] ) ) {
    $plugin["filename"] = $platform . "/" . $plugin["filename"];
  }
  elseif ( !file_exists( $plugin["filename"] ) ) {
    $plugin = false;
  }
}

if ( $plugin ) {
  header("Content-type: text/xml; charset=utf-8");
  echo ('<?xml version="1.0"?>' . "\n"); ?> <!DOCTYPE RDF> <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:em="http://www.mozilla.org/2004/em-rdf#">
  <Description about="urn:mozilla:extension:<?php echo $pluginname ?>">
    <em:updates>
      <Seq>
        <li>
          <Description>
            <em:version><?php echo $plugin["version"] ?></em:version>
            <em:targetApplication>
              <Description>
                <?php echo $applications[$plugin["application"]] ?><em:updateLink>http://<your server external FQDN or IP>/SOGo-configs/<?php echo $plugin["filename"] ?></em:updateLink>
              </Description>
            </em:targetApplication>
          </Description>
        </li>
      </Seq>
    </em:updates>
  </Description>
</RDF>
<?php
} else {
  header("Content-type: text/plain; charset=utf-8", true, 404);
  echo( 'Plugin not found' );
}
?>

Client Side

Please let me know if you find any errors or omissions. If you have a better way of doing this please let me know too. I am always looking to do things better (my wife has quite an extensive list of suggestions)! I believe the “updates.php” could be automatically created with a script based on the “xpi” files in the folder. search?q=clearos%2C%20clearos%20content%2C%20kb%2C%20howtos%2C%20clearos6%2C%20skunkworks%2C%20categoryserver%2C%20maintainer_dloper&amp;btnI=lucky