Danton Dorati mais uma vez contribuiu com um belo artigo, que com certeza irá ajudar boa parte dos usuários da comunidade BSD. Com um artigo bem detalhado, ele deixa claro sobre a implementação de um Servidor de Mensagens Instatâneas muito utilizado, o Jabber, principalmente em intranets de empresas de diversos segmentos, para comunicação interna dos usuários.
Jabber é um protocolo aberto, com bases XML, para sistemas de mensagens instantâneas. Software com base nesse protocolo soa distribuído em milhares de servidores através da internet, e usado por cerca de dez milhões de pessoas em todo mundo, de acordo com a Fundação Jabber Software, para mais informações veja o link completo.
Softwares utilizados no ambiente deste artigo: · FreeBSD 6.2 – RELEASE-p2 (STABLE) · Jabberd-2.0.11_2 · OpenLDAP-Server-2.3.34 · OpenSSL 0.9.7e-p1 · MySQL-Client-5.0.33 · MySQL-Server-5.0.33 · BSDpan-Perl-LDAP-0.34 · p5-DBD-MySQL-4.001 Atualizando seu ports
# portsnap fetch extract # portsnap update É necessário que sua coleção ports esteja atualizada para que utilize as ultimas versões dos pacotes, pois pode haver também correções de bugs e novos patch's, assim nosso servidor estará mais seguro e mais eficiente sem possíveis erros.
Definindo um hostname para seu servidor LDAP e MySQL
# ee /etc/hosts
Esta configuração possibilita que você atribua um hostname + domain (FQDN = Fully Qualified Domain Name) a seu IP, assim não precisando colocar números, ficando assim com uma aparência mais agradável e mais funcional, pois se decora com mais facilidade nomes.
O arquivo terá a seguinte sintaxe: 127.0.0.1 localhost.domain.org localhost IP-do-FreBSD hostname.domain.org hostname Instalando o jabberd versão 2 via ports # cd /usr/ports/net-im/jabberd # make install clean
Marque APENAS a opção de Suporte ao MySQL. Depois de finalizada a instalação do Servidor Jabber vamos passar para instalação e configuração do LDAP. Você deve estar se perguntando "porque não configurar o Jabberd agora?" Logo à frente tenho certeza que entenderá o motivo.
Instalando o OpenLDAP via ports e configurando-o
# cd /usr/ports/net/openldap24-server # make install clean Marque as seguintes opções: Suporte à TCP Wrapper, Suporte à BerkeleyDB e SLURPD. Após o termino da compilação e da instalação vamos gerar chaves de criptografia e uma senha encriptada.
# cd /usr/local/etc/openldap
Certificado para a função "Server"
# openssl genrsa -des3 -out server.key 4096 Enter pass phrase for server.key: <Digite a senha que deseja colocar em slapd.conf.> Verifying - Enter pass phrase for server.key: < Redigite a mesma senha. >
# openssl rsa -in server.key -out server.key Enter pass phrase for server.key: <Novamente a mesma senha> # openssl req -new -key server.key -out server.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:BR State or Province Name (full name) [Some-State]:SP Locality Name (eg, city) []:Bebedouro Organization Name (eg, company) [Internet Widgits Pty Ltd]:EMPRESA Organizational Unit Name (eg, section) []: Digite <ENTER> Common Name (eg, YOUR name) []:urisso Email Address []:
Este endereo de e-mail est sendo protegido de spam, voc precisa de Javascript habilitado para v-lo
Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:system An optional company name []: Digite <ENTER> # openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.csr Signature ok subject=/C=BR/ST=SP/L=Bebedouro/O=EMPRESA/CN=urisso/emailAddress=
Este endereo de e-mail est sendo protegido de spam, voc precisa de Javascript habilitado para v-lo
Getting Private key Certificado para a função "client"
# openssl genrsa -des3 -out client.key 1024 Enter pass phrase for client.key: <Digite a senha usada anteriormente.> Verifying - Enter pass phrase for client.key:<Mais uma vez a mesma senha.>
# openssl rsa -in client.key -out client.key Enter pass phrase for client.key:<Você deve estar cansado já de ouvir falar pra digitar a senha, mas faça isso agora novamente.> writing RSA key # openssl req -new -key client.key -out client.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:BR State or Province Name (full name) [Some-State]:SP Locality Name (eg, city) []:Bebedouro Organization Name (eg, company) [Internet Widgits Pty Ltd]:EMPRESA Organizational Unit Name (eg, section) []: Digite <ENTER> Common Name (eg, YOUR name) []:urisso Email Address []:
Este endereo de e-mail est sendo protegido de spam, voc precisa de Javascript habilitado para v-lo
Please enter the following 'extra' attributes o be sent with your certificate request A challenge password []:system An optional company name []: Digite <ENTER> # openssl x509 -req -days 365 -in client.csr -signkey client.key -out client.csr Signature ok subject=/C=BR/ST=SP/L=Bebedouro/O=EMPRESA/CN=urisso/emailAddress=
Este endereo de e-mail est sendo protegido de spam, voc precisa de Javascript habilitado para v-lo
Getting Private key
Criando uma senha encriptada
# slappasswd -s SENHA {SSHA}zK+i59AN3hXRF3EnSxgwQKOfVKaXrnLo
Arquivo de configuração do servidor LDAP ############################################################# # /usr/local/etc/openldap/slapd.conf
# Veja slapd.conf(5) para mais detalhes e opção de configuração. Include /usr/local/etc/openldap/schema/core.schema include /usr/local/etc/openldap/schema/cosine.schema include /usr/local/etc/openldap/schema/inetorgperson.schema referral ldaps://hostname.domain.org pidfile /var/run/openldap/slapd.pid argsfile /var/run/openldap/slapd.args #Modulos modulepath /usr/local/libexec/openldap moduleload back_bdb moduleload back_ldap # Definicoes do banco de dados BDB database bdb suffix "dc=domain,dc=org" rootdn "cn=urisso,dc=domain,dc=org"
# Não é aconselhável que use senha do tipo clear text. # Utilize senhas criptografadas, para isso basta copiar # e colar logo abaixo a chave resultante do comando # digitado acima ( slappasswd -s SENHA ) rootpw UA82yYo9+9WBlmuAE20hlqPa0deJxlOn directory /var/db/openldap-dataindex objectClass eq
# Chave de criptografia do servidor TLSCertificateFile /usr/local/etc/openldap/server.csr TLSCertificateKeyFile /usr/local/etc/openldap/server.key TLSVerifyClient 0 ############################################################# Arquivo de configuração do cliente LDAP ############################################################# #/usr/local/etc/openldap/ldap.conf
# Veja ldap.conf(5) para mais detalhes host hostname.domain.org BASE dc=domain, dc=org URI ldaps://hostname.domain.org ldaps://hostname.domain.org:636 port 636 ssl true
# Chave de criptografia do cliente TLS_CERT /usr/local/etc/openldap/client.csr TLS_KEY /usr/local/etc/openldap/client.key TLS_REQCERT never SIZELIMIT 12 TIMELIMIT 15 DEREF never ############################################################
Vamos criar uma base inicial para o LDAP em um arquivo *.ldif onde ficará as informações quando formos carregar pela primeira vez o DB.
# touch base.ldif
O arquivo terá o conteúdo semelhante as este: ############################################################# dn: dc=domain,dc=org dc: domain objectClass: top objectClass: domain dn: cn=urisso,dc=domain,dc=org objectclass: organizationalRole cn: urisso ############################################################# Agora basta adicionar o conteúdo do arquivo ldif ao db do slapd com o comando:
# /usr/local/libexec/slapd -h "ldaps:///" -4 -d 4 &
# ldapadd -x -D cn=urisso,dc=domain,dc=org -W -f base.ldif -h hostname.domain.org Com o comando acima estamos executando o daemon do LDAP (slapd) em modo interativo e debugado em nível 4.
Agora vamos aos testes:
# ldapsearch -x -ZZ -h IP-do-FreeBSD
Caso você tenha configurado seu hostname, altere o comando acima, ao invés de IP-do-FreeBSD coloque hostname.domain.org
Instalando MySQL via ports e configurando:
# cd /usr/ports/databases/mysql50-server # make install clean
Obs: Caso seu shell seja csh, então de um rehash de antes continuar:
Agora é só por o MySQL para funcionar.
Criando as databases do sistema:
# mysql_install_db
Ajustando o dono do diretório do MySQL para o próprio:
# chown -R mysql:mysql /var/db/mysql
Subindo o serviço do MySQL: # mysqld_safe &
Configurando usuário root no MySQL:
# /usr/local/bin/mysqladmin -u root password 'crie-sua-senha-do-root'
Preparando o MySQL para receber os dados do Jabberd2. Edite o arquivo /usr/local/share/jabberd/db-setup.mysql e adicione as seguintes linhas para o script possa inserir juntamente com sua estrutura de tabelas um novo usuário para acessar sua database. O arquivo modificado ficará algo parecido com isso.
CREATE DATABASE jabberd2; USE jabberd2; GRANT ALL ON jabberd2.* TO jabberd2@localhost IDENTIFIED BY "senha_do_user_jabberd2"; ... Depois de fazer a alteração no script basta adicionar a estrutura à DATABASE no MySQL
# mysql -u root -p < /usr/local/share/jabberd/db-setup.mysql
Configurando o Jabberd2
As configurações que se seguem são especificas para o funcionamento correto do servidor Jabber + LDAP (Pipe script) + SSL + MySQL , logo você notará que algumas linhas não haverão comentários, isso porque não há necessidade de alterar todo o conteúdo dos arquivos padrões, afinal ficaria muito extenso e gastaria um bom tempo para fazê-lo, coisa que não quero e nem posso, afinal estou matando meu serviço para fazer esse artigo e pretendo publicá-lo o mais rápido possível mas não deixando de lado uma boa explicação para "funfar redondinho" em nosso servidor.
Dica: Caso queira ver um uma boa explicação destes edite os arquivos *.conf.dist dentro de /usr/local/etc/jabberd.
Arquivo de configuração do servidor C2S
# cd /usr/local/etc/jabberd # rm c2s.conf && touch c2s.conf # chown jabber:jabber c2s.conf ############################################################ <!-- Configuração do servidor c2s --> <c2s> <!-- ID do servidor quando estiver rodando (padrão: c2s) --> <id>c2s</id> <!-- Local onde ficara o arquivo pidfile do servidor c2s --> <pidfile>/var/jabberd/pid/c2s.pid</pidfile> <router> <ip>127.0.0.1</ip> <!-- default: 127.0.0.1 --> <port>5347</port> <!-- default: 5347 --> <!-- Arquivo que conterá as informações do certificado SSL e chave privada que quando habilitado fará tunnel encriptado. --> <pemfile>/usr/local/etc/jabberd/server.pem</pemfile> <retry> <sleep>2</sleep> </retry> </router>
<!-- Configuração do log - o tipo de log pode ser "syslog", "file" ou "stdout" --> <log type='syslog'> <!-- Se usar syslog, aqui será a identificao do log --> <ident>jabberd/c2s</ident> <facility>local3</facility> <!-- se usar o "file", aqui você ira setar o nome e o local do arquivo log --> <file>/var/jabberd/log/c2s.log</file> </log>
<!-- Configuração do servidor local --> <local> <id>hostname.domain.org</id> <!-- IP que o servidor ouvira (Padrão: 0.0.0.0) --> <ip>0.0.0.0</ip> <!-- Porta que o servidor ouvira, ou 0 para desativá-la, mas essa porta não passarão os dados encriptados então vamos desativar. (padrão: 5222) --> <port>0</port> <pemfile>/usr/local/etc/jabberd/server.pem</pemfile>
<!-- Porta SSL a qual o servidor jabber ouvira e que os dados encriptados usarão como rota. (padrão: 5223) --> <ssl-port>5223</ssl-port> </local> <io> <max_fds>1024</max_fds> <limits> <bytes>0</bytes> <connects>0</connects> </limits> <access> <!-- Checka a ordem de verificação (padrão: allow,deny) allow,deny - Check primeiro as "REDEs/IPs" que estão em "allow". --> <!-- Depois passa a checar os que estão em "deny". [ deny,allow - Inverso de allow,deny ] --> <order>allow,deny</order>
<!-- Se a mascara de sub-rede nao for especificada o padrão que o servidor aceita conexões eh 255.255.255.255 --> <allow ip='0.0.0.0' mask='255.0.0.0'/> <!-- Aceita conexões vindas do IP setado abaixo --> <allow ip='0.0.0.0'/> <!-- Nega acesso ao servidor, os IPs que estiveram setado nessa linha --> <deny ip='127.0.0.1' mask='255.0.0.0'/> <deny ip='87.65.43.21'/> </access> <check> <interval>0</interval> <idle>0</idle> <keepalive>0</keepalive> </check> </io> <!-- Configuração de autenticação e registro de users e mensagens no banco de dados --> <authreg> <!-- Modulo backend para usar --> <module>mysql</module> <!-- Configuração de registro --> <register> <!-- Caso nao queira que registro dos usuários seja feita automaticamente comente essa linha, mas você terá que ter certo conhecimento nos comandos do --> <!-- MySQL e da sua estrutura para que possa registrar os users manualmente --> <enable/> <instructions>Coloque um username e um password para registrá-lo.</instructions> <!-- <password/> --> </register> <mechanisms> <traditional> <plain/> <digest/> <zerok/> </traditional> <sasl> <plain/> <digest-md5/> <!-- <anonymous/> --> </sasl> </mechanisms> <!-- Configuração do module MySQL --> <mysql> <!-- Database server host and port --> <host>localhost</host> <port>3306</port>
<!-- Nome do DB --> <dbname>jabberd2</dbname>
<!-- Usuário e senha pra logar no servidor mysql --> <user>jabberd2</user> <pass>senha_do_user_jabberd2</pass> </mysql>
<!-- Configuração do modulo Pipe --> <pipe> <!—Script de autenticação --> <exec>/usr/local/etc/jabberd/pipe-auth.pl</exec> </pipe> </authreg></c2s> #############################################################
Arquivo de configuração do servidor Session Mamager
# rm sm.conf && touch sm.conf # chown jabber:jabber sm.conf
############################################################# <!-- Configuração do Session manager--><sm> <!-- Coloque ai seu hostname --> <id>hostname.domain.org</id>
<!-- Define onde o pidfile ficara e qual o nome. --> <pidfile>/var/jabberd/pid/sm.pid</pidfile> <router> <ip>127.0.0.1</ip> <port>5347</port> <pemfile>/usr/local/etc/jabberd/server.pem</pemfile> <retry> <init>3</init> <lost>3</lost> <sleep>2</sleep> </retry> </router> <!-- Configuração de log - o método para logar poderá ser "syslog", "file" ou "stdout" --> <log type='syslog'> <!-- Se usar método syslog, aqui será a identificao do log --> <ident>jabberd/c2s</ident> <facility>local3</facility>
<!-- se usar método o "file", aqui você ira setar o nome e o local do arquivo log --> <file>/var/jabberd/log/c2s.log</file> </log>
<!-- Configuração do banco de dados--> <storage> <driver>mysql</driver>
<!-- Configuracao do driver MySQL --> <mysql> <!-- Servidor e porta do MySQL --> <host>localhost</host> <port>3306</port>
<!-- Nome do banco de dados --> <dbname>jabberd2</dbname>
<!-- Nome do usuário e senha do MySQL --> <user>jabberd2</user> <pass>senha_do_user_jabberd2</pass> <transactions/> </mysql> </storage> <aci> <acl type='all'> <jid>
Este endereo de e-mail est sendo protegido de spam, voc precisa de Javascript habilitado para v-lo
</jid> </acl> </aci> <modules> <chain id='sess-start'/> <chain id='sess-end'> <module>iq-last</module> </chain> <chain id='in-sess'> <module>validate</module> <!-- validate packet type --> <module>privacy</module> <!-- manage privacy lists --> <module>roster</module> <!-- handle roster get/sets and s10ns --> <module>vacation</module> <!-- manage vacation settings --> <module>iq-vcard</module> <!-- store and retrieve the user's vcard --> <module>iq-private</module> <!-- manage the user's private data store --> <module>disco</module> <!-- respond to agents requests from sessions --> <module>offline</module> <module>announce</module> <!-- deliver motd --> <module>presence</module> <!-- process and distribute presence updates --> <module>deliver</module> <!-- deliver packets with full jids directly --> </chain> <chain id='out-sess'/> <chain id='in-router'> <module>session</module> <!-- perform session actions as required by c2s --> <module>validate&;lt;/module> <!-- validate packet type --> <module>presence</module> <!-- drop incoming presence if user not online --> <module>privacy</module> </chain> <chain id='out-router'> <module>privacy</module> </chain> <chain id='pkt-sm'> <module>iq-last</module> <!-- return the server uptime --> <module>iq-time</module> <!-- return the current server time --> <module>iq-version</module> <!-- return the server name and version --> <module>disco</module> <module>announce</module> <module>help</module> <!-- resend sm messages to administrators --> <module>echo</module> <!-- echo messages sent to /echo --> </chain> <chain id='pkt-user'> <module>roster</module> <!-- handle s10n responses --> <module>presence</module> <module>iq-vcard</module> <!-- grab user vcards --> <module>deliver</module> <module>vacation</module> <!-- send vacation messages --> <module>offline</module> <!-- save messages and s10ns for later --> <module>disco-publish</module> <module>iq-last</module> <!-- return time since last logout --> </chain> <chain id='pkt-router'> <module>session</module> <!-- take sessions offline their c2s disappears --> <module>disco</module> </chain> <chain id='user-load'> <module>active</module> <!-- get active status --> <module>roster</module> <!-- load the roster and trust list --> <module>privacy</module> <!-- load privacy lists --> <module>disco-publish</module> <!-- load published information --> <module>vacation</module> <!-- load vacation settings --> </chain> <chain id='user-create'> <module>active</module> <!-- activate new users --> <module>template-roster</module> <!-- populate roster from template --> </chain> <chain id='user-delete'> <module>active</module> <!-- deactivate users --> <module>announce</module> <!-- delete motd data --> <module>disco-publish</module> <!-- delete published information --> <module>offline</module> <!-- bounce queued messages --> <module>privacy</module> <!-- delete privacy lists --> <module>roster</module> <!-- delete roster --> <module>vacation</module> <!-- delete vacation settings --> <module>iq-last</module> <!-- delete last logout time --> <module>iq-private</module> <!-- delete private data --> <module>iq-vcard</module> <!-- delete vcard --> </chain> </modules> <discovery> <identity> <category>server</category> <type>im</type> <name>Jabber IM server</name> </identity> <agents/> <items> </items> </discovery> <!-- User options --> <user> <!-- <auto-create/> -->
<template> <!-- <roster>/usr/local/etc/jabberd/templates/roster.xml</roster> --> </template> </user> </sm> ############################################################# Configurando o Jabberd para utilizar um pacote de autenticação e armazenamento de dados externo. O Jabberd pode efetuar autenticação de diversas maneiras: MySQL, PostgreSQL, LDAP e Pipe. Nesse caso usaremos o script Pipe. Preparando a autenticação redirecionamento para um Script:
Os seguintes modulos perl devem serem instalados via MCPAN: · Net::LDAP::Control · Net::LDAP · Net::LDAPS · MIME::Base64 · Unix::Syslog · DBI # perl -MCPAN -e 'install Net::LDAP::Control' # perl -MCPAN -e 'install Net::LDAP' # perl -MCPAN -e 'install MIME::Base64' # perl -MCPAN -e 'install Unix::Syslog' # perl -MCPAN -e 'install DBI' # perl -MCPAN -e 'install DBD::mysql' # perl -MCPAN -e 'install IO::Socket::INET'
Para gerar a chave SSL server.pem deve-se ser seguidos os comandos: # openssl req -new -x509 -newkey rsa:1024 -days 3650 -keyout privkey.pem -out server.pem # openssl rsa -in privkey.pem -out privkey.pem # cat privkey.pem >> server.pem
# rm privkey.pem
# chown jabber:jabber server.pem # chmod 640 server.pem
Logo abaixo tem um arquivo modelo de script Pipe. Esse arquivo será o responsável em fazer o intermédio do LDAP com MySQL, é um script pré-configurado que pode ser baixado através desse link. Você poderá comparar com esse que disponibilizei no artigo caso tenha alguma dificuldade na configuração do mesmo.
# touch pipe-auth.pl # chown jabber:jabber pipe-auth.pl # chmod +x pipe-auth.pl
Arquivo de autenticação
############################################################# #!/usr/local/bin/perl -w use strict; use Net::LDAP; use Net::LDAP::Control; use DBI; my ($debug, $sth, $entry, $dept, $s, $query, $rosteritem, $rostergroup,@roster, $inneritem, $res); my $basedn = "dc=domain,dc=org"; my $ldapserver = "hostname.domain.org"; my $disname = "cn=urisso,dc=domain,dc=org"; my $ldappass = "SENHA"; my $dbuser = "jabberd2"; my $dbpass = "senha_do_user_jabberd2"; my $dbname = "jabberd2"; my $dbh = DBI->connect("DBI:mysql:database=$dbname;host=localhost",$dbuser, $dbpass);
my $ldap = Net::LDAP->new ( $ldapserver, debug => 0 ) or die "$@"; my $mesg = $ldap->bind ($disname, password => $ldappass, version => 3 ) or die "Cannot bind to ldap server. $!";
die $mesg->error if $mesg->code;
# query the department names my $search = $ldap->search( base => "$basedn", scope => "one", filter => "(&(objectClass=organizationalUnit) )" );
# fetch the department names foreach $entry ($search->entries) { $dept = $entry->get_value('name'); print "\n\n Dept: $dept \n\n";
fetchperson("ou=$dept,$basedn", "one", "$dept");
# query the first department level names $s = $ldap->search( base => "ou=$dept,$basedn", scope => "one", filter => "( & (objectClass=organizationalUnit) )" ); die $s->error if $s->code; }
$ldap->unbind;
# delete everything in roster-items and roster-groups # start with a clean page $query = "DELETE FROM `roster-items`"; $dbh->do("$query") or die ("Cannot delete roster-items!\n"); $query = "DELETE FROM `roster-groups`"; $dbh->do("$query") or die ("Cannot delete roster-groups!\n"); # now that the @roster array is ready, populate the rosters foreach $rosteritem (@roster) { print STDERR "\n\n" . $rosteritem->{'jid'} . "is in " . $rosteritem->{'role'} if $debug; foreach $inneritem (@roster) { if($debug) { print STDERR "\n|_____" . $inneritem->{'jid'} unless $rosteritem->{'jid'} eq $inneritem->{'jid'} ; }
# the following two statements add the roster-groups (Dept Names or Buddy Groups etc) # and also take care of adding each user to every users' rosters without the need to authorize them manually $query = "INSERT INTO `roster-items` SET `collection-owner` = " . $dbh->quote($rosteritem->{'jid'}) . ", jid = " . $dbh->quote($inneritem->{'jid'}) . ", name = " . $dbh->quote($inneritem->{'name'}) . " , `to` = 1, `from` = 1, ask = 0 "; $sth = $dbh->prepare($query); $sth->execute or die("Cannot execute query! ($!)");
$query = "INSERT INTO `roster-groups` SET `collection-owner` = " . $dbh->quote($rosteritem->{'jid'}) . ", jid = " . $dbh->quote($inneritem->{'jid'}) . ", `group` = " . $dbh->quote($inneritem->{'rostergroup'}) ; $sth = $dbh->prepare($query); $sth->execute or warn("Cannot add roster group! ($!)"); } }
#### SUBS ####
sub updatevcard { $res = shift; $rostergroup = shift;
my $collection_owner = $res->get_value('sAMAccountName') . '@' . 'jabber.yourdomain.com'; my $email = $res->get_value('mail'); my $org_orgname = $res->get_value('l'); my $org_orgunit = $res->get_value('department'); my $tel = $res->get_value('telephoneNumber'); my $title = $res->get_value('title'); my $role = $res->get_value('description'); my $nickname = $res->get_value('givenName'); my $adr_locality = $res->get_value('physicalDeliveryOfficeName'); my $adr_region = $res->get_value('st'); my $fn = $res->get_value('displayName');
$query = "REPLACE INTO vcard SET `collection-owner` =" . $dbh->quote($collection_owner) . ", fn = " . $dbh->quote($fn) . ", nickname = " . $dbh->quote($nickname) . ", email = " . $dbh->quote($email) . ", title = " . $dbh->quote($title) . ", role = " . $dbh->quote($role) . ", `adr-locality` = " . $dbh->quote($adr_locality) . ", `adr-region` = " . $dbh->quote($adr_region) . ", `org-orgname` = " . $dbh->quote($org_orgname) . ", `org-orgunit` = " . $dbh->quote($org_orgunit) . ", `desc` = " . $dbh->quote($rostergroup) ;
$sth = $dbh->prepare($query) or die("Cannot prepare database query! ($!)"); $sth->execute or die("Cannot execute database query! ($!) \n $query"); $sth->finish; print STDERR $collection_owner . "\n" if $debug;
push @roster , {"jid" => $collection_owner, "name" => $fn, "rostergroup" => $rostergroup}; }
sub fetchperson { my $searchdn = shift; my $scope = shift; my $rostergroup = shift; my ($pers, $person) ;
# query the user names my $us = $ldap->search( base => "$searchdn", scope => "$scope", filter => "( & (objectClass=person) (mail=*) )" ); die $us->error if $us->code;
# fetch the usernames foreach $pers ($us->entries) { $person = $pers->get_value('cn'); print "\t\t|___" . $person . "\n"; updatevcard($pers,$rostergroup); } } ############################################################ Para iniciarmos o serviço basta executar o comando jabberd mas como ainda é primeira vez que você ira subir o processo aconselho que rode o servidor Jabbber com a opção -D, ou seja em modo debug para visualizar quaisquer erros possíveis. Mas antes, use o comando sockstat para saber quais portas estão abertas em seu servidor e veja se o processo slapd está rodando e escutando na porta 636 (SSL), caso não re-execute-o ( # /usr/local/libexec/slapd -h "ldaps:///" -4 -d 4 & ), lembrando que com esse comando você irá executar o servidor LDAP e modo depurado.
# sockstat -4l |grep slapd root slapd 1460 6 tcp4 *:636 *:* # jabberd -D
Agora vamos habilitar no rc.conf os serviços MySQL, LDAP e Jabberd para sejam executados no momento do boot do sistema. Adicione as seguintes linhas: jabberd_enable="YES" jabberd_chdir="/var/jabberd/pid" jabberd_user="jabber" slapd_enable="YES" slapd_flags="-h ldap:/// ldaps:/// -4" mysql_enable="YES"
Configurando um Client Jabber Windows
Baixe o instalador do Gaim e instale-o.
Execute o aplicativo, abrirá 3 janelas provavelmente isso se for a mesma versão usada por mim que se encontra no link acima. Vá na aba Contas e clique em Adicionar, um pop-up irá aparecer em seguida. Nessa pop-up (“Adicionar conta”) selecione o Protocolo: Jabber, em Nome de usuário: coloque um username qualquer, em Servidor: logicamente seu hostname ou IP do servidor Jabber que acabamos de configurar, no campo Senha: atribua uma senha qualquer. Logo abaixo do ultimo campo preenchido há uma opção minimizada (“Mostrar mais opções”), desmarque a primeira caixa (“Usar TLS se disponível”) e em seguida marque Forçar SSL antigo. Clique em Registrar, abrirá uma barra de progresso do processo de conexão com o Servidor Jabber, se tudo ocorrer bem aparecerá uma mensagem de que você foi registrado com sucesso, e fianalmente clique em Conectar.
Nota: *Os locais que houverem urisso altere-os por um nickname desejado ( sugiro admin ). Obs: Caso haja algum problema com o hostname.domain.org substitua pelo IP-do-FreeBSD. Danton Dorati -
Este endereo de e-mail est sendo protegido de spam, voc precisa de Javascript habilitado para v-lo
|