コード例 #1
0
        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.");
        }
コード例 #2
0
        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);
                }
            }
        }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
ファイル: SIPRegistrarCore.cs プロジェクト: nghoul/sipsorcery
        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);
            }
        }