Exemplo n.º 1
0
        public async Task<ActionResult<UserAttempt>> PostUserAttempt(UserAttempt userAttempt)
        {
            _context.UserAttepmts.Add(userAttempt);
            await _context.SaveChangesAsync();

            return CreatedAtAction("GetUserAttempt", new { id = userAttempt.Id }, userAttempt);
        }
Exemplo n.º 2
0
        public async Task<IActionResult> PutUserAttempt(int id, UserAttempt userAttempt)
        {
            if (id != userAttempt.Id)
            {
                return BadRequest();
            }

            _context.Entry(userAttempt).State = EntityState.Modified;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!UserAttemptExists(id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }

            return NoContent();
        }
Exemplo n.º 3
0
 private static GetUserAttemptsResult.UserAttempt Map(UserAttempt userAttempt)
 {
     return(new GetUserAttemptsResult.UserAttempt
     {
         Id = userAttempt.Id,
         DateTimeUtc = userAttempt.DateTimeUtc,
         IsSuccess = userAttempt.IsSuccess
     });
 }
        private void ResetAttempts(UserAttempt userAttempts)
        {
            if (userAttempts.LastRequest.AddHours(1) <= DateTime.Now)
            {
                userAttempts.Attempts = 0;
            }

            _context.Attempts.Update(userAttempts);
        }
 private void UpdateAttempts(UserAttempt userAttempts)
 {
     userAttempts.Attempts++;
     userAttempts.LastRequest = DateTime.Now;
     if (userAttempts.Attempts >= MaxRequestsBeforeLockout)
     {
         userAttempts.Timeout = DateTime.Now.AddHours(2);
     }
     _context.Attempts.Update(userAttempts);
 }
Exemplo n.º 6
0
        public async Task <AddUserAttemptResult> Handle(AddUserAttemptParams addUserAttemptParams)
        {
            ICollection <Setting> settings = await _settingsRepository.GetSettings();

            // 1. Validate attempts count
            Setting enterSecretNumberAttemptsCountSetting = settings.Single(t => t.Name == SettingName.EnterSecretNumberAttemptsCount);
            int     userAttemptsCount = (await _userAttemptRepository.GetUserAttempts(addUserAttemptParams.UserId)).Count;

            if (userAttemptsCount > enterSecretNumberAttemptsCountSetting.IntValue)
            {
                return(new AddUserAttemptResult(AddUserAttemptResult.Type.AttemptsCountExceeded));
            }

            // 2. Validate value against range
            Setting secretMinValueSetting = settings.Single(t => t.Name == SettingName.SecretRangeMinValue);

            if (addUserAttemptParams.SecretValue < secretMinValueSetting.IntValue)
            {
                return(new AddUserAttemptResult(AddUserAttemptResult.Type.LessThanRangeMinValue));
            }

            Setting secretMaxValueSetting = settings.Single(t => t.Name == SettingName.SecretRangeMaxValue);

            if (addUserAttemptParams.SecretValue < secretMinValueSetting.IntValue)
            {
                return(new AddUserAttemptResult(AddUserAttemptResult.Type.MoreThanRangeMaxValue));
            }

            // 3. Validate entered secret value
            AddUserAttemptResult result = null;

            Setting secretValueSetting = settings.Single(t => t.Name == SettingName.SecretValue);

            if (addUserAttemptParams.SecretValue == secretValueSetting.IntValue)
            {
                result = new AddUserAttemptResult(AddUserAttemptResult.Type.IncorrectValue);
            }
            else
            {
                result = new AddUserAttemptResult(AddUserAttemptResult.Type.Success);
            }

            // 4. Log user attempt to database
            UserAttempt userAttempt = new UserAttempt
            {
                UserId             = addUserAttemptParams.UserId,
                DateTimeUtc        = DateTime.UtcNow,
                EnteredSecretValue = addUserAttemptParams.SecretValue,
                IsSuccess          = result.ResultType == AddUserAttemptResult.Type.Success
            };
            await _userAttemptRepository.AddUserAttempt(userAttempt);

            return(result);
        }
        private void CreateNewAttempt(string ip)
        {
            var attempt = new UserAttempt
            {
                IP          = ip,
                Attempts    = 1,
                LastRequest = DateTime.Now
            };

            _context.Attempts.Add(attempt);
        }
Exemplo n.º 8
0
        public async Task AddUserAttempt(UserAttempt userAttempt)
        {
            using (SqlConnection sqlConnection = new SqlConnection(_conntectionString))
            {
                await sqlConnection.OpenAsync();

                using (SqlCommand sqlCommand = new SqlCommand("[dbo].[spAddUserAttempt]", sqlConnection))
                {
                    sqlCommand.Parameters.Add(new SqlParameter("@UserId", userAttempt.UserId));
                    sqlCommand.Parameters.Add(new SqlParameter("@DateTimeUtc", userAttempt.DateTimeUtc));
                    sqlCommand.Parameters.Add(new SqlParameter("@EnteredSecretValue", userAttempt.EnteredSecretValue));
                    sqlCommand.Parameters.Add(new SqlParameter("@IsSuccess", userAttempt.IsSuccess));

                    await sqlCommand.ExecuteNonQueryAsync();
                }
            }
        }
        private async Task <UserAttempt> CreateUserAttempt(Attempt attempt)
        {
            await _db.Entry(attempt).Reference(s => s.Test)
            .Query()
            .Include(s => s.Questions)
            .ThenInclude(s => (s as OptionsQuestion).Options)
            .Include(s => s.Questions)
            .ThenInclude(s => (s as PassFillingQuestion).Passes)
            .LoadAsync();

            var rnd = new Random();

            var userAttempt = new UserAttempt()
            {
                Id        = attempt.Id,
                TestName  = attempt.Test.Name,
                MaxTime   = attempt.Test.AttemptTime,
                Questions = attempt.Test.Questions.OrderBy(s => rnd.Next()).ToList()
            };

            return(userAttempt);
        }
Exemplo n.º 10
0
        public async System.Threading.Tasks.Task <ActionResult> Participate([Bind(Include = "ContestId, CurrentTaskId, CurrentTaskNumber, SelectedDevelopmentToolId")] ParticipantTaskPartialViewModel model, HttpPostedFileBase fileUpload)
        {
            var tasks = await _db.Tasks.Where(t => t.ContestId == model.ContestId).ToListAsync();

            if (tasks == null || tasks.Count < 1)
            {
                TempData["Message"] = "Произошла ошибка: кол-во задач и компиляторов должно быть больше 0";
                return(RedirectToAction("Contests"));
                //ViewBag.ErrorMessage = "Произошла ошибка: кол-во задач и компиляторов должно быть больше 0";
                //return View("Error");
            }
            var model2 = new ParticipantParticipateViewModel
            {
                ContestId         = model.ContestId,
                CurrentTaskNumber = model.CurrentTaskNumber,
                Tasks             = tasks
            };

            if (ModelState.IsValid)
            {
                if (!string.IsNullOrEmpty(fileUpload?.FileName))
                {
                    var ext = Path.GetExtension(fileUpload.FileName);
                    if (_allowedExtForSolutionFiles.Any(e => e == ext))
                    {
                        byte[] solutionData;
                        using (var binaryReader = new BinaryReader(fileUpload.InputStream))
                        {
                            solutionData = binaryReader.ReadBytes(fileUpload.ContentLength);
                        }
                        var currentUserId  = User.Identity.GetUserId();
                        var postedSolution = await _db.PostedSolutions.Where(
                            s => s.TaskId == model.CurrentTaskId && s.UserId == currentUserId)
                                             .FirstOrDefaultAsync();

                        if (postedSolution != null)
                        {
                            postedSolution.Solution         = solutionData;
                            _db.Entry(postedSolution).State = EntityState.Modified;
                            await _db.SaveChangesAsync();
                        }
                        else
                        {
                            var postedSolutionId = Guid.NewGuid();
                            postedSolution = new PostedSolution
                            {
                                Id                = postedSolutionId,
                                UserId            = User.Identity.GetUserId(),
                                TaskId            = model.CurrentTaskId,
                                DevelopmentToolId = model.SelectedDevelopmentToolId,
                                Solution          = solutionData,
                                IsChecked         = false
                            };

                            _db.PostedSolutions.Add(postedSolution);
                            _db.SaveChanges();
                        }
                        var task    = postedSolution.Task;
                        var contest = task.Contest;
                        var devTool = _db.DevelopmentTools.Find(model.SelectedDevelopmentToolId);
                        var user    = _db.Users.Find(currentUserId);
                        var postedSolutionsRootFolder = ConfigurationManager.AppSettings["PostedSolutionsRootFolder"];
                        var contestTypeName           = contest.ContestsType.Name;
                        var contestName     = contest.Name;
                        var userIp          = user.Ip;
                        var solutionsFolder = Path.Combine(postedSolutionsRootFolder, contestTypeName, contestName,
                                                           userIp);

                        if (!Directory.Exists(solutionsFolder))
                        {
                            Directory.CreateDirectory(solutionsFolder);
                        }
                        var sourcePath = Path.Combine(solutionsFolder, task.ExecutableName) + ext;

                        if (ByteArrayToFile(sourcePath, solutionData))
                        {
                            try
                            {
                                var taskCheckSolution = new System.Threading.Tasks.Task <Solution>(() =>
                                {
                                    return(CheckPostedSolution(contest, user, task, devTool, solutionsFolder,
                                                               LocalFolder, sourcePath));
                                });

                                _checkSolutionQueue.AddTask(taskCheckSolution);
                                taskCheckSolution.Wait();
                                var solution = taskCheckSolution.Result;

                                var userAttempt = new UserAttempt
                                {
                                    Id                = Guid.NewGuid(),
                                    ContestId         = contest.Id,
                                    TaskId            = task.Id,
                                    UserId            = user.Id,
                                    CreatedDate       = DateTime.Now,
                                    Solution          = solutionData,
                                    SolutionExtension = ext,
                                    Score             = solution.WeightedScore,
                                    DevelopmentToolId = devTool.Id,
                                    FailedRuns        = solution.FailedRuns,
                                    FailedChecks      = solution.FailedChecks
                                };
                                _db.UserAttempts.Add(userAttempt);
                                postedSolution.IsChecked        = true;
                                _db.Entry(postedSolution).State = EntityState.Modified;
                                await _db.SaveChangesAsync();

                                TempData["Message"] = "Решение было отправлено и проверено. \nБаллов: " + solution.WeightedScore
                                                      + "\nПроваленных запусков: " + solution.FailedRuns
                                                      + "\nПроваленных тестов: " + solution.FailedChecks;
                                //ToDo: вывести результат в другом виде?
                            }
                            catch (Exception ex)
                            {
                                var exeptionLog = new ExceptionsLog
                                {
                                    Id          = Guid.NewGuid(),
                                    ContestId   = contest.Id,
                                    CreatedDate = DateTime.Now,
                                    UserId      = user.Id,
                                    Text        = ex.InnerException.Message
                                };
                                _db.ExceptionsLogs.Add(exeptionLog);
                                _db.SaveChanges();

                                TempData["Message"] = "При проверке решения возникло исключение: " + ex.InnerException.Message;
                                //ToDo: вывести результат в другом виде?
                            }

                            if (Directory.Exists(postedSolutionsRootFolder))
                            {
                                Directory.Delete(postedSolutionsRootFolder, true);
                            }
                        }
                        else
                        {
                            TempData["Message"] = "Решение не было сохранено в локальном каталоге участника";
                        }
                    }
                    else
                    {
                        ModelState.AddModelError("", "Недопустимое расширения загружаемого файла решения");
                        return(View(model2));
                    }
                }
                else
                {
                    ModelState.AddModelError("", "Не выбран загружаемый файл решения");
                    return(View(model2));
                }

                //db.Tasks.Add(task);
                //await db.SaveChangesAsync();
                return(RedirectToAction("Participate", new { id = model.ContestId, currentTaskNumber = model.CurrentTaskNumber }));
            }
            return(View(model2));
        }