private void AuthenticateSpecificMechanism(NetworkCredential credential)
        {
            using (var server = new ImapPseudoServer()) {
            server.Start();

            var prof = new Profile(new NetworkCredential("imap-user", (string)null), "imap", server.HostPort);

            prof.UsingSaslMechanisms = new[] {"LOGIN", "PLAIN", "ANONYMOUS", "DIGEST-MD5", "CRAM-MD5"};
            prof.AllowInsecureLogin = true;

            // greeting
            server.EnqueueResponse("* OK ready\r\n");
            // CAPABILITY response
            server.EnqueueResponse("* CAPABILITY IMAP4rev1\r\n" +
                               "0000 OK done\r\n");
            // AUTHENTICATE X-PSEUDO-MECHANISM response
            server.EnqueueResponse("+ \r\n");
            server.EnqueueResponse("* CAPABILITY IMAP4rev1\r\n" +
                               "0001 OK done\r\n");

            using (var authMechanism = new SaslPseudoMechanism(1)) {
              authMechanism.Credential = credential;

              using (var session = ImapSessionCreator.CreateSession(prof, authMechanism, null)) {
            Assert.AreEqual(ImapSessionState.Authenticated, session.State);

            if (credential == null)
              Assert.AreEqual(new Uri(string.Format("imap://AUTH=X-PSEUDO-MECHANISM@{0}/", server.HostPort)),
                              session.Authority);
            else
              Assert.AreEqual(new Uri(string.Format("imap://sasl-user;AUTH=X-PSEUDO-MECHANISM@{0}/", server.HostPort)),
                              session.Authority);
              }

              Assert.AreSame(credential,
                         authMechanism.Credential,
                         "credential must be kept");

              Assert.AreEqual(Smdn.Security.Authentication.Sasl.SaslExchangeStatus.Succeeded,
                          authMechanism.ExchangeStatus);
            }

            server.DequeueRequest(); // CAPABILITY
            StringAssert.Contains("AUTHENTICATE X-PSEUDO-MECHANISM", server.DequeueRequest());
              }
        }
Exemple #2
0
        public void TestConnectWithSpecifiedSaslMechanism()
        {
            Connect(delegate(ImapPseudoServer server, ImapClient client) {
            // greeting
            server.EnqueueResponse("* OK [CAPABILITY IMAP4rev1] ImapPseudoServer ready\r\n");
            // AUTHENTICATE X-PSEUDO-MECHANISM
            server.EnqueueResponse("+ \r\n");
            server.EnqueueTaggedResponse("* CAPABILITY IMAP4rev1\r\n" +
                                     "$tag OK done\r\n");

            using (var authMechanism = new SaslPseudoMechanism(1)) {
              client.Connect(authMechanism);

              Assert.AreEqual(Smdn.Security.Authentication.Sasl.SaslExchangeStatus.Succeeded,
                          authMechanism.ExchangeStatus);
            }

            Assert.IsTrue(client.IsConnected);
            Assert.IsFalse(client.IsSecureSession);
            Assert.IsNotNull(client.ServerCapabilities);
            Assert.IsNotNull(client.ServerNamespace);
            Assert.IsNotNull(client.ServerID);
            Assert.IsNull((client.Profile as IImapSessionProfile).Credentials);
              });
        }
        public void TestAuthenticateSpecificMechanismSaslIRCapable()
        {
            using (var authMechanism = new SaslPseudoMechanism(2)) {
            authMechanism.Credential = new NetworkCredential("user", (string)null);

            AuthenticateSpecificMechanism(true, authMechanism);
              }
        }
 public void TestAuthenticateSpecificMechanismWithNoCredential()
 {
     using (var authMechanism = new SaslPseudoMechanism(2)) {
     AuthenticateSpecificMechanism(false, authMechanism);
       }
 }
        public void TestAuthenticateSpecificMechanismAlreadyExchanged()
        {
            using (var authMechanism = new SaslPseudoMechanism(2)) {
            byte[] clientResponse;

            authMechanism.Exchange(null, out clientResponse);

            Assert.AreNotEqual(SaslExchangeStatus.None,
                           authMechanism.ExchangeStatus);

            AuthenticateSpecificMechanism(true, authMechanism);
              }
        }