Alisson Machado
21 June 2016

Python - Zimbra Preauth

Esses dias precisei realizar uma integração entre Zimbra e Python. Para fazer isso é necessário seguir alguns procedimentos. O primeiro passo é gerar a Preauth Key no zimbra, a documentação pode ser encontrada no site oficial: https://wiki.zimbra.com/wiki/Preauth Basicamente é rodar o seguinte comando:
 zmprov generateDomainPreAuthKey alissonmachado.com.br
 preAuthKey: 4e2816f16c44fab20ecdee39fb850c3b0bb54d03f1d8e073aaea376a4f407f0c
Agora pra gerar a url de preauth, podem ser seguidos os seguintes procedimentos:
#!/usr/bin/python

from datetime import datetime
from hashlib import sha1
import hmac
import time

domain = "alissonmachado.com.br"
preauth = "4e2816f16c44fab20ecdee39fb850c3b0bb54d03f1d8e073aaea376a4f407f0c"
expires = 0
timestamp = int(time.mktime(datetime.now().timetuple()))*1000
by = "name"
string = "%s|%s|%s|%s"%(account,by,expires,timestamp)


pre = hmac.new(preauth_key,string,sha1).hexdigest()

print "https://%s/service/preauth?account=%s&expires=%s×tamp=%s&preauth=%s"%(domain,account,expires,timestamp,pre)

Agora explicando o código acima. A pre autenticação do zimbra, serve para que possamos autenticar no zimbra como se fosse um determinado usuário sem a necessidade do login e da senha dele. Um exemplo muito comum seria ao gerar um painel administrativo, onde um analista de suporte pode verificar a conta de outros usuários mas não precisa da senha dele. A pre autenticação espera 5 valores: Expires - Deve receber o tempo em que a sessão vai expirar, esse tempo é definido pela própria administração do zimbra, no caso colocamos 0 pois não queremos definir esse tempo, o próprio zimbra se encarregará disso. name - Será o criterio de busca dentro da base do zimbra, name é o valor padrão. Preauth - Essa é a chave gerada com os comandos do próprio zimbra conforme a documentação. Timestamp - É a data e hora atual em timestamp, o zimbra só aceita a autenticação por preauth se a diferença do timestamp e a data atual for menor do que 5 minutos. Account - é uma conta de email valida no zimbra. Agora pra gerar a chave precisamos que esses 4 valores estejam na seguinte ordem: email|name|expires|timestamp Uma vez que isso foi definido em uma string, deve ser gerado um hash utilizando a criptografia SHA1, e esse HASH será usado na URL. A instrução responsável para isso é a seguinte:
pre = hmac.new(preauth_key,string,sha1).hexdigest()