public override int Execute(IDataContext context) { var result = 0; ContextQuery = ctx => { var user = ctx.AsQueryable <User>().SingleOrDefault(t => t.Id == UserId); if (user == null) { throw new DomainException($"User with Id {UserId} could not be found"); } var entry = CaptchaEntry.Create(user); ctx.Add(entry); ctx.Commit(); result = entry.Id; }; ExecuteInternal(context); return(result); }
public void POST(string key, RequestInfo info) { if (string.IsNullOrWhiteSpace(key)) { var target = info.Request.Param["target"].Value; if (string.IsNullOrWhiteSpace(target)) { info.ReportClientError("Missing target parameter"); return; } var answer = CaptchaUtil.CreateRandomAnswer(minlength: 6, maxlength: 6); var nonce = Guid.NewGuid().ToString(); string token; using (var ms = new System.IO.MemoryStream()) { var bytes = System.Text.Encoding.UTF8.GetBytes(answer + nonce); ms.Write(bytes, 0, bytes.Length); ms.Position = 0; token = Library.Utility.Utility.Base64PlainToBase64Url(Library.Utility.Utility.CalculateHash(ms)); } lock (m_lock) { var expired = m_captchas.Where(x => x.Value.Expires < DateTime.Now).Select(x => x.Key).ToArray(); foreach (var x in expired) { m_captchas.Remove(x); } if (m_captchas.Count > 3) { info.ReportClientError("Too many captchas, wait 2 minutes and try again", System.Net.HttpStatusCode.ServiceUnavailable); return; } m_captchas[token] = new CaptchaEntry(answer, target); } info.OutputOK(new { token = token }); } else { var answer = info.Request.Param["answer"].Value; var target = info.Request.Param["target"].Value; if (string.IsNullOrWhiteSpace(answer)) { info.ReportClientError("Missing answer parameter"); return; } if (string.IsNullOrWhiteSpace(target)) { info.ReportClientError("Missing target parameter"); return; } if (SolvedCaptcha(key, target, answer)) { info.OutputOK(); } else { info.ReportClientError("Incorrect"); } } }