Microsoft.Protocols.TestSuites.Common.AutoDiscover.GetAutoDiscoverProperties C# (CSharp) Method

GetAutoDiscoverProperties() public static method

Get auto discover properties for server name and proxy name
public static GetAutoDiscoverProperties ( ITestSite site, string server, string userName, string domain, string requestURL, string transport ) : AutoDiscoverProperties
site ITestSite An instance of interface ITestSite which provides logging, assertions, /// and adapters for test code onto its execution context.
server string Server to connect.
userName string User name used to logon.
domain string Domain name.
requestURL string The server url address to receive the request from clien.
transport string The current transport used in the test suite.
return AutoDiscoverProperties
        public static AutoDiscoverProperties GetAutoDiscoverProperties(
            ITestSite site,
            string server,
            string userName,
            string domain,
            string requestURL,
            string transport)
        {
            HttpStatusCode httpStatusCode = HttpStatusCode.Unused;
            XmlDocument doc = new XmlDocument();
            XmlNodeList elemList = null;
            string requestXML = string.Empty;
            string responseXML = string.Empty;

            AutoDiscoverProperties autoDiscoverProperties = new AutoDiscoverProperties
            {
                PrivateMailboxServer = null,
                PrivateMailboxProxy = null,

                PublicMailboxServer = null,
                PublicMailboxProxy = null,

                PublicMailStoreUrl = null,
                PrivateMailStoreUrl = null,

                AddressBookUrl = null
            };

            // Get auto discover properties for private mailbox
            requestXML = "<Autodiscover xmlns=\"http://schemas.microsoft.com/exchange/autodiscover/outlook/requestschema/2006\">" +
                "<Request><EMailAddress>" + userName + "@" + domain + "</EMailAddress><AcceptableResponseSchema>http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a</AcceptableResponseSchema></Request></Autodiscover>";

            if (transport == "mapi_http")
            {
                httpStatusCode = SendHttpPostRequest(site, userName, domain, requestXML, requestURL, out responseXML, true);
                site.Assert.AreEqual<HttpStatusCode>(HttpStatusCode.OK, httpStatusCode, "Http status code should be 200 (OK), the error code is {0}", httpStatusCode);
                doc.LoadXml(responseXML);

                elemList = doc.GetElementsByTagName("MailStore");
                site.Assert.IsTrue(elemList != null && elemList.Count > 0, "MailStore element should exist in response.");
                string mailStoreUrl = GetMAPIInternalURLProperty(elemList);
                site.Assert.IsFalse(string.IsNullOrEmpty(mailStoreUrl), "The mailstore internal URL should be gotten under MailStore element");
                autoDiscoverProperties.PrivateMailStoreUrl = mailStoreUrl; // Add private mailbox server

                elemList = doc.GetElementsByTagName("AddressBook");
                site.Assert.IsTrue(elemList != null && elemList.Count > 0, "AddressBook element should exist in response.");
                string addressBookUri = GetMAPIInternalURLProperty(elemList);
                site.Assert.IsFalse(string.IsNullOrEmpty(addressBookUri), "The AddressBook internal URL should be gotten under AddressBook element");
                autoDiscoverProperties.AddressBookUrl = addressBookUri;
            }
            else
            {
                httpStatusCode = SendHttpPostRequest(site, userName, domain, requestXML, requestURL, out responseXML, false);
                site.Assert.AreEqual<HttpStatusCode>(HttpStatusCode.OK, httpStatusCode, "Http status code should be 200 (OK), the error code is {0}", httpStatusCode);
                doc.LoadXml(responseXML);

                elemList = doc.GetElementsByTagName("PublicFolderInformation");
                if (elemList == null || elemList.Count == 0)
                {
                    // Not found PublicFolderInformation means the SUT is not Microsoft Exchange Server 2013, in this case, proxy will not be changed and using original server name.
                    // For Microsoft Exchange Server 2010 the private mailbox server should be same as public folder server
                    autoDiscoverProperties.PrivateMailboxServer = server; // Add private mailbox server
                    autoDiscoverProperties.PublicMailboxServer = server; // Add public mailbox server

                    return autoDiscoverProperties;
                }

                // That the PublicFolderInformation is found means that the SUT is Microsoft Exchange Server 2013, in this case, get server name and proxy information for both private mailbox and public folder.
                elemList = doc.GetElementsByTagName("Protocol");
                site.Assert.IsTrue(elemList != null && elemList.Count > 0, "Protocol element should exist in response.");

                string privateMailboxServer = GetServerNameProperty(elemList);
                site.Assert.IsFalse(string.IsNullOrEmpty(privateMailboxServer), "The private mailbox server name should be gotten under Protocol element");

                string privateMailboxProxy = GetServerProxyProperty(elemList);
                site.Assert.IsFalse(string.IsNullOrEmpty(privateMailboxProxy), "The private mailbox server proxy should be gotten under Protocol element");

                autoDiscoverProperties.PrivateMailboxServer = privateMailboxServer; // Add private mailbox server
                autoDiscoverProperties.PrivateMailboxProxy = privateMailboxProxy; // Add private mailbox proxy
            }

            // Get auto discover properties for public mailbox
            string smtpAddress = "PublicFolderMailbox_" + server + "@" + domain;
            requestXML = "<Autodiscover xmlns=\"http://schemas.microsoft.com/exchange/autodiscover/outlook/requestschema/2006\">" +
                "<Request><EMailAddress>" + smtpAddress + "</EMailAddress><AcceptableResponseSchema>http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a</AcceptableResponseSchema></Request></Autodiscover>";
            responseXML = string.Empty;

            if (transport == "mapi_http")
            {
                httpStatusCode = SendHttpPostRequest(site, userName, domain, requestXML, requestURL, out responseXML, true);
                site.Assert.AreEqual<HttpStatusCode>(HttpStatusCode.OK, httpStatusCode, "Http status code should be 200 (OK), the error code is {0}", httpStatusCode);
                doc.LoadXml(responseXML);

                elemList = doc.GetElementsByTagName("MailStore");
                site.Assert.IsTrue(elemList != null && elemList.Count > 0, "MailStore element should exist in response.");

                string publicMailStoreUrl = GetMAPIInternalURLProperty(elemList);
                site.Assert.IsFalse(string.IsNullOrEmpty(publicMailStoreUrl), "The public folder mailbox server name should be gotten under MailStore element");

                autoDiscoverProperties.PublicMailStoreUrl = publicMailStoreUrl; // Add public mailbox server
            }
            else
            {
                httpStatusCode = SendHttpPostRequest(site, userName, domain, requestXML, requestURL, out responseXML, false);
                site.Assert.AreEqual<HttpStatusCode>(HttpStatusCode.OK, httpStatusCode, "Http status code should be 200 (OK), the error code is {0}", httpStatusCode);
                doc.LoadXml(responseXML);
                elemList = doc.GetElementsByTagName("Protocol");
                site.Assert.IsTrue(elemList != null && elemList.Count > 0, "There should be an element called Protocol.");

                string publicMailboxServer = GetServerNameProperty(elemList);
                site.Assert.IsFalse(string.IsNullOrEmpty(publicMailboxServer), "The public folder mailbox server name should be gotten under Protocol element");

                string publicMailboxProxy = GetServerProxyProperty(elemList);
                site.Assert.IsFalse(string.IsNullOrEmpty(publicMailboxProxy), "The public folder mailbox server proxy should be gotten under Protocol element");

                autoDiscoverProperties.PublicMailboxServer = publicMailboxServer; // Add public mailbox server
                autoDiscoverProperties.PublicMailboxProxy = publicMailboxProxy; // Add public mailbox proxy
            }

            return autoDiscoverProperties;
        }

Usage Example

Example #1
0
        /// <summary>
        /// Send ROP request to the server.
        /// </summary>
        /// <param name="requestROPs">ROP request objects.</param>
        /// <param name="requestSOHTable">ROP request server object handle table.</param>
        /// <param name="responseROPs">ROP response objects.</param>
        /// <param name="responseSOHTable">ROP response server object handle table.</param>
        /// <param name="rgbRopOut">The response payload bytes.</param>
        /// <param name="pcbOut">The maximum size of the rgbOut buffer to place Response in.</param>
        /// <param name="mailBoxUserName">Autodiscover find the mailbox according to this username.</param>
        /// <returns>0 indicates success, other values indicate failure. </returns>
        public uint RopCall(
            List <ISerializable> requestROPs,
            List <uint> requestSOHTable,
            ref List <IDeserializable> responseROPs,
            ref List <List <uint> > responseSOHTable,
            ref byte[] rgbRopOut,
            uint pcbOut,
            string mailBoxUserName = null)
        {
            // Log the rop requests
            if (requestROPs != null)
            {
                foreach (ISerializable requestROP in requestROPs)
                {
                    byte[] ropData = requestROP.Serialize();
                    this.site.Log.Add(LogEntryKind.Comment, "Request: {0}", requestROP.GetType().Name);
                    this.site.Log.Add(LogEntryKind.Comment, Common.FormatBinaryDate(ropData));
                }
            }

            // Construct request buffer
            byte[] rgbIn = this.BuildRequestBuffer(requestROPs, requestSOHTable);

            uint ret = 0;

            switch (this.MapiContext.TransportSequence.ToLower())
            {
            case "mapi_http":
                ret = this.mapiHttpAdapter.Execute(rgbIn, pcbOut, out rgbRopOut);
                break;

            case "ncacn_ip_tcp":
            case "ncacn_http":
                ret = this.rpcAdapter.RpcExt2(ref this.cxh, rgbIn, out rgbRopOut, ref pcbOut);
                break;

            default:
                this.site.Assert.Fail("TransportSeq \"{0}\" is not supported by the test suite.");
                break;
            }

            RPC_HEADER_EXT[] rpcHeaderExts;
            byte[][]         rops;
            uint[][]         serverHandleObjectsTables;

            if (ret == OxcRpcErrorCode.ECNone)
            {
                this.ParseResponseBuffer(rgbRopOut, out rpcHeaderExts, out rops, out serverHandleObjectsTables);

                // Deserialize rops
                if (rops != null)
                {
                    foreach (byte[] rop in rops)
                    {
                        List <IDeserializable> ropResponses = new List <IDeserializable>();
                        RopDeserializer.Deserialize(rop, ref ropResponses);
                        foreach (IDeserializable ropResponse in ropResponses)
                        {
                            responseROPs.Add(ropResponse);
                            Type type = ropResponse.GetType();
                            this.site.Log.Add(LogEntryKind.Comment, "Response: {0}", type.Name);
                        }

                        this.site.Log.Add(LogEntryKind.Comment, Common.FormatBinaryDate(rop));
                    }
                }

                // Deserialize serverHandleObjectsTables
                if (serverHandleObjectsTables != null)
                {
                    foreach (uint[] serverHandleObjectsTable in serverHandleObjectsTables)
                    {
                        List <uint> serverHandleObjectList = new List <uint>();
                        foreach (uint serverHandleObject in serverHandleObjectsTable)
                        {
                            serverHandleObjectList.Add(serverHandleObject);
                        }

                        responseSOHTable.Add(serverHandleObjectList);
                    }
                }

                // The return value 0x478 means that the client needs to reconnect server with server name in response
                if (this.MapiContext.AutoRedirect && rops.Length > 0 && rops[0][0] == 0xfe && ((RopLogonResponse)responseROPs[0]).ReturnValue == 0x478)
                {
                    // Reconnect server with returned server name
                    string serverName = Encoding.ASCII.GetString(((RopLogonResponse)responseROPs[0]).ServerName);
                    serverName = serverName.Substring(serverName.LastIndexOf("=") + 1);

                    responseROPs.Clear();
                    responseSOHTable.Clear();

                    bool disconnectReturnValue = this.Disconnect();
                    this.site.Assert.IsTrue(disconnectReturnValue, "Disconnect should be successful here.");

                    string rpcProxyOptions = null;
                    if (string.Compare(this.MapiContext.TransportSequence, "ncacn_http", true) == 0)
                    {
                        rpcProxyOptions = "RpcProxy=" + this.originalServerName + "." + this.domainName;

                        bool connectionReturnValue = this.RpcConnect(serverName, this.userDN, this.domainName, this.userName, this.userPassword, rpcProxyOptions);
                        this.site.Assert.IsTrue(connectionReturnValue, "RpcConnect_Internal should be successful here.");
                    }
                    else if (string.Compare(this.MapiContext.TransportSequence, "mapi_http", true) == 0)
                    {
                        if (mailBoxUserName == null)
                        {
                            mailBoxUserName = Common.GetConfigurationPropertyValue("AdminUserName", this.site);
                            if (mailBoxUserName == null || mailBoxUserName == "")
                            {
                                this.site.Assert.Fail(@"There must be ""AdminUserName"" configure item in the ptfconfig file.");
                            }
                        }

                        string requestURL = Common.GetConfigurationPropertyValue("AutoDiscoverUrlFormat", this.site);
                        requestURL = Regex.Replace(requestURL, @"\[ServerName\]", this.originalServerName, RegexOptions.IgnoreCase);
                        string publicFolderMailbox = Common.GetConfigurationPropertyValue("PublicFolderMailbox", this.site);
                        AutoDiscoverProperties autoDiscoverProperties = AutoDiscover.GetAutoDiscoverProperties(this.site, this.originalServerName, mailBoxUserName, this.domainName, requestURL, this.MapiContext.TransportSequence.ToLower(), publicFolderMailbox);

                        this.privateMailboxServer      = autoDiscoverProperties.PrivateMailboxServer;
                        this.privateMailboxProxyServer = autoDiscoverProperties.PrivateMailboxProxy;
                        this.publicFolderServer        = autoDiscoverProperties.PublicMailboxServer;
                        this.publicFolderProxyServer   = autoDiscoverProperties.PublicMailboxProxy;
                        this.privateMailStoreUrl       = autoDiscoverProperties.PrivateMailStoreUrl;
                        this.publicFolderUrl           = autoDiscoverProperties.PublicMailStoreUrl;

                        bool connectionReturnValue = this.MapiConnect(this.privateMailStoreUrl, this.userDN, this.domainName, this.userName, this.userPassword);
                        this.site.Assert.IsTrue(connectionReturnValue, "RpcConnect_Internal should be successful here.");
                    }

                    ret = this.RopCall(
                        requestROPs,
                        requestSOHTable,
                        ref responseROPs,
                        ref responseSOHTable,
                        ref rgbRopOut,
                        0x10008);
                }
            }

            return(ret);
        }
All Usage Examples Of Microsoft.Protocols.TestSuites.Common.AutoDiscover::GetAutoDiscoverProperties