Response::ResponseCode Server_ProtocolHandler::cmdCreateGame(const Command_CreateGame &cmd, Server_Room *room, ResponseContainer &rc) { if (authState == NotLoggedIn) return Response::RespLoginNeeded; const int gameId = databaseInterface->getNextGameId(); if (gameId == -1) return Response::RespInternalError; if (server->getMaxGamesPerUser() > 0) if (room->getGamesCreatedByUser(QString::fromStdString(userInfo->name())) >= server->getMaxGamesPerUser()) return Response::RespContextError; QList<int> gameTypes; for (int i = cmd.game_type_ids_size() - 1; i >= 0; --i) gameTypes.append(cmd.game_type_ids(i)); QString description = QString::fromStdString(cmd.description()); if (description.size() > 60) description = description.left(60); Server_Game *game = new Server_Game(copyUserInfo(false), gameId, description, QString::fromStdString(cmd.password()), cmd.max_players(), gameTypes, cmd.only_buddies(), cmd.only_registered(), cmd.spectators_allowed(), cmd.spectators_need_password(), cmd.spectators_can_talk(), cmd.spectators_see_everything(), room); game->addPlayer(this, rc, false, false); room->addGame(game); return Response::RespOk; }
Response::ResponseCode Server_ProtocolHandler::cmdLogin(const Command_Login &cmd, ResponseContainer &rc) { QString userName = QString::fromStdString(cmd.user_name()).simplified(); QString clientId = QString::fromStdString(cmd.clientid()).simplified(); if (userName.isEmpty() || (userInfo != 0)) return Response::RespContextError; QString reasonStr; int banSecondsLeft = 0; AuthenticationResult res = server->loginUser(this, userName, QString::fromStdString(cmd.password()), reasonStr, banSecondsLeft, clientId); switch (res) { case UserIsBanned: { Response_Login *re = new Response_Login; re->set_denied_reason_str(reasonStr.toStdString()); if (banSecondsLeft != 0) re->set_denied_end_time(QDateTime::currentDateTime().addSecs(banSecondsLeft).toTime_t()); rc.setResponseExtension(re); return Response::RespUserIsBanned; } case NotLoggedIn: return Response::RespWrongPassword; case WouldOverwriteOldSession: return Response::RespWouldOverwriteOldSession; case UsernameInvalid: { Response_Login *re = new Response_Login; re->set_denied_reason_str(reasonStr.toStdString()); rc.setResponseExtension(re); return Response::RespUsernameInvalid; } case RegistrationRequired: return Response::RespRegistrationRequired; case ClientIdRequired: return Response::RespClientIdRequired; case UserIsInactive: return Response::RespAccountNotActivated; default: authState = res; } userName = QString::fromStdString(userInfo->name()); Event_ServerMessage event; event.set_message(server->getLoginMessage().toStdString()); rc.enqueuePostResponseItem(ServerMessage::SESSION_EVENT, prepareSessionEvent(event)); Response_Login *re = new Response_Login; re->mutable_user_info()->CopyFrom(copyUserInfo(true)); if (authState == PasswordRight) { QMapIterator<QString, ServerInfo_User> buddyIterator(databaseInterface->getBuddyList(userName)); while (buddyIterator.hasNext()) re->add_buddy_list()->CopyFrom(buddyIterator.next().value()); QMapIterator<QString, ServerInfo_User> ignoreIterator(databaseInterface->getIgnoreList(userName)); while (ignoreIterator.hasNext()) re->add_ignore_list()->CopyFrom(ignoreIterator.next().value()); } joinPersistentGames(rc); rc.setResponseExtension(re); return Response::RespOk; }
Response::ResponseCode Server_ProtocolHandler::cmdLogin(const Command_Login &cmd, ResponseContainer &rc) { QString userName = QString::fromStdString(cmd.user_name()).simplified(); QString clientId = QString::fromStdString(cmd.clientid()).simplified(); QString clientVersion = QString::fromStdString(cmd.clientver()).simplified(); if (userName.isEmpty() || (userInfo != 0)) return Response::RespContextError; // check client feature set against server feature set FeatureSet features; QMap<QString, bool> receivedClientFeatures; QMap<QString, bool> missingClientFeatures; for (int i = 0; i < cmd.clientfeatures().size(); ++i) receivedClientFeatures.insert(QString::fromStdString(cmd.clientfeatures(i)).simplified(), false); missingClientFeatures = features.identifyMissingFeatures(receivedClientFeatures, server->getServerRequiredFeatureList()); if (!missingClientFeatures.isEmpty()) { if (features.isRequiredFeaturesMissing(missingClientFeatures, server->getServerRequiredFeatureList())) { Response_Login *re = new Response_Login; re->set_denied_reason_str("Client upgrade required"); QMap<QString, bool>::iterator i; for (i = missingClientFeatures.begin(); i != missingClientFeatures.end(); ++i) re->add_missing_features(i.key().toStdString().c_str()); rc.setResponseExtension(re); return Response::RespClientUpdateRequired; } } QString reasonStr; int banSecondsLeft = 0; AuthenticationResult res = server->loginUser(this, userName, QString::fromStdString(cmd.password()), reasonStr, banSecondsLeft, clientId, clientVersion); switch (res) { case UserIsBanned: { Response_Login *re = new Response_Login; re->set_denied_reason_str(reasonStr.toStdString()); if (banSecondsLeft != 0) re->set_denied_end_time(QDateTime::currentDateTime().addSecs(banSecondsLeft).toTime_t()); rc.setResponseExtension(re); return Response::RespUserIsBanned; } case NotLoggedIn: return Response::RespWrongPassword; case WouldOverwriteOldSession: return Response::RespWouldOverwriteOldSession; case UsernameInvalid: { Response_Login *re = new Response_Login; re->set_denied_reason_str(reasonStr.toStdString()); rc.setResponseExtension(re); return Response::RespUsernameInvalid; } case RegistrationRequired: return Response::RespRegistrationRequired; case ClientIdRequired: return Response::RespClientIdRequired; case UserIsInactive: return Response::RespAccountNotActivated; default: authState = res; } userName = QString::fromStdString(userInfo->name()); Event_ServerMessage event; event.set_message(server->getLoginMessage().toStdString()); rc.enqueuePostResponseItem(ServerMessage::SESSION_EVENT, prepareSessionEvent(event)); Response_Login *re = new Response_Login; re->mutable_user_info()->CopyFrom(copyUserInfo(true)); if (authState == PasswordRight) { QMapIterator<QString, ServerInfo_User> buddyIterator(databaseInterface->getBuddyList(userName)); while (buddyIterator.hasNext()) re->add_buddy_list()->CopyFrom(buddyIterator.next().value()); QMapIterator<QString, ServerInfo_User> ignoreIterator(databaseInterface->getIgnoreList(userName)); while (ignoreIterator.hasNext()) re->add_ignore_list()->CopyFrom(ignoreIterator.next().value()); } // return to client any missing features the server has that the client does not if (!missingClientFeatures.isEmpty()) { QMap<QString, bool>::iterator i; for (i = missingClientFeatures.begin(); i != missingClientFeatures.end(); ++i) re->add_missing_features(i.key().toStdString().c_str()); } joinPersistentGames(rc); rc.setResponseExtension(re); return Response::RespOk; }
int copyRuleExecInfo(ruleExecInfo_t *from, ruleExecInfo_t *to) { (*to) = (*from); /**** The following structures are not copied and just the pointer is copied. dataObjInp_t *doinp; dataOprInp_t *dinp; fileOpenInp_t *finp; dataObjInp_t *doinpo; dataOprInp_t *dinpo; fileOpenInp_t *finpo; ***/ if (from->doi != NULL) { to->doi = (dataObjInfo_t *) mallocAndZero(sizeof(dataObjInfo_t)); copyDataObjInfo(from->doi, to->doi); } else to->doi = NULL; if (from->rgi != NULL) { to->rgi = (rescGrpInfo_t*)mallocAndZero(sizeof(rescGrpInfo_t)); copyRescGrpInfo(from->rgi, to->rgi); } else to->rgi = NULL; if (from->uoic != NULL) { to->uoic = (userInfo_t*)mallocAndZero(sizeof(userInfo_t)); copyUserInfo(from->uoic, to->uoic); } else to->uoic = NULL; if (from->uoip != NULL) { to->uoip = (userInfo_t*)mallocAndZero(sizeof(userInfo_t)); copyUserInfo(from->uoip, to->uoip); } else to->uoip = NULL; if (from->coi != NULL) { to->coi = (collInfo_t*)mallocAndZero(sizeof(collInfo_t)); copyCollInfo(from->coi, to->coi); } else to->coi = NULL; #if 0 /* XXXXX deplicate rgio */ if (from->rgio != NULL) { to->rgio = mallocAndZero(sizeof(rescGrpInfo_t)); copyRescGrpInfo(from->rgio, to->rgio); } else to->rgi = NULL; #endif if (from->uoio != NULL) { to->uoio= (userInfo_t*)mallocAndZero(sizeof(userInfo_t)); copyUserInfo(from->uoio, to->uoio); } else to->uoio = NULL; if (from->condInputData != NULL) { to->condInputData = (keyValPair_t*)mallocAndZero(sizeof(keyValPair_t)); copyKeyValPairStruct(from->condInputData, to->condInputData); } else to->condInputData = NULL; if (from->next != NULL) { to->next = (ruleExecInfo_t*)mallocAndZero(sizeof(ruleExecInfo_t)); copyRuleExecInfo(from->next,to->next); } else to->next = NULL; return(0); }