예제 #1
0
        public void ChallengeNineProof()
        {
            IRoutingDomain domain = new RoutingDomain(_routeRepositoryMock.Object);

            var distance = domain.GetShortestDistance('B', 'B', 10);

            Assert.Equal(9, distance);
        }
예제 #2
0
        public void ChallengeTenProof()
        {
            IRoutingDomain domain = new RoutingDomain(_routeRepositoryMock.Object);

            var count = domain.GetCountOfRoutesThatLoop('C', 'C', 30);

            Assert.Equal(7, count);
        }
예제 #3
0
        public void ChallengeSevenProof()
        {
            IRoutingDomain domain = new RoutingDomain(_routeRepositoryMock.Object);

            var count = domain.GetNumberOfStopsWithEqualCount('A', 'C', 4, 50);

            Assert.Equal(3, count);
        }
예제 #4
0
        public void ChallengeFiveProof()
        {
            IRoutingDomain domain = new RoutingDomain(_routeRepositoryMock.Object);

            var request = new LinkedList <char>();

            request.AddLast('A');
            request.AddLast('E');
            request.AddLast('D');

            Assert.Throws <Core.Exceptions.RouteNotFoundException>(() => domain.GetSpeicificRoutesDistance(request, 50));
        }
예제 #5
0
        public void ChallengeTwoProof()
        {
            IRoutingDomain domain = new RoutingDomain(_routeRepositoryMock.Object);

            var request = new LinkedList <char>();

            request.AddLast('A');
            request.AddLast('D');

            int distance = domain.GetSpeicificRoutesDistance(request, 20);

            Assert.Equal(5, distance);
        }
예제 #6
0
        public bool IsInternal(string domainName)
        {
            bool result;

            try
            {
                RoutingDomain domain = new RoutingDomain(domainName);
                result = this.isInternalResolver.IsInternal(domain);
            }
            catch (FormatException)
            {
                result = false;
            }
            return(result);
        }
예제 #7
0
        void SCPRoutingAgent_OnResolvedMessage(ResolvedMessageEventSource source, QueuedMessageEventArgs e)
        {
            try
            {
                WriteLine("Start SCPRoutingAgent_OnResolvedMessage");

                WriteLine("\tFromAddress: " + e.MailItem.FromAddress.ToString());
                WriteLine("\tSubject: " + e.MailItem.Message.Subject.ToString());
                WriteLine("\tMapiMessageClass: " + e.MailItem.Message.MapiMessageClass.ToString());

                MimeDocument mdMimeDoc    = e.MailItem.Message.MimeDocument;
                HeaderList   hlHeaderlist = mdMimeDoc.RootPart.Headers;
                Header       mhProcHeader = hlHeaderlist.FindFirst("X-SCP");

                if (mhProcHeader == null)
                {
                    WriteLine("\tTouched: " + "No");

                    if (!e.MailItem.Message.IsSystemMessage)
                    {
                        bool touched = false;

                        if (e.MailItem.FromAddress.DomainPart != null)
                        {
                            foreach (EnvelopeRecipient recp in e.MailItem.Recipients)
                            {
                                WriteLine("\t\tFrom: " + e.MailItem.Message.From.SmtpAddress.ToString().ToLower());
                                WriteLine("\t\tTo: " + recp.Address.ToString().ToLower());
                                string[] tmpFrom = e.MailItem.Message.From.SmtpAddress.Split('@');
                                string[] tmpTo   = recp.Address.ToString().Split('@');
                                if (IsMessageBetweenTenants(tmpFrom[1].ToLower(), tmpTo[1].ToLower()))
                                {
                                    WriteLine("\t\tMessage routed to domain: " + tmpTo[1].ToLower() + routingDomain);
                                    RoutingDomain   myRoutingDomain   = new RoutingDomain(tmpTo[1].ToLower() + routingDomain);
                                    RoutingOverride myRoutingOverride = new RoutingOverride(myRoutingDomain, DeliveryQueueDomain.UseOverrideDomain);
                                    source.SetRoutingOverride(recp, myRoutingOverride);
                                    touched = true;
                                }
                            }
                        }
                        else
                        {
                            if ((e.MailItem.Message.MapiMessageClass.ToString() == "IPM.Note.Rules.OofTemplate.Microsoft") &
                                blockInternalInterTenantOOF)
                            {
                                WriteLine("\t\tOOF From: " + e.MailItem.Message.From.SmtpAddress);
                                if (e.MailItem.Message.From.SmtpAddress.Contains("@"))
                                {
                                    string[] tmpFrom = e.MailItem.Message.From.SmtpAddress.Split('@');
                                    foreach (EnvelopeRecipient recp in e.MailItem.Recipients)
                                    {
                                        WriteLine("\t\tTo: " + recp.Address.ToString().ToLower());
                                        string[] tmpTo = recp.Address.ToString().Split('@');
                                        if (IsMessageBetweenTenants(tmpFrom[1].ToLower(), tmpTo[1].ToLower()))
                                        {
                                            WriteLine("\t\tRemove: " + tmpTo[1].ToLower());
                                            e.MailItem.Recipients.Remove(recp);
                                        }
                                    }
                                }
                            }
                        }

                        if (touched)
                        {
                            MimeNode   lhLasterHeader = hlHeaderlist.LastChild;
                            TextHeader nhNewHeader    = new TextHeader("X-SCP", "Logged00");
                            hlHeaderlist.InsertBefore(nhNewHeader, lhLasterHeader);
                        }
                    }
                    else
                    {
                        WriteLine("\tSystem Message");
                    }
                }
                else
                {
                    WriteLine("\tTouched: " + "Yes");
                }
            }

            catch (Exception ex)
            {
                WriteLine("\t[Error] Error :" + ex.Message);
                LogErrorToEventLog("[Error] [OnResolvedMessage] Error :" + ex.Message);
            }

            WriteLine("End SCPRoutingAgent_OnResolvedMessage");
        }
예제 #8
0
 public bool IsInternal(RoutingDomain domain)
 {
     return(domain.IsValid() && this.IsInternal(domain.Domain));
 }
예제 #9
0
 public static bool IsInternal(RoutingDomain routingDomain, OrganizationId organizationId)
 {
     return(routingDomain.IsValid() && IsInternalResolver.IsInternal(routingDomain.Domain, organizationId));
 }
예제 #10
0
        void WSPRoutingAgent_OnResolvedMessage(ResolvedMessageEventSource source, QueuedMessageEventArgs e)
        {
            try
            {

                WriteLine("Start WSPRoutingAgent_OnResolvedMessage");

                WriteLine("\tFromAddress: " + e.MailItem.FromAddress.ToString());
                WriteLine("\tSubject: " + e.MailItem.Message.Subject.ToString());
                WriteLine("\tMapiMessageClass: " + e.MailItem.Message.MapiMessageClass.ToString());

                MimeDocument mdMimeDoc = e.MailItem.Message.MimeDocument;
                HeaderList hlHeaderlist = mdMimeDoc.RootPart.Headers;
                Header mhProcHeader = hlHeaderlist.FindFirst("X-WSP");

                if (mhProcHeader == null)
                {
                    WriteLine("\tTouched: " + "No");

                    if (!e.MailItem.Message.IsSystemMessage)
                    {
                        bool touched = false;

                        if (e.MailItem.FromAddress.DomainPart != null)
                        {
                            foreach (EnvelopeRecipient recp in e.MailItem.Recipients)
                            {
                                WriteLine("\t\tFrom: " + e.MailItem.Message.From.SmtpAddress.ToString().ToLower());
                                WriteLine("\t\tTo: " + recp.Address.ToString().ToLower());
                                string[] tmpFrom = e.MailItem.Message.From.SmtpAddress.Split('@');
                                string[] tmpTo = recp.Address.ToString().Split('@');
                                if (IsMessageBetweenTenants(tmpFrom[1].ToLower(), tmpTo[1].ToLower()))
                                {
                                    WriteLine("\t\tMessage routed to domain: " + tmpTo[1].ToLower() + routingDomain);
                                    RoutingDomain myRoutingDomain = new RoutingDomain(tmpTo[1].ToLower() + routingDomain);
                                    RoutingOverride myRoutingOverride = new RoutingOverride(myRoutingDomain, DeliveryQueueDomain.UseOverrideDomain);
                                    source.SetRoutingOverride(recp, myRoutingOverride);
                                    touched = true;
                                }
                            }
                        }
                        else
                        {
                            if ((e.MailItem.Message.MapiMessageClass.ToString() == "IPM.Note.Rules.OofTemplate.Microsoft") &
                                blockInternalInterTenantOOF)
                            {
                                WriteLine("\t\tOOF From: " + e.MailItem.Message.From.SmtpAddress);
                                if (e.MailItem.Message.From.SmtpAddress.Contains("@"))
                                {
                                    string[] tmpFrom = e.MailItem.Message.From.SmtpAddress.Split('@');
                                    foreach (EnvelopeRecipient recp in e.MailItem.Recipients)
                                    {
                                        WriteLine("\t\tTo: " + recp.Address.ToString().ToLower());
                                        string[] tmpTo = recp.Address.ToString().Split('@');
                                        if (IsMessageBetweenTenants(tmpFrom[1].ToLower(), tmpTo[1].ToLower()))
                                        {
                                            WriteLine("\t\tRemove: " + tmpTo[1].ToLower());
                                            e.MailItem.Recipients.Remove(recp);
                                        }
                                    }
                                }
                            }
                        }

                        if (touched)
                        {
                            MimeNode lhLasterHeader = hlHeaderlist.LastChild;
                            TextHeader nhNewHeader = new TextHeader("X-WSP", "Logged00");
                            hlHeaderlist.InsertBefore(nhNewHeader, lhLasterHeader);
                        }
                    }
                    else
                        WriteLine("\tSystem Message");
                }
                else
                    WriteLine("\tTouched: " + "Yes");

            }

            catch (Exception ex)
            {
                WriteLine("\t[Error] Error :" + ex.Message);
                LogErrorToEventLog("[Error] [OnResolvedMessage] Error :" + ex.Message);
            }

            WriteLine("End WSPRoutingAgent_OnResolvedMessage");
        }
예제 #11
0
파일: Program.cs 프로젝트: steme/TrainWork
        static void Main(string[] args)
        {
            string fileName = "input.txt";
            string path     = GetFilePath(fileName);

            //Instantiate Repository
            IRouteRepository repository = new RouteTextAdapterRepository(path);

            //Inject repository into domain
            IRoutingDomain domain = new RoutingDomain(repository);

            int defaultMaxDistance = 30;

            #region Output 1

            var outputOneRequest = new LinkedList <char>();
            outputOneRequest.AddLast('A');
            outputOneRequest.AddLast('B');
            outputOneRequest.AddLast('C');

            try
            {
                var abcRouteDistance = domain.GetSpeicificRoutesDistance(outputOneRequest, defaultMaxDistance);
                Console.WriteLine($"Output #01: {abcRouteDistance}");
            }
            catch (Core.Exceptions.RouteNotFoundException exc)
            {
                Console.WriteLine($"Output #01: {exc.StandardRouteNotFoundUserMessage}");
            }


            #endregion

            #region Output 2

            var outputTwoRequest = new LinkedList <char>();
            outputTwoRequest.AddLast('A');
            outputTwoRequest.AddLast('D');

            try
            {
                var adRouteDistance = domain.GetSpeicificRoutesDistance(outputTwoRequest, defaultMaxDistance);
                Console.WriteLine($"Output #02: {adRouteDistance}");
            }
            catch (Core.Exceptions.RouteNotFoundException exc)
            {
                Console.WriteLine($"Output #02: {exc.StandardRouteNotFoundUserMessage}");
            }

            #endregion

            #region Output 3

            var outputThreeRequest = new LinkedList <char>();
            outputThreeRequest.AddLast('A');
            outputThreeRequest.AddLast('D');
            outputThreeRequest.AddLast('C');

            try
            {
                var adcRouteDistance = domain.GetSpeicificRoutesDistance(outputThreeRequest, defaultMaxDistance);
                Console.WriteLine($"Output #03: {adcRouteDistance}");
            }
            catch (Core.Exceptions.RouteNotFoundException exc)
            {
                Console.WriteLine($"Output #03: {exc.StandardRouteNotFoundUserMessage}");
            }

            #endregion

            #region Output 4

            var outputFourRequest = new LinkedList <char>();
            outputFourRequest.AddLast('A');
            outputFourRequest.AddLast('E');
            outputFourRequest.AddLast('B');
            outputFourRequest.AddLast('C');
            outputFourRequest.AddLast('D');

            try
            {
                var aebcdRouteDistance = domain.GetSpeicificRoutesDistance(outputFourRequest, defaultMaxDistance);
                Console.WriteLine($"Output #04: {aebcdRouteDistance}");
            }
            catch (Core.Exceptions.RouteNotFoundException exc)
            {
                Console.WriteLine($"Output #04: {exc.StandardRouteNotFoundUserMessage}");
            }

            #endregion

            #region Output 5

            var outputFiveRequest = new LinkedList <char>();
            outputFiveRequest.AddLast('A');
            outputFiveRequest.AddLast('E');
            outputFiveRequest.AddLast('D');

            try
            {
                var aedcdRouteDistance = domain.GetSpeicificRoutesDistance(outputFiveRequest, defaultMaxDistance);
                Console.WriteLine($"Output #05: {aedcdRouteDistance}");
            }
            catch (Core.Exceptions.RouteNotFoundException exc)
            {
                Console.WriteLine($"Output #05: {exc.StandardRouteNotFoundUserMessage}");
            }

            #endregion

            #region Output 6

            try
            {
                var count = domain.GetCountOfRoutesThatLoop('C', 3, 50);
                Console.WriteLine($"Output #06: {count}");
            }
            catch (Core.Exceptions.RouteNotFoundException exc)
            {
                Console.WriteLine($"Output #06: {exc.StandardRouteNotFoundUserMessage}");
            }

            #endregion

            #region Output 7

            try
            {
                var count = domain.GetNumberOfStopsWithEqualCount('A', 'C', 4, 50);
                Console.WriteLine($"Output #07: {count}");
            }
            catch (Core.Exceptions.RouteNotFoundException exc)
            {
                Console.WriteLine($"Output #07: {exc.StandardRouteNotFoundUserMessage}");
            }


            #endregion

            #region Output 8

            try
            {
                var distance = domain.GetShortestDistance('A', 'C', 10);
                Console.WriteLine($"Output #08: {distance}");
            }
            catch (Core.Exceptions.RouteNotFoundException exc)
            {
                Console.WriteLine($"Output #08: {exc.StandardRouteNotFoundUserMessage}");
            }

            #endregion

            #region Output 9

            try
            {
                var distance = domain.GetShortestDistance('B', 'B', 10);
                Console.WriteLine($"Output #09: {distance}");
            }
            catch (Core.Exceptions.RouteNotFoundException exc)
            {
                Console.WriteLine($"Output #09: {exc.StandardRouteNotFoundUserMessage}");
            }

            #endregion

            #region Output 10

            try
            {
                var count = domain.GetCountOfRoutesThatLoop('C', 'C', 30);
                Console.WriteLine($"Output #10: {count}");
            }
            catch (Core.Exceptions.RouteNotFoundException exc)
            {
                Console.WriteLine($"Output #10: {exc.StandardRouteNotFoundUserMessage}");
            }

            #endregion

            Console.ReadLine();
        }