public Token BuildToken(string tokenString, string ip) { if (ip == null) { throw new Exception("Unknown IP-Address."); } var delaySeconds = CheckHandleRequest(tokenString, ip); if (delaySeconds > 0) { // to many invalid requests. Used to handle brute force attacks throw new PublicException( string.Format( "Sie haben bereits zu viele ungültige Token abgegeben.\n" + "Sie können ein neues Token erst wieder in {0} Sekunden ({1:hh:mm:ss}) abgeben.", delaySeconds, DateTime.Now.AddSeconds(delaySeconds))); } var token = new Token(tokenString); if (!token.IsValid()) { // save invalid token request using (var context = new ElectionDBEntities()) { context.InvalidTokenRequests.Add(new InvalidTokenRequest { IP = ip, Token = tokenString, Timestamp = DateTime.Now }); context.SaveChanges(); } throw new PublicException(string.Format("Das Token '{0}' ist ungültig.", tokenString)); } if (!ReservedToken.ContainsKey(token)) { using (var context = new ElectionDBEntities()) { var existing = context.UsedTokens.SingleOrDefault(t => t.TokenString.Equals(tokenString)); // new token requested if (existing != null) { throw new PublicException(string.Format( "Das Token '{0}' wurde bereits genutzt. Sie dürfen es daher nicht noch einmal verwenden.", existing.TokenString)); } // add new token to database context.UsedTokens.Add(new UsedToken { TokenString = tokenString }); context.SaveChanges(); } ReservedToken.Add(token, ip); } else { // token for actual voting requested var fromIp = ReservedToken[token]; if (!ip.Equals(fromIp)) { throw new Exception("Wrong IP-Address detected."); } } return token; }
public void FinishedToken(Token token) { ReservedToken.Remove(token); }