private bool EnsureVersion(PFSType pfs) { if (_gsOptions.GameType == GameType.GT6) { if (pfs < PFSType.GT6_V1_22) { _logger.LogInformation("Client Fail: Received PFS type {type} (num) - expected GT6 1.22.", pfs, (long)pfs); return false; } } else if (_gsOptions.GameType == GameType.GT5) { if (pfs < PFSType.GT5_JP_V2_11) { _logger.LogInformation("Client Fail: Received PFS type {type} (num) - expected GT5 2.11.", pfs, (long)pfs); return false; } } return true; }
public async Task<ActionResult> Post(ulong pfsVersion) { PFSType pfsType = (PFSType)pfsVersion; _logger.LogDebug("Login request from {host} with PFS: {pfsType} ({pfsNum})", Request.Host, pfsType, (long)pfsType); if (_gsOptions.EnforceGameVersion && !EnsureVersion(pfsType)) return Forbid(); if (Request.ContentLength >= 0x300) { _logger.LogWarning("Received a ticket too big - {size} from {host}", Request.ContentLength, Request.Host); return BadRequest(); } NPTicket ticket; try { byte[] buf = new byte[(int)Request.ContentLength]; await Request.Body.ReadAsync(buf.AsMemory(0, buf.Length)); ticket = NPTicket.FromBuffer(buf); } catch (Exception e) { _logger.LogWarning(e, "Could not read NP ticket provided by client"); return BadRequest(); } if (!VerifyTicket(ticket)) return BadRequest(); _logger.LogDebug("Auth Request: NP_Ticket -> PFS: {pfsVersion} | OnlineID: {OnlineId} | Region: {Region}", pfsVersion, ticket.OnlineId, ticket.Region); // Check if already connected if (CheckAlreadyConnected(ticket.OnlineId)) _logger.LogTrace("Auth Request from OnlineID: {OnlineId} which was already connected", ticket.OnlineId); UserDTO user = await _users.GetByPSNUserIdAsync(ticket.OnlineId) ?? await CreateUser(ticket); if (user is null) { _logger.LogError("Failed to get or create user from db: Name: {name}", ticket.OnlineId); return Problem(); } var now = DateTime.Now; // From this point, auth is OK var resp = new TicketResult() { Result = "1", // Doesn't seem to do much. Nickname = ticket.OnlineId, UserId = ticket.OnlineId, UserNumber = user.Id, ServerTime = now, }; var expiryTime = now.AddHours(1); var sToken = new SessionToken(GenerateToken(expiryTime), expiryTime); var cookieOptions = new CookieOptions() { Expires = sToken.ExpiryDate }; Response.Cookies.Append("X-gt-token", sToken.Token, cookieOptions); var player = new Player(user, sToken); player.LastUpdate = now; _players.AddUser(player); return Ok(resp); }