Fix regressions introduced by new simple XML parser.

This commit is contained in:
Maurizio Porrato 2011-01-30 14:59:29 +00:00
parent 214cb07962
commit 17eb5f0ca3
9 changed files with 370 additions and 354 deletions

View File

@ -129,13 +129,16 @@ class DatabaseManager(object):
('ID', 'EA', 'PW', 'ON', 'BC', 'NN', 'CT', 'NT', 'DS', 'IP', 'registration', 'lastlogin', 'server', 'port'), ('ID', 'EA', 'PW', 'ON', 'BC', 'NN', 'CT', 'NT', 'DS', 'IP', 'registration', 'lastlogin', 'server', 'port'),
data[0])) data[0]))
log.msg("Mailing password to user %s" % str(u)) log.msg("Mailing password to user %s" % str(u))
with open('mailtemplate.txt','r') as tplfile: tplfile = open('mailtemplate.txt','r')
try:
tpl = tplfile.read() tpl = tplfile.read()
mailbody = string.Template(tpl).safe_substitute(u) mailbody = string.Template(tpl).safe_substitute(u)
sendmail('127.0.0.1', sendmail('127.0.0.1',
'admin@gnuradionetwork.org', 'admin@gnuradionetwork.org',
[u['EA']], [u['EA']],
mailbody, port=2525) mailbody, port=25)
finally:
tplfile.close()
return "OK" return "OK"
return self._pool.runQuery( return self._pool.runQuery(
"SELECT * FROM frn_users WHERE _ea=?", (user.EA,) "SELECT * FROM frn_users WHERE _ea=?", (user.EA,)

View File

@ -23,7 +23,7 @@ class CustomManagerClientFactory(FRNManagerClientFactory):
def authReply(auth): def authReply(auth):
self.resetDelay() self.resetDelay()
self.authResult = auth self.authResult = auth
self.authDone = (auth['al'] == '0') self.authDone = (auth['AL'] == '0')
if self.authDone: if self.authDone:
self.deferred.callback(auth) self.deferred.callback(auth)
connection.sendServerLogin(self.user).addCallback(authReply) connection.sendServerLogin(self.user).addCallback(authReply)

View File

@ -67,9 +67,9 @@ class FRNClient(BufferingLineReceiver, TimeoutMixin):
self.phase = 1 self.phase = 1
else: else:
self.serverdata = parseSimpleXML(line.strip()) self.serverdata = parseSimpleXML(line.strip())
if int(self.serverdata['sv']) > 2009004: if int(self.serverdata['SV']) > 2009004:
self.sendLine(responseToChallange( self.sendLine(responseToChallange(
self.serverdata['kp'])) self.serverdata['KP']))
self.ready() self.ready()
self.setTimeout(10.0) self.setTimeout(10.0)
self.factory.resetDelay() self.factory.resetDelay()

View File

@ -52,10 +52,10 @@ class FRNManagerClient(LineOnlyReceiver):
def loginDone(result): def loginDone(result):
self.managerdata = parseSimpleXML(result) self.managerdata = parseSimpleXML(result)
log.msg("Server login results: %s" % str(self.managerdata)) log.msg("Server login results: %s" % str(self.managerdata))
if int(self.managerdata['mc']) > 2009004: if int(self.managerdata['MC']) > 2009004:
self.sendLine(responseToChallange( self.sendLine(responseToChallange(
self.managerdata['kp'])) self.managerdata['KP']))
if self.managerdata['al'] != '0': if self.managerdata['AL'] != '0':
self.transport.loseConnection() self.transport.loseConnection()
else: else:
self.pingtimer = LoopingCall(self.sendPing) self.pingtimer = LoopingCall(self.sendPing)

View File

@ -103,7 +103,7 @@ class FRNServer(BufferingLineReceiver, TimeoutMixin):
return (userId, "") return (userId, "")
user.IP = self.clientAddress.host user.IP = self.clientAddress.host
if self.factory.tracker.canLogin(user): if self.factory.tracker.canLogin(user):
return self.factory.manager.clientLogin(user).addCallback(loginReturned) return self.factory.manager.clientLogin(self.factory.serverAuth, user).addCallback(loginReturned)
else: else:
log.msg("BLOCK %s" % repr(user)) log.msg("BLOCK %s" % repr(user))
return succeed(("BLOCK", "")) return succeed(("BLOCK", ""))
@ -112,7 +112,7 @@ class FRNServer(BufferingLineReceiver, TimeoutMixin):
self.stopPinging() self.stopPinging()
if self.user is not None: if self.user is not None:
log.msg("Logging out client %s" % self.user) log.msg("Logging out client %s" % self.user)
self.factory.manager.clientLogout(self.user) self.factory.manager.clientLogout(self.factory.serverAuth, self.user)
self.factory.tracker.logout(self) self.factory.tracker.logout(self)
self.transport.loseConnection() self.transport.loseConnection()
@ -169,15 +169,15 @@ class FRNServer(BufferingLineReceiver, TimeoutMixin):
def decodeTM(self, body): def decodeTM(self, body):
log.msg("TM: %s" % str(body)) log.msg("TM: %s" % str(body))
if body['id'] == '': if body['ID'] == '':
msgtype = 'A' msgtype = 'A'
else: else:
msgtype = 'P' msgtype = 'P'
for c in self.factory.tracker.getClientList(self.user.NT): for c in self.factory.tracker.getClientList(self.user.NT):
if msgtype == 'A' or c.ID == body['id']: if msgtype == 'A' or c.ID == body['ID']:
if c.ID != self.user.ID or msgtype == 'A': if c.ID != self.user.ID or msgtype == 'A':
client = self.factory.tracker.getClientProtocol(c.ID) client = self.factory.tracker.getClientProtocol(c.ID)
client.sendTextMessage(self.user.ID, body['ms'], msgtype) client.sendTextMessage(self.user.ID, body['MS'], msgtype)
def decodeTX(self, body): def decodeTX(self, body):
if body == '0': if body == '0':
@ -190,53 +190,53 @@ class FRNServer(BufferingLineReceiver, TimeoutMixin):
def decodeMC(self, body): def decodeMC(self, body):
if self.role in ["OWNER","ADMIN"]: if self.role in ["OWNER","ADMIN"]:
self.factory.tracker.mute(self.user, body['ip']) self.factory.tracker.mute(self.user, body['IP'])
if self.factory.tracker.isLoggedIn(body['ip']): if self.factory.tracker.isLoggedIn(body['IP']):
self.factory.tracker.getClientProtocol(body['ip']).decodeRX('0') self.factory.tracker.getClientProtocol(body['IP']).decodeRX('0')
def decodeUM(self, body): def decodeUM(self, body):
if self.role in ["OWNER","ADMIN"]: if self.role in ["OWNER","ADMIN"]:
self.factory.tracker.unMute(body['ip']) self.factory.tracker.unMute(body['IP'])
def decodeBC(self, body): def decodeBC(self, body):
if self.role in ["OWNER","ADMIN"]: if self.role in ["OWNER","ADMIN"]:
self.factory.tracker.block(self.user, body['ip']) self.factory.tracker.block(self.user, body['IP'])
self.factory.tracker.getClientProtocol(body['ip']).disconnect() self.factory.tracker.getClientProtocol(body['IP']).disconnect()
def decodeUC(self, body): def decodeUC(self, body):
if self.role in ["OWNER","ADMIN"]: if self.role in ["OWNER","ADMIN"]:
self.factory.tracker.unBlock(body['ip']) self.factory.tracker.unBlock(body['IP'])
def decodeAA(self, body): def decodeAA(self, body):
if self.role == "OWNER": if self.role == "OWNER":
self.factory.tracker.admin(body['ip']) self.factory.tracker.admin(body['IP'])
def decodeDA(self, body): def decodeDA(self, body):
if self.role == "OWNER": if self.role == "OWNER":
self.factory.tracker.unAdmin(body['ip']) self.factory.tracker.unAdmin(body['IP'])
def decodeETX(self, body): def decodeETX(self, body):
log.msg("decodeETX(%s)" % str(body)) log.msg("decodeETX(%s)" % str(body))
if self.role == "OWNER": if self.role == "OWNER":
self.factory.tracker.setAclTx(self.user.NT, body['ea'], True) self.factory.tracker.setAclTx(self.user.NT, body['EA'], True)
self.sendAccessList(self.factory.tracker.getAcl(self.user.NT)) self.sendAccessList(self.factory.tracker.getAcl(self.user.NT))
def decodeRTX(self, body): def decodeRTX(self, body):
log.msg("decodeRTX(%s)" % str(body)) log.msg("decodeRTX(%s)" % str(body))
if self.role == "OWNER": if self.role == "OWNER":
self.factory.tracker.setAclTx(self.user.NT, body['ea'], False) self.factory.tracker.setAclTx(self.user.NT, body['EA'], False)
self.sendAccessList(self.factory.tracker.getAcl(self.user.NT)) self.sendAccessList(self.factory.tracker.getAcl(self.user.NT))
def decodeDT(self, body): def decodeDT(self, body):
log.msg("decodeDT(%s)" % str(body)) log.msg("decodeDT(%s)" % str(body))
if self.role == "OWNER": if self.role == "OWNER":
self.factory.tracker.delAcl(self.user.NT, body['ea']) self.factory.tracker.delAcl(self.user.NT, body['EA'])
self.sendAccessList(self.factory.tracker.getAcl(self.user.NT)) self.sendAccessList(self.factory.tracker.getAcl(self.user.NT))
def decodeAT(self, body): def decodeAT(self, body):
log.msg("decodeAT(%s)" % str(body)) log.msg("decodeAT(%s)" % str(body))
if self.role == "OWNER": if self.role == "OWNER":
self.factory.tracker.addAcl(self.user.NT, body['ea']) self.factory.tracker.addAcl(self.user.NT, body['EA'])
self.sendAccessList(self.factory.tracker.getAcl(self.user.NT)) self.sendAccessList(self.factory.tracker.getAcl(self.user.NT))
def decodeTXR(self, body): def decodeTXR(self, body):

13
mailtemplate.txt Normal file
View File

@ -0,0 +1,13 @@
From: GNURadioNetwork System Manager <admin@gnuradionetwork.org>
To: $EA
Subject: [GRN] $ON account data
Callsign and operator name: $ON
Password: $PW
Operating mode: $BC
Description: $DS
City and locator: $CT
Country: $NN
Registration date: $registration
Last login: $lastlogin

View File

@ -68,7 +68,7 @@ class FRNStream(FRNClient):
def getClientName(self, client_id): def getClientName(self, client_id):
if self.clientsById.has_key(client_id): if self.clientsById.has_key(client_id):
return self.clientsById[client_id]['on'] return self.clientsById[client_id]['ON']
else: else:
return client_id return client_id
@ -77,11 +77,11 @@ class FRNStream(FRNClient):
self.pong() self.pong()
def loginResponse(self, info): def loginResponse(self, info):
log.msg("Login: %s" % info['al']) log.msg("Login: %s" % info['AL'])
def clientsListUpdated(self, clients): def clientsListUpdated(self, clients):
self.clients = clients self.clients = clients
self.clientsById = dict([(i['id'], i) for i in clients]) self.clientsById = dict([(i['ID'], i) for i in clients])
class FRNStreamFactory(FRNClientFactory): class FRNStreamFactory(FRNClientFactory):

View File

@ -34,7 +34,7 @@ class FRNCrosslinkClient(FRNClient):
def getClientName(self, client_id): def getClientName(self, client_id):
if self.clientsById.has_key(client_id): if self.clientsById.has_key(client_id):
return self.clientsById[client_id]['on'] return self.clientsById[client_id]['ON']
else: else:
return client_id return client_id
@ -60,16 +60,16 @@ class FRNCrosslinkClient(FRNClient):
for server, port, u, factory in clients: for server, port, u, factory in clients:
cl = [] cl = []
cl.append("<u>%s@%s:%d</u>" % (u.NT,server,port)) cl.append("<u>%s@%s:%d</u>" % (u.NT,server,port))
role = factory.connection.serverdata.get('al', None) role = factory.connection.serverdata.get('AL', None)
if role in ['OK', 'ADMIN', 'OWNER']: if role in ['OK', 'ADMIN', 'OWNER']:
for c in factory.connection.clients: for c in factory.connection.clients:
ss = cStatus.get(c['s'], '?') ss = cStatus.get(c['s'], '?')
if c['m'] != '0': if c['M'] != '0':
ss = ss.lower() ss = ss.lower()
cl.append(" %s%s %s " % ( cl.append(" %s%s %s " % (
cType.get(c['bc'], 'G'), cType.get(c['BC'], 'G'),
ss, ss,
c['on'].replace('<', '&lt;'), c['ON'].replace('<', '&lt;'),
)) ))
else: else:
cl.append(" :!: DISCONNECTED :!: ") cl.append(" :!: DISCONNECTED :!: ")
@ -100,7 +100,7 @@ class FRNCrosslinkClient(FRNClient):
global clients, talking, lastMessages global clients, talking, lastMessages
if talking is None or talking == self: if talking is None or talking == self:
talking = self talking = self
talkingUser = self.clients[from_id-1]['on'] talkingUser = self.clients[from_id-1]['ON']
if len(lastMessages) > 0: if len(lastMessages) > 0:
if lastMessages[0] == talkingUser: if lastMessages[0] == talkingUser:
talkingUser = None talkingUser = None
@ -126,15 +126,15 @@ class FRNCrosslinkClient(FRNClient):
self.pong() self.pong()
def loginResponse(self, info): def loginResponse(self, info):
log.msg("%s login: %s" % (self.user.ON, info['al'])) log.msg("%s login: %s" % (self.user.ON, info['AL']))
def clientsListUpdated(self, clients): def clientsListUpdated(self, clients):
self.clients = clients self.clients = clients
self.clientsById = dict([(i['id'], i) for i in clients]) self.clientsById = dict([(i['ID'], i) for i in clients])
if self.clientId is None: if self.clientId is None:
for c in clients: for c in clients:
if c['on'] == self.user.ON and c['bc'] == self.user.BC: if c['ON'] == self.user.ON and c['BC'] == self.user.BC:
self.clientId = c['id'] self.clientId = c['ID']
class FRNCrosslinkClientFactory(FRNClientFactory): class FRNCrosslinkClientFactory(FRNClientFactory):
protocol = FRNCrosslinkClient protocol = FRNCrosslinkClient

View File

@ -34,13 +34,13 @@ class FRNRecorder(FRNClient):
def getClientName(self, client_id): def getClientName(self, client_id):
if self.clientsById.has_key(client_id): if self.clientsById.has_key(client_id):
return self.clientsById[client_id]['on'] return self.clientsById[client_id]['ON']
else: else:
return client_id return client_id
def buildRecordingName(self, client_id): def buildRecordingName(self, client_id):
ts = time.localtime() ts = time.localtime()
opname = sanitizeFilename(self.clients[client_id-1]['on']) opname = sanitizeFilename(self.clients[client_id-1]['ON'])
dirname = self.factory.recdir+"/"+time.strftime("%Y%m/%d/%H", ts) dirname = self.factory.recdir+"/"+time.strftime("%Y%m/%d/%H", ts)
filename = time.strftime("%Y%m%d-%H%M%S-", ts) + opname + '.wav' filename = time.strftime("%Y%m%d-%H%M%S-", ts) + opname + '.wav'
try: try:
@ -82,16 +82,16 @@ class FRNRecorder(FRNClient):
def archiveRecording(self, from_id): def archiveRecording(self, from_id):
log.msg("%s stopped talking" % log.msg("%s stopped talking" %
self.clients[from_id-1]['on']) self.clients[from_id-1]['ON'])
self.closeFile() self.closeFile()
self.recordingFile = None self.recordingFile = None
self.recordingOperator = None self.recordingOperator = None
def audioFrameReceived(self, from_id, frames): def audioFrameReceived(self, from_id, frames):
if self.recordingOperator != self.clients[from_id-1]['on']: if self.recordingOperator != self.clients[from_id-1]['ON']:
if self.recordingOperator is not None: if self.recordingOperator is not None:
self.closeFile() self.closeFile()
self.recordingOperator = self.clients[from_id-1]['on'] self.recordingOperator = self.clients[from_id-1]['ON']
self.recordingFile = file(self.buildRecordingName(from_id), 'wb') self.recordingFile = file(self.buildRecordingName(from_id), 'wb')
self.recordingFile.write(WAV_HEADER) self.recordingFile.write(WAV_HEADER)
self.recordingFile.write(frames) self.recordingFile.write(frames)
@ -99,20 +99,20 @@ class FRNRecorder(FRNClient):
self.parrot_timer.reset(AUDIO_TIMEOUT) self.parrot_timer.reset(AUDIO_TIMEOUT)
except: except:
log.msg("%s started talking" % log.msg("%s started talking" %
self.clients[from_id-1]['on']) self.clients[from_id-1]['ON'])
self.parrot_timer = self.factory.reactor.callLater( self.parrot_timer = self.factory.reactor.callLater(
AUDIO_TIMEOUT, self.archiveRecording, from_id) AUDIO_TIMEOUT, self.archiveRecording, from_id)
self.pong() self.pong()
def loginResponse(self, info): def loginResponse(self, info):
log.msg("Login: %s" % info['al']) log.msg("Login: %s" % info['AL'])
self.setStatus(1) self.setStatus(1)
self.recordingOperator = None self.recordingOperator = None
self.recordingFile = None self.recordingFile = None
def clientsListUpdated(self, clients): def clientsListUpdated(self, clients):
self.clients = clients self.clients = clients
self.clientsById = dict([(i['id'], i) for i in clients]) self.clientsById = dict([(i['ID'], i) for i in clients])
class FRNRecorderFactory(FRNClientFactory): class FRNRecorderFactory(FRNClientFactory):