35376d2541852919234ead8327217cd71fd030a0
2 # -*- coding: UTF-8 -*-
3 # Depends: python-mysqldb
4 # install -o root -g ejabberd -m 0750 -c auth-mysql.py /etc/ejabberd/
5 # install -o ejabberd -g adm -m 0640 -c /dev/null /var/log/ejabberd/auth-mysql.log
6 # Test: printf '\000\031isuser:moussa.nombre:test' | ./auth-mysql.py | hd
15 # TODO: transformer toute la partie gestion de BdD en une classe
16 # TODO: connexion persistente et gérer les coupures de service MySQL
23 _query
= "SELECT * FROM auforg_virtual WHERE source=%s AND LENGTH(password)>1"
25 def find_user(user
, host
):
26 global _host
, _user
, _passwd
, _db
27 db
= MySQLdb
.connect(host
=_host
, user
=_user
, passwd
=_passwd
,
28 db
=_db
, connect_timeout
=_timeout
)
29 cur
= db
.cursor(MySQLdb
.cursors
.DictCursor
)
30 nrows
= cur
.execute(_query
, ('%s@%s' % (user
,host
), ))
34 def authenticate_user(user
, host
, password
):
35 global _host
, _user
, _passwd
, _db
36 db
= MySQLdb
.connect(host
=_host
, user
=_user
, passwd
=_passwd
,
37 db
=_db
, connect_timeout
=_timeout
)
38 cur
= db
.cursor(MySQLdb
.cursors
.DictCursor
)
39 nrows
= cur
.execute(_query
, ('%s@%s' % (user
,host
), ))
40 users
= cur
.fetchall()
45 if crypt
.crypt(password
, user
['password']) == user
['password']:
50 log_file
= open('/var/log/ejabberd/auth-mysql.log', 'a')
53 nread
= sys
.stdin
.read(2)
57 now
= time
.strftime('%Y/%m/%d %H:%M:%S', time
.localtime())
59 log_file
.write('%s bytes_read=%d\n' % (now
, len(nread
)))
62 size
= struct
.unpack('>h', nread
)[0]
63 data
= sys
.stdin
.read(size
)
64 (operation
, data
) = data
.split(':', 1)
65 if operation
== 'auth':
66 (user
, host
, password
) = data
.split(':', 2)
67 log_file
.write('%s operation=%s user=%s host=%s\n'
68 % (now
, operation
, user
, host
))
70 result
= authenticate_user(user
, host
, password
)
71 elif operation
== 'isuser':
72 (user
, host
) = data
.split(':', 1)
73 log_file
.write('%s operation=%s user=%s host=%s\n'
74 % (now
, operation
, user
, host
))
76 result
= find_user(user
, host
)
77 elif operation
== 'setpass':
78 (user
, host
, password
) = data
.split(':', 2)
79 log_file
.write('%s operation=%s user=%s host=%s\n'
80 % (now
, operation
, user
, host
))
82 #result = set_user_password(user, host, password)
86 log_file
.write('%s => result=%s\n' % (now
, result
))
88 sys
.stdout
.write(struct
.pack('>hh', 2, result
and 1 or 0))
91 traceback
.print_exc(file=log_file
)
94 if __name__
== '__main__':