Пример #1
0
        public static void Main(string[] args)
        {
            if (args.Length != 0)
            {
                return;
            }

            var users = new UserRegistry();

            users.Add(new OctetString("neither"), DefaultPrivacyProvider.DefaultPair);
            users.Add(new OctetString("authen"), new DefaultPrivacyProvider(new MD5AuthenticationProvider(new OctetString("authentication"))));
            if (DESPrivacyProvider.IsSupported)
            {
                users.Add(new OctetString("privacy"), new DESPrivacyProvider(new OctetString("privacyphrase"),
                                                                             new MD5AuthenticationProvider(new OctetString("authentication"))));
            }

            if (AESPrivacyProviderBase.IsSupported)
            {
                users.Add(new OctetString("aes"), new AESPrivacyProvider(new OctetString("privacyphrase"), new MD5AuthenticationProvider(new OctetString("authentication"))));
                users.Add(new OctetString("aes192"), new AES192PrivacyProvider(new OctetString("privacyphrase"), new MD5AuthenticationProvider(new OctetString("authentication"))));
                users.Add(new OctetString("aes256"), new AES256PrivacyProvider(new OctetString("privacyphrase"), new MD5AuthenticationProvider(new OctetString("authentication"))));
            }

            var trapv1 = new TrapV1MessageHandler();

            trapv1.MessageReceived += WatcherTrapV1Received;
            var trapv1Mapping = new HandlerMapping("v1", "TRAPV1", trapv1);

            var trapv2 = new TrapV2MessageHandler();

            trapv2.MessageReceived += WatcherTrapV2Received;
            var trapv2Mapping = new HandlerMapping("v2,v3", "TRAPV2", trapv2);

            var inform = new InformRequestMessageHandler();

            inform.MessageReceived += WatcherInformRequestReceived;
            var informMapping = new HandlerMapping("v2,v3", "INFORM", inform);

            var store          = new ObjectStore();
            var v1             = new Version1MembershipProvider(new OctetString("public"), new OctetString("public"));
            var v2             = new Version2MembershipProvider(new OctetString("public"), new OctetString("public"));
            var v3             = new Version3MembershipProvider();
            var membership     = new ComposedMembershipProvider(new IMembershipProvider[] { v1, v2, v3 });
            var handlerFactory = new MessageHandlerFactory(new[] { trapv1Mapping, trapv2Mapping, informMapping });

            var pipelineFactory = new SnmpApplicationFactory(store, membership, handlerFactory);

            using (var engine = new SnmpEngine(pipelineFactory, new Listener {
                Users = users
            }, new EngineGroup()))
            {
                engine.Listener.AddBinding(new IPEndPoint(IPAddress.Any, 162));
                engine.Start();
                Console.WriteLine("#SNMP is available at https://sharpsnmp.com");
                Console.WriteLine("Press any key to stop . . . ");
                Console.Read();
                engine.Stop();
            }
        }
Пример #2
0
        public async Task TestTrapV2HandlerWithV2Message()
        {
            var manualEvent = new ManualResetEventSlim();
            // TODO: this is a hack. review it later.
            var users = new UserRegistry();

            users.Add(new OctetString("neither"), DefaultPrivacyProvider.DefaultPair);
            users.Add(new OctetString("authen"), new DefaultPrivacyProvider(new MD5AuthenticationProvider(new OctetString("authentication"))));
#if !NETSTANDARD
            users.Add(new OctetString("privacy"), new DESPrivacyProvider(new OctetString("privacyphrase"),
                                                                         new MD5AuthenticationProvider(new OctetString("authentication"))));
#endif
            var count = 0;

            var trapv1        = new TrapV1MessageHandler();
            var trapv1Mapping = new HandlerMapping("v1", "TRAPV1", trapv1);

            var trapv2 = new TrapV2MessageHandler();
            trapv2.MessageReceived += (sender, args) =>
            {
                count++;
                manualEvent.Set();
            };
            var trapv2Mapping = new HandlerMapping("v2,v3", "TRAPV2", trapv2);

            var inform        = new InformRequestMessageHandler();
            var informMapping = new HandlerMapping("v2,v3", "INFORM", inform);

            var store          = new ObjectStore();
            var v1             = new Version1MembershipProvider(new OctetString("public"), new OctetString("public"));
            var v2             = new Version2MembershipProvider(new OctetString("public"), new OctetString("public"));
            var v3             = new Version3MembershipProvider();
            var membership     = new ComposedMembershipProvider(new IMembershipProvider[] { v1, v2, v3 });
            var handlerFactory = new MessageHandlerFactory(new[] { trapv1Mapping, trapv2Mapping, informMapping });

            var pipelineFactory = new SnmpApplicationFactory(store, membership, handlerFactory);
            using (var engine = new SnmpEngine(pipelineFactory, new Listener {
                Users = users
            }, new EngineGroup()))
            {
                var daemonEndPoint = new IPEndPoint(IPAddress.Loopback, port.NextId);
                engine.Listener.AddBinding(daemonEndPoint);
                engine.Start();

                await Messenger.SendTrapV2Async(1, VersionCode.V2, daemonEndPoint, new OctetString("public"), new ObjectIdentifier("1.3.6.1"), 500, new List <Variable>());

                manualEvent.Wait();

                Assert.Equal(1, count);

                engine.Stop();
            }
        }
 public void Test()
 {
     var mock = new Mock<ISnmpContext>();
     var mock2 = new Mock<IListenerBinding>();
     IList<Variable> v = new List<Variable>();
     var message = new InformRequestMessage(0, VersionCode.V1, new OctetString("community"), new ObjectIdentifier("1.3.6"), 0, v);
     mock.Setup(foo => foo.Binding).Returns(mock2.Object);
     mock.Setup(foo => foo.Request).Returns(message);
     mock.Setup(foo => foo.Sender).Returns(new IPEndPoint(IPAddress.Any, 0));
     mock.Setup(foo => foo.CopyRequest(ErrorCode.NoError, 0)).Verifiable("this must be called");
     var handler = new InformRequestMessageHandler();
     Assert.Throws<ArgumentNullException>(() => handler.Handle(null, null));
     Assert.Throws<ArgumentNullException>(() => handler.Handle(mock.Object, null));
     handler.MessageReceived += delegate(object args, InformRequestMessageReceivedEventArgs e)
                                    {
                                        Assert.AreEqual(mock2.Object, e.Binding);
                                        Assert.AreEqual(message, e.InformRequestMessage);
                                        Assert.IsTrue(new IPEndPoint(IPAddress.Any, 0).Equals(e.Sender));
                                    }; 
     handler.Handle(mock.Object, new ObjectStore());
 }
        public void Test()
        {
            var mock           = new Mock <ISnmpContext>();
            var mock2          = new Mock <IListenerBinding>();
            IList <Variable> v = new List <Variable>();
            var message        = new InformRequestMessage(0, VersionCode.V1, new OctetString("community"), new ObjectIdentifier("1.3.6"), 0, v);

            mock.Setup(foo => foo.Binding).Returns(mock2.Object);
            mock.Setup(foo => foo.Request).Returns(message);
            mock.Setup(foo => foo.Sender).Returns(new IPEndPoint(IPAddress.Any, 0));
            mock.Setup(foo => foo.CopyRequest(ErrorCode.NoError, 0)).Verifiable("this must be called");
            var handler = new InformRequestMessageHandler();

            Assert.Throws <ArgumentNullException>(() => handler.Handle(null, null));
            Assert.Throws <ArgumentNullException>(() => handler.Handle(mock.Object, null));
            handler.MessageReceived += delegate(object args, InformRequestMessageReceivedEventArgs e)
            {
                Assert.Equal(mock2.Object, e.Binding);
                Assert.Equal(message, e.InformRequestMessage);
                Assert.True(new IPEndPoint(IPAddress.Any, 0).Equals(e.Sender));
            };
            handler.Handle(mock.Object, new ObjectStore());
        }
Пример #5
0
        public static void Main(string[] args)
        {
            if (args.Length != 0)
            {
                return;
            }

            var users = new EngineUserRegistry();

            users.Add(new OctetString("neither"), DefaultPrivacyProvider.DefaultPair);
            users.Add(
                new OctetString("authen"),
                new DefaultPrivacyProvider(new MD5AuthenticationProvider(new OctetString("authentication"))));
            if (DESPrivacyProvider.IsSupported)
            {
                users.Add(
                    new OctetString("privacy"),
                    new DESPrivacyProvider(
                        new OctetString("privacyphrase"),
                        new MD5AuthenticationProvider(new OctetString("authentication"))));

                // for snmpsendtrap testing
                users.Add(new OctetString("trap"),
                          new DESPrivacyProvider(
                              new OctetString("privacyphrase"),
                              new MD5AuthenticationProvider(new OctetString("authentication")))
                {
                    EngineIds = new List <OctetString> {
                        new OctetString(ByteTool.Convert("80001F8880E9630000D61FF449"))
                    }
                });
            }
            else
            {
                Console.WriteLine("DES privacy is not supported by .NET Core natively. Switched to BouncyCastle implementation.");
                users.Add(
                    new OctetString("privacy"),
                    new Samples.BouncyCastle.BouncyCastleDESPrivacyProvider(
                        new OctetString("privacyphrase"),
                        new MD5AuthenticationProvider(new OctetString("authentication"))));

                // for snmpsendtrap testing
                users.Add(new OctetString("trap"),
                          new Samples.BouncyCastle.BouncyCastleDESPrivacyProvider(
                              new OctetString("privacyphrase"),
                              new MD5AuthenticationProvider(new OctetString("authentication")))
                {
                    EngineIds = new List <OctetString> {
                        new OctetString(ByteTool.Convert("80001F8880E9630000D61FF449"))
                    }
                });
            }

            if (AESPrivacyProviderBase.IsSupported)
            {
                users.Add(new OctetString("aes"), new AESPrivacyProvider(new OctetString("privacyphrase"), new MD5AuthenticationProvider(new OctetString("authentication"))));
                users.Add(new OctetString("aes192"), new AES192PrivacyProvider(new OctetString("privacyphrase"), new MD5AuthenticationProvider(new OctetString("authentication"))));
                users.Add(new OctetString("aes256"), new AES256PrivacyProvider(new OctetString("privacyphrase"), new MD5AuthenticationProvider(new OctetString("authentication"))));

                // for snmpsendtrap testing
                users.Add(new OctetString("trapAES"),
                          new AESPrivacyProvider(
                              new OctetString("privacyphrase"),
                              new MD5AuthenticationProvider(new OctetString("authentication")))
                {
                    EngineIds = new List <OctetString> {
                        new OctetString(ByteTool.Convert("80001F8880E9630000D61FF449"))
                    }
                });
            }
            else
            {
                Console.WriteLine("AES privacy is not supported by .NET Core natively. Switched to BouncyCastle implementation.");
                users.Add(new OctetString("aes"), new Samples.BouncyCastle.BouncyCastleAESPrivacyProvider(new OctetString("privacyphrase"), new MD5AuthenticationProvider(new OctetString("authentication"))));
                users.Add(new OctetString("aes192"), new Samples.BouncyCastle.BouncyCastleAES192PrivacyProvider(new OctetString("privacyphrase"), new MD5AuthenticationProvider(new OctetString("authentication"))));
                users.Add(new OctetString("aes256"), new Samples.BouncyCastle.BouncyCastleAES256PrivacyProvider(new OctetString("privacyphrase"), new MD5AuthenticationProvider(new OctetString("authentication"))));

                // for snmpsendtrap testing
                users.Add(new OctetString("trapAES"),
                          new Samples.BouncyCastle.BouncyCastleAESPrivacyProvider(
                              new OctetString("privacyphrase"),
                              new MD5AuthenticationProvider(new OctetString("authentication")))
                {
                    EngineIds = new List <OctetString> {
                        new OctetString(ByteTool.Convert("80001F8880E9630000D61FF449"))
                    }
                });
            }

            var trapv1 = new TrapV1MessageHandler();

            trapv1.MessageReceived += WatcherTrapV1Received;
            var trapv1Mapping = new HandlerMapping("v1", "TRAPV1", trapv1);

            var trapv2 = new TrapV2MessageHandler();

            trapv2.MessageReceived += WatcherTrapV2Received;
            var trapv2Mapping = new HandlerMapping("v2,v3", "TRAPV2", trapv2);

            var inform = new InformRequestMessageHandler();

            inform.MessageReceived += WatcherInformRequestReceived;
            var informMapping = new HandlerMapping("v2,v3", "INFORM", inform);

            var store          = new ObjectStore();
            var v1             = new Version1MembershipProvider(new OctetString("public"), new OctetString("public"));
            var v2             = new Version2MembershipProvider(new OctetString("public"), new OctetString("public"));
            var v3             = new Version3MembershipProvider();
            var membership     = new ComposedMembershipProvider(new IMembershipProvider[] { v1, v2, v3 });
            var handlerFactory = new MessageHandlerFactory(new[] { trapv1Mapping, trapv2Mapping, informMapping });

            var pipelineFactory = new SnmpApplicationFactory(store, membership, handlerFactory);

            using (var engine = new SnmpEngine(pipelineFactory, new Listener {
                Users = users
            }, new EngineGroup()))
            {
                engine.Listener.AddBinding(new IPEndPoint(IPAddress.Any, 162));
                engine.Listener.ExceptionRaised += (sender, e) => Console.WriteLine($"Exception catched: {e.Exception}");
                engine.Start();
                Console.WriteLine("#SNMP is available at https://sharpsnmp.com");
                Console.WriteLine("Press any key to stop . . . ");
                Console.Read();
                engine.Stop();
            }
        }
        private async Task BackgroundProcessing(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                using (var scope = _serviceProvider.CreateScope())
                {
                    var repository = scope.ServiceProvider.GetRequiredService <ITrapUsersRepository>();

                    if (await repository.HasNewUsers(_activeTrapUsers, stoppingToken))
                    {
                        _activeTrapUsers = await repository.GetUsers();

                        var ports = _activeTrapUsers.Select(usr => usr.Port).Distinct();
                        var users = new UserRegistry();
                        users.Add(new OctetString("neither"), DefaultPrivacyProvider.DefaultPair);

                        foreach (var trapUser in _activeTrapUsers)
                        {
                            IPrivacyProvider provider;
                            if (trapUser.EncryptionType == EncryptionType.DES)
                            {
                                provider = new DESPrivacyProvider(
                                    new OctetString(trapUser.Encryption),
                                    new MD5AuthenticationProvider(new OctetString(trapUser.Password)))
                                {
                                    EngineIds = new List <OctetString> {
                                        new OctetString(ByteTool.Convert(trapUser.EngineId))
                                    }
                                };
                            }
                            else
                            {
                                provider = new AESPrivacyProvider(
                                    new OctetString(trapUser.Encryption),
                                    new MD5AuthenticationProvider(new OctetString(trapUser.Password)))
                                {
                                    EngineIds = new List <OctetString> {
                                        new OctetString(ByteTool.Convert(trapUser.EngineId))
                                    }
                                };
                            }

                            users.Add(new OctetString(trapUser.UserName), provider);
                        }

                        var trap = new TrapV2MessageHandler();
                        trap.MessageReceived += TrapMessageReceived;
                        var trapv2Mapping = new HandlerMapping("v2,v3", "TRAPV2", trap);

                        //sudo snmptrap -v3 -e 0x090807060504030201 -l authPriv -u snmpro -a MD5 -A STrP@SSWRD -x DES -X STr0ngP@SSWRD 192.168.0.110:162 ''  1.3.6.1.4.1.8072.2.3.0.1 1.3.6.1.4.1.8072.2.3.2.1 s "Example Message"
                        var inform = new InformRequestMessageHandler();
                        inform.MessageReceived += InformMessageReceived;
                        var informMapping = new HandlerMapping("v2,v3", "INFORM", inform);

                        var membership = new ComposedMembershipProvider(new IMembershipProvider[]
                        {
                            new Version1MembershipProvider(new OctetString("public"), new OctetString("public")),
                            new Version2MembershipProvider(new OctetString("public"), new OctetString("public")),
                            new Version3MembershipProvider()
                        });

                        var handlerFactory  = new MessageHandlerFactory(new[] { trapv2Mapping, informMapping });
                        var pipelineFactory = new SnmpApplicationFactory(new ObjectStore(), membership, handlerFactory);

                        if (_engine?.Active ?? false)
                        {
                            _engine.Stop();
                            _engine.Dispose();
                        }

                        _engine = new SnmpEngine(pipelineFactory, new Listener {
                            Users = users
                        }, new EngineGroup());

                        foreach (var port in ports)
                        {
                            _engine.Listener.AddBinding(new IPEndPoint(IPAddress.Any, port));
                        }

                        _engine.Start();
                    }
                }

                await Task.Delay(5000, stoppingToken);
            }
        }
Пример #7
0
        public static void Init(string ip, string trapMcastIp, int port, int trap)
        {
            SnmpLogger  logger      = new SnmpLogger();
            ObjectStore objectStore = new ObjectStore();

            OctetString getCommunity = new OctetString("public");
            OctetString setCommunity = new OctetString("public");

            IMembershipProvider[] membershipProviders = new IMembershipProvider[]
            {
                new Version1MembershipProvider(getCommunity, setCommunity),
                new Version2MembershipProvider(getCommunity, setCommunity),
                new Version3MembershipProvider()
            };
            IMembershipProvider composedMembershipProvider = new ComposedMembershipProvider(membershipProviders);

            TrapV1MessageHandler        trapv1 = new TrapV1MessageHandler();
            TrapV2MessageHandler        trapv2 = new TrapV2MessageHandler();
            InformRequestMessageHandler inform = new InformRequestMessageHandler();

            HandlerMapping[] handlerMappings = new HandlerMapping[]
            {
                new HandlerMapping("v1", "GET", new GetV1MessageHandler()),
                new HandlerMapping("v2,v3", "GET", new GetMessageHandler()),
                new HandlerMapping("v1", "SET", new SetV1MessageHandler()),
                new HandlerMapping("v2,v3", "SET", new SetMessageHandler()),
                new HandlerMapping("v1", "GETNEXT", new GetNextV1MessageHandler()),
                new HandlerMapping("v2,v3", "GETNEXT", new GetNextMessageHandler()),
                new HandlerMapping("v2,v3", "GETBULK", new GetBulkMessageHandler()),
                new HandlerMapping("v1", "TRAPV1", trapv1),
                new HandlerMapping("v2,v3", "TRAPV2", trapv2),
                new HandlerMapping("v2,v3", "INFORM", inform)                /*,
                                                                              * new HandlerMapping("*", "*", new NullMessageHandler())*/
            };
            MessageHandlerFactory messageHandlerFactory = new MessageHandlerFactory(handlerMappings);

            User[] users = new User[]
            {
                new User(new OctetString("neither"), DefaultPrivacyProvider.DefaultPair),
                new User(new OctetString("authen"), new DefaultPrivacyProvider(new MD5AuthenticationProvider(new OctetString("authentication")))),
                new User(new OctetString("privacy"), new DESPrivacyProvider(new OctetString("privacyphrase"), new MD5AuthenticationProvider(new OctetString("authentication"))))
            };
            UserRegistry userRegistry = new UserRegistry(users);

            EngineGroup engineGroup = new EngineGroup();
            Listener    listener    = new Listener()
            {
                Users = userRegistry
            };
            SnmpApplicationFactory factory = new SnmpApplicationFactory(logger, objectStore, composedMembershipProvider, messageHandlerFactory);

            _engine = new SnmpEngine(factory, listener, engineGroup);
            _engine.Listener.AddBinding(new IPEndPoint(IPAddress.Parse(ip), port));
            _engine.Listener.AddBinding(new IPEndPoint(IPAddress.Parse(ip), trap));
            //			_engine.Listener.AddBinding(new IPEndPoint(IPAddress.Parse(ip), trap), trapMcastIp != null ? IPAddress.Parse(trapMcastIp) : null);
            _engine.ExceptionRaised += (sender, e) => _logger.Error(e.Exception, "ERROR Snmp");

            _closed  = false;
            _store   = objectStore;
            _context = SynchronizationContext.Current ?? new SynchronizationContext();

            trapv1.MessageReceived += TrapV1Received;
            trapv2.MessageReceived += TrapV2Received;
            inform.MessageReceived += InformRequestReceived;

            /*(new IPEndPoint(IPAddress.Parse(ip), 0)).SetAsDefault();*/
        }
Пример #8
0
        public async Task TestTrapV2HandlerWithV3MessageAndWrongEngineId()
        {
            var manualEvent = new ManualResetEventSlim();
            // TODO: this is a hack. review it later.
            var engineId = new OctetString(ByteTool.Convert("80001F8880E9630000D61FF449"));
            var users    = new UserRegistry();

            users.Add(new OctetString("neither"), DefaultPrivacyProvider.DefaultPair);
            users.Add(new OctetString("authen"), new DefaultPrivacyProvider(new MD5AuthenticationProvider(new OctetString("authentication")))
            {
                EngineId = engineId
            });
#if !NETSTANDARD
            users.Add(new OctetString("privacy"), new DESPrivacyProvider(new OctetString("privacyphrase"),
                                                                         new MD5AuthenticationProvider(new OctetString("authentication"))));
#endif
            var count = 0;

            var trapv1        = new TrapV1MessageHandler();
            var trapv1Mapping = new HandlerMapping("v1", "TRAPV1", trapv1);

            var trapv2 = new TrapV2MessageHandler();
            trapv2.MessageReceived += (sender, args) => { count++; };
            var trapv2Mapping = new HandlerMapping("v2,v3", "TRAPV2", trapv2);

            var inform        = new InformRequestMessageHandler();
            var informMapping = new HandlerMapping("v2,v3", "INFORM", inform);

            var store          = new ObjectStore();
            var v1             = new Version1MembershipProvider(new OctetString("public"), new OctetString("public"));
            var v2             = new Version2MembershipProvider(new OctetString("public"), new OctetString("public"));
            var v3             = new Version3MembershipProvider();
            var membership     = new ComposedMembershipProvider(new IMembershipProvider[] { v1, v2, v3 });
            var handlerFactory = new MessageHandlerFactory(new[] { trapv1Mapping, trapv2Mapping, informMapping });

            var logger = new TestLogger();
            logger.Handler = (obj, args) => { manualEvent.Set(); };

            var pipelineFactory = new SnmpApplicationFactory(logger, store, membership, handlerFactory);
            var group           = new EngineGroup();
            using (var engine = new SnmpEngine(pipelineFactory, new Listener {
                Users = users
            }, group))
            {
                var daemonEndPoint = new IPEndPoint(IPAddress.Loopback, port.NextId);
                engine.Listener.AddBinding(daemonEndPoint);
                engine.Start();

                var privacy = new DefaultPrivacyProvider(new MD5AuthenticationProvider(new OctetString("authentication")));
                var trap    = new TrapV2Message(
                    VersionCode.V3,
                    1004947569,
                    234419641,
                    new OctetString("authen"),
                    new ObjectIdentifier("1.3.6"),
                    0,
                    new List <Variable>(),
                    privacy,
                    0x10000,
                    new OctetString(ByteTool.Convert("80001F8880E9630000D61FF450")),
                    0,
                    0);
                await trap.SendAsync(daemonEndPoint);

                manualEvent.Wait();

                Assert.Equal(0, count);
                Assert.Equal(new Counter32(1), group.UnknownEngineId.Data);

                engine.Stop();
            }
        }
        public async Task TestTrapV2HandlerWithV3Message()
        {
            var manualEvent = new ManualResetEventSlim();
            // TODO: this is a hack. review it later.
            var engineId = new OctetString(ByteTool.Convert("80001F8880E9630000D61FF449"));
            var users    = new EngineUserRegistry();

            users.Add(new OctetString("neither"), DefaultPrivacyProvider.DefaultPair);
            users.Add(new OctetString("authen"),
                      new DefaultPrivacyProvider(new MD5AuthenticationProvider(new OctetString("authentication")))
            {
                EngineIds = new[] { engineId }
            });
            if (DESPrivacyProvider.IsSupported)
            {
                users.Add(new OctetString("privacy"), new DESPrivacyProvider(new OctetString("privacyphrase"),
                                                                             new MD5AuthenticationProvider(new OctetString("authentication"))));
            }

            var count = 0;

            var trapv1        = new TrapV1MessageHandler();
            var trapv1Mapping = new HandlerMapping("v1", "TRAPV1", trapv1);

            var trapv2 = new TrapV2MessageHandler();

            trapv2.MessageReceived += (sender, args) =>
            {
                count++;
                manualEvent.Set();
            };
            var trapv2Mapping = new HandlerMapping("v2,v3", "TRAPV2", trapv2);

            var inform        = new InformRequestMessageHandler();
            var informMapping = new HandlerMapping("v2,v3", "INFORM", inform);

            var store          = new ObjectStore();
            var v1             = new Version1MembershipProvider(new OctetString("public"), new OctetString("public"));
            var v2             = new Version2MembershipProvider(new OctetString("public"), new OctetString("public"));
            var v3             = new Version3MembershipProvider();
            var membership     = new ComposedMembershipProvider(new IMembershipProvider[] { v1, v2, v3 });
            var handlerFactory = new MessageHandlerFactory(new[] { trapv1Mapping, trapv2Mapping, informMapping });

            var pipelineFactory = new SnmpApplicationFactory(store, membership, handlerFactory);
            var engine          = new SnmpEngine(pipelineFactory, new Listener {
                Users = users
            }, new EngineGroup());
            var daemonEndPoint = new IPEndPoint(IPAddress.Loopback, port.NextId);

            engine.Listener.AddBinding(daemonEndPoint);
            engine.Start();

            try
            {
                var privacy =
                    new DefaultPrivacyProvider(new MD5AuthenticationProvider(new OctetString("authentication")));
                var trap = new TrapV2Message(
                    VersionCode.V3,
                    1004947569,
                    234419641,
                    new OctetString("authen"),
                    new ObjectIdentifier("1.3.6"),
                    0,
                    new List <Variable>(),
                    privacy,
                    0x10000,
                    engineId,
                    0,
                    0);
                await trap.SendAsync(daemonEndPoint);

                manualEvent.Wait();

                Assert.Equal(1, count);
            }
            finally
            {
                if (SnmpMessageExtension.IsRunningOnWindows)
                {
                    engine.Stop();
                }
            }
        }
        public async Task TestInformV2HandlerWithV3MessageDES()
        {
            var manualEvent = new ManualResetEventSlim();
            // TODO: this is a hack. review it later.
            var users = new EngineUserRegistry();

            users.Add(new OctetString("neither"), DefaultPrivacyProvider.DefaultPair);
            users.Add(new OctetString("authen"),
                      new DefaultPrivacyProvider(new MD5AuthenticationProvider(new OctetString("authentication"))));
            if (DESPrivacyProvider.IsSupported)
            {
                users.Add(
                    new OctetString("privacy"),
                    new DESPrivacyProvider(
                        new OctetString("privacyphrase"),
                        new MD5AuthenticationProvider(new OctetString("authentication"))));
            }
            else
            {
                users.Add(
                    new OctetString("privacy"),
                    new BouncyCastle.BouncyCastleDESPrivacyProvider(
                        new OctetString("privacyphrase"),
                        new MD5AuthenticationProvider(new OctetString("authentication"))));
            }

            var count = 0;

            var trapv1        = new TrapV1MessageHandler();
            var trapv1Mapping = new HandlerMapping("v1", "TRAPV1", trapv1);

            var trapv2        = new TrapV2MessageHandler();
            var trapv2Mapping = new HandlerMapping("v2,v3", "TRAPV2", trapv2);

            var inform = new InformRequestMessageHandler();

            inform.MessageReceived += (sender, args) =>
            {
                count++;
                manualEvent.Set();
            };
            var informMapping = new HandlerMapping("v2,v3", "INFORM", inform);

            var store          = new ObjectStore();
            var v1             = new Version1MembershipProvider(new OctetString("public"), new OctetString("public"));
            var v2             = new Version2MembershipProvider(new OctetString("public"), new OctetString("public"));
            var v3             = new Version3MembershipProvider();
            var membership     = new ComposedMembershipProvider(new IMembershipProvider[] { v1, v2, v3 });
            var handlerFactory = new MessageHandlerFactory(new[] { trapv1Mapping, trapv2Mapping, informMapping });

            var pipelineFactory = new SnmpApplicationFactory(store, membership, handlerFactory);
            var engine          = new SnmpEngine(pipelineFactory, new Listener {
                Users = users
            }, new EngineGroup());
            var daemonEndPoint = new IPEndPoint(IPAddress.Loopback, port.NextId);

            engine.Listener.AddBinding(daemonEndPoint);
            engine.Listener.ExceptionRaised += (sender, e) => { Assert.True(false, "unhandled exception"); };
            engine.Listener.MessageReceived += (sender, e) => { Console.WriteLine(e.Message); };
            engine.Start();

            try
            {
                Discovery     discovery = Messenger.GetNextDiscovery(SnmpType.InformRequestPdu);
                ReportMessage report    = discovery.GetResponse(2000, daemonEndPoint);
                await Messenger.SendInformAsync(1,
                                                VersionCode.V3,
                                                daemonEndPoint,
                                                new OctetString("privacy"),
                                                OctetString.Empty,
                                                new ObjectIdentifier("1.3.6.1"),
                                                500,
                                                new List <Variable>(),
                                                DESPrivacyProvider.IsSupported
                                                ?(IPrivacyProvider) new DESPrivacyProvider(
                                                    new OctetString("privacyphrase"),
                                                    new MD5AuthenticationProvider(new OctetString("authentication")))
                                                : new BouncyCastle.BouncyCastleDESPrivacyProvider(
                                                    new OctetString("privacyphrase"),
                                                    new MD5AuthenticationProvider(new OctetString("authentication"))),
                                                report);

                manualEvent.Wait();

                Assert.Equal(1, count);
            }
            finally
            {
                if (SnmpMessageExtension.IsRunningOnWindows)
                {
                    engine.Stop();
                }
            }
        }