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()