public void Execute() { string username; if (Authorize(out username)) { while (true) { Request request = this.Formatter.Deserialize(this.SocketStream) as Request; Response response = new Response(); try { switch (request.RequestType) { case RequestType.Logout: { response.Message = "Successfully logged out."; break; } case RequestType.RegisterToken: { int rights = this.UsersService.GetRights(username); if ((rights & (int)Rights.CanRegisterToken) == 0) { throw new InvalidOperationException("You don't have rights to do that."); } string token; if (this.TokenizationService.RegisterToken(request.Data as string, out token)) { response.Data = token; response.Message = "Successfully registered token."; } else { throw new ArgumentException("Invalid card number."); } break; } case RequestType.GetCardNumber: { int rights = this.UsersService.GetRights(username); if ((rights & (int)Rights.CanGetCardNumber) == 0) { throw new InvalidOperationException("You don't have rights to do that."); } string cardNumber = this.TokenizationService.GetCardNumber(request.Data as string); response.Data = cardNumber; response.Message = "Successfully taken card number."; break; } case RequestType.Terminate: { response.Message = "Successfully terminated."; break; } default: { throw new InvalidOperationException( string.Format("Operation {0} is not supported.", request.RequestType)); } } response.ResponseType = ResponseType.Success; } catch (Exception e) { response.ResponseType = ResponseType.Error; response.Message = e.Message; } this.Formatter.Serialize(this.SocketStream, response); if (request.RequestType == RequestType.Logout) { if (!Authorize(out username)) { break; } } if (request.RequestType == RequestType.Terminate) { break; } } } this.Dispose(); }
public bool Authorize(out string username) { username = null; while (true) { Request request = this.Formatter.Deserialize(this.SocketStream) as Request; Response response = new Response(); try { switch (request.RequestType) { case RequestType.Login: { var login = request.Data as Login; this.UsersService.Login(login); username = login.Username; response.Message = "Successfully logged!"; break; } case RequestType.Terminate: { break; } } response.ResponseType = ResponseType.Success; } catch (Exception e) { response.ResponseType = ResponseType.Error; response.Message = e.Message; } this.Formatter.Serialize(this.SocketStream, response); if (username != null) { break; } if (request.RequestType == RequestType.Terminate) { return false; } } return true; }