コード例 #1
0
        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;
        }
コード例 #2
0
        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);
        }