예제 #1
0
        public ActionResult <MilvanethProtocol> AccountStatus([FromQuery] string token)
        {
            if (!_token.TryDecode(token, out var payload))
            {
                return(new MilvanethProtocol
                {
                    Context = null,
                    Data = new AccountStatus
                    {
                        Message = GlobalMessage.OP_TOKEN_NOT_FOUND,
                        ReportTime = _time.SafeNow,
                    }
                });
            }

            try
            {
                if (payload.ValidTo < _time.UtcNow)
                {
                    return(new MilvanethProtocol
                    {
                        Context = null,
                        Data = new AccountStatus
                        {
                            Message = GlobalMessage.OP_TOKEN_RENEW_REQUIRED,
                            ReportTime = _time.SafeNow,
                        }
                    });
                }

                _auth.EnsureToken(payload, TokenPurpose.AccessToken, GlobalOperation.ACCOUNT_STATUS, 0, out var account);

                return(new MilvanethProtocol
                {
                    Context = null,
                    Data = new AccountStatus
                    {
                        Message = GlobalMessage.OK_SUCCESS,
                        ReportTime = _time.SafeNow,
                        DisplayName = account.DisplayName,
                        Email = account.Email,
                        EstiKarma = (int)Helper.EstimateNumber(account.Karma, 3),
                        Username = account.AccountName
                    }
                });
            }
            catch (Exception e)
            {
                Log.Error(e, "Error in ACCOUNT/STATUS");
                return(new MilvanethProtocol
                {
                    Context = null,
                    Data = new AccountStatus
                    {
                        Message = GlobalMessage.OP_INVALID,
                        ReportTime = _time.SafeNow,
                    }
                });
            }
        }
예제 #2
0
        public ActionResult SessionLogout([FromQuery] string token)
        {
            try
            {
                _token.TryDecode(token, out var payload);

                _auth.EnsureToken(payload, TokenPurpose.AccessToken, GlobalOperation.SESSION_LOGOUT, 0, out var account);

                if (payload.RelatedKey != -1)
                {
                    var key = _context.KeyStore.Single(x => x.KeyId == payload.RelatedKey);

                    if (key != null &&
                        key.ReuseCounter != key.Quota &&
                        key.ValidUntil > _time.UtcNow)
                    {
                        key.ReuseCounter = key.Quota;

                        _context.KeyStore.Update(key);

                        _context.ApiLog.Add(new ApiLog
                        {
                            ReportTime = _time.UtcNow,
                            AccountId  = account.AccountId,
                            KeyId      = key.KeyId,
                            Operation  = GlobalOperation.SESSION_LOGOUT,
                            Detail     = "Deactivate via session/logout",
                            IpAddress  = _accessor.GetIp()
                        });
                    }
                }

                _context.TokenRevocationList.Add(new TokenRevocationList
                {
                    Reason      = GlobalOperation.SESSION_LOGOUT,
                    RevokeSince = _time.UtcNow,
                    TokenSerial = payload.TokenId,
                });

                _context.SaveChanges();

                return(StatusCode(200));
            }
            catch (Exception e)
            {
                Log.Error(e, "Error in SESSION/LOGOUT");
                return(StatusCode(500));
            }
        }
예제 #3
0
        public ActionResult <MilvanethProtocol> DataOverview([FromQuery] string token, int part, MilvanethProtocol data)
        {
            if (!_token.TryDecode(token, out var payload))
            {
                return(new MilvanethProtocol
                {
                    Context = null,
                    Data = new OverviewResponse
                    {
                        Message = GlobalMessage.OP_TOKEN_NOT_FOUND,
                        ReportTime = _time.SafeNow,
                    }
                });
            }

            if (!(data?.Data is OverviewRequest request) || !request.Check())
            {
                return(new MilvanethProtocol
                {
                    Context = null,
                    Data = new OverviewResponse
                    {
                        Message = GlobalMessage.DATA_INVALID_INPUT,
                        ReportTime = _time.SafeNow,
                    }
                });
            }

            try
            {
                if (payload.ValidTo < _time.UtcNow)
                {
                    return(new MilvanethProtocol
                    {
                        Context = null,
                        Data = new OverviewResponse
                        {
                            Message = GlobalMessage.OP_TOKEN_RENEW_REQUIRED,
                            ReportTime = _time.SafeNow,
                        }
                    });
                }

                _auth.EnsureToken(payload, TokenPurpose.AccessToken, GlobalOperation.DATA_OVERVIEW, -15, out _);

                var query = request.QueryItems.OrderBy(x => x).Skip(part * GlobalConfig.DATA_OVERVIEW_QUERY_LIMIT)
                            .Take(GlobalConfig.DATA_OVERVIEW_QUERY_LIMIT).ToArray();

                var param = new NpgsqlParameter <int[]>("query", query);

                var result = _context.OverviewData.AsNoTracking()
                             .FromSql(
                    $"select record_id, bucket_id, report_time, world, reporter_id, item_id, open_listing, demand from (select *, rank() over (partition by item_id, world order by report_time desc) as ranking from overview_data where item_id = any(@query)) as result_table where ranking = 1", param).Select(x => x.FromDb()).ToList();

                return(new MilvanethProtocol
                {
                    Context = null,
                    Data = new OverviewResponse
                    {
                        Message = GlobalMessage.OK_SUCCESS,
                        ReportTime = _time.SafeNow,
                        EstiTotalParts = request.QueryItems.Length / GlobalConfig.DATA_OVERVIEW_QUERY_LIMIT + 1,
                        FinalPart = part * GlobalConfig.DATA_OVERVIEW_QUERY_LIMIT + query.Count() >= request.QueryItems.Length,
                        PartId = part,
                        Results = result
                    }
                });
            }
            catch (Exception e)
            {
                Log.Error(e, $"Error in DATA/OVERVIEW/{part}");
                return(new MilvanethProtocol
                {
                    Context = null,
                    Data = new OverviewResponse
                    {
                        Message = GlobalMessage.OP_TOKEN_NOT_FOUND,
                        ReportTime = _time.SafeNow,
                    }
                });
            }
        }