From: <umg...@us...> - 2007-07-10 20:01:37
|
Revision: 472 http://svn.sourceforge.net/pybridge/?rev=472&view=rev Author: umgangee Date: 2007-07-10 12:27:08 -0700 (Tue, 10 Jul 2007) Log Message: ----------- Add change password functionality; some reorganisation of server-side validation of data received from client. Modified Paths: -------------- trunk/pybridge/pybridge/network/client.py trunk/pybridge/pybridge/server/server.py trunk/pybridge/pybridge/server/user.py Modified: trunk/pybridge/pybridge/network/client.py =================================================================== --- trunk/pybridge/pybridge/network/client.py 2007-07-10 17:25:05 UTC (rev 471) +++ trunk/pybridge/pybridge/network/client.py 2007-07-10 19:27:08 UTC (rev 472) @@ -171,6 +171,12 @@ # Client request methods. + def changePassword(self, password): + hash = sha.new(password).hexdigest() + d = self.avatar.callRemote('changePassword', hash) + return d + + def joinTable(self, tableid, host=False): def success(table): @@ -179,10 +185,9 @@ return table if host: - d = self.avatar.callRemote('hostTable', tableid=tableid, - tabletype='bridge') + d = self.avatar.callRemote('hostTable', tableid, 'bridge') else: - d = self.avatar.callRemote('joinTable', tableid=tableid) + d = self.avatar.callRemote('joinTable', tableid) d.addCallback(success) return d @@ -193,7 +198,7 @@ del self.tables[tableid] self.notify('leaveTable', tableid=tableid) - d = self.avatar.callRemote('leaveTable', tableid=tableid) + d = self.avatar.callRemote('leaveTable', tableid) d.addCallback(success) return d Modified: trunk/pybridge/pybridge/server/server.py =================================================================== --- trunk/pybridge/pybridge/server/server.py 2007-07-10 17:25:05 UTC (rev 471) +++ trunk/pybridge/pybridge/server/server.py 2007-07-10 19:27:08 UTC (rev 472) @@ -16,7 +16,7 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -from datetime import datetime +import re from twisted.python import log import database as db @@ -35,13 +35,11 @@ def getServerInfo(): - return {'supported': (version, version), # minimum, maximum + return {'compatibleVersions': (version, version), # minimum, maximum + 'supportedGames': 'bridge', # TODO 'version': version} -# Methods invoked by user perspectives. - - def registerUser(username, password): """Registers a new user account in the database. @@ -51,21 +49,23 @@ # Check that username has not already been registered. if db.UserAccount.selectBy(username=username).count() > 0: raise DeniedRequest, "Username already registered" - try: - # Create user account. - db.UserAccount(username=username, password=password, allowLogin=True) - log.msg("New user %s registered" % username) - except ValueError, err: - raise IllegalRequest, err + # Create user account - may raise ValueError. + db.UserAccount(username=username, password=password, allowLogin=True) + log.msg("New user %s registered" % username) -def changePasswordOfUser(username, password): - """Sets the password of user to specified password. + +def changeUserPassword(username, password): + """Sets the password of user's account. @param username: the user identifier. @param password: the new password for user. """ - pass # TODO implement + try: + user = db.UserAccount.selectBy(username=username)[0] + user.set(password=password) # May raise ValueError. + except IndexError: + raise DeniedRequest, "User account does not exist" def createTable(tableid, gametype): @@ -75,9 +75,17 @@ @param gametype: a game identifier. """ # TODO: convert gametype string to corresponding class. - if tableid not in availableTables: - table = LocalTable(tableid, BridgeGame) # Ignore gametype for now. - # Provide table instance with a means of closing itself. - table.close = lambda: availableTables.closeTable(table) - availableTables.openTable(table) + if not 0 < len(tableid) <= 20 or re.search("[^A-Za-z0-9_ ]", tableid): + raise IllegalRequest, "Invalid table identifier format" + if tableid in availableTables: + raise DeniedRequest, "Table name exists" +# if tabletype not in supported: +# raise DeniedRequest, "Table type not suppported by this server" + + table = LocalTable(tableid, BridgeGame) # Ignore gametype for now. + # Provide table instance with a means of closing itself. + table.close = lambda: availableTables.closeTable(table) + availableTables.openTable(table) + return table + Modified: trunk/pybridge/pybridge/server/user.py =================================================================== --- trunk/pybridge/pybridge/server/user.py 2007-07-10 17:25:05 UTC (rev 471) +++ trunk/pybridge/pybridge/server/user.py 2007-07-10 19:27:08 UTC (rev 472) @@ -17,7 +17,6 @@ from datetime import datetime -import re from twisted.python import log from twisted.spread import pb @@ -29,7 +28,7 @@ class RegisteredUser(pb.Avatar): - info = property(lambda self: {}) + info = property(lambda self: {}) # TODO: Send profile data? def __init__(self, name): @@ -72,19 +71,32 @@ raise DeniedRequest, "Unknown roster name \'%s\'" % name - def perspective_hostTable(self, tableid, tabletype): + def perspective_getUserProfile(self, username): + """Provides profile information for user with specified username.""" + pass + + + def perspective_changePassword(self, password): + """Sets avatar's user account password to that specified.""" + if not isinstance(password, str): + raise IllegalRequest, "Invalid parameter for password" + + try: + server.changeUserPassword(self.name, password) + except ValueError, err: # Password validation failed. + raise DeniedRequest, err + + + def perspective_hostTable(self, tableid, gametype): """Creates a new table.""" if not isinstance(tableid, str): raise IllegalRequest, "Invalid parameter for table identifier" - elif not(0 < len(tableid) < 21) or re.search("[^A-Za-z0-9_ ]", tableid): - raise IllegalRequest, "Invalid table identifier format" - elif tableid in server.availableTables: - raise DeniedRequest, "Table name exists" -# elif tabletype not in server.supported: -# raise DeniedRequest, "Table type not suppported by this server" + if not isinstance(gametype, str): + raise IllegalRequest, "Invalid parameter for game type" - server.createTable(tableid, tabletype) - return self.perspective_joinTable(tableid) # Force join to table. + table = server.createTable(tableid, gametype) + # Force client to join table. + return self.perspective_joinTable(tableid) def perspective_joinTable(self, tableid): @@ -119,5 +131,7 @@ def perspective_register(self, username, password): """Create a user account with specified username and password.""" # TODO: consider defer.succeed, defer.fail, failure.Failure - server.registerUser(username, password) - + try: + server.registerUser(username, password) + except ValueError, err: # Username/password validation failed. + raise DeniedRequest, err This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |