00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "net/tmwserv/loginhandler.h"
00023
00024 #include "net/tmwserv/connection.h"
00025 #include "net/tmwserv/protocol.h"
00026
00027 #include "net/tmwserv/accountserver/account.h"
00028 #include "net/tmwserv/accountserver/accountserver.h"
00029
00030 #include "net/messagein.h"
00031
00032 #include "logindata.h"
00033 #include "main.h"
00034
00035 Net::LoginHandler *loginHandler;
00036
00037 extern Net::Connection *accountServerConnection;
00038
00039 namespace TmwServ {
00040
00041 LoginHandler::LoginHandler()
00042 {
00043 static const Uint16 _messages[] = {
00044 APMSG_LOGIN_RESPONSE,
00045 APMSG_REGISTER_RESPONSE,
00046 APMSG_RECONNECT_RESPONSE,
00047 APMSG_PASSWORD_CHANGE_RESPONSE,
00048 APMSG_EMAIL_CHANGE_RESPONSE,
00049 0
00050 };
00051 handledMessages = _messages;
00052 loginHandler = this;
00053 }
00054
00055 void LoginHandler::handleMessage(MessageIn &msg)
00056 {
00057 switch (msg.getId())
00058 {
00059 case APMSG_LOGIN_RESPONSE:
00060 handleLoginResponse(msg);
00061 break;
00062 case APMSG_REGISTER_RESPONSE:
00063 handleRegisterResponse(msg);
00064 break;
00065 case APMSG_RECONNECT_RESPONSE:
00066 {
00067 int errMsg = msg.readInt8();
00068
00069 if (errMsg == ERRMSG_OK)
00070 {
00071 state = STATE_CHAR_SELECT;
00072 }
00073
00074 else
00075 {
00076 switch (errMsg) {
00077 case ERRMSG_INVALID_ARGUMENT:
00078 errorMessage = "Wrong magic_token";
00079 break;
00080 case ERRMSG_FAILURE:
00081 errorMessage = "Already logged in";
00082 break;
00083 case LOGIN_SERVER_FULL:
00084 errorMessage = "Server is full";
00085 break;
00086 default:
00087 errorMessage = "Unknown error";
00088 break;
00089 }
00090 state = STATE_ERROR;
00091 }
00092 }
00093 break;
00094
00095 case APMSG_PASSWORD_CHANGE_RESPONSE:
00096 {
00097 int errMsg = msg.readInt8();
00098
00099 if (errMsg == ERRMSG_OK)
00100 {
00101 state = STATE_CHANGEPASSWORD;
00102 }
00103
00104 else
00105 {
00106 switch (errMsg) {
00107 case ERRMSG_INVALID_ARGUMENT:
00108 errorMessage = "New password incorrect";
00109 break;
00110 case ERRMSG_FAILURE:
00111 errorMessage = "Old password incorrect";
00112 break;
00113 case ERRMSG_NO_LOGIN:
00114 errorMessage = "Account not connected. Please login first.";
00115 break;
00116 default:
00117 errorMessage = "Unknown error";
00118 break;
00119 }
00120 state = STATE_ACCOUNTCHANGE_ERROR;
00121 }
00122 }
00123 break;
00124
00125 case APMSG_EMAIL_CHANGE_RESPONSE:
00126 {
00127 int errMsg = msg.readInt8();
00128
00129 if (errMsg == ERRMSG_OK)
00130 {
00131 state = STATE_CHANGEEMAIL;
00132 }
00133
00134 else
00135 {
00136 switch (errMsg) {
00137 case ERRMSG_INVALID_ARGUMENT:
00138 errorMessage = "New email address incorrect";
00139 break;
00140 case ERRMSG_FAILURE:
00141 errorMessage = "Old email address incorrect";
00142 break;
00143 case ERRMSG_NO_LOGIN:
00144 errorMessage = "Account not connected. Please login first.";
00145 break;
00146 case ERRMSG_EMAIL_ALREADY_EXISTS:
00147 errorMessage = "The new Email Address already exists.";
00148 break;
00149 default:
00150 errorMessage = "Unknown error";
00151 break;
00152 }
00153 state = STATE_ACCOUNTCHANGE_ERROR;
00154 }
00155 }
00156 break;
00157
00158 }
00159 }
00160
00161 void LoginHandler::handleLoginResponse(MessageIn &msg)
00162 {
00163 const int errMsg = msg.readInt8();
00164
00165 if (errMsg == ERRMSG_OK)
00166 {
00167 readUpdateHost(msg);
00168 state = STATE_CHAR_SELECT;
00169 }
00170 else
00171 {
00172 switch (errMsg) {
00173 case LOGIN_INVALID_VERSION:
00174 errorMessage = "Client version is too old";
00175 break;
00176 case ERRMSG_INVALID_ARGUMENT:
00177 errorMessage = "Wrong username or password";
00178 break;
00179 case ERRMSG_FAILURE:
00180 errorMessage = "Already logged in";
00181 break;
00182 case LOGIN_SERVER_FULL:
00183 errorMessage = "Server is full";
00184 break;
00185 default:
00186 errorMessage = "Unknown error";
00187 break;
00188 }
00189 state = STATE_LOGIN_ERROR;
00190 }
00191 }
00192
00193 void LoginHandler::handleRegisterResponse(MessageIn &msg)
00194 {
00195 const int errMsg = msg.readInt8();
00196
00197 if (errMsg == ERRMSG_OK)
00198 {
00199 readUpdateHost(msg);
00200 state = STATE_CHAR_SELECT;
00201 }
00202 else
00203 {
00204 switch (errMsg) {
00205 case REGISTER_INVALID_VERSION:
00206 errorMessage = "Client version is too old";
00207 break;
00208 case ERRMSG_INVALID_ARGUMENT:
00209 errorMessage = "Wrong username, password or email address";
00210 break;
00211 case REGISTER_EXISTS_USERNAME:
00212 errorMessage = "Username already exists";
00213 break;
00214 case REGISTER_EXISTS_EMAIL:
00215 errorMessage = "Email address already exists";
00216 break;
00217 default:
00218 errorMessage = "Unknown error";
00219 break;
00220 }
00221 state = STATE_LOGIN_ERROR;
00222 }
00223 }
00224
00225 void LoginHandler::readUpdateHost(MessageIn &msg)
00226 {
00227
00228 if (msg.getUnreadLength() > 0)
00229 {
00230 mLoginData->updateHost = msg.readString();
00231 }
00232 }
00233
00234 void LoginHandler::loginAccount(LoginData *loginData)
00235 {
00236 mLoginData = loginData;
00237 Net::AccountServer::login(accountServerConnection,
00238 0,
00239 loginData->username,
00240 loginData->password);
00241 }
00242
00243 void LoginHandler::changeEmail(const std::string &email)
00244 {
00245 Net::AccountServer::Account::changeEmail(email);
00246 }
00247
00248 void LoginHandler::changePassword(const std::string &username,
00249 const std::string &oldPassword,
00250 const std::string &newPassword)
00251 {
00252 Net::AccountServer::Account::changePassword(username, oldPassword,
00253 newPassword);
00254 }
00255
00256 void LoginHandler::chooseServer(int server)
00257 {
00258
00259 }
00260
00261 void LoginHandler::registerAccount(LoginData *loginData)
00262 {
00263 Net::AccountServer::registerAccount(accountServerConnection,
00264 0,
00265 loginData->username,
00266 loginData->password,
00267 loginData->email);
00268 }
00269
00270 void LoginHandler::unregisterAccount(const std::string &username,
00271 const std::string &password)
00272 {
00273 Net::AccountServer::Account::unregister(username, password);
00274 }
00275
00276 }