- Timestamp:
- Jan 29, 2013, 7:34:29 PM (12 years ago)
- Branches:
- master
- Children:
- 60b77d2
- Parents:
- 5806dc2
- Location:
- server
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
server/DataAccess.cpp
r5806dc2 rb128109 3 3 #include <iostream> 4 4 #include <sstream> 5 #include <cstdlib> 5 6 6 7 using namespace std; … … 27 28 ostringstream oss; 28 29 29 oss << "'" << username << "', '" << password << "'"; 30 string salt = "$1$"; 31 int random; 32 char chr; 33 for(int i=0; i<8; i++) 34 { 35 random = rand() % 62; 36 if (random < 26) 37 chr = (char)('a'+random); 38 else if (random < 52) 39 chr = (char)('A'+random-26); 40 else 41 chr = (char)('0'+random-52); 42 salt += chr; 43 } 44 salt += '$'; 45 46 string encrypted(crypt(password.c_str(), salt.c_str())); 47 48 oss << "'" << username << "', '" << encrypted << "'"; 30 49 31 50 return insert("users", "name, password", oss.str()); 51 } 52 53 int DataAccess::updatePlayer(string username, string password) 54 { 55 ostringstream values, where; 56 57 values << "password='" << password << "'"; 58 59 where << "name='" << username << "'"; 60 61 return update("users", values.str(), where.str()); 32 62 } 33 63 … … 63 93 } 64 94 65 int DataAccess::printPlayers() 95 // need to make sure this list is freed 96 // since we need to create a DataAccess class 97 // when calling these functions, 98 // we could free this list in the destructor 99 list<Player*>* DataAccess::getPlayers() 66 100 { 67 101 MYSQL_RES *result; … … 73 107 if (result == NULL) { 74 108 cout << mysql_error(connection) << endl; 75 return 1;109 return NULL; 76 110 } 77 111 112 list<Player*>* lstPlayers = new list<Player*>(); 78 113 while ( ( row = mysql_fetch_row(result)) != NULL ) { 79 114 cout << row[0] << ", " << row[1] << ", " << row[2] << endl; 115 lstPlayers->push_back(new Player(row[1], row[2])); 80 116 } 81 117 82 118 mysql_free_result(result); 83 119 84 return 0;120 return lstPlayers; 85 121 } 86 122 87 int DataAccess::insert(string table, string rows, string values) 123 bool DataAccess::verifyPassword(string password, string encrypted) 124 { 125 string test(crypt(password.c_str(), encrypted.c_str())); 126 127 return encrypted.compare(test) == 0; 128 } 129 130 int DataAccess::insert(string table, string columns, string values) 88 131 { 89 132 int query_state; 90 133 ostringstream oss; 91 134 92 oss << "INSERT into " << table << " (" << rows << ") VALUES (" << values << ")"; 135 oss << "INSERT into " << table << " (" << columns << ") VALUES (" << values << ")"; 136 cout << "query: " << oss.str() << endl; 137 138 query_state = mysql_query(connection, oss.str().c_str()); 139 140 if (query_state != 0) { 141 cout << mysql_error(connection) << endl; 142 return 1; 143 } 144 145 return 0; 146 } 147 148 int DataAccess::update(string table, string values, string where) 149 { 150 int query_state; 151 ostringstream oss; 152 153 oss << "UPDATE " << table << " SET " << values << " WHERE " << where; 93 154 cout << "query: " << oss.str() << endl; 94 155 -
server/DataAccess.h
r5806dc2 rb128109 3 3 4 4 #include <string> 5 #include <list> 5 6 6 7 #include <mysql/mysql.h> … … 16 17 17 18 int insertPlayer(string username, string password); 19 int updatePlayer(string username, string password); 18 20 19 Player *getPlayer(string username); 20 int printPlayers(); 21 Player* getPlayer(string username); 22 list<Player*>* getPlayers(); 23 bool verifyPassword(string encrypted, string password); 21 24 22 25 int insert(string table, string rows, string values); 26 int update(string table, string values, string where); 23 27 MYSQL_RES *select(string table, string filter); 24 28 -
server/makefile
r5806dc2 rb128109 1 1 CC = g++ 2 LIB_FLAGS = -lssl -lmysqlclient 2 LIB_FLAGS = -lssl -lmysqlclient -lcrypt 3 3 FLAGS = $(LIB_FLAGS) 4 4 COMMON_PATH = ../common -
server/server.cpp
r5806dc2 rb128109 14 14 #include <netinet/in.h> 15 15 #include <arpa/inet.h> 16 17 #include <crypt.h> 16 18 17 19 /* … … 129 131 broadcastResponse = processMessage(clientMsg, from, mapPlayers, unusedId, serverMsg); 130 132 133 // probably replace this with a function that prints based on the 134 // message type 131 135 cout << "msg: " << serverMsg.buffer << endl; 132 136 cout << "broadcastResponse: " << broadcastResponse << endl; 133 137 if (broadcastResponse) 134 138 { … … 197 201 string username(clientMsg.buffer); 198 202 string password(strchr(clientMsg.buffer, '\0')+1); 199 cout << "Player logging in: " << username << endl;200 203 201 204 Player* p = da.getPlayer(username); 202 205 203 if (p == NULL || p->password != password)206 if (p == NULL || !da.verifyPassword(password, p->password)) 204 207 { 205 208 strcpy(serverMsg.buffer, "Incorrect username or password"); … … 272 275 broadcastResponse = true; 273 276 274 stringstreamss;275 ss << p->name << ": " << clientMsg.buffer;276 277 strcpy(serverMsg.buffer, ss.str().c_str());277 ostringstream oss; 278 oss << p->name << ": " << clientMsg.buffer; 279 280 strcpy(serverMsg.buffer, oss.str().c_str()); 278 281 } 279 282 280 283 serverMsg.type = MSG_TYPE_CHAT; 284 285 break; 286 } 287 case MSG_TYPE_PLAYER_MOVE: 288 { 289 istringstream iss; 290 iss.str(clientMsg.buffer); 291 292 cout << "PLAYER_MOVE" << endl; 293 294 int id, x, y; 295 296 memcpy(&id, clientMsg.buffer, 4); 297 memcpy(&x, clientMsg.buffer+4, 4); 298 memcpy(&y, clientMsg.buffer+8, 4); 299 300 cout << "x: " << x << endl; 301 cout << "y: " << y << endl; 302 cout << "id: " << id << endl; 303 304 if ( mapPlayers[id].addr.sin_addr.s_addr == from.sin_addr.s_addr && 305 mapPlayers[id].addr.sin_port == from.sin_port ) 306 { 307 memcpy(&mapPlayers[id].pos.x, clientMsg.buffer+4, 4); 308 memcpy(&mapPlayers[id].pos.y, clientMsg.buffer+8, 4); 309 310 serverMsg.type = MSG_TYPE_PLAYER_MOVE; 311 memcpy(serverMsg.buffer, clientMsg.buffer, 12); 312 313 broadcastResponse = true; 314 } 315 else // nned to send back a message indicating failure 316 cout << "Player id (" << id << ") doesn't match sender" << endl; 281 317 282 318 break;
Note:
See TracChangeset
for help on using the changeset viewer.