private void ProcessRegisterRequest(string threadName) { Thread.CurrentThread.Name = threadName; while (!_exit) { if (m_registerQueue.Count > 0) { if (m_registerQueue.TryDequeue(out var registrarTransaction)) { DateTime startTime = DateTime.Now; RegisterResultEnum result = Register(registrarTransaction); TimeSpan duration = DateTime.Now.Subtract(startTime); if (result != RegisterResultEnum.Authenticated) { OnRegisterFailure?.Invoke(registrarTransaction.TransactionRequest.RemoteSIPEndPoint, result, registrarTransaction.TransactionRequest); } } } else if (!_exit) { m_registerARE.WaitOne(MAX_PROCESS_REGISTER_SLEEP); } } Logger.LogWarning($"ProcessRegisterRequest thread {Thread.CurrentThread.Name} stopping."); }
public void RegistrationFailure(SIPEndPoint remoteEP, RegisterResultEnum result, SIPRequest registerRequest) { if (result == RegisterResultEnum.DomainNotServiced || result == RegisterResultEnum.Forbidden) { if (IsPrivateSubnet?.Invoke(remoteEP.Address) == false) { var banEntry = _banList.GetOrAdd(remoteEP.Address, (addr) => new BanEntry { Source = remoteEP }); if (DateTime.Now.Subtract(banEntry.LastRegistrationFailureAt).TotalMinutes > BAN_RESET_COUNT_AFTER_MINUTES) { // Reset count. banEntry.RegistrationFailureCount = 0; } int violationCount = 1; if (IPAddress.TryParse(registerRequest.URI.HostAddress, out _)) { // Malicious UA's typically only use the IP address when scanning and brute forcing. violationCount = RULE_VIOLATION_COUNT_FOR_IPADDRESS; } banEntry.LastRegistrationFailureAt = DateTime.Now; banEntry.RegistrationFailureCount += violationCount; ApplyBanRules(ref banEntry); } } }
private void ProcessRegisterRequest(string threadName) { try { Thread.CurrentThread.Name = threadName; while (!Stop) { if (m_registerQueue.Count > 0) { try { SIPNonInviteTransaction registrarTransaction = null; lock (m_registerQueue) { registrarTransaction = m_registerQueue.Dequeue(); } if (registrarTransaction != null) { DateTime startTime = DateTime.Now; RegisterResultEnum result = Register(registrarTransaction); TimeSpan duration = DateTime.Now.Subtract(startTime); FireProxyLogEvent(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.Registrar, SIPMonitorEventTypesEnum.RegistrarTiming, "register result=" + result.ToString() + ", time=" + duration.TotalMilliseconds + "ms, user="******".", null)); if (RegisterComplete != null) { RegisterComplete(duration.TotalMilliseconds, registrarTransaction.TransactionRequest.Header.AuthenticationHeader != null); } } } catch (InvalidOperationException invalidOpExcp) { // This occurs when the queue is empty. logger.Warn("InvalidOperationException ProcessRegisterRequest Register Job. " + invalidOpExcp.Message); } catch (Exception regExcp) { logger.Error("Exception ProcessRegisterRequest Register Job. " + regExcp.Message); } } else { m_registerARE.WaitOne(MAX_PROCESS_REGISTER_SLEEP); } } logger.Warn("ProcessRegisterRequest thread " + Thread.CurrentThread.Name + " stopping."); } catch (Exception excp) { logger.Error("Exception ProcessRegisterRequest (" + Thread.CurrentThread.Name + "). " + excp.Message); } }
private void ProcessRegisterRequest(string threadName) { try { Thread.CurrentThread.Name = threadName; while (!Stop) { if (m_registerQueue.Count > 0) { try { if (m_registerQueue.TryDequeue(out var registrarTransaction)) { DateTime startTime = DateTime.Now; RegisterResultEnum result = Register(registrarTransaction); TimeSpan duration = DateTime.Now.Subtract(startTime); RegisterComplete?.Invoke(duration.TotalMilliseconds, registrarTransaction.TransactionRequest.Header.AuthenticationHeader != null); } } catch (Exception regExcp) { Logger.LogError("Exception ProcessRegisterRequest Register Job. " + regExcp.Message); } } else { m_registerARE.WaitOne(MAX_PROCESS_REGISTER_SLEEP); } } Logger.LogWarning("ProcessRegisterRequest thread " + Thread.CurrentThread.Name + " stopping."); } catch (Exception excp) { Logger.LogError("Exception ProcessRegisterRequest (" + Thread.CurrentThread.Name + "). " + excp); } }