diff --git a/ccserver/ccserver.py b/ccserver/ccserver.py index 958e6f25e77dd74399ec14c2512ad5a019489f9d..de9b7596338afe27bf26e1510517939804bcf47a 100644 --- a/ccserver/ccserver.py +++ b/ccserver/ccserver.py @@ -7,6 +7,7 @@ from sjrpc.server import SimpleSslRpcServer from handlers import WelcomeHandler from conf import CCConf from client import CCClient +from exceptions import AlreadyRegistered class CCServer(object): ''' @@ -70,8 +71,12 @@ class CCServer(object): :param connection: connection to register :param tags: tags to add for the client ''' - - self._connected[login] = CCClient(login, role, self, connection) + + if login in self._connected: + raise AlreadyRegistered('A client is already connected with this ' + 'account.') + else: + self._connected[login] = CCClient(login, role, self, connection) def unregister(self, connection): ''' diff --git a/ccserver/exceptions.py b/ccserver/exceptions.py new file mode 100644 index 0000000000000000000000000000000000000000..c05d18147032c597f4185abb7e5fbca774a0d6ad --- /dev/null +++ b/ccserver/exceptions.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python +#coding=utf8 + + +class AlreadyRegistered(Exception): + pass + +class AuthenticationError(Exception): + pass diff --git a/ccserver/handlers.py b/ccserver/handlers.py index b34fe7c6084c70c82902500a44c43c764c465c16..d3fc75cd16c8c476d114f716d9c67efcd898dfa0 100644 --- a/ccserver/handlers.py +++ b/ccserver/handlers.py @@ -6,6 +6,7 @@ import logging from sjrpc.utils import RpcHandler, pure from tql import TqlQuery from conf import CCConf +from exceptions import AlreadyRegistered, AuthenticationError def listed(func): func.__listed__ = True @@ -218,10 +219,6 @@ class ClientHandler(OnlineCCHandler): client = self._server.get_connection(login) return client.connection.call(command, *args, **kwargs) -class AuthenticationError(Exception): - pass - - class WelcomeHandler(CCHandler): ''' Default handler used on client connections of the server. @@ -248,8 +245,12 @@ class WelcomeHandler(CCHandler): logging.info('New authentication from %s: failure' % login) raise AuthenticationError('Authentication failure') else: - # If authentication is a success, ask tags to the server: - self._server.register(login, role, connection) + # If authentication is a success, try to register the client: + try: + self._server.register(login, role, connection) + except AlreadyRegistered: + raise AuthenticationError('Authentication failure ' + '(already connected)') connection.set_handler(WelcomeHandler.ROLES.get(role)(self._server)) logging.info('New authentication from %s: success' % login)