Example #1
0
        public async Task <UserClaimDTO> AcquireUserClaim(string identityServerIp, string token)
        {
            HttpRequestEntity httpRequestEntity = new HttpRequestEntity()
            {
                Method = Enums.HttpMethod.GET
            };
            HttpResponseEntity responseEntity = HttpHelper.Get(identityServerIp + "/connect/userinfo", httpRequestEntity, token);

            return(await Task.FromResult(JsonHelper.Deserialize <UserClaimDTO>(responseEntity.Bodys.ToString())));
        }
Example #2
0
        public static async void ProcessClicksForGeo(
            [QueueTrigger(QueueNames.ProcessClicksGeo)] string queuedHttpRequestString,
            [Table(TableNames.Redirects)] CloudTable redirectTable,
            [Table(TableNames.Domains)] CloudTable domainTable,
            [Table(TableNames.Geos)] CloudTable geoTable,
            ILogger log,
            ExecutionContext context)
        {
            HttpRequestEntity queuedHttpRequest = JsonConvert.DeserializeObject <HttpRequestEntity>(queuedHttpRequestString);

            var config = new ConfigurationBuilder()
                         .SetBasePath(context.FunctionAppDirectory)
                         .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
                         .AddEnvironmentVariables()
                         .Build();

            string ipLookupUrl = $"{config["FREEGEOIP_HOST"] ??= "https://freegeoip.app"}/json/{queuedHttpRequest.RemoteIpAddress}";

            log.LogInformation($"Looking up freegeoip: {ipLookupUrl}.");


            var client      = new HttpClient();
            var getResponse = await client.GetAsync(ipLookupUrl);

            if (getResponse.StatusCode == HttpStatusCode.OK)
            {
                List <DomainEntity> domains = await DomainEntity.get(domainTable, queuedHttpRequest.Host);

                if (domains == null)
                {
                    throw new Exception($"Unable to process Geo lookup - domain {queuedHttpRequest.Host} wasn't found");
                }

                string path = queuedHttpRequest.Path.Value.Substring(1);

                RedirectEntity redirect = await RedirectEntity.get(redirectTable, domains.First().Account, path);

                if (redirect != null)
                {
                    string ipResponseString = await getResponse.Content.ReadAsStringAsync();

                    dynamic   ipResponse = JsonConvert.DeserializeObject <dynamic>(ipResponseString);
                    GeoEntity geoEntity  = new GeoEntity(ipResponse);
                    await GeoEntity.put(geoTable, geoEntity);

                    Dictionary <string, int> _geoCount = JsonConvert.DeserializeObject <Dictionary <string, int> >(redirect.GeoCount ??= "{}");
                    if (_geoCount.ContainsKey(geoEntity.RowKey))
                    {
                        log.LogInformation($"Incrementing GeoCount for redirect entity {queuedHttpRequest.Path}");

                        _geoCount[geoEntity.RowKey] = _geoCount[geoEntity.RowKey] + 1;
                    }
                    else
                    {
                        log.LogInformation($"Creating GeoCount for redirect entity {queuedHttpRequest.Path}");
                        _geoCount.Add(geoEntity.RowKey, 1);
                    }

                    redirect.GeoCount = JsonConvert.SerializeObject(_geoCount);
                    await RedirectEntity.put(redirectTable, redirect);

                    return;
                }


                log.LogError($"Http request {queuedHttpRequest.Path} for click handling doesn't match handled path");
                throw new System.Exception($"Http request {queuedHttpRequest.Path} for click handling doesn't match handled path");
            }

            log.LogError($"Free geo ip lookup for IP {queuedHttpRequest.RemoteIpAddress} failed with status code {getResponse.StatusCode}");
            throw new System.Exception($"Free geo ip lookup for IP {queuedHttpRequest.RemoteIpAddress} failed with status code {getResponse.StatusCode}");
        }
Example #3
0
        public static async void ProcessRedirectClicksForGeo(
            [QueueTrigger(QueueNames.ProcessRedirectClicksForGeo)] string queuedHttpRequestString,
            [Table(TableNames.RedirectSessions)] CloudTable redirectTable,
            ILogger log,
            ExecutionContext context)
        {
            HttpRequestEntity queuedHttpRequest = JsonConvert.DeserializeObject <HttpRequestEntity>(queuedHttpRequestString);

            var config = new ConfigurationBuilder()
                         .SetBasePath(context.FunctionAppDirectory)
                         .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
                         .AddEnvironmentVariables()
                         .Build();

            string ipLookupUrl = $"{config["FREEGEOIP_HOST"] ??= "https://freegeoip.app"}/json/{queuedHttpRequest.RemoteIpAddress}";

            log.LogInformation($"Looking up freegeoip: {ipLookupUrl}.");

            var client      = new HttpClient();
            var getResponse = await client.GetAsync(ipLookupUrl);

            if (getResponse.StatusCode == HttpStatusCode.OK)
            {
                MatchCollection matches = Regex.Matches(queuedHttpRequest.Path, "/redirect/session/(\\d+)/", RegexOptions.IgnoreCase);
                if (matches.Count > 0)
                {
                    string ipResponseString = await getResponse.Content.ReadAsStringAsync();

                    dynamic   ipResponse      = JsonConvert.DeserializeObject(ipResponseString);
                    GeoEntity geoEntity       = new GeoEntity(ipResponse);
                    string    geoEntityString = JsonConvert.SerializeObject(geoEntity);

                    RedirectEntity redirectEntity = await RedirectEntity.get(redirectTable, matches[0].Groups[1].Value);

                    if (redirectEntity != null)
                    {
                        if (redirectEntity.GeoCount == null)
                        {
                            log.LogInformation($"Adding GeoCount property to redirect entity {queuedHttpRequest.Path}");
                            // redirectEntity.GeoCount = new Dictionary<string, int>();
                        }

                        Dictionary <string, int> _geoCount = JsonConvert.DeserializeObject <Dictionary <string, int> >(redirectEntity.GeoCount ??= "{}");
                        if (_geoCount.ContainsKey(geoEntityString))
                        {
                            log.LogInformation($"Incrementing GeoCount for redirect entity {queuedHttpRequest.Path}");

                            _geoCount[geoEntityString] = _geoCount[geoEntityString] + 1;
                        }
                        else
                        {
                            log.LogInformation($"Creating GeoCount for redirect entity {queuedHttpRequest.Path}");
                            _geoCount.Add(geoEntityString, 1);
                        }

                        log.LogInformation($" GeoCount property value: {JsonConvert.SerializeObject(redirectEntity.GeoCount)}");

                        await RedirectEntity.put(redirectTable, redirectEntity.RowKey, redirectEntity.RedirectTo, redirectEntity.VideoLink, redirectEntity.StartRedirectingMinutes ??= 0, redirectEntity.ClickCount, redirectEntity.CalendarClickCount, redirectEntity.VideoClickCount, JsonConvert.SerializeObject(_geoCount), redirectEntity.CalendarGeoCount, redirectEntity.VideoGeoCount);

                        log.LogInformation($"Successfully processed geo ip click for redirect query {queuedHttpRequest.Path} from {queuedHttpRequest.RemoteIpAddress}");

                        return;
                    }
                    else
                    {
                        log.LogError($"Http request {queuedHttpRequest.Path} for click geo handling failed to match a redirect session");
                        throw new System.Exception($"Http request {queuedHttpRequest.Path} for click geo handling failed to match a redirect session");
                    }
                }

                MatchCollection calendarMatches = Regex.Matches(queuedHttpRequest.Path, "/calendar/session/(\\d+)", RegexOptions.IgnoreCase);
                if (calendarMatches.Count > 0)
                {
                    string ipResponseString = await getResponse.Content.ReadAsStringAsync();

                    dynamic   ipResponse      = JsonConvert.DeserializeObject(ipResponseString);
                    GeoEntity geoEntity       = new GeoEntity(ipResponse);
                    string    geoEntityString = JsonConvert.SerializeObject(geoEntity);

                    RedirectEntity redirectEntity = await RedirectEntity.get(redirectTable, calendarMatches[0].Groups[1].Value);

                    if (redirectEntity != null)
                    {
                        Dictionary <string, int> _calendarGeoCount = JsonConvert.DeserializeObject <Dictionary <string, int> >(redirectEntity.CalendarGeoCount ??= "{}");
                        if (_calendarGeoCount.ContainsKey(geoEntityString))
                        {
                            log.LogInformation($"Incrementing CalendarGeoCount for redirect entity {queuedHttpRequest.Path}");

                            _calendarGeoCount[geoEntityString] = _calendarGeoCount[geoEntityString] + 1;
                        }
                        else
                        {
                            log.LogInformation($"Creating CalendarGeoCount for redirect entity {queuedHttpRequest.Path}");
                            _calendarGeoCount.Add(geoEntityString, 1);
                        }

                        log.LogInformation($" CalendarGeoCount property value: {JsonConvert.SerializeObject(redirectEntity.GeoCount)}");

                        await RedirectEntity.put(redirectTable, redirectEntity.RowKey, redirectEntity.RedirectTo, redirectEntity.VideoLink, redirectEntity.StartRedirectingMinutes ??= 0, redirectEntity.ClickCount, redirectEntity.CalendarClickCount, redirectEntity.VideoClickCount, redirectEntity.GeoCount, JsonConvert.SerializeObject(_calendarGeoCount), redirectEntity.VideoGeoCount);

                        log.LogInformation($"Successfully processed calendar geo ip click for redirect query {queuedHttpRequest.Path} from {queuedHttpRequest.RemoteIpAddress}");

                        return;
                    }
                    else
                    {
                        log.LogError($"Http request {queuedHttpRequest.Path} for click geo handling failed to match a redirect session");
                        throw new System.Exception($"Http request {queuedHttpRequest.Path} for click geo handling failed to match a redirect session");
                    }
                }

                MatchCollection videoMatches = Regex.Matches(queuedHttpRequest.Path, "/redirect/video/(\\d+)/", RegexOptions.IgnoreCase);
                if (videoMatches.Count > 0)
                {
                    string ipResponseString = await getResponse.Content.ReadAsStringAsync();

                    dynamic   ipResponse      = JsonConvert.DeserializeObject(ipResponseString);
                    GeoEntity geoEntity       = new GeoEntity(ipResponse);
                    string    geoEntityString = JsonConvert.SerializeObject(geoEntity);

                    RedirectEntity redirectEntity = await RedirectEntity.get(redirectTable, videoMatches[0].Groups[1].Value);

                    if (redirectEntity != null)
                    {
                        Dictionary <string, int> _videoGeoCount = JsonConvert.DeserializeObject <Dictionary <string, int> >(redirectEntity.VideoGeoCount ??= "{}");
                        if (_videoGeoCount.ContainsKey(geoEntityString))
                        {
                            log.LogInformation($"Incrementing VideoGeoCount for redirect entity {queuedHttpRequest.Path}");

                            _videoGeoCount[geoEntityString] = _videoGeoCount[geoEntityString] + 1;
                        }
                        else
                        {
                            log.LogInformation($"Creating VideoGeoCount for redirect entity {queuedHttpRequest.Path}");
                            _videoGeoCount.Add(geoEntityString, 1);
                        }

                        log.LogInformation($" VideoGeoCount property value: {JsonConvert.SerializeObject(redirectEntity.GeoCount)}");

                        await RedirectEntity.put(redirectTable, redirectEntity.RowKey, redirectEntity.RedirectTo, redirectEntity.VideoLink, redirectEntity.StartRedirectingMinutes ??= 0, redirectEntity.ClickCount, redirectEntity.CalendarClickCount, redirectEntity.VideoClickCount, redirectEntity.GeoCount, redirectEntity.CalendarGeoCount, JsonConvert.SerializeObject(_videoGeoCount));

                        log.LogInformation($"Successfully processed video geo ip click for redirect query {queuedHttpRequest.Path} from {queuedHttpRequest.RemoteIpAddress}");

                        return;
                    }
                    else
                    {
                        log.LogError($"Http request {queuedHttpRequest.Path} for click geo handling failed to match a redirect session");
                        throw new System.Exception($"Http request {queuedHttpRequest.Path} for click geo handling failed to match a redirect session");
                    }
                }

                log.LogError($"Http request {queuedHttpRequest.Path} for click handling doesn't match handled paths");
                throw new System.Exception($"Http request {queuedHttpRequest.Path} for click handling doesn't match handled paths");
            }

            log.LogError($"Free geo ip lookup for IP {queuedHttpRequest.RemoteIpAddress} failed with status code {getResponse.StatusCode}");
            throw new System.Exception($"Free geo ip lookup for IP {queuedHttpRequest.RemoteIpAddress} failed with status code {getResponse.StatusCode}");
        }
Example #4
0
        public static async void ProcessRedirectClicks(
            [QueueTrigger(QueueNames.ProcessRedirectClicks)] string queuedHttpRequestString,
            [Table(TableNames.RedirectSessions)] CloudTable redirectTable,
            [Queue(QueueNames.ProcessRedirectClicksForGeo), StorageAccount("AzureWebJobsStorage")] ICollector <HttpRequestEntity> processRedirectQueueForGeo,
            ILogger log,
            ExecutionContext context)
        {
            HttpRequestEntity queuedHttpRequest = JsonConvert.DeserializeObject <HttpRequestEntity>(queuedHttpRequestString);

            var config = new ConfigurationBuilder()
                         .SetBasePath(context.FunctionAppDirectory)
                         .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
                         .AddEnvironmentVariables()
                         .Build();

            string nodeMaster = config["NODE_SYNC_MASTER_CONN"];

            if (nodeMaster != null)
            {
                try {
                    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(nodeMaster);
                    CloudQueueClient    queueClient    = storageAccount.CreateCloudQueueClient();
                    CloudQueue          destinationProcessClicksQueue = queueClient.GetQueueReference(QueueNames.ProcessRedirectClicks);

                    await destinationProcessClicksQueue.AddMessageAsync(new CloudQueueMessage(queuedHttpRequestString));
                }
                catch (Exception ex) {
                    log.LogError(ex.Message);
                    throw ex;
                }

                return;
            }

            MatchCollection matches = Regex.Matches(queuedHttpRequest.Path, "/redirect/session/(\\d+)/", RegexOptions.IgnoreCase);

            if (matches.Count > 0)
            {
                RedirectEntity redirectEntity = await RedirectEntity.get(redirectTable, matches[0].Groups[1].Value);

                if (redirectEntity != null)
                {
                    redirectEntity.ClickCount++;
                    await RedirectEntity.put(redirectTable, redirectEntity.RowKey, redirectEntity.RedirectTo, redirectEntity.VideoLink, redirectEntity.StartRedirectingMinutes ??= 0, redirectEntity.ClickCount, redirectEntity.CalendarClickCount, redirectEntity.VideoClickCount, redirectEntity.GeoCount, redirectEntity.CalendarGeoCount, redirectEntity.VideoGeoCount);

                    processRedirectQueueForGeo.Add(queuedHttpRequest);

                    log.LogInformation($"Successfully processed click for redirect query {queuedHttpRequest.Path} from {queuedHttpRequest.RemoteIpAddress}");

                    return;
                }
                else
                {
                    log.LogError($"Http request {queuedHttpRequest.Path} for click handling failed to match a redirect session");
                    throw new System.Exception($"Http request {queuedHttpRequest.Path} for click handling doesn't match handled paths");
                }
            }

            MatchCollection sessionMatches = Regex.Matches(queuedHttpRequest.Path, "/calendar/session/(\\d+)", RegexOptions.IgnoreCase);

            if (sessionMatches.Count > 0)
            {
                RedirectEntity redirectEntity = await RedirectEntity.get(redirectTable, sessionMatches[0].Groups[1].Value);

                if (redirectEntity != null)
                {
                    redirectEntity.CalendarClickCount++;
                    await RedirectEntity.put(redirectTable, redirectEntity.RowKey, redirectEntity.RedirectTo, redirectEntity.VideoLink, redirectEntity.StartRedirectingMinutes ??= 0, redirectEntity.ClickCount, redirectEntity.CalendarClickCount, redirectEntity.VideoClickCount, redirectEntity.GeoCount, redirectEntity.CalendarGeoCount, redirectEntity.VideoGeoCount);

                    processRedirectQueueForGeo.Add(queuedHttpRequest);

                    log.LogInformation($"Successfully processed click for redirect query {queuedHttpRequest.Path} from {queuedHttpRequest.RemoteIpAddress}");

                    return;
                }
                else
                {
                    log.LogError($"Http request {queuedHttpRequest.Path} for click handling failed to match a redirect session");
                    throw new System.Exception($"Http request {queuedHttpRequest.Path} for click handling failed to match a redirect session");
                }
            }

            MatchCollection videoMatches = Regex.Matches(queuedHttpRequest.Path, "/redirect/video/(\\d+)/", RegexOptions.IgnoreCase);

            if (videoMatches.Count > 0)
            {
                RedirectEntity redirectEntity = await RedirectEntity.get(redirectTable, videoMatches[0].Groups[1].Value);

                if (redirectEntity != null)
                {
                    redirectEntity.VideoClickCount++;
                    await RedirectEntity.put(redirectTable, redirectEntity.RowKey, redirectEntity.RedirectTo, redirectEntity.VideoLink, redirectEntity.StartRedirectingMinutes ??= 0, redirectEntity.ClickCount, redirectEntity.CalendarClickCount, redirectEntity.VideoClickCount, redirectEntity.GeoCount, redirectEntity.CalendarGeoCount, redirectEntity.VideoGeoCount);

                    processRedirectQueueForGeo.Add(queuedHttpRequest);

                    log.LogInformation($"Successfully processed click for redirect query {queuedHttpRequest.Path} from {queuedHttpRequest.RemoteIpAddress}");

                    return;
                }
                else
                {
                    log.LogError($"Http request {queuedHttpRequest.Path} for click handling failed to match a redirect session");
                    throw new System.Exception($"Http request {queuedHttpRequest.Path} for click handling failed to match a redirect session");
                }
            }

            log.LogError($"Http request {queuedHttpRequest.Path} for click handling doesn't match handled paths");
            throw new System.Exception($"Http request {queuedHttpRequest.Path} for click handling doesn't match handled paths");
        }
Example #5
0
        public object Hello(HttpRequestEntity request)
        {
            request.Response.Content = "Hello World!";

            return(null);
        }
Example #6
0
        public object Post(HttpRequestEntity request)
        {
            request.Response.Content = "OK";

            return(null);
        }
Example #7
0
 public void Account(HttpRequestEntity request, string name, int age)
 {
     request.Response.Content = $"Welcome {name}! Your Age is {age}";
 }
Example #8
0
        /// <summary>
        ///     Creates a Stump data entity from a Stump contract.
        /// </summary>
        /// <param name="contract">The <see cref="StumpContract"/> used to create the entity.</param>
        /// <returns>
        ///     A <see cref="StumpEntity"/> created from the specified <paramref name="contract"/>.
        /// </returns>
        public static StumpEntity CreateEntityFromContract(StumpContract contract)
        {
            var originalRequest = new HttpRequestEntity
            {
                BodyResourceName = string.Empty,
                Headers          = CreateNameValuePairFromHeaders(contract.OriginalRequest.Headers),
                HttpMethod       = contract.OriginalRequest.HttpMethod,
                LocalEndPoint    = contract.OriginalRequest.LocalEndPoint.ToString(),
                ProtocolVersion  = contract.OriginalRequest.ProtocolVersion,
                RawUrl           = contract.OriginalRequest.RawUrl,
                RemoteEndPoint   = contract.OriginalRequest.RemoteEndPoint.ToString()
            };

            var originalResponse = new HttpResponseEntity
            {
                BodyResourceName    = string.Empty,
                Headers             = CreateNameValuePairFromHeaders(contract.OriginalResponse.Headers),
                RedirectAddress     = contract.OriginalResponse.RedirectAddress,
                ResponseDelay       = contract.OriginalResponse.ResponseDelay,
                StatusCode          = contract.OriginalResponse.StatusCode,
                StatusDescription   = contract.OriginalResponse.StatusDescription,
                TerminateConnection = contract.OriginalResponse.TerminateConnection
            };

            var response = new HttpResponseEntity
            {
                BodyResourceName    = string.Empty,
                Headers             = CreateNameValuePairFromHeaders(contract.Response.Headers),
                RedirectAddress     = contract.Response.RedirectAddress,
                ResponseDelay       = contract.Response.ResponseDelay,
                StatusCode          = contract.Response.StatusCode,
                StatusDescription   = contract.Response.StatusDescription,
                TerminateConnection = contract.Response.TerminateConnection
            };

            var entity = new StumpEntity
            {
                OriginalRequest  = originalRequest,
                OriginalResponse = originalResponse,
                Response         = response,
                Rules            = new List <RuleEntity>(),
                StumpCategory    = contract.StumpCategory,
                StumpId          = contract.StumpId,
                StumpName        = contract.StumpName,
            };

            foreach (var rule in contract.Rules)
            {
                var ruleEntity = new RuleEntity
                {
                    RuleName = rule.RuleName,
                    Settings = new List <NameValuePairEntity>()
                };

                var settings = rule.GetRuleSettings();
                foreach (var setting in settings)
                {
                    ruleEntity.Settings.Add(
                        new NameValuePairEntity
                    {
                        Name  = setting.Name,
                        Value = setting.Value
                    });
                }

                entity.Rules.Add(ruleEntity);
            }

            return(entity);
        }