示例#1
0
        /// <summary>
        /// Retrieves a contact with some user supplied identifier.
        /// </summary>
        /// <param name="identifier">The user-supplied identifier for the contact.</param>
        /// <param name="cancellationToken">A cancellation token.</param>
        /// <returns>
        /// A task whose result is the contact, or null if no match is found.
        /// </returns>
        public override async Task <Endpoint> LookupAsync(string identifier, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (string.IsNullOrEmpty(identifier))
            {
                return(null);
            }

            Verify.Operation(this.AddressBookLookupUrl != null, "AddressBookLookupUrl not initialized");

            var queryString = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase);

            if (HashedEmailRegEx.IsMatch(identifier))
            {
                queryString["emailHash"] = identifier;
            }
            else if (EmailRegEx.IsMatch(identifier))
            {
                queryString["email"] = identifier;
            }
            else
            {
                return(null);
            }

            var builder = new UriBuilder(this.AddressBookLookupUrl);

            builder.Query = queryString.UrlEncode();
            return(await this.DownloadEndpointAsync(builder.Uri, cancellationToken).ConfigureAwait(false));
        }
示例#2
0
        public byte[] RenderReport(Entity report, string format, string parameters)
        {
            var session = GetReportSession(report, parameters);

            var url  = "/Reserved.ReportViewerWebControl.axd";
            var lcid = report.GetAttributeValue <int>("languagecode");

            format = format.ToUpper();
            if (format == "WORD" || format == "EXCEL")
            {
                format = format + "OPENXML";
            }
            var data = new Dictionary <string, dynamic>()
            {
                ["OpType"]             = "Export",
                ["Format"]             = format,
                ["ContentDisposition"] = "AlwaysAttachment",
                ["FileName"]           = string.Empty,
                ["Culture"]            = lcid.ToString(),
                ["CultureOverrides"]   = "False",
                ["UICulture"]          = lcid.ToString(),
                ["UICultureOverrides"] = "False",
                ["ReportSession"]      = session.Item1,
                ["ControlID"]          = session.Item2
            };

            return(GetResponse(GetRequest("GET", $"{url}?{data.UrlEncode()}")));
        }
示例#3
0
        private Token GetToken(string resource, string username, string password)
        {
            var uri = $"https://login.microsoftonline.com/common/oauth2/token";

            var parameters = new Dictionary <string, dynamic>()
            {
                ["grant_type"] = "password",
                ["client_id"]  = "2ad88395-b77d-4561-9441-d0e40824f9bc",
                ["username"]   = username,
                ["password"]   = password,
                ["resource"]   = resource,
            };
            var request = WebRequest.CreateHttp(uri);

            request.Method = "POST";
            var body = Encoding.ASCII.GetBytes(parameters.UrlEncode());

            request.ContentType   = "application/x-www-form-urlencoded";
            request.ContentLength = body.Length;

            using (var stream = request.GetRequestStream())
            {
                stream.Write(body, 0, body.Length);
            }

            using (var response = request.GetResponse())
                using (var stream = response.GetResponseStream())
                {
                    var serializer = new DataContractJsonSerializer(typeof(Token));
                    return(serializer.ReadObject(stream) as Token);
                }
        }
        /// <summary>
        /// Retrieves a contact with some user supplied identifier.
        /// </summary>
        /// <param name="identifier">The user-supplied identifier for the contact.</param>
        /// <param name="cancellationToken">A cancellation token.</param>
        /// <returns>
        /// A task whose result is the contact, or null if no match is found.
        /// </returns>
        public override async Task<Endpoint> LookupAsync(string identifier, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (string.IsNullOrEmpty(identifier))
            {
                return null;
            }

            Verify.Operation(this.AddressBookLookupUrl != null, "AddressBookLookupUrl not initialized");

            var queryString = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
            if (HashedEmailRegEx.IsMatch(identifier))
            {
                queryString["emailHash"] = identifier;
            }
            else if (EmailRegEx.IsMatch(identifier))
            {
                queryString["email"] = identifier;
            }
            else
            {
                return null;
            }

            var builder = new UriBuilder(this.AddressBookLookupUrl);
            builder.Query = queryString.UrlEncode();
            return await this.DownloadEndpointAsync(builder.Uri, cancellationToken).ConfigureAwait(false);
        }
        public static void Write(this WebRequest request, Dictionary <string, string> parameters)
        {
            var body = Encoding.UTF8.GetBytes(parameters.UrlEncode());

            request.ContentLength = body.Length;
            using (var stream = request.GetRequestStream())
            {
                stream.Write(body, 0, body.Length);
            }
        }
示例#6
0
		public void UrlEncode() {
			var data = new Dictionary<string, string> { { "a", "b" }, { "a=b&c", "e=f&g" }, };
			string urlEncoded = data.UrlEncode();
			Assert.That(urlEncoded, Is.EqualTo("a=b&a%3Db%26c=e%3Df%26g"));

			var decoded = HttpUtility.ParseQueryString(urlEncoded);
			Assert.That(decoded.Count, Is.EqualTo(data.Count));
			foreach (string key in decoded) {
				Assert.That(data[key], Is.EqualTo(decoded[key]));
			}
		}
示例#7
0
        public void UrlEncode()
        {
            var data = new Dictionary <string, string> {
                { "a", "b" }, { "a=b&c", "e=f&g" },
            };
            string urlEncoded = data.UrlEncode();

            Assert.That(urlEncoded, Is.EqualTo("a=b&a%3Db%26c=e%3Df%26g"));

            var decoded = HttpUtility.ParseQueryString(urlEncoded);

            Assert.That(decoded.Count, Is.EqualTo(data.Count));
            foreach (string key in decoded)
            {
                Assert.That(data[key], Is.EqualTo(decoded[key]));
            }
        }
示例#8
0
        private Tuple <string, string> GetReportSession(Entity report, string parameters)
        {
            var name     = report.GetAttributeValue <string>("reportnameonsrs");
            var isCustom = name == null;

            var url  = "/CRMReports/RSViewer/ReportViewer.aspx";
            var data = new Dictionary <string, dynamic>()
            {
                ["id"]              = report.Id.ToString("B"),
                ["iscustomreport"]  = isCustom.ToString().ToLower(),
                ["reportnameonsrs"] = name
            };

            if (!string.IsNullOrEmpty(parameters))
            {
                Dictionary <string, dynamic> parsedParameters;
                try
                {
                    parsedParameters = parameters.Parse();
                }
                catch (Exception)
                {
                    throw new Exception("Unable to parse report parameters.  Please ensure they are in JSON format.");
                }

                if (isCustom)
                {
                    foreach (var parameter in parsedParameters)
                    {
                        data.Add($"p:{parameter.Key}", parameter.Value);
                    }
                }
                else
                {
                    var filter = new StringBuilder();
                    filter.Append("<ReportFilter>");
                    foreach (var parameter in parsedParameters)
                    {
                        filter.Append($"<ReportEntity paramname=\"{parameter.Key}\">{parameter.Value}</ReportEntity>");
                    }
                    filter.Append("</ReportFilter>");
                    data.Add("CRM_Filter", filter.ToString());
                }
            }
            else
            {
                if (!isCustom)
                {
                    var defaultFilter = report.GetAttributeValue <string>("defaultfilter");
                    data.Add("CRM_Filter", defaultFilter);
                }
            }

            var response = Encoding.UTF8.GetString(GetResponse(GetRequest("POST", url, data.UrlEncode())));

            if (response.Contains("ReportSession=") && response.Contains("ControlID="))
            {
                var sessionId = response.Substring(response.LastIndexOf("ReportSession=") + 14, 24);
                var controlId = response.Substring(response.LastIndexOf("ControlID=") + 10, 32);

                return(new Tuple <string, string>(sessionId, controlId));
            }
            else
            {
                throw new Exception("Error while getting report session.  This is most likely an issue with invalid report parameters.");
            }
        }
示例#9
0
        private Tuple <string, string> GetReportSession(Entity report, string parameters)
        {
            var name     = report.GetAttributeValue <string>("reportnameonsrs");
            var isCustom = name == null;

            var url  = "/CRMReports/RSViewer/ReportViewer.aspx";
            var data = new Dictionary <string, dynamic>()
            {
                ["id"]              = report.Id.ToString("B"),
                ["iscustomreport"]  = isCustom.ToString().ToLower(),
                ["reportnameonsrs"] = name
            };

            if (!string.IsNullOrEmpty(parameters))
            {
                if (isCustom)
                {
                    foreach (var parameter in parameters.Parse())
                    {
                        data.Add($"p:{parameter.Key}", parameter.Value);
                    }
                }
                else
                {
                    var filter = new StringBuilder();
                    filter.Append("<ReportFilter>");
                    foreach (var parameter in parameters.Parse())
                    {
                        filter.Append($"<ReportEntity paramname=\"{parameter.Key}\">{parameter.Value}</ReportEntity>");
                    }
                    filter.Append("</ReportFilter>");
                    data.Add("CRM_Filter", filter.ToString());
                }
            }
            else
            {
                if (!isCustom)
                {
                    var defaultFilter = report.GetAttributeValue <string>("defaultfilter");
                    data.Add("CRM_Filter", defaultFilter);
                }
            }

            var response = Encoding.UTF8.GetString(GetResponse(GetRequest("POST", url, data.UrlEncode())));

            var sessionId = response.Substring(response.LastIndexOf("ReportSession=") + 14, 24);
            var controlId = response.Substring(response.LastIndexOf("ControlID=") + 10, 32);

            return(new Tuple <string, string>(sessionId, controlId));
        }