Fix server crash on acl block. Update acl on login.

This commit is contained in:
Maurizio Porrato 2011-01-22 21:38:06 +00:00
parent 9929d03364
commit 02b1c0209c
2 changed files with 18 additions and 2 deletions

View File

@ -142,6 +142,8 @@ class ClientTracker(object):
client.user.M = 0 client.user.M = 0
if not self.canLogin(client.user): if not self.canLogin(client.user):
client.role = "BLOCK" client.role = "BLOCK"
else:
self.aclUpdate(client.user)
if client.user.EA in self._admin: if client.user.EA in self._admin:
client.role = "ADMIN" client.role = "ADMIN"
self._admin[client.user.EA].update(client.user.dict()) self._admin[client.user.EA].update(client.user.dict())
@ -271,6 +273,16 @@ class ClientTracker(object):
l[email].AI = 1 l[email].AI = 1
self._setAcl(network, oac, otx, l) self._setAcl(network, oac, otx, l)
def aclUpdate(self, user):
network = user.NT
email = user.EA
ac, tx, l = self._getAcl(network)
if email in l:
old = l[email]
new = user.copy(ID=email, AI=old.AI)
l[email] = new
self._setAcl(network, ac, tx, l)
def aclLoginOk(self, network, email): def aclLoginOk(self, network, email):
ac, tx, l = self._getAcl(network) ac, tx, l = self._getAcl(network)
if not ac: if not ac:

View File

@ -3,7 +3,7 @@
# Copyright 2010 Maurizio Porrato <maurizio.porrato@gmail.com> # Copyright 2010 Maurizio Porrato <maurizio.porrato@gmail.com>
# See LICENSE.txt for copyright info # See LICENSE.txt for copyright info
from twisted.internet.defer import Deferred from twisted.internet.defer import Deferred, succeed
from twisted.internet.protocol import ServerFactory from twisted.internet.protocol import ServerFactory
from twisted.protocols.policies import TimeoutMixin from twisted.protocols.policies import TimeoutMixin
from twisted.internet.task import LoopingCall from twisted.internet.task import LoopingCall
@ -103,7 +103,11 @@ class FRNServer(BufferingLineReceiver, TimeoutMixin):
else: else:
return (userId, "") return (userId, "")
user.IP = self.clientAddress.host user.IP = self.clientAddress.host
return self.factory.manager.clientLogin(user).addCallback(loginReturned) if self.factory.tracker.canLogin(user):
return self.factory.manager.clientLogin(user).addCallback(loginReturned)
else:
log.msg("BLOCK %s" % repr(user))
return succeed(("BLOCK", ""))
def disconnect(self): def disconnect(self):
self.transport.loseConnection() self.transport.loseConnection()