/// <summary>
        /// Site will validate the user's local AD credentials for the cloud STS
        /// </summary>
        /// <param name="credential"></param>
        /// <returns></returns>
        public static ValidationResponse GetValidationResponse(STSCredential credential)
        {
            var data = new ValidationResponse();

            data.UserName        = credential.UserName;
            data.STSConnectionId = credential.STSConnectionId;

            // create a "principal context" - e.g. your domain (could be machine, too)
            using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, credential.Domain))
            {
                // validate the credentials
                data.IsValid = pc.ValidateCredentials(credential.UserName, credential.Password, ContextOptions.Sealing);
            }
            if (data.IsValid)
            {
                data.UserProperties = ADTools.SearchName(credential.UserName);
            }
            return(data);
        }
        public static RelayResponseInternal ProcessMessage(RelayMessage message)
        {
            RelayResponse         r;
            RelayResponseInternal res = new RelayResponseInternal
            {
                OriginSiteId       = message.OriginSiteId,
                OriginConnectionId = message.OriginConnectionId,
                RespondingSiteId   = message.DestSiteId,
                Identifier         = message.Identifier,
                Operation          = message.Operation
            };

            try
            {
                switch (message.Operation)
                {
                case SiteOperation.ResetPW:
                    r                = ADTools.ResetPassword(message);
                    res.Data         = r.Data;
                    res.Success      = r.Success;
                    res.ErrorMessage = r.ErrorMessage;
                    LogPWReset(res);
                    return(res);

                case SiteOperation.TriggerPoll:
                    r                = ActivatePoll(message);
                    res.Success      = r.Success;
                    res.ErrorMessage = r.ErrorMessage;
                    res.Operation    = SiteOperation.TriggerPoll;
                    return(res);

                case SiteOperation.DisableUser:
                    r                = ADTools.EnableDisableUser(message.Data, enabled: false);
                    res.Data         = r.Data;
                    res.Success      = r.Success;
                    res.ErrorMessage = r.ErrorMessage;
                    return(res);

                case SiteOperation.EnableUser:
                    r                = ADTools.EnableDisableUser(message.Data, enabled: true);
                    res.Data         = r.Data;
                    res.Success      = r.Success;
                    res.ErrorMessage = r.ErrorMessage;
                    return(res);

                case SiteOperation.GetUserStatus:
                    r                = ADTools.GetUserStatus(message.Data);
                    res.Data         = r.Data;
                    res.Success      = r.Success;
                    res.ErrorMessage = r.ErrorMessage;
                    return(res);

                case SiteOperation.SetUserStatus:
                    var user = Utils.ConvertDynamic <ADUser>(message.Data);
                    r                = ADTools.SetUserStatus(user);
                    res.Data         = r.Data;
                    res.Success      = r.Success;
                    res.ErrorMessage = r.ErrorMessage;
                    return(res);

                case SiteOperation.GetScriptVersion:
                    r                = GetScriptVersion(message);
                    res.Data         = r.Data;
                    res.Success      = r.Success;
                    res.ErrorMessage = r.ErrorMessage;
                    return(res);

                case SiteOperation.Ping:
                case SiteOperation.AddLogEntry:
                case SiteOperation.FireScript:
                    res.Data = message.Data;
                    return(res);
                }
                return(null);
            }
            catch (PrincipalException ex)
            {
                res.Success      = false;
                res.ErrorMessage = string.Format("An error occured processing your request. {0}", ex.Message);
                res.Exception    = ex;
                return(res);
            }
            catch (Exception ex)
            {
                res.Success      = false;
                res.ErrorMessage = string.Format("An error occured processing your request. The site and sync logs will have more details.");
                res.Exception    = ex;
                return(res);
            }
        }