Admins/Messenger

De Wiki Expresso V3
Edição feita às 15h43min de 12 de junho de 2015 por Miguel (disc | contribs)

(dif) ← Edição anterior | ver versão atual (dif) | Versão posterior → (dif)
Ir para: navegação, pesquisa

Conteúdo

Guia de Instalação Messenger (rascunho)

Autores:
Daniel Coletti (original em espanhol)
Marcelo Costa Toyama (tradução e revisão)
Porto Alegre,04 de dezembro de 2013 - RS
Histórico das versões
Versão                Data          Autor
1.0 Versão            21/11/2013    Daniel Coletti
1.1 Revisão\tradução  01/04/2014    Marcelo Costa Toyama

Introdução

Este é um módulo Javascript usado para bate-papo entre usuários de expresso. Ele implementa uma biblioteca JS chamada estrofe e trabalha com BOSH - também é conhecido como XMPP sobre HTTP. Nesta implementação usamos ejabberd XMPP que é um bom servidor e permite a autenticação externa. A autenticação externa é necessária pois no expresso V3 não existe uma autenticação XMPP comum, mas sim o envio de uma série de dados conhecidos na base de dados PostgreSQL. O módulo messenger também suporta chat de vídeo, utilizando um servidor RTMFP (Tempo Real Media Fluxo Protocol) por exemplo o Cumulus (https://github.com/OpenRTMFP/Cumulus/wiki/_pages) para Linux.

Assim, para executar o módulo mensageiro precisa ser configurado :

  1.  o módulo messenger
  2. apache
  3.  ejabberd
  4.  script de autenticação personalizada para o cliente XMPP e expresso
  5.  cumulo

Configurando o Apache

No apache para fazer duas coisas, primeiro ativar módulos mod_proxy e mod_proxy_http.

# sudo a2enmod proxy
# sudo a2enmod proxy_http 

Em seguida, crie um arquivo de configuração que encaminha todas as solicitações para apache /http-bind ao servidor ejabberd (BOSH pedidos são recebidos na porta: 5280).

# sudo cd /etc/apache2/conf-available/
# sudo vi jabber.conf 

Dentro do arquivo adicione o seguinte:

ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /http-bind http://localhost:5280/http-bind
ProxyPassReverse /http-bind http://localhost:5280/http-bind 

Ative a nova configuração

# a2enconfjabber.conf

Recarrega as configurações do apache

# service apache2 reload

Configurando ejabberd

Instale e configure o ejabberd. Nesta configuração , você pode colocar as coisas básicas, como o nome do host no qual ele irá receber os pedidos (no caso deste exemplo "expresso.serpro.gov.br" ), e muito importante, o nome de usuário e a senha do administrador ejabberd. Para instalar e configurar o ejabberd no Debian utilize os comandos abaixo:

sudo apt-get install ejabberd
sudo dpkg-reconfigure ejabberd

A seguir editamos o o arquivo de configuração ejabberd (/etc/ejabberd/ejabberd.cfg). As alterações no ejabberd são :

  •  A adição de http_bind módulo BOSH de apoio
{ Modules,
 [
...
  {mod_http_bind, []},
...
] } .
  • Adicionar este módulo para a seção request_handlers porque ele não usa o mod_http_bind módulo.
  {5280, ejabberd_http [
                           {request_handlers, 
                             [
                               {["http-bind"], mod_http_bind }
                             ]
                           },
                           http_poll,
                           web_admin
                         ]
  } 
  • Coloque a autenticação é externa e indique aonde está o programa externo
{auth_method, external}.
{extauth_program, "/usr/local/bin/expresso-jabber-auth.pl"}.
  • Dê permissões para usuários locais para que eles possam conversar entre si .
{access, local, [{ allow, all}]}.
  • O arquivo de configuração completo (ejabberd.cfg)
{acl, admin, {user, "admin", "localhost"}}.
{acl, admin, {user, "expresso-admin", "localhost"}}.
{hosts, ["localhost", "serpro.gov.br"]}.
{loglevel, 5}.
{listen,
 [
  {5222, ejabberd_c2s, [
			{access, c2s},
			{shaper, c2s_shaper},
			{max_stanza_size, 65536},
                        %%zlib,
			starttls, {certfile, "/etc/ejabberd/ejabberd.pem"}
		       ]},
  {5269, ejabberd_s2s_in, [
			   {shaper, s2s_shaper},
			   {max_stanza_size, 131072}
			  ]},
  {5280, ejabberd_http, [
			{request_handlers, [
				{["http-bind"], mod_http_bind}
			]},
			http_poll,
			web_admin
			]
  }
 ]}.
{max_fsm_queue, 1000}.
{s2s_use_starttls, true}.
{s2s_certfile, "/etc/ejabberd/ejabberd.pem"}.
{auth_method, external}.
{extauth_program, "/usr/local/bin/expresso-jabber-auth.pl"}.
{shaper, normal, {maxrate, 1000}}.
{shaper, fast, {maxrate, 50000}}.
{acl, local, {user_regexp, ""}}.
{access, max_user_sessions, [{10, all}]}.
{access, max_user_offline_messages, [{5000, admin}, {100, all}]}. 
{access, local, [{allow, all}]}.
{access, c2s, [{deny, blocked},
	       {allow, all}]}.
{access, c2s_shaper, [{none, admin},
		      {normal, all}]}.
{access, s2s_shaper, [{fast, all}]}.
{access, announce, [{allow, admin}]}.
{access, configure, [{allow, admin}]}.
{access, muc_admin, [{allow, admin}]}.
{access, muc, [{allow, all}]}.
{access, register, [{deny, all}]}.
{access, pubsub_createnode, [{allow, all}]}.
{language, "en"}.
{modules,
 [
  {mod_adhoc,    []},
  {mod_announce, [{access, announce}]}, % requires mod_adhoc
  {mod_caps,     []},
  {mod_configure,[]}, % requires mod_adhoc
  {mod_admin_extra, []},
  {mod_disco,    []},
  %%{mod_echo,   [{host, "echo.localhost"}]},
  {mod_irc,      []},
  %% NOTE that mod_http_fileserver must also be enabled in the
  %% "request_handlers" clause of the "ejabberd_http" listener
  %% configuration (see the "LISTENING PORTS" section above).
  %%{mod_http_fileserver, [
  %%                       {docroot, "/var/www"}, 
  %%                       {accesslog, "/var/log/ejabberd/access.log"}
  %%                      ]},
  {mod_last,     []},
  {mod_muc,      [
		  %%{host, "conference.@HOST@"},
		  {access, muc},
		  {access_create, muc},
		  {access_persistent, muc},
		  {access_admin, muc_admin},
		  {max_users, 500}
		 ]},
  %%{mod_muc_log,[]},
  {mod_offline,  [{access_max_user_messages, max_user_offline_messages}]},
  {mod_privacy,  []},
  {mod_private,  []},
  {mod_proxy65,  [
		  {access, local},
		  {shaper, c2s_shaper}
		 ]},
  {mod_pubsub,   [ % requires mod_caps
		  {access_createnode, pubsub_createnode},
		  {pep_sendlast_offline, false},
		  {last_item_cache, false},
		  %%{plugins, ["default", "pep"]}
		  {plugins, ["flat", "hometree", "pep"]}  % pep requires mod_caps
		 ]},
  {mod_roster,   []},
  %%{mod_service_log,[]},
  {mod_shared_roster,[]},
  {mod_stats,    []},
  {mod_time,     []},
  {mod_vcard,    []},
  {mod_http_bind,[]},
  {mod_version,  []}
 ]}. 

Script de autenticação externa

Primeiramente deveremos instalar o módulo libdbd-pg-perl (Perl DBI driver for the PostgreSQL database server) para a conexão do script perl com o postgreSQL

apt-get install libdbd-pg-perl

O script de autenticação /usr/local/bin/expresso-jabber-auth.pl é chamado a partir do daemon ejabberd para autenticar uma nova conexão de um cliente. Essa comunicação vem com vários parâmetros:

  • auth
  • isuser
  • setpass
  • novo registro

O espresso javascript cliente envia a conexão com o seguinte formato:

<body rid='4101344925' xmlns='http://jabber.org/protocol/httpbind' sid='40e786d99b3cfd92907e2b279683b14c6c860fc1'/>


O script de autenticação processa os dados enviados:

  1. operação
  2. usuário - Se a configuração é expresso E-mail , vai enviar e-mail. Se o login for bem sucedido, torna-se o identificador interno para o usuário do Postgres.
  3. servidor - Este dado é o campo "Domínio" de configuração do módulo no Expresso
  4. e-mail: contact_id tabela de contas - codificados em um código Base64 </nowiki>

O script verifica se os dados correspondem (e-mail contra contact_id). Este script também é usado para autenticar o usuário administrador do ejabber (através web_admin). A porta de administração web do Ejabberd é a: 5280. O usuário de administração e a senha são:

usuário: admin@localhost
senha1: "qualquer coisa"

O script não é muito seguro a menos que você utilize TLS. Configure as variáveis de banco para os valores corretos - abaixo é só um exemplo

my $DBHOST="127.0.0.1";
my $DBNAME="expressov3";
my $DBUSER="expressopgsql";
my $DBPASS="prodemge";
my $DBPORT=5432;
my $DOMAIN = "prodemge.gov.br"; 

Coloque o script abaixo em /usr/local/bin/expresso-jabber-auth.pl)

#!/usr/bin/perl

# http://ejabberd.jabber.ru/check_pass_ldap_perl

use Sys::Syslog;
use MIME::Base64;
use DBI;

my $DBHOST="127.0.0.1";
my $DBNAME="expressov3";
my $DBUSER="expressopgsql";
my $DBPASS="prodemge";
my $DBPORT=5432;
my $DOMAIN = "prodemge.gov.br";

my $SQLQUERY = "SELECT email FROM tine20_accounts WHERE contact_id=?;";
my $ISUSERSQLQUERY = "SELECT id FROM tine20_accounts WHERE login_name=?;";

my $dbh =  DBI->connect("dbi:Pg:dbname=$DBNAME;host=$DBHOST;port=$DBPORT", $DBUSER, $DBPASS)
        or die $DBI::errstr;


openlog "ejabberd_auth", "ndelay,pid", "user" or die "Cannot open syslog\n";

while(1){

    my $buf = "";
    my $nread = sysread STDIN,$buf,2;

    do { syslog LOG_INFO,"port closed"; exit; } unless $nread == 2;
    my $len = unpack "n",$buf;
    my $nread = sysread STDIN,$buf,$len;

    my ($op,$user,$domain,$password) = split /:/,$buf;

    # Filter dangerous characters
    $user =~ s/[\n\r]//g;
    $password =~ s/[\n\r]//g;
    $domain =~ s/[\n\r]//g;
    
    my $jid = "$user\@$domain";
    my $result=0;
    my $res;

    syslog('info',"option: %s", $op);

    SWITCH:
    {
      $op eq 'auth' and do
      {
	if (($user eq "admin") && ($domain eq "localhost")) {
            $result = 1;
	} else {
			my ($contact_id,$email) = split /:/,decode_base64($password);
			   
			syslog('info',"Decoded contact_id (%s) email(%s)", $contact_id, $email);
			my $sth = $dbh->prepare($SQLQUERY) or warn($dbh->errstr);
			#syslog ('info', 'SQLQUERY(%s) username=(%s)', $SQLQUERY,$user); 
			#$sth->execute($user);
			syslog ('info', 'SQLQUERY(%s) contact_id=(%s)', $SQLQUERY,$contact_id); 
			$sth->execute($contact_id);
			my @row = $sth->fetchrow_array;
			syslog ('info', 'rows (%s)', $#row); 
			syslog ('info', 'row[0](%s) =? email(%s)', $row[0],$email); 
			$sth->finish;
			if (!@row){ 
			    syslog('info', 'username not found');
			    #print MYFILE "       >>>>username not found       ";
			} elsif ($row[0] ne $email) {
			    syslog('info', 'wrong email address');
			    #print MYFILE "       >>>>>> wrong email address      ";
			} else {
			    syslog('info', 'email match');
			    #print MYFILE "       >>>>>> email match       ";
			    $result = 1;
			}
	}

      },last SWITCH;

      $op eq 'setpass' and do
      {
	 syslog('info', 'ignoring setpass request');
	 $result = 0;
      },last SWITCH;
      $op eq 'isuser' and do
      {
                syslog ('info', 'isuser: op (%s), username(%s)', $op, $user); 
                my $sth = $dbh->prepare($ISUSERSQLQUERY);
                $sth->execute($user);
                my @row = $sth->fetchrow_array;
                syslog ('info', 'rows (%s)', $#row); 
                syslog ('info', 'row[0](%s) ', $row[0]); 
                $sth->finish;
                if (!@row) {
                    syslog('info', 'username not found');
		    $result = 1; # for now, username can be different from login_name
                } else {
                    syslog('info', 'username found');
                    $result = 1;
                }

      },last SWITCH;
    };
    #$result = 0 if $domain ne "sample";   
    my $out = pack "nn",2,$result ? 1 : 0;
    syswrite STDOUT,$out;
}

closelog;
exit 0;


De permissão de execução para o script

chmod 755 /usr/local/bin/expresso-jabber-auth.pl

Instalação Cumulus

Faça a copia do repositorio git do Cumulus

# git clone https://github.com/OpenRTMFP/Cumulus.git


1) Para funcionamento do Cumulus com o Expresso 3.0, após a instalação do Cumulus (github.com/OpenRTMFP/Cumulus/wiki/FAQ), é necessário criar o arquivo (com permissão para execução) ...DiretorioDoCumulus/CumulusServer/www/main.lua com o seguinte conteúdo:

function onConnection(client,...) 
 function client:relay(targetId,...) 
 target = cumulus.clients(targetId) 
 if not target then 
 error("client '"..targetId.."' not found") 
 return 
 end 
 target.writer:writeAMFMessage("onRelay",self.id,...) 
 target.writer:flush(true) 
 end 
end 

2) Você utilizou a porta 1985 na configuração do Cumulus?

Se sim, a url: rtmfp://:1985/ está correta.
Se deixou a porta padrão, utilize: rtmfp://:1935/

3) Portas necessárias para conectividade (UDP):

Clientes flash <-> Cumulus Server: Porta 1935 e 10000...10100 UDP
Clientes flash <-> Clientes Flash: Portas 1024..65535 UDP

Configuração Expresso

Digite o usuário administrativo (normalmente admin-expresso) Ir para Administração → Configurações → Aplicações → Messenger:

Domínio: <host>
Resource: qualquer coisa
Formato: E-mail Nome
Endereço do servidor Videochat: rtmfp://<host>:1935 (aqui deve haver um servidor RTMFP como Cumulus)
Arquivos temporários: /tmp

notas

Software Ejabberd é muito flexível e tem muitas possibilidades.

Recomenda-se a entender completamente a sua configuração, porque você tem que manter o registro está aberto (no exemplo, está diretamente removeu o módulo de registro), os usuários não podem alterar a senha também.

Mod_shared_roster_ldap é um módulo que pode ser muito útil para os usuários do expresso. Com ele é possível listar todos os usuários do sistema sem ter que adicioná-los manualmente.

Apesar de todo o sistema de mensagens instantâneas tem melhor desempenho, você deve manter o nível de log baixos para não compromenter o desempenho..

As informações de depuração estão em:

  • /var/log/ejabberd/ejabberd.log (ejabberd)
  •  /var/log/ auth.log (roteiro autenticação externa)
Ferramentas pessoais
Espaços nominais

Variantes
Ações
Navegação
Ferramentas