Admins/Instalação

De Wiki Expresso V3
Ir para: navegação, pesquisa

Conteúdo

Guia de Instalação e Configuração ExpressoLivre V3

Participe desta construção! 
Acesse o fórum da comunidade!

Sistema Operacional

  • Sistema Operacional estável Debian 7.x – Wheezy
Instalado sem ambiente gráfico a partir do CD 1 da distribuição Oficial Estável, disponível em:
https://www.debian.org/CD/
ou
http://cdimage.debian.org/debian-cd/
  • Linguagem do Sistema
 - Português do Brasil
 - Teclado Português Brasileiro

Repositórios

- Editar /etc/apt/sources.list mantendo e acrescentando os seguintes linhas:

 deb http://security.debian.org/ wheezy/updates main non-free contrib
 deb-src http://security.debian.org/ wheezy/updates main contrib non-free
 deb http://ftp.debian.org/debian/ wheezy-updates main non-free contrib
 deb-src http://ftp.debian.org/debian/ wheezy-updates main non-free contrib
 deb http://ftp.debian.org/debian/ wheezy main non-free contrib
 deb-src http://ftp.debian.org/debian/ wheezy main non-free contrib

- Atualizar lista de pacotes disponíveis e atualizar os pacotes instalados.

 # apt-get update
 # apt-get upgrade

- Remover Exim.

 # apt-get purge exim4 exim4-base exim4-config exim4-daemon-light

- Instalação de Pacotes úteis.

 # apt-get install vim openssh-server openssh-client

Instalação/Configuração Inicial dos Serviços

Servidor de Diretório Openldap

O Expresso usa constantemente o servidor LDAP (Openldap - slapd). No início ('initial.ldif') são criados 2 usuários com senhas em hash MD5. Se você precisar acessar o ldap ou os diversos serviços (cyrus, postfix, etc) as senhas são as seguintes:

 Administrador do ldap
 user: cn=ldap-admin,dc=prodemge,dc=gov,dc=br
 password: prodemge
user: expresso-admin
password: prodemge
user: cyrus-admin
password: prodemge


Instalação do OpenLdap

 # apt-get install slapd ldap-utils shelldap
 Senha do administrador do servidor ldap: Ex.: prodemge

Configuração do Openldap

- Criar o arquivo /etc/ldap/slapd.conf com o conteúdo abaixo

sizelimit -1
timelimit -1
threads 2
# Esquemas a serem utilizados
include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema
#include /etc/ldap/schema/qmail.schema

# Compatibilidade V2 ( esquemas podem ser obtidos pelo download do instalador em .../expresso-v3/files/debian/etc/ldap/schema)
include /etc/ldap/schema/qmailuser.schema
include /etc/ldap/schema/phpgwaccount.schema
include /etc/ldap/schema/mailman.schema


pidfile /var/run/slapd/slapd.pid
argsfile /var/run/slapd/slapd.args
loglevel 1024
allow bind_v2
modulepath /usr/lib/ldap
moduleload back_hdb
backend hdb
database hdb
suffix "dc=prodemge,dc=gov,dc=br"
rootdn "cn=ldap-admin,dc=prodemge,dc=gov,dc=br"
#
# senha gerada pelo comando slappasswd -h {MD5} -s prodemge
# Todas as senhas usadas no tutorial é sempre “prodemge”
rootpw {MD5}Fn16h7QYEETtz36FjnrD4w==
checkpoint 1024 10
lastmod on
directory "/var/lib/ldap"
index default sub
index objectClass,uidNumber,gidNumber,entryUUID eq,pres
index cn,displayName eq,pres,subany,approx
index sn,ou,givenName,uid,employeeNumber eq,pres,subany
index memberUid,mail eq,pres,subany
index uniqueMember pres
access to attrs=userPassword
  by anonymous auth
  by self write
  by * none
access to dn.base="" by * read
access to * by * read 

- Criar o arquivo /etc/ldap/schema/qmail.schema com o conteúdo abaixo.

#
# qmail-ldap (20030901) ldapv3 directory schema
#
# The offical qmail-ldap OID assigned by IANA is 7914
#
# Created by: David E. Storey <dave@tamos.net>
# Modified and included into qmail-ldap by Andre Oppermann <opi@nrg4u.com>
# Schema fixes by Mike Jackson <mjj@pp.fi>
# Schema fixes by Christian Zoffoli (XMerlin) <czoffoli@xmerlin.org>
#
#
# This schema depends on:
#	- core.schema
#	- cosine.schema
#	- nis.schema
#

# Attribute Type Definitions

attributetype ( 1.3.6.1.4.1.7914.1.2.1.1 NAME 'qmailUID'
	DESC 'UID of the user on the mailsystem'
	EQUALITY integerMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.7914.1.2.1.2 NAME 'qmailGID'
	DESC 'GID of the user on the mailsystem'
	EQUALITY integerMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.7914.1.2.1.3 NAME 'mailMessageStore'
	DESC 'Path to the maildir/mbox on the mail system'
	EQUALITY caseExactIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.7914.1.2.1.4 NAME 'mailAlternateAddress'
	DESC 'Secondary (alias) mailaddresses for the same user'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )

#
# mailQuota format is no longer supported from qmail-ldap 20030901 on,
# user mailQuotaSize and mailQuotaCount instead.
#
#attributetype ( 1.3.6.1.4.1.7914.1.2.1.5 NAME 'mailQuota'
#	DESC 'The amount of space the user can use until all further messages get bounced.'
#	SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 SINGLE-VALUE )
#

attributetype ( 1.3.6.1.4.1.7914.1.2.1.6 NAME 'mailHost'
	DESC 'On which qmail server the messagestore of this user is located.'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} SINGLE-VALUE)

attributetype ( 1.3.6.1.4.1.7914.1.2.1.7 NAME 'mailForwardingAddress'
	DESC 'Address(es) to forward all incoming messages to.'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )

attributetype ( 1.3.6.1.4.1.7914.1.2.1.8 NAME 'deliveryProgramPath'
	DESC 'Program to execute for all incoming mails.'
	EQUALITY caseExactIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )

attributetype ( 1.3.6.1.4.1.7914.1.2.1.9 NAME 'qmailDotMode'
	DESC 'Interpretation of .qmail files: both, dotonly, ldaponly, ldapwithprog'
	EQUALITY caseIgnoreIA5Match
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.7914.1.2.1.10 NAME 'deliveryMode'
	DESC 'multi field entries of: nolocal, noforward, noprogram, reply'
	EQUALITY caseIgnoreIA5Match
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{32} )

attributetype ( 1.3.6.1.4.1.7914.1.2.1.11 NAME 'mailReplyText'
	DESC 'A reply text for every incoming message'
	EQUALITY caseIgnoreMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{4096} SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.7914.1.2.1.12 NAME 'accountStatus'
	DESC 'The status of a user account: active, noaccess, disabled, deleted'
	EQUALITY caseIgnoreIA5Match
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.7914.1.2.1.14 NAME 'qmailAccountPurge'
        DESC 'The earliest date when a mailMessageStore will be purged'
        EQUALITY numericStringMatch
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.7914.1.2.1.15 NAME 'mailQuotaSize'
	DESC 'The size of space the user can have until further messages get bounced.'
	EQUALITY integerMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.7914.1.2.1.16 NAME 'mailQuotaCount'
	DESC 'The number of messages the user can have until further messages get bounced.'
	EQUALITY integerMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.7914.1.2.1.17 NAME 'mailSizeMax'
	DESC 'The maximum size of a single messages the user accepts.'
	EQUALITY integerMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )

#
# qmailGroup attributes
#

attributetype ( 1.3.6.1.4.1.7914.1.3.1.1 NAME 'dnmember'
	DESC 'Group member specified as distinguished name.'
	EQUALITY distinguishedNameMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )

attributetype ( 1.3.6.1.4.1.7914.1.3.1.2 NAME 'rfc822member'
	DESC 'Group member specified as normal rf822 email address.'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )

attributetype ( 1.3.6.1.4.1.7914.1.3.1.3 NAME 'filtermember'
	DESC 'Group member specified as ldap search filter.'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{512} )

attributetype ( 1.3.6.1.4.1.7914.1.3.1.4 NAME 'senderconfirm'
	DESC 'Sender to Group has to answer confirmation email.'
	EQUALITY booleanMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.7914.1.3.1.5 NAME 'membersonly'
	DESC 'Sender to Group must be group member itself.'
	EQUALITY booleanMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.7914.1.3.1.6 NAME 'confirmtext'
	DESC 'Text that will be sent with sender confirmation email.'
	EQUALITY caseIgnoreMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{4096} SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.7914.1.3.1.7 NAME 'dnmoderator'
	DESC 'Group moderator specified as Distinguished name.'
	EQUALITY distinguishedNameMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )

attributetype ( 1.3.6.1.4.1.7914.1.3.1.8 NAME 'rfc822moderator'
	DESC 'Group moderator specified as normal rfc822 email address.'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )

attributetype ( 1.3.6.1.4.1.7914.1.3.1.9 NAME 'moderatortext'
	DESC 'Text that will be sent with request for moderation email.'
	EQUALITY caseIgnoreMatch
	SUBSTR caseIgnoreSubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{4096} SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.7914.1.3.1.10 NAME 'dnsender'
	DESC 'Allowed sender specified as distinguished name.'
	EQUALITY distinguishedNameMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )

attributetype ( 1.3.6.1.4.1.7914.1.3.1.11 NAME 'rfc822sender'
	DESC 'Allowed sender specified as normal rf822 email address.'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )

attributetype ( 1.3.6.1.4.1.7914.1.3.1.12 NAME 'filtersender'
	DESC 'Allowed sender specified as ldap search filter.'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{512} )

attributetype ( 1.3.6.1.4.1.7914.1.3.1.13 NAME 'bounceadmin'
	DESC 'rfc822 email address where bounces should be sent to.'
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )


#
# qldapAdmin Attributes
#

attributetype ( 1.3.6.1.4.1.7914.1.4.1.1 NAME 'qladnmanager'
	DESC ''
	EQUALITY distinguishedNameMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )

attributetype ( 1.3.6.1.4.1.7914.1.4.1.2 NAME 'qlaDomainList'
	DESC ''
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )

attributetype ( 1.3.6.1.4.1.7914.1.4.1.3 NAME 'qlaUidPrefix'
	DESC ''
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.7914.1.4.1.4 NAME 'qlaQmailUid'
	DESC ''
	EQUALITY integerMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.7914.1.4.1.5 NAME 'qlaQmailGid'
	DESC ''
	EQUALITY integerMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.7914.1.4.1.6 NAME 'qlaMailMStorePrefix'
	DESC ''
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.7914.1.4.1.7 NAME 'qlaMailQuotaSize'
	DESC ''
	EQUALITY integerMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.7914.1.4.1.8 NAME 'qlaMailQuotaCount'
	DESC ''
	EQUALITY integerMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.7914.1.4.1.9 NAME 'qlaMailSizeMax'
	DESC ''
	EQUALITY integerMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.7914.1.4.1.10 NAME 'qlaMailHostList'
	DESC ''
	EQUALITY caseIgnoreIA5Match
	SUBSTR caseIgnoreIA5SubstringsMatch
	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} )


# Object Class Definitions

objectclass ( 1.3.6.1.4.1.7914.1.2.2.1 NAME 'qmailUser'
	DESC 'QMail-LDAP User'
	SUP top
	AUXILIARY
	MUST ( mail )
	MAY ( uid $ mailMessageStore $ homeDirectory $ userPassword $
	      mailAlternateAddress $ qmailUID $ qmailGID $
	      mailHost $ mailForwardingAddress $ deliveryProgramPath $
	      qmailDotMode $ deliveryMode $ mailReplyText $
	      accountStatus $ qmailAccountPurge $ 
	      mailQuotaSize $ mailQuotaCount $ mailSizeMax ) )

objectclass ( 1.3.6.1.4.1.7914.1.3.2.1 NAME 'qmailGroup'
	DESC 'QMail-LDAP Group'
	SUP top
	AUXILIARY
	MUST ( mail $ mailAlternateAddress $ mailMessageStore )
	MAY ( dnmember $ rfc822member $ filtermember $ senderconfirm $
	      membersonly $ confirmtext $ dnmoderator $ rfc822moderator $
	      moderatortext $ dnsender $ rfc822sender $ filtersender $
	      bounceadmin) )

objectclass ( 1.3.6.1.4.1.7914.1.4.2.1 NAME 'qldapAdmin'
	DESC 'QMail-LDAP Subtree Admin'
	SUP top
	AUXILIARY
	MUST ( qlaDnManager $ qlaDomainList $ qlaMailMStorePrefix $
	       qlaMailHostList )
	MAY ( qlaUidPrefix $ qlaQmailUid $ qlaQmailGid $ qlaMailQuotaSize $
	      qlaMailQuotaCount $ qlaMailSizeMax ) ) 


- Executar os comandos abaixo, para limpar a base ldap que foi criada na instalação:

# service slapd stop
# rm -f /var/lib/ldap/alock /var/lib/ldap/_* /var/lib/ldap/log.* /var/lib/ldap/*.bdb 

- Renomear a pasta /etc/ldap/slapd.d/ para /etc/ldap/slapd.d.old com o comando a seguir:

# mv /etc/ldap/slapd.d /etc/ldap/slapd.d.old

Executar os comandos abaixo para recriar a base ldap.

# service slapd start
# service slapd stop 

- Criar o arquivo /tmp/initial.ldif com o conteúdo abaixo(atentar para o exemplo:dc=prodemge, com seu domínio).

Cuidado com o initial.ldif, ele deve possuir uma ultima quebra de linha, caso contrário a entrada cyrus-admin não será processada!

dn: dc=prodemge,dc=gov,dc=br
dc: prodemge
objectClass: top
objectClass: dcObject
objectClass: organization
o: prodemge.gov.br

dn: ou=grupos,dc=prodemge,dc=gov,dc=br
objectClass: top
objectClass: organizationalUnit
ou: grupos
description: Repositorio de grupos utilizados no expresso
structuralObjectClass: organizationalUnit

dn: ou=usuarios,dc=prodemge,dc=gov,dc=br
objectClass: top
objectClass: organizationalUnit
ou: usuarios
description: Repositorio de usuarios do sistema expresso
structuralObjectClass: organizationalUnit

dn: cn=grupo-admin,ou=grupos,dc=prodemge,dc=gov,dc=br
gidNumber: 900
cn: grupo-admin
structuralObjectClass: posixGroup
description: Grupo de Administradores do Expresso V3
objectClass: top
objectClass: posixGroup
memberUid: expresso-admin

dn: cn=grupo-user,ou=grupos,dc=prodemge,dc=gov,dc=br
gidNumber: 901
cn: grupo-user
structuralObjectClass: posixGroup
objectClass: top
objectClass: posixGroup

dn: uid=expresso-admin,ou=usuarios,dc=prodemge,dc=gov,dc=br
cn: Teste Expresso
givenName: Teste
sn: Expresso
userPassword: {MD5}Fn16h7QYEETtz36FjnrD4w==
displayName: Teste Expresso
objectClass: inetOrgPerson
objectClass: top
objectClass: posixAccount
objectClass: shadowAccount
uid: expresso-admin
homeDirectory: /bin/false
gidNumber: 900
uidNumber: 1000
mail: expresso-admin@prodemge.gov.br

dn: uid=cyrus-admin,dc=prodemge,dc=gov,dc=br
cn: Administrador Cyrus
givenName: Administrador
sn: Cyrus
userPassword: {MD5}Fn16h7QYEETtz36FjnrD4w==
displayName: Administrador do servico cyrus imap
objectClass: inetOrgPerson
objectClass: top
objectClass: posixAccount
objectClass: shadowAccount
uid: cyrus-admin
homeDirectory: /bin/false
gidNumber: 800
uidNumber: 800
mail: cyrus-admin@prodemge.gov.br

- Inicializar o Serviço, executar os comandos:

# slapadd -l /tmp/initial.ldif
# chown -R openldap.openldap /var/lib/ldap/*
# service slapd start 

Configuração do Saslauthd

Instale os pacotes do saslauthd

# apt-get install libsasl2-modules sasl2-bin 

- Editar o arquivo /etc/default/saslauthd alterando os seguintes parâmetros:

START=yes
MECHANISMS="ldap"
OPTIONS="-c -t 60 -m /var/run/saslauthd"

- Criar o arquivo /etc/saslauthd.conf e incluir o conteúdo:

ldap_servers: ldap://127.0.0.1
ldap_port: 389
ldap_version: 3
ldap_referrals: no
ldap_search_base: dc=prodemge,dc=gov,dc=br
ldap_filter: uid=%u 

- Execute o comando abaixo para que o saslauthd comece a utilizar o ldap para autenticação:

  # service saslauthd restart 

- O comando abaixo testa se o serviço está autenticando corretamente.

# testsaslauthd -u expresso-admin -p prodemge 

Se a integração entre o openldap e o saslauthd estiver correta a saída do comando será conforme abaixo:

0: OK "Success." 

Servidor Web Apache / PHP

Instalação Apache

# apt-get install apache2 apache2-mpm-prefork libapache2-mod-php5 apache2-utils php5 
# apt-get install php5-common php5-dev php5-imap php5-ldap php5-pgsql php5-cgi php5-cli 
# apt-get install php5-curl php5-xmlrpc php5-memcache php5-pspell libgv-php5 zip unzip 
# apt-get install memcached python-software-properties php-date php5-gd php-apc php5-mcrypt 

Configuração Apache

- Copiar o arquivo browscap.ini disponível no site: http://browscap.org/ para um diretório que o apache tenha permissão de leitura, editar o arquivo /etc/php5/apache/php.ini e adicionar a seguinte configuração:

browscap = "<path completo para >/php_browscap.ini" 

- Reiniciar o servidor Apache.

- Fazer download da versão do Expresso V3 mais atual disponível no site Download - Expresso V3. Para baixar o arquivo utilize o comando abaixo, considerando download no diretório /root

# cd /root
# wget https://comunidadeexpresso.serpro.gov.br/portal/downloads/codname.yyyymmdd.xxtar.gz 

Onde, codname= Nome da versão yyyymmdd= Data da versão xx= Release da versão

- Descompacte o arquivo com o seguinte comando:

# tar xvzf codname.yyyymmdd.xx.tar.gz

- Mova os arquivo para o diretório /var/www/expressov3

# mv codname.yyyymmyy.xx expressov3
# mv expressov3 /var/www/expressov3

- Corrija as permissões dos arquivos, com o seguinte comando:

# chown -R root.www-data /var/www/expressov3
# chmod -R 750 /var/www/expressov3

- Crie o arquivo expressov3 no diretório /etc/apache2/sites-available/ com conteúdo abaixo substituindo 192.168.0.0/24 pela rede ou IP que terá acesso ao setup.

# vim /etc/apache2/sites-available/expressov3
NameVirtualHost *:80
<VirtualHost *:80>
    ServerAdmin postmaster@prodemge.gov.br
    DocumentRoot /var/www/expressov3

    <Directory /var/www/expressov3/>
       Options FollowSymLinks MultiViews
       AllowOverride All
       Order allow,deny
       allow from all
    </Directory>

    <Directory /var/www/expressov3/setup.php>
       Options FollowSymLinks MultiViews
       AllowOverride All
       Order allow,deny
       Allow from 192.168.0.0/24
    </Directory>
    ErrorLog /var/log/apache2/error.log
    LogLevel debug
    CustomLog /var/log/apache2/access.log combined
</VirtualHost>

- Desabilite o site default com o comando:

# a2dissite 000-default

- Habilite o site expressov3 com o comando:

# a2ensite expressov3


- Crie o arquivo expressov3-ssl no diretório /etc/apache2/sites-available/ com conteúdo abaixo substituindo 192.168.0.0/24 pela rede ou IP que terá acesso ao setup.

# vim /etc/apache2/sites-available/expressov3-ssl


NameVirtualHost *:443
<VirtualHost *:443>
    ServerAdmin postmaster@prodemge.gov.br
    DocumentRoot /var/www/expressov3
    ServerName expressov3.prodemge.gov.br
    SSLEngine on
    SSLCertificateFile /etc/apache2/key-cert.pem

    <Directory /var/www/expressov3/>
       Options FollowSymLinks MultiViews
       AllowOverride All
       Order allow,deny
       allow from all
    </Directory>
    
    <Directory /var/www/expressov3/setup.php>
       Options FollowSymLinks MultiViews
       AllowOverride All
       Order allow,deny
       Allow from 192.168.0.0/24
    </Directory>
    ErrorLog /var/log/apache2/error.log
    LogLevel debug
    CustomLog /var/log/apache2/access.log combined
</VirtualHost>

- Habilite o módulo ssl e o site expressov3-ssl com os comandos:

# a2enmod ssl
# a2ensite expressov3-ssl

- Inclua no /etc/php5/apache2/php.ini
Por default, a linha default_charset="utf-8" deve estar comentada - descomentea.

default_charset = "utf-8"

- Reinicialize o apache

# service apache2 restart

Servidor Imap Cyrus

Instalação do Cyrus

# apt-get install cyrus-admin-2.4 cyrus-common-2.4 cyrus-replication-2.4 cyrus-pop3d-2.4 cyrus-nntpd-2.4 cyrus-clients-2.4 cyrus-murder-2.4 
# apt-get install cyrus-imapd-2.4 cyrus-doc-2.4 libcyrus-imap-perl24 libmail-imapclient-perl 
# apt-get install libparse-recdescent-perl libterm-readkey-perl libterm-readline-perl-perl

A pergunta a seguir é feita durante a instalação do Cyrus. Responda NÃO.

   - Configurando cyrus-common
     É possível remover as áreas de armazenagem (spools) usadas pelo Cyrus, e também as áreas usadas
     para armazenar os scripts sieve dos usuários quando o pacote for eliminado (purge) do sistema.
     Apenas as áreas padrão em /var serão removidas. Caso você tenha configurado outras áreas em
     imapd.conf, elas não serão removidas. Removo as spools do Cyrus e os scripts sieve?

Configuração do Cyrus

- Editar o arquivo /etc/imapd.conf alterando e/ou acrescentando os seguintes parâmetros:

admins: cyrus-admin cyrus expresso-admin admin​
imap_admins: cyrus-admin cyrus expresso-admin admin
sieve_admins: cyrus-admin cyrus expresso-admin admin
popminpoll: 0
sasl_pwcheck_method: saslauthd
sasl_mech_list: PLAIN
unixhierarchysep: yes 

- Editar o arquivo /etc/cyrus.conf comentando o seguinte parâmetro:

# nntp cmd="nntpd -U 30" listen="nntp" prefork=0 maxchild=100 

- Obs.: Não se preocupar em criar os diretórios que estão dentro do diretório /run/cyrus/ pois este diretório é em memória e o erro deixara de acontecer quanto o cyrus tiver usuários cadastrados e utilizando o sistema.

- Executar o restart do serviço cyrus-imapd.

# service cyrus-imapd restart 

- Executar o seguinte comando para verificar se o cyrus-imapd está funcionando corretamente.

# imtest -p 143 -a cyrus-admin 127.0.0.1 

Ao executar esse comando o prompt ira exibir a saída abaixo, pedindo a senha do usuário cyrus-admin.

Informe a senha definida no ldap, no exemplo é: “prodemge”.
S: * OK [CAPABILITY IMAP4rev1 LITERAL+ ID ENABLE AUTH=PLAIN SASL-IR] debian Cyrus IMAP v2.4.16-Debian-2.4.16-4+deb7u1 server ready
Please enter your password:

Após fornecer a senha será exibida a tela abaixo, com a informação de “Authenticated” confirmando que o login foi feito com sucesso.

C: A01 AUTHENTICATE PLAIN AGN5cnVzLWFkbWluAHByb2RlbWdl
S: A01 OK [CAPABILITY IMAP4rev1 LITERAL+ ID ENABLE ACL RIGHTS=kxte QUOTA MAILBOX-REFERRALS NAMESPACE UIDPLUS
NO_ATOMIC_RENAME UNSELECT CHILDREN MULTIAPPEND BINARY CATENATE CONDSTORE ESEARCH SORT SORT=MODSEQ SORT=DISPLAY
THREAD=ORDEREDSUBJECT THREAD=REFERENCES ANNOTATEMORE LIST-EXTENDED WITHIN QRESYNC SCAN XLIST URLAUTH
URLAUTH=BINARY LOGINDISABLED COMPRESS=DEFLATE IDLE] Success (no protection) SESSIONID=<cyrus-3580-1376055931-1>
Authenticated.
Security strength factor: 0

Agora você já está logado no servidor imap, para sair do servidor imap digite o comando abaixo:

1 logout <enter> - Digitar o número 1 também, pois os comandos do protocolo imap devem ser  precedidos por uma tag identificadora.

- Caixa de emails para o usuário inicial expresso-admin

# cyradm --server localhost --user cyrus-admin --password prodemge
localhost> cm user/expresso-admin
localhost> cm user/expresso-admin/Sent
localhost> cm user/expresso-admin/Trash
localhost> cm user/expresso-admin/Draft
localhost> quit

Configuração do Sieve

Temos de adicionar duas configurações referentes ao Sieve

- Edite o arquivo /etc/services e adicione as linhas abaixo:

sieve        4190/tcp            # ManageSieve Protocol
sieve        4190/udp 

- Edite o arquivo /etc/cyrus.conf e adicione as linhas abaixo, completando com o <IP-DO-SERVIDOR>:

sieve        cmd="timsieved" listen="<IP-DO-SERVIDOR>:sieve" prefork=0 maxchild=100
sievelocal      cmd="timsieved" listen="127.0.0.1:sieve" prefork=0 maxchild=100 

Postfix

Instalação Postfix

 # apt-get install postfix postfix-ldap postfix-pgsql
 Opções que devem ser utilizadas durante a instalação dos pacotes:
 ** Sites de Internet
 ** Nome de email do sistema: (seu domínio Ex.: prodemge.gov.br)

Configuração do Postfix

- Criar o arquivo /etc/postfix/transport com o conteúdo abaixo.

prodemge.gov.br lmtp:unix:/var/run/cyrus/socket/lmtp
.prodemge.gov.br lmtp:unix:/var/run/cyrus/socket/lmtp 

- Criar o arquivo /etc/postfix/expresso-dominios e adicionar o conteúdo abaixo.

prodemge.gov.br OK 

Executar os comandos:

# postmap /etc/postfix/transport
# postmap /etc/postfix/expresso-dominios 

- Criar o arquivo e o diretório /etc/postfix/sasl/smtpd.conf e adicionar o conteúdo abaixo

pwcheck_method: saslauthd
mech_list: PLAIN LOGIN 

- Editar o arquivo /etc/postfix/main.cf e substituir o conteúdo existe pelo conteúdo abaixo:

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
readme_directory = no
transport_maps = hash:/etc/postfix/transport
lmtp_destination_recipient_limit = 80
smtpd_sasl_auth_enable = yes
myhostname = expressov3.prodemge.gov.br
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = expressov3.prodemge.gov.br, localhost, hash:/etc/postfix/expresso-dominios
mynetworks = 127.0.0.0/8
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4

# Faz uma consulta pelo from do email pega o resultado uid(username) e compara com o username da autenticacao SASL
smtpd_sender_login_maps = ldap:/etc/postfix/users_from.cf

# Numero maximo de recipientes na mesma mensagem
smtpd_recipient_limit = 2000
smtpd_recipient_overshoot_limit = 2000

smtpd_client_restrictions = 
         permit_mynetworks,
         permit_sasl_authenticated,
         reject

smtpd_recipient_restrictions =
        permit_mynetworks,
        reject_sender_login_mismatch,
        permit_sasl_authenticated,
        reject_unauth_destination,
        reject_unverified_recipient,
        reject

#virtual_alias_maps = ldap:mailboxes
#virtual_alias_maps = ldap:listas ldap:mailboxes, ldap:grupos
'''virtual_alias_maps = ldap:listas ldap:mailboxes'''

ldaphost = 127.0.0.1
ldapbase = dc=prodemge,dc=gov,dc=br

mailboxes_server_host = $ldaphost
mailboxes_version = 3
mailboxes_timeout = 10
mailboxes_search_base = $ldapbase
'''mailboxes_query_filter = (&(mail=%s)(objectClass=posixAccount))'''
mailboxes_bind = no
mailboxes_domain = hash:/etc/postfix/expresso-dominios
mailboxes_result_attribute = uid

listas_server_host = $ldaphost
listas_version = 3
listas_timeout = 1000
#listas_chase_referral = 0
listas_search_base = $ldapbase
#listas_query_filter = (&(mail=%s)(objectClass=Mailman)(deliveryMode=forwardOnly)) (ainda não está gravando deliveryMode no Ldap)
'''listas_query_filter = (&(mail=%s)(objectClass=Mailman))'''
listas_domain = hash:/etc/postfix/expresso-dominios
listas_result_attribute = mailForwardingAddress
listas_bind = no
listas_bind_dn = uid=expresso-admin,ou=usuarios,$ldapbase
listas_bind_pw = senha


- Criar o arquivo /etc/postfix/users_from.cf

server_host = 127.0.0.1
search_base = dc=prodemge,dc=gov,dc=br
query_filter = (&(mail=%s)(objectClass=posixAccount))
result_attribute = uid
version = 3
bind = no
timeout = 30 

- Editar o arquivo /etc/postfix/master.cf

smtp inet n - n - - smtpd
submission inet n - n - - smtpd
  -o syslog_name=postfix/submission
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
lmtp unix - - n - - lmtp 

A seção submission irá habilitar a porta 587 que é recomendado para clientes de email.

- Adicionar o usuário postfix no grupo sasl e mail com os comandos abaixo.

# gpasswd -a postfix sasl
# gpasswd -a postfix mail
# gpasswd -a cyrus mail 
# service postfix restart 

OBS: É necessário garantir que o usuários cyrus e postfix estejam no grupo mail para que a comunicação entre eles via protocolo lmtp funcione corretamente.

Testando o Postfix e Cyrus

- Testar se a configuração do Postfix + Cyrus + Slapd esta funcionando. Faça um telnet para o servidor postfix e envie um email.

# telnet localhost 25

Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 prodemge.gov.br ESMTP Postfix (Debian/GNU)

ehlo localhost

250-dummy.gov.br
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

mail from: expresso-admin@prodemge.gov.br
250 2.1.0 Ok
rcpt to: expresso-admin@prodemge.gov.br
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
hello 
world
.
250 2.0.0 Ok: queued as 374FF412C4

quit

221 2.0.0 Bye

Agora que você já enviou o email pelo Postfix, você vai precisar verificar se o email foi entregue para o Cyrus. O próximo teste irá confirmar se a conexão entre o Postfix e o Cyrus utilizando o protocolo LMTP está funcionando corretamente.

Os comandos IMAP precisam ser precedidos por uma tag identificadora nesse exemplo as tags identificadoras são: a1, a2, a3, a4, a5.

Na tag a1 é realizado o login a sintaxe é LOGIN <usuário> <senha>.
Na tag a2 é listada as pastas do usuário: LIST "" "*".
Na tag a3 é executado o comando EXAMINE na pasta INBOX nele é listado o total de emails existentes na pasta e o total de não lidos.
Na tag a4 é executado o comando que manda baixar o conteúdo da mensagem: FETCH <numero da mensagem> BODY[]
Na tag a5 é feito o logout, esse comando fechada a conexão com o servidor imap.

# telnet localhost 143
Trying ::1...
Connected to localhost.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 LITERAL+ ID ENABLE AUTH=PLAIN SASL-IR] expresso Cyrus IMAP v2.4.16-Debian-2.4.16-4+deb7u1 server ready

a1 LOGIN expresso-admin prodemge
a1 OK [CAPABILITY IMAP4rev1 LITERAL+ ID ENABLE ACL RIGHTS=kxte QUOTA MAILBOX-REFERRALS NAMESPACE UID PLUS NO_ATOMIC_RENAME 
UNSELECT CHILDREN MULTIAPPEND BINARY CATENATE CONDSTORE ESEARCH SORT SORT=MODS EQ SORT=DISPLAY THREAD=ORDEREDSUBJECT THREAD=REFERENCES 
ANNOTATEMORE LIST-EXTENDED WITHIN QRESYNC SCAN XLIST URLAUTH URLAUTH=BINARY LOGINDISABLED COMPRESS=DEFLATE IDLE] User logged in 
SESSIONID=<cyrus-5397-1381233317-1>

a2 LIST "" "*"
* LIST (\HasChildren) "/" INBOX
* LIST (\HasNoChildren) "/" INBOX/Draft
* LIST (\HasNoChildren) "/" INBOX/Sent
* LIST (\HasNoChildren) "/" INBOX/Trash
a2 OK Completed (0.000 secs 5 calls)

a3 EXAMINE INBOX
* 2 EXISTS
* 1 RECENT
* FLAGS (\Answered \Flagged \Draft \Deleted \Seen)
* OK [PERMANENTFLAGS ()] Ok
* OK [UNSEEN 2] Ok
* OK [UIDVALIDITY 1380899478] Ok
* OK [UIDNEXT 3] Ok
* OK [HIGHESTMODSEQ 4] Ok
* OK [URLMECH INTERNAL] Ok
a3 OK [READ-ONLY] Completed

a4 FETCH 1 BODY[]
* 1 FETCH (BODY[] {592}
Return-Path: <expresso-admin@prodemge.gov.br>
Received: from expressov3.prodemge.gov.br ([unix socket])
         by expresso (Cyrus v2.4.16-Debian-2.4.16-4+deb7u1) with LMTPA;
         Fri, 04 Oct 2013 15:48:59 -0300
X-Sieve: CMU Sieve 2.4
Received: from localhost (localhost [IPv6:::1])
        by expressov3.prodemge.gov.br (Postfix) with ESMTP id C75734419C
        for <expresso-admin@prodemge.gov.br>; Fri,  4 Oct 2013 15:48:24 -0300 (BRT)
Message-Id: <20131004184835.C75734419C@expressov3.prodemge.gov.br>
Date: Fri,  4 Oct 2013 15:48:24 -0300 (BRT)
From: expresso-admin@prodemge.gov.br

hello 
world
)
a4 OK Completed (0.000 sec)

a5 logout
* BYE LOGOUT received
a5 OK Completed
Connection closed by foreign host.

- utilize o sieveshell para testar se o servidor sieve esta online.

# sieveshell --user=expresso-admin --authname=expresso-admin localhost:4190

connecting to localhost:4190
Please enter your password: 
> list
expressoV3  <- active script

Banco de Dados Postgresql

Instalando Postgresql

- Instalar o software postgresql

 # apt-get install postgresql-9.1 postgresql-client-9.1 postgresql-contrib-9.1

Configuração do Postgresql

- Editar o arquivo /etc/postgresql/9.1/main/pg_hba.conf para permissões de acessos ao banco, remover todo o conteúdo do arquivo e substituir pelas três linhas abaixo.

local    all     postgres                 trust
local    all     all                      trust
host     all     all     127.0.0.1/32     trust

- Editar arquivo /etc/postgresql/9.1/main/postgresql.conf e habilitar bind em todas as interfaces

listen_addresses = '*' 

- Restartar o banco com o comando

# service postgresql restart 

- Executar os comandos abaixo para criar a base de dados inicial do Expresso.

# psql -U postgres -c "CREATE DATABASE expressov3 WITH ENCODING 'UTF-8' TEMPLATE template0;"
# psql -U postgres -c "CREATE USER expressopgsql WITH PASSWORD 'prodemge';"
# psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE expressov3 TO expressopgsql;"
# psql -U postgres -d expressov3 -f /usr/share/postgresql/9.1/extension/unaccent--1.0.sql
# psql -U postgres -c "CREATE EXTENSION unaccent;" 


Modos de configuração do Expresso

Existem tres modos de configurar/administrar o expresso.

1. Configuração Básica via arquivo config.inc.php

Algumas vezes as opções de configuração ficam pendentes de serem transportadas para interface gráfica. Neste caso somente a configuração direta no arquivo de configuração é possível.

2. Configurando via browser(setup.php)

Mesmo com a opção de customização no arquivo config_inc.php, deve-se obrigatoriamente utilizar esta opção, pois algumas funcionalidades somente estarão presentes neste modo de configuração. Ex: instalação ou desisntalação de módulos.

3. Instalação via linha de comando (CLI)

Este tipo de configuração está disponível para que os administradores tenham acesso batch às funções de administração, muitas vezes necessárias em rotinas automatizadas que não dependem de interface gráfica. Detalhes relacionados as funções CLI podem ser obtidos em funções CLI.

Estes três modos serão explorados a seguir.

Configuração Básica via arquivo config.inc.php

A configuração inicial do expresso se dá via o arquivo de configuração: config.inc.php Criar o arquivo config.inc.php no diretório home da aplicação no apache: Ex: /var/www/expressov3 Substituir o <IP DO SEU SERVIDOR> por um valor válido e customiza-lo conforme sua configuração. Substituir o valor <SITE EXPRESSO LITE> por um valor válido e customiza-lo.

domanindata => informa os domínios que estarão em uso por esta instância enabledApplications => Diz quais aplicações estarão ativas

# vim /var/www/expressov3/config.inc.php

<?php
   return array(
     'enabledApplications' => 'Tinebase,Admin,Addressbook,Calendar,Tasks,Webconference,Messenger,Expressomail,AppLauncher,ActiveSync',
     'domaindata' =>
          array (
            'domain' => 'expressobr.gov.br', 'outro.org.br'),
     'captcha' => array('count'=>0),
     'database' => array(
       'host' => '127.0.0.1',
       'dbname' => 'expressov3',
       'username' => 'expressopgsql',
       'password' => 'prodemge',
       'adapter' => 'pdo_pgsql',
       'tableprefix' => 'tine20_',
     ),
     'setupuser' => array(
       'username' => 'tine-admin',
       'password' => 'prodemge',
     ),
     'denySurveys' => true,
     'modssl' => array (
       'username_callback' => 'Serpro_Auth_ModSsl_UsernameCallback_Cpf',
       'casfile' => '/opt/security/cas/todos.cer',
       'crlspath' => '/opt/security/crls',
       'redirectUrlmodSsl' => 'https://<IP DO SEU SERVIDOR>',
     ),
     'maxfiltertypeemail' => 2,
     'maxfiltertypecalendar' => 4,
     'disableaccesslog' => true,
     'mobile' => array( 'url' => '<SITE EXPRESSO LITE>(exemplo: https://m.expresso.serpro.gov.br)', ),
);

- Corrigir as permissões do arquivo criado, com os comandos abaixo:

# chown root.www-data /var/www/expressov3/config.inc.php
# chmod 770 /var/www/expressov3/config.inc.php


Expiração de Senhas

O controle de expiração de senhas fora introduzido no setup da aplicação.

Fora adicionado um novo grupo de opções junto às entradas de configurações para "Autenticação/Contas". Trata-se do painel "Política de expiração de senha LDAP"

Por padrão, a guia mestre deste conjunto de definições vem com o valor de "Não verificar senha expirada".

Quando ativado, para verificar a expiração de senha, outras duas definições devem ser informadas pelo administrador, que são as seguintes:

a)"Nome do atributo para senha expirada" 
Como este atributo pode ser diferente para diretórios Ldap de direfentes empresas, 
foi incluída a possibilidade de configuração de qual o nome do atributo Ldap que irá controlar esta expiração.
Este é campo textual, que deve ser o nome do atributo(possivelmente oculto junto ao LDAP) responsável pelo controle de 
expiração de senha junto ao serviço do LDAP. Exemplo "passwordexpirationtime". 

IMPORTANTE: caso venha ser informado nome incorreto/inválido/inexistente, no evento de logon o usuário não poderá realizar
a autenticação  e no arquivo de log da aplicação haverá um registro desta inconformidade. Para o usuário, será apresentada mensagem
padrão "Usuário/senha inválidos".
b)"Intervalo para renovação da senha" = campo de seleção numérica, onde o administrador define o intervalo, em dias, válido para que a
troca da senha seja  realizada pelo usuário.
Este painel somente é disponibilizado quando o agrupamento de configurações "Armazenamento de Contas" está utilizando como "Retaguarda"
a tecnologia "LDAP".   

A funcionalidade destas diretivas são aplicadas no evento de login de usuários, onde é verificado se está sendo usado o controle de expiração; se o usuário apresenta o atributo de expiração de conta em seus dados junto ao LDAP e se a data da última modificação da senha está válida dentro do intervalo definido para a expiração. Muitos destes eventos são evidenciados no arquivo de log, em nível de "Debug" para um acompanhamento mais detalhado.

Restrição de sincronia com dispositivos móveis

Esses parâmetros limitam o período máximo de sincronia de e-mail e calendário para "TODOS" dispositivos móveis. Deve-se ter bastante critério na definição destes parêmetros, principalmente em função da configuração dos dispositivos móveis ficar totalmente a cargo do usuário e dos parametros do dispositivo, que em caso de configuração agressiva de sincronia poderá causar uma carga elevada aos servidores que abastecem este serviço.

1) No config.inc.php, inclua os parâmetros da seguinte forma:

'maxfiltertypeemail’ ⇒ 2,
'maxfiltertypecalendar’ ⇒ 4,

2) Reinicie o Apache

3) Sincronize o dispositivo móvel e veja se sincronizou e-mails de 3 dias e eventos de calendário de 2 semanas

4) Repita o procedimento utilizando os valores abaixo para testar outros períodos.

Os possíveis valores númericos para os parâmetros são:

'maxfiltertypeemail’
1 ← um dia
2 ← três dias
3 ← uma semana
4 ← duas semanas
5 ← um mês
6 ← três meses
7 ← seis meses
0 ← tudo 
'maxfiltertypecalendar’
4 ← duas semanas
5 ← um mês
6 ← três meses
7 ← seis meses
0 ← tudo 

Desabilitar criação de log de acesso

Quando o parâmetro é "true" (configurado no config.inc.php), o ActiveSync não cria log de acesso para diminuir a carga sobre o BD.

'disableaccesslog’ ⇒ true,

Utilização de Temas

O expressoV3 pode utilizar diferentes aspectos visuais definidos como temas para apresentação gráfica, conforme
a necessidade da organização.
A utilização de diferentes temas se dão via arquivo de configuração config_inc.php
Documentação específica pode ser vista no link Temas

Configuração de Multidomínio

Visando simplificar a estruturação da documentação informações relativas a utilização de multidomínio podem ser acessadas via link suporte a multidomínios.

Catálogos(containers) Ldap externos

Esta funcionalidade é um requisito oriundo da versão 2 do Expresso na qual era permitido configurar acesso a mais de um catálogo LDAP no Addressbook além dos catálogos do próprio Expresso. Funcionalidade chamada de Catálogos Externos. Sua implementação no expressov3 está detalhada em Catálogos Externos

Política de Privacidade

Dados complementares em relação a política de privacidade, pesquisa de satisfação e controle de updade podem ser obtidos em: Política de Privacidade

Configurando via browser(setup.php)

Acessar o setup do Expresso V3 na página http://<ip-do-servidor>/setup.php e configurar os parâmetros necessários para o funcionamento do serviço. Para realizar o login na interface web do Expresso V3 utilizar o usuário e senha definidos no arquivo config.inc.php, no exemplo é:

  Username: tine-admin
  Password: prodemge 

Configurações de Cache, Sessão e Temporários

Para a configuração do Expresso V3, informar os valores das telas seguintes. Os diretórios parametrizados em Logging, Caching, Sessions, Temporary files e Filestore directory deverão possuir escrita para o usuário apache(ex: www-data). Config manager.png


Configurações de Tamanho email e contatos dinâmicos

A partir da versão Kristina.20141010.03, dois novos parâmetros de configuração foram inseridos na configuração:


Tamanho máximo de mensagem permitido (bytes):
Máximo para importação em Contatos Coletados:
  Este parâmetro fora criado em função de envio de emails para uma quantidade muito grande de destinatários causando overhead muito grande
  em guardar cada um dos destinatários no container pessoal do usuários(contatos coletados).
  Portanto é extremamente aconselhável configurar este parâmetro para evitar overhead para usuários que costumam
  enviar emails para grandes quantidade de usuários.

Autenticação de Usuários LDAP

A tela a seguir exemplifica a configuração de onde e como será a autenticação dos usuários. Contas 00.png

Expiração de senha de Usuários LDAP

O tratamento de expiração de senhas fora introduzido mediante a criação de três novos parâmetros de customização no Setup, relativos a LDAP. Via setup da aplicação, selecionar o item de menu “Autenticação/Contas” e identificar (dentro do agrupamento “Armazenamento de contas”), três novas diretivas de configuração, conforme imagem: Expiration.png

a. LDAP nome do atributo para senha expirada
   Qual o nome do atributo do LDAP. 
   Este parametro fora criado em virtude de diretórios de empresas diferentes usarem diferentes atributos para o 
   controle de expiração.
   Neste exemplo o nome do atributo é "passwordexpirationtime" considerando a realidade deste exemplo.
b. LDAP Verificar senha expirada     
   Informar se o controle de expiração será ativado ou não.
   Este atributo poderá ser consultado via client ldap em linha de comando, considerando o parâmetro do item acima(a).
   ldapsearch -x -h IP_HOST_LDAP -D cn=admin,ou=expressolivre,ou=corp,dc=serpro,dc=gov,dc=br -W -b dc=serpro,dc=gov,dc=br uid=USUARIO_DE_BUSCA  
   passwordexpirationtime 
c. LDAP intervalo para renovação da senha
   Com acesso privilegiado ao LDAP é possível atualizar o atributo de expiração de senha(ex: passwordexpirationtime), conforme abaixo:
  c.1.Criar um arquivo trocarexpiracao.ldif  com o conteúdo abaixo:
    dn: uid=USUARIO_DE_BUSCA,ou=reg,ou=regpae,dc=serpro,dc=gov,dc=br 
    changetype: modify 
    replace: passwordexpirationtime 
    passwordexpirationtime: 19800101000000Z
  c.2. Executar o comando que atualiza a base LDAP via arquivo anterior, Ex:
    ldapmodify -x -h IP_HOST_LDAP -D cn="directory manager" -w serpro -f trocarexpiracao.ldif
  c.4.Realizar autenticação via interface web no expressoV3:
 
  c.5.Ao informar a senha e esta estiver expirada, o sistema perguntará se deseja realizar a alteração de senha.
      Caso não altere a senha, o usuário não irá logar no sistema.
  c.6.Ao acionar a troca da senha, o sistema solicitará a nova senha e a sua confirmação, processando a atualização da nova senha.
  c.7. O ExpressoV3 informa o êxito da atualização da senha e solicita re-login.
  
  c.8. O usuário então passa a logar com a nova senha.
  OBS: Alterações de setup, implicam em modificações nas tabelas de configuração. Estas tabelas são cacheadas pelo Zend e, portanto é 
  prudente que se limpe o chache Zend(normalmente no diretório /tmp) para que o sistema reconstrua o cache com os novos valores.
  Futuramente este procedimento será automático.

OU de usuário

Existe o campo OU de usuário no setup.php. É um campo novo, utilizado para criar usuário em ramos diferentes do LDAP. Ele deve ser configurado da maneira abaixo:


"Usuário DN:" - indica qual ramo LDAP é usado para guardar os registros de usuários; no caso do Serpro, coloca-se a raiz do LDAP, mas isso depende de como está configurado o servidor LDAP.

"OUs de usuários:" - mais uma alteração feita para suprir necessidades específicas do Serpro, mas que servem para outros clientes também. Indica ramos do LDAP passíveis de conter registros de usuários. No caso do Serpro, o LDAP é subdividido em regionais, tendo um ramo para cada uma delas.

usuário dn: ou=usuarios,dc=prodemge,dc=gov,dc=br
ou de usuário: Porto Alegre|ou=poa;São Paulo|ou=sp

Assim serão mostrados 2 opções para criar o Usuário: Porto Alegre e São Paulo

Atributo/Esquema LDAP obrigatório extra

Configurar as seguintes entradas na sessão Autenticação/contas do config.

"Esquema LDAP obrigatório extra para usuários:" - como o sistema é usado por empresas diferentes, com necessidades diferentes, é bem possível que os servidores LDAP delas também tenham esquemas de atributos diferentes. Este campo serve justamente para informar quais são esses esquemas peculiares a cada cliente. O Serpro, por exemplo, utiliza um esquema LDAP bem específico, o "phpgwaccount".

"phpgwaccount"

"Atributo LDAP obrigatório extra para usuários:" - assim como os esquemas, é possível que alguns atributos específicos sejam usados no registro de usuários no LDAP. Mais uma vez, o Serpro usa os atributos "phpgwaccounttype=u", "phpgwaccountstatus=A" e "accountstatus=active" para identificar usuários com uma ou outra característica.

"phpgwaccounttype=u;phpgwaccountstatus=A;accountstatus=active"

Armazenamento contas

Contas 01.png

Configuração do Nome de Exibição e Nome Completo dos Contatos do Catálogo de Endereços

Há três opções para configuração das opções "Exibir Nome" e "Nome Completo" no Catálogo de Endereços: 
1) 'Nome Sobrenome': Tanto o nome de exibção quanto o nome completo são criados a partir da concatenação do atributo "givenName" com o "sn".
2) 'Sobrenome, Nome': O nome de exibição é criado a partir da concatenação do atributo "sn, " com o "givenName". Já o nome completo é criado da mesma forma que na primeira opção,
ou seja, ele é o resultado da concatenação dos atributos "givenName" e "sn".
3) 'Usar Outros Atributos': A opção 'Exibir Nome' apresentará o atributo LDAP definido na configuração "Atributo do Nome de Exibição" e a opção 'Nome Completo' exibirá o atributo LDAP
definido na configuração "Atributo do Nome Completo".

Opcoes-Nome-Exibicao.png

Controle de Senhas

Contas 02.png

Configurando postfix, cyrus e sieve

Email.png

Instalando Aplicações

No geranciamento de Aplicações, escolha quais as aplicações a instalar. Exemplo: INstalando ExpressoMail Expressomail.png

Migrando a configuração de banco de dados para Arquivo

A partir da versão Kristina.20141010 é possível trocar-se o armazenamento das configurações do banco de dados para armazenamento somente no arquivo config.inc.php mandento-se a persistências das diversas configurações do Setup somente no arquivo e não mais no banco de dados.

Para a utilização do expressoBr em ambiente multidomínio esta migração para arquivo torna-se obrigatória.

Caso sua organização não necessite suporte a multidomínios esta migração para arquivos é opcional, com suporte da configuração em banco de dados como já é o default ou suporte da configuração em arquivo de configuração conforme documentação relacionada.

A tendência é que a configuração em banco de dados perca seu suporte em um futuro médio em detrimento à configuração para arquivo.

Configuração via comandos CLI

O Sutup pode ser executado de modo automático via chamada de função CLI, conforme abaixo. Normalmente na instalação inicial não é necessária esta instalação via CLI. O script seguinte configura o setup.php de maneira automática. Basta editar o script, substituir os parâmetros desejados e executa-lo.

#!/bin/sh
# Instalador para Expresso usando Banco de dados Postgres - Openldap - Cyrus - Postfix

#Define configuracoes de Banco conforme o config.inc.php
bd='expressov8'
user='expressopgsql'

#Define aplicacoes instaladas
aplic='tinebase,admin,addressbook,expressomail,calendar,tasks' 

#Define o usuario com permissao administrativa conforme config.inc.php	
adminLoginName='expresso-admin'
adminPassword='serpro'
hostname='127.0.0.1'

#Define configuracoes do LDAP
baseDn='dc=serpro\,dc=gov\,dc=br'
username='cn=ldap-admin\,dc=serpro\,dc=gov\,dc=br'
passwordLdap='serpro'
userDn='ou=usuarios\,dc=serpro\,dc=gov\,dc=br'
groupsDn='ou=grupos\,dc=serpro\,dc=gov\,dc=br'
minUserId='1000'
maxUserId='99999'
minGroupId='900'
maxGroupId='99999'
defaultUserGroupName='grupo-usuarios'
defaultAdminGroupName='grupo-administradores'

#Define configuracoes do LDAP para troca de senha
masterLdapPassword='serpro'
masterLdapHost='127.0.0.1'
masterLdapUsername='cn=ldap-admin\,dc=serpro\,dc=gov\,dc=br'

#Define configuracoes do SMTP
smtp_host='127.0.0.1'
primarydomain='serpro.gov.br'
smtp_port='25'
primarydomain='serpro.gov.br'

#Define configuracoes do IMAP
cyrus_admin='cyrus-admin'
cyrus_password='serpro'
cyrus_port='143'
cyrus_host='127.0.0.1'

#Define configuracoes do SIEVE
sieve_port='4190'
sieve_host='127.0.0.1'


#Exclue e recria BD
echo "Exclue e recria Banco de dados $bd"
/usr/bin/psql -U postgres -c "DROP DATABASE $bd;"
/usr/bin/psql -U postgres -c "CREATE DATABASE $bd WITH ENCODING 'UTF-8' TEMPLATE template0;"
/usr/bin/psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE $bd TO $user;"


#Instala aplicacoes

echo "Instala as aplicações -> $aplic"

/usr/bin/php setup.php --install "$aplic" -- adminLoginName=$adminLoginName adminPassword=$adminPassword acceptTermsVersion=1000 sieve=active:true,hostname:$sieve_host,port:$sieve_port,ssl:none smtp=active:true,backend:standard,hostname:$smtp_host,port:$smtp_port,ssl:none,auth:none,primarydomain:$primarydomain imap=active:true,backend:cyrus,host:$cyrus_host,port:$cyrus_port,ssl:none,useSystemAccount:1,domain:,dbmail:port:3306,cyrus_admin:$cyrus_admin,cyrus_password:$cyrus_password,cyrus_useProxyAuth:0 authentication=bindRequiresDn:1,backend:ldap,host:$hostname,username:$username,password:$passwordLdap,baseDn:$baseDn accounts=backend:ldap,host:$hostname,username:$username,password:$passwordLdap,userDn:$userDn,groupsDn:$groupsDn,minUserId:$minUserId,maxUserId:$maxUserId,minGroupId:$minGroupId,maxGroupId:maxGroupId,defaultUserGroupName:$defaultUserGroupName,defaultAdminGroupName:$defaultAdminGroupName,readonly:0,masterLdapHost:$masterLdapHost,masterLdapUsername:$username,masterLdapPassword:$masterLdapPassword,checkExpiredPassword:0

echo "FIM !!!"


Instalador Automatizado

Veja a documentação completa em Instalação Automatizada

Importação de usuários

O ExpressoV3 permite importação de arquivos txt, no formato csv, isto é, arquivos cujos dados dos usuários estão em uma linha do arquivo e separados por algum delimitador específico.

Também existe a possibilidade de importar/sincronizar os usuários de uma árvore ldap previamente existente.

Maiores detalhes sobre importação de usuários podem ser obtidos em Importando Usuários

Plugins para o Expresso

Plugins, no contexto do Expresso, são componentes (conjuntos de classes, traits e interfaces) desacoplados do núcleo e dos módulos do Expresso, que adicionam funcionalidades por injeção de dependências.

Como os plugins funcionam

Os plugins são inicializados no arquivo init_plugins.php.

Quais plugins estão disponíveis

  • Custom_Plugins_VerifyCertificate, que tem o método verifyCertificate(), para validar certificados digitais de acordo com o padrão da ICP-Brasil;
  • Custom_Session_Validator_IpAddress, que valida o endereço IP para um ambiente com balanceador de frontends;
  • Custom_AccessLog_Strategy_Default, que altera a forma como o AccessLog obtém o IP a ser registrado;
  • Tinebase_User_Plugin_Samba, que permite o uso de Samba para controle de usuários;
  • Tinebase_Group_Plugin_Samba, que permite o uso de Samba para controle de grupos de usuários.

Entradas de configuração dos plugins

Informações gerais

Se um plugin possui configuração, ela fica disponível na seção Plugins do Gerenciador de Configurações do módulo Setup.

Leia a documentação do código-fonte do plugin a ser utilizado para compreender como funcionam suas configurações.

Redirecionamento de dispositivos móveis

(ATENÇÃO, ESTE PLUGIN AINDA NÃO ESTÁ DISPONÍVEL)

O plugin Tinebase_UserAgent_Plugin provê a funcionalidade de redirecionar requisições de dispositivos móveis para uma interface web diferente.

Para injetar esse plugin, adicione a seguinte linha no arquivo init_plugins.php:

Tinebase_UserAgent_Plugin::init(__DIR__ . DIRECTORY_SEPARATOR . 'config.inc.php');

Para configurar a URL a ser redirecionada, acesse o Gerenciador de Configurações no Setup e dentro da seção Plugins, preencha o campo Mobile URL.

Para habilitar o redirecionamento, marque a caixa de verificação Mobile Redirect. Se ela estiver desmarcada, não será efetuado o redirecionamento.

Usando seus plugins

Aprenda a criar seus próprios plugins

Configurações Diversas

Configurar aceite de agendamentos externos

Em desenvolvimento

Autenticando em um serviço Active Directory

Ver o artigo Autenticação AD

Utilizando Listas de Distribuição Emails

O módulo de administração de lista fora disponibilizado na versão kristina.20150223.00

Para maiores detalhes Acesse o artigo

Listas de Distribuição

Configurando Cache

Considerações relativas a cache e performance podem ser acessadas via link Performance

Limites de uploads

Agradecimentos : https://diorgenes.wordpress.com/2010/06/15/aumentar-o-tamanho-do-anexo-no-expresso-livre/

Recentemente tive um pequeno trabalho para configurar o tamanho do limite de anexo no Expresso Livre, então resolvi compartilhar essa dica, vamos as configurações:

Ajustar as variáveis do PHP

   memory_limit = 256M (Define o tamanho máximo de memória disponível para ser utilizada pelo PHP);
   upload_max_filesize = 25M (Define o tamanho máximo de um arquivo para upload);
   post_max_size = 25M (Define o tamanho máximo de dados em uma requisição POST);

Obs: O tamanho das variáveis upload_max_filesize e post_max_size reflete diretamente na variável memory_limit, pois o PHP necessita de mais memória para trabalhar com volumes de dados maiores. Ex: upload_max_filesize = 50M, post_max_size = 50M e memory_limit = 512M.

No meu caso, utilizo virtualhost no apache, segue minha configuração:

   <VirtualHost *:80>
    ServerAdmin suporte@domain.org.br
    ServerName expresso.domain.org.br
    DocumentRoot /var/www/html/expresso.domain.org.br
    HostnameLookups Off
    UseCanonicalName Off
    ServerSignature Off
    <IfModule prefork.c>
    php_value memory_limit 256M
    php_value upload_max_filesize 25M
    php_value post_max_size 25M
    </IfModule>
   RewriteEngine on
    RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
    RewriteRule .* - [F]
    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
    LogLevel warn
    ErrorLog /var/log/httpd/expresso-error_log
    CustomLog /var/log/httpd/expresso-access_log combined
   </VirtualHost>

Ajustar o tamanho de anexo no Postfix

No arquivo /etc/postfix/main.cf procure por message_size_limit, altere para o tamanho em bytes desejado. Ex:

   # Tamanho maximo de anexo
   message_size_limit = 35651584

Carregando as novas configurações dos serviços:

   /etc/init.d/httpd reload
   /etc/init.d/postfix reload

Configurar o tamanho limite de anexo no Expresso Livre

Entre no setup, Gerenciador de configurações e depois altere o campo:

 Tamanho máximo de mensagem permitido (bytes) 

Este parâmetro é respaldado na configuração do arquivo config.inc.php pelo parâmetro:

 maxMessageSize = 10M

O tamanho do anexo é diferente do tamanho real do anexo(característica php):

Segue a justificativa da diferença, de acordo com algumas pesquisas o PHP utiliza codificação base64 para os arquivos anexados.

A codificação de base 64 foi definida originalmente para anexos do correio electrónico: RFC 2045: “Multipurpose Internet Mail Extensions”.

A codificação de base 64 usa o sub-conjunto de 65 caracteres do US-ASCII que são os caracteres mais “universais”, ou seja, caracteres que são iguais em practicamente todos os códigos: A-Z, a-z, 0-9, +, / = pad.

24 bits são representados em 4 caracteres 6 bits úteis por caracter Aumenta tamanho do conteúdo em 33%, por causa dos 2 bits “desperdiçados”.

Ou seja, um arquivo de “5Mb” anexado no Expresso Livre, será exibido como “6.8Mb”.

Link para aplicações Externas

Fora criado um módulo visando acesso rápido a outras aplicações(Lançador de aplicações/AppLuncher). A configuração aos links externos poderão ser feitas no arquivo de configuração config_inc.php, conforme exemplo abaixo.

 'applauncher' => array (
   'domain' => 'dominioxyz',
   'applications' => array (
     'listadmin' => 'https://aplicacoesexternas.ssss.gov.br',
   ),
 ),

Ajuda e Documentação

Na tela de autenticação, foi adicionado o recurso de ajuda/documentação junto com a tela "Sobre o ExpressoV3".

A entrada que é referenciada pelo link é definida e armazenada no arquivo "config.inc.php", usando seguinte modelo:

 ...
 'helpdoc' =>
 array(
 'active' => true,
 'text' => 'Ajuda e documentação?',
 'title' => 'Documentação online da Comunidade',
 'url' => 'http://comunidadeexpresso.serpro.gov.br/expressov3/tutorial/html/index.html'
 )

No setup da aplicação foi adicionado um agrupamento ("Ajuda e documentação") na opção "Gerenciador de Configuração" para a leitura destes argumentos, conforme pode ser observado na figura abaixo:

Config-Ajuda-Documentacao.png

Bugreport

Para utilizar o bugreport, é preciso efetuar as configurações abaixo:

1) Criar uma pasta com nome 'bugreport' dentro de var/www;

2) Copiar o arquivo bugreport.php (da pasta /scripts/bugreport do projeto) para esta nova pasta;

3) Editar o arquivo bugreport.php e configurar as variáveis:

 $from_mail:  Informar email de origem.
              Será usado somente quando ocorrer algum erro no recebimento dos dados do bugreport, então usa este email padrão.
 $from_name: Informar nome de origem.
             Também é usado somente quando ocorre algum erro.
 $to_mail: Informar o email de destino para qual o bugreport irá enviar;
 $to_name: Informar nome do destinatário;
 $mail_server: Email do servidor, não está sendo usado;
 $smtp_server: Informar o endereço do servidor SMTP;
 $smtp_port: Informar a porta do servidor SMTP;
 $path: Informar caminho da pasta de bibliotecas do zend framework. Ex.: /xxx/library/

4) Editar o arquivo config.inc.php e adicionar o caminho para o arquivo do bugreport que foi criado:

  'bugreportUrl' => 'http://<endereço do servidor>/bugreport/bugreport.php'

Debug

Para habilitar o profiler da aplicação, deve-se adicionar a seguinte chave no config.inc.php:

  ...
  'profiler' =>
  array(
  'xhprof' => TRUE,
  'queryProfiles' => TRUE
  ),

O xhprof é usado para coletar o tempo de resposta, o uso de memória e a quantidade de requisições de cada função. Isso auxilia no tratamento dos métodos mais chamados, pois identifica-se quais funções eles chamam.

O queryProfiles é utilizado para habilitar o registro das consultas realizadas pela aplicação. Isso torna desnecessário o filtro dos SELECTs após a coletar o log do PostgreSQL. O Zend\Db\Profiler registra o número total de consultas, o tempo total gasto, o maior tempo de execução, a maior consulta e, para cada consulta, o texto SQL e o maior tempo gasto pela consulta.

Esses dados coletados vão para o log do Expresso.


Exemplo de configuração para captura de queries sql:


'database' ⇒ {
...
'profiler' ⇒ TRUE
}

'profiler' ⇒ {
...
'queryProfiles' ⇒ TRUE,
'queryProfilesDetails' ⇒ TRUE
}

'logger' ⇒ {
...
'syslog' ⇒ TRUE,
'priority' ⇒ 7 //integer grava no syslog
}

Containers/Catálogos de Endereços

O administrador poderá configurar novos containers, ou seja, objetos de pesquisas para catalogos de endereços. Normalmente são containers LDAP visando disponibilizar pesquisas extra sobre contatos além do Internal catalog originalmente disponibilizado. Ex: caso voce tenha clientes em um outro catálogo ldap e queira que eles participem de seus contatos, basta configurar um container ldap para disponibilizar este acesso.

Detalhes podem ser obtidos aqui.

Direcionamento de Usuário Para Frontend Web Específicos

Esta configuração permite o redirecionamento de requisições para os servidores de frontend por usuário. A idéia é que, via cadastro de usuário(ldap), informar ao expressov3 para quais servidores Web estes usuários serão direcionados.

Com esta funcionalidade é possível direcionar grupos de usuários a grupos específicos de frontens Web, possibilitando agrupar-los por determinadas características, como por exemplo região geográfica, prioridade de acesso, etc.

É possível trabalhar com a diretiva desativada, pois esta configuração é opcional.

A aplicação definirá um cookie com o valor de um atributo ldap configurado no config.inc.php que será lido durante o processo de login. Este cookie será utilizado pela infraestrutura para direcionar as requisições do usuário para um frontend (ou grupo de frontends) específico. O objetivo é permitir que existam diferentes versões do expresso e que um grupo de usuários possa ser direcionado para um grupo específico de frontends. Essa definição de qual grupo de frontends utilizar será obtida a partir do atributo ldap de cada usuário.

Obs.: A sessão deve ser compartilhada entre os servidores frontend. Caso não exista seção compartilhada e o redirecionamento estiver ativo na aplicação, o usuário deverá fazer um duplo login.

 Através da configuração da aplicação (setup/config.inc) será possível:
 - Habilitar ou não o redirecionamento;
 - Definir o nome do atributo ldap;
 - Definir o nome do cookie de redirecionamento;
 - Definir o valor padrão do cookie caso não exista o atributo no ldap.

Estrutura da seção no config.inc.php:

 'redirecting' =>
  array (
     'active' => true,
     'ldapAttribute' => 'manager',
     'cookieName' => 'BALANCEID',
     'defaultCookieValue' => '.kristina',
  ),

Caso o redirecionamento esteja desabilitado nenhum tratamento será feito na aplicação. Caso esteja habilitado:
- Se o atributo ldap estiver definido, será setado o cookie de redirecionamento com esse valor;
- Se o atributo ldap não estiver definido, será setado o cookie de redirecionamento com o valor default.

Em qualquer caso, o cookie enviado na requisição será comparado com o cookie recebido, e caso sejam diferentes, será feito um refresh no navegador após o login para que sejam carregados os arquivos JS/CSS do novo frontend.

Limpeza de tabelas de registros

Existem tabelas que necessitam manutenção em função da quantidade de registros que irão acumular no dia-a-dia da utilização do expressov3. São tabelas que registram atividades do usuário no sistema como por exemplo tabela de registros de acesso dos usuários.

As seguintes tabelas são objetos de manutenção periódica, caso necessário: =

  • credential_cache
  • access_log
  • async_job

Esta manutenção se faz via comandos CLI, normalmente agendados via cron do sistema.

Exemplo1: Eliminar registros das tabelas.

php tine20.php --username [login] --password [senha] --method Tinebase.clearTable credential_cache access_log async_job --date=[YYYY-MM-DD]

O argumento date só serve para a tabela access_log. Serão removidos dela somente os registros da data informada para trás.

Caso queira limpar somente uma tabela, não mencione as outras.

Exemplo2: Eliminar registros removidos logicamente de uma data para trás.

php tine20.php --username [login] --password [senha] --method Tinebase.purgeDeletedRecords --date=[YYYY-MM-DD]


Configuração para aceite de convites externos

Este item encontra-se em construção

Utilização Certificados Digitais

A utilização de certificados digitais constituem-se em uma grande funcionalidade relacionada a segurança dos dados, autenticidade, não repúdio e inviolabilidade para os usários do ExpressoV3.

O Expresso permite Login(opcional ou obrigatório) com certificados digitais em detrimento de usuário e senha. Assinatura Digital de emails garante a autenticidade e não repúdio, enquanto a Criptografia Digital de emails também garante a inviolabilidade.

Para maiores detalhes consulte capítulo específico no Wiki que trata Certificados Digitais.

Alias de email

Detalhado no manual de administração em configurando alias

Sincronismo com Dispositivos móveis

A sincronização com dispositivos móveis se dá via protocolo Activesync. A documetação necessária esta sendo construída em WikiSincronização.

Eventos assincronos/Alarmes para Calendário e Tarefas

Os alarmes para monitoração de eventos podem ser acionados tanto via criação de um evento de agenda como via criação de uma tarefa. O alarme é uma notificação ao usuário que aquele evento, no período selecionado, ocorrera. Entenda-se por notificação o envio de um email para o usuário solicitante.

Este processo é conhecido como controle de eventos assíncronos e é monitorado pela cron do sistema.

Basicamente é necessária a criação de uma entrada na crontab visando uma chamanda ao metodo triggerAsyncEvents.

Listando o conteúdo da crontab: crontab -l
Editando a crontab: crontab -e
Exemplo de entrada na crontab para notificações assíncronas:
*/5 * * * * su apache -c '/usr/bin/php /xxxx/tine20.php --method Tinebase.triggerAsyncEvents --username=xxxxxx'

Para multidomínio habilitado:

*/5 * * * * su apache -c '/usr/bin/php /xxxx/tine20.php --method Tinebase.triggerAsyncEvents --username=xxxxxx --domain=dominio.xxx.yy'
Obs: o usuário apache, o caminho do php, o caminho do tine20.php e o username devem ser configurados conforme sua instalação.

Configuração de feriados

Obter o arquivo BrazilHolidays.ics em http://www.mozilla.org/projects/calendar/holidays.html. 
Clique com  botão direito em cima de Brazil Holidays - Salvar link como... - informar o 
lugar para salvar o arquivo.
Logado no expresso como usuário administrador, Criar um calendário corporativo com nome igual 
a "Feriados  BR"(Sugestão).
Conectar-se no banco de dados e executar o comando abaixo para obter o "id" do calendário criado:
select id from tine20_container where name='Feriados BR';
Alternativamente o Id do Calendário poderá ser visto no módulo de Administração/Repositórios(opção
de exibir Id)
Incluir a seguinte linha no config.inc.php:
'fixedCalendars' => array(id), // id obtido com a execução do comando no item 3.
A partir da pasta /var/www/tine20, raiz do aplicativo web, Importar o calendário de feriados:
php tine20.php --method=Calendar.import --username=<administrator user> -v plugin=Calendar_Import_Ical  
importContainerId=<id> </caminho/BrazilHolidays.ics> --domain=<domínio>
Substituir "id" pelo valor obtido com a execução do comando no item 3. O aplicativo pede a senha do  
usuário informado em --username. password> 
O aplicativo inicia a execução e responde com: reading file BrazilHolidays.ics ...done. 
O fim normal do aplicativo ocorre com uma msg do tipo: 
Imported xxx records. 
Import failed for 0 records.
Recarregar a aplicação Calendário.

Reportar Phishing

Configuração

Expresso possui a funcionalidade de reportar um email como phising. Para isso, acesse o módulo de administração >> aplicações e complete o campo email para relatar phising.

Configurar phising.png

Como Usar

Para reportar um email de phising, dê um clique com o botão direito do mouse sobre a mensagem e escolha a opção denunciar phising.

Reportar phising.png

LDAP com Esquemas e Atributos extra

Em função das particularidades dos Ldaps das diferentes empresas que utilizarem o expressoBR fora disponibilizada a possibilidade de utilização de esquemas a atributos que não são originais do ExpressoBR.

Um exemplo clássico é para manter a compatibilidade com a versão2 do expresso, a qual usa esquemas e atributos específicos, tanto para usuários como para grupos.

As seguintes entradas no setup foram adicionadas visando suprir esta necessidade:

* Esquema LDAP obrigatório extra para usuários: 
  Informar quais os esquemas ldap a mais serão gravados no ldap na criação de um usuário.
  Podem ser informados mais de um esquema, separados por ponto-e-vírgula(;)
  Ex: phpgwaccount;shadowAccount
* Atributo LDAP obrigatório extra para usuários: 
  Tal qual os esquemas, tambem podem ser informados os atributos necessários para os esquemas acima.
  Ex: phpgwaccounttype=u;phpgwaccountstatus=A
* Esquema LDAP obrigatório extra para grupos: 
  Informar quais os esquemas ldap a mais serão gravados no ldap na criação de um usuário.
  Podem ser informados mais de um esquema, separados por ponto-e-vírgula(;)
  Ex: phpgwaccount
* Atributo LDAP obrigatório extra para grupos: 
  Tal qual os esquemas, tambem podem ser informados os atributos necessários para os esquemas acima.
  Ex: phpgwaccounttype=g

Migrações do ExpressoV2

Em construção...

- Exemplificar mapeamento Ldap(Addresbook/Container/ContainerConf_<iddocontainermodificado>.inc 
- Exemplificar sincronização Ldap e funções CLI
- Exemplificar exportação/importação .ics
- Exemplificar utilização de catálogos internos, catálogos Ldap e catálogos externos

Interface Leve(ExpressoLite)

O ExpressoLite é um acesso via web que visa simplificar e disponibilizar uma interface mais leve para os usuários facilitando tanto o acesso via dispositivos móveis como smartfones ou tablets ou mesmo navegadores web.

Informações adicionais pode ser obtidas aqui.

Problemas Reportados

Abaixo estão descritos erros e problemas conhecidos na instalação do Expresso V3. Eles estão sendo tratados pelo desenvolvimento.

Criação de índices no banco de dados Postgresql

Normalmente a criação e manutenção do banco de dados se dá via setup para o módulo. Ex: ao realizar install ou update são feitas as atualizações necessárias na estrutura do banco de dados para este módulo, porém algumas vezes esta manutenção não reflete a necessidade do ambiente produtivo e por esta razão há necessidade de criação de índices para o banco de dados de modo batch, até que estas modificações sejam incorporadas ao setup.

Segue a necessidade de índices:

CREATE INDEX CONCURRENTLY tine20_expressomail_account_userid ON tine20_expressomail_account (user_id);
CREATE INDEX CONCURRENTLY tine20_cal_attendee_userid ON tine20_cal_attendee(user_id);
CREATE INDEX CONCURRENTLY tine20_addressbook_lists_containerid on tine20_addressbook_lists(container_id);
CREATE INDEX CONCURRENTLY tine20_groups_listid on tine20_groups(list_id);
CREATE INDEX CONCURRENTLY tine20_addressbook_containerid ON tine20_addressbook (container_id);
CREATE INDEX CONCURRENTLY tine20_addressbook_list_members_listid ON tine20_addressbook_list_members (list_id);
CREATE INDEX CONCURRENTLY tine20_cal_attendee_displaycontainerid ON tine20_cal_attendee(displaycontainer_id);
CREATE INDEX CONCURRENTLY tine20_cal_events_uid ON tine20_cal_events(uid) ;
**CREATE INDEX CONCURRENTLY tine20_cal_attendee_usertype_userid ON tine20_cal_attendee (user_type, user_id);
CREATE INDEX CONCURRENTLY tine20_cal_attendee_cal_eventid ON tine20_cal_attendee (cal_event_id);
CREATE INDEX CONCURRENTLY tine20_cal_exdate_cal_eventid ON tine20_cal_exdate (cal_event_id);
CREATE INDEX CONCURRENTLY tine20_cal_events_creationtime_sinc ON tine20_cal_events (creation_time);
CREATE INDEX CONCURRENTLY tine20_cal_events_dtstart_sinc ON tine20_cal_events (dtstart);
CREATE INDEX CONCURRENTLY tine20_cal_events_lastmodifiedtime_sinc ON tine20_cal_events (last_modified_time);
CREATE INDEX CONCURRENTLY tine20_cal_events_deletedtime_sinc ON tine20_cal_events (deleted_time);
CREATE INDEX CONCURRENTLY tine20_container_createdby_sinc ON tine20_container (created_by);
CREATE INDEX CONCURRENTLY tine20_container_type_name_createdby_sinc on tine20_container (type,created_by,name);
CREATE INDEX CONCURRENTLY tine20_container_name_createdby_sinc on tine20_container (UPPER(name), created_by);
CREATE INDEX CONCURRENTLY tine20_tags_owner_sinc ON tine20_tags (owner);
CREATE INDEX CONCURRENTLY tine20_tags_name_sinc ON tine20_tags (upper(name));
CREATE INDEX CONCURRENTLY tine20_tagging_tagid_sinc ON tine20_tagging (tag_id);
CREATE INDEX CONCURRENTLY tine20_preferences_account_id_sinc ON tine20_preferences (account_id);
CREATE INDEX CONCURRENTLY tine20_preferences_name_sinc ON tine20_preferences (name);
CREATE INDEX CONCURRENTLY tine20_preferences_accounttype_sinc ON tine20_preferences(account_type);
CREATE INDEX CONCURRENTLY tine20_applications_name_status_sinc on tine20_applications(name, status);
CREATE INDEX CONCURRENTLY tine20_access_log_sessionid on tine20_access_log (sessionid);
CREATE INDEX tine20_addressbook_lists_createdby_sinc ON tine20_addressbook_lists (created_by);
ALTER TABLE tine20_addressbook_lists DROP CONSTRAINT tine20_addressbook_lists_name_key;
ALTER TABLE tine20_addressbook_lists ADD CONSTRAINT tine20_addressbook_lists_created_by_name_key UNIQUE (created_by, name); 
drop INDEX tine20_applications_name_status_sinc;
drop INDEX tine20_addressbook_lists_createdby_sinc;
DROP INDEX tine20_groups_list_id;

"Não foi possível enviar Message. ( Erro: You dont have permission to create folder here.)"

1- Parar o apache
2- Deletar os arquivos de cache 
3- Iniciar o apache

ActiveSync e ExpressoMail

Para compatibilizar o módulo ActiveSync com o Expressomail se fez necessário criar atualizações em tabelas e consequentemente atualizar a versão do módulo. Mas a comunidade ainda não incorporou o Expressomail, portanto é necessário remover a atualização automática de estrutura de tabelas do módulo ActiveSync para evitar conflito de versão com a comunidade.

Toda vez que o módulo ActiveSync for instalado será necessário executar alguns comandos para atualizar o BD. Note que não será necessário executar quando o módulo ActiveSync for apenas atualizado.

QUERIES:
alter table tine20_acsync_folder add imapstatus character varying(254) not null default '';
alter table tine20_acsync_folder add lastimapmodseq integer not null default -1;
alter table tine20_acsync_content alter contentid type character varying(254);
alter table tine20_acsync_device add lastping timestamp without time zone null; 

setup.php - Desabilite o Cache

Se a opção caching for habilitada no setup.php, ocorre um erro ao selecionar o LDAP como mecanismo de backend. Para proceder a instalação sem erros, desabilite o cache no setup.php no momento da instalação.

expresso-admin + sieve

Se o usuário expresso-admin for configurado como administrador do cyrus (e do sieve portanto) ele não consiguira criar regras sieve para a conta expresso-admin@prodemge.gov.br.

Todos os outros usuários consiguiram criar suas regras normalmente.

Administração de contas

Se você tentar criar uma conta de usuário no sistema, o expresso vai até gerar o registro no LDAP, porém o userPassword estará errado. Você terá que configurar o hash do password manualmente. Você poderá gerar o hash usando o seguinte comando:

root@debian:~# slappasswd -h {MD5} -s serpro
{MD5}IABXOxAjHjYeLm2KmKMZew== 

Agora é só editar o LDAP alterando o campo userPassword e adicionando o hash! E você vai poder fazer Login com seu novo usuário!

Servidor Indisponível

O Expresso V3 pode travar em uma tela informando Servidor Indisponível. Esse é um problema de inconsistência dos caches do Expresso V3. Para solucionar remova o conteúdo do diretório /tmp/ e de um reload no browser.

rm -rf /tmp/*

Erro ao importar contas do LDAP

Se você for instalar o Expresso V3 utilizando uma base LDAP pré-existente existem alguns problemas que podem ocorrer bio setup.php => Authentication / Accounts ao importar as contas do LDAP.

  1. Se o seu gidNumber estiver fora do intervalo específicado pelo (ID do Grupo Mínimo e ID do Grupo Máximo - no Authentication / Accounts) o Expresso não checa se o gidNumber é válido (ele pula a verificação feita no passo anterior). No exemplo de LDIF existente na wiki o usuário uid=cyrus-admin possui gidNumber = 800, mas o Expresso não válida isso, pois o intervalo do gidNumber é especificado entre 900 e 999. Pois isso não é apresentado erro e foi dificíl detectar o erro do passo anterior.
  2. O V3 interrompe a instalação caso haja algum atributo telephonenumber com mais de 40 caracteres.
  3. O V3 interrompe a instalação caso existam entradas na base que contenham gidnumber de grupos não existentes;
  4. O V3 interrompe a instalação caso existam entradas (usuários, listas ou caixas corporativas) com mesmo uidnumber;
  5. As bases LDAP garantem apenas exclusividade de dn, ou seja, chave única de uid (para usuários, caixas corporativas e listas) ou cn (para grupos) apenas dentro do mesmo ramo da árvore;
  6. A configuração dos grupos no /setup é case sensitive, embora a base Ldap não o seja. O grupo precisa ter exatamente o mesmo nome informado no atributo cn do LDAP. Do contrário a instalação é refeita.
  7. O V3 interrompe a instalação caso, em uma única consulta, não conseguir baixar todas as entradas de usuário de Ldap.

CalDAV/CardDAV não funciona

Se o serviço CalDAV/CardDAV não estiver funcionando, pode haver alguma inconsistência nos grupos de usuários.

Execute o seguinte script de reparação:

php tine20.php --method=Admin.repairGroups [--domain=[DOMÍNIO]]


Alterando a configuração pelo terminal (depende da integração do ticket 15995)

Para alterar configurações pela linha de comando, há um script PHP que deve ser executado dentro da pasta do Expresso.

+Para multidomínio:+

php config.php set [nome da chave] [valor] [nome do domínio]

+Sem multidomínio:+

php config.php set [nome da chave] [valor]

Onde o valor pode ser um tipo primitivo do PHP ou um objeto JSON, neste formato:

'{"chave": "valor"}'
Ferramentas pessoais
Espaços nominais

Variantes
Ações
Navegação
Ferramentas