Пример #1
0
        private List <ActionPropertyBag> GetMsalPropertyBagsForCorrelationId(string correlationId)
        {
            var retval = new List <ActionPropertyBag>();

            lock (_lockActionIdToPropertyBag)
            {
                foreach (var propertyBag in _actionIdToPropertyBag.Values)
                {
                    var contents   = propertyBag.GetContents();
                    var actionType = contents.StringProperties[ActionPropertyNames.ActionTypeConstStrKey];

                    string propertyBagCorrelationId = contents.StringProperties[ActionPropertyNames.CorrelationIdConstStrKey];
                    propertyBagCorrelationId = propertyBagCorrelationId.TrimCurlyBraces();
                    string correlationIdTrimmed = correlationId.TrimCurlyBraces();

                    if (string.Compare(actionType, MatsConverter.AsString(ActionType.Msal), StringComparison.OrdinalIgnoreCase) == 0 &&
                        string.Compare(propertyBagCorrelationId, correlationIdTrimmed, StringComparison.OrdinalIgnoreCase) == 0)
                    {
                        retval.Add(propertyBag);
                    }
                }
            }

            return(retval);
        }
 private bool HasActionOutcome(AuthOutcome outcome, ConcurrentDictionary <string, string> properties)
 {
     if (properties.TryGetValue(ActionPropertyNames.OutcomeConstStrKey, out string outcomeStr))
     {
         return(outcomeStr.Equals(MatsConverter.AsString(outcome)));
     }
     return(false);
 }
 private bool IsOfActionType(ActionType actionType, ConcurrentDictionary <string, string> properties)
 {
     if (properties.TryGetValue(ActionPropertyNames.ActionTypeConstStrKey, out string actionTypeStr))
     {
         return(actionTypeStr.Equals(MatsConverter.AsString(actionType)));
     }
     return(false);
 }
Пример #4
0
        public static string GetUploadEventName(IPlatformProxy platformProxy, EventType eventType, string appName)
        {
            string eventName  = MatsConverter.AsString(eventType);
            string osPlatform = platformProxy.GetMatsOsPlatform();

            return(GetUploadEventNameGeneric(
                       eventName.ToUpperInvariant(),
                       appName.ToUpperInvariant(),
                       osPlatform.ToUpperInvariant()));
        }
Пример #5
0
        public IEnumerable <IPropertyBag> GetEventsForUpload()
        {
            lock (_lockActionIdToPropertyBag)
            {
                var keysToRemove = new List <string>();
                var retval       = new List <PropertyBag>();

                foreach (var kvp in _actionIdToPropertyBag)
                {
                    var propertyBag = kvp.Value;

                    if (!propertyBag.ReadyForUpload)
                    {
                        var contents = propertyBag.GetContents();
                        if (!contents.Int64Properties.TryGetValue(ActionPropertyNames.StartTimeConstStrKey, out long startTime))
                        {
                            _errorStore.ReportError("No start time on action", ErrorType.Action, ErrorSeverity.LibraryError);
                            continue;
                        }

                        long currentTimeInMs = DateTimeUtils.GetMillisecondsSinceEpoch(DateTime.UtcNow);
                        long durationInMs    = currentTimeInMs - startTime;

                        if (propertyBag.IsAggregable && durationInMs > _maxActionDurationMillis)
                        {
                            propertyBag.ReadyForUpload = true;
                        }
                        else if (durationInMs > _maxAggregationDurationMillis)  // todo: report bug in C++ code where they're doing microseconds around this value instead of milliseconds
                        {
                            propertyBag.Add(ActionPropertyNames.EndTimeConstStrKey, currentTimeInMs);
                            propertyBag.Add(ActionPropertyNames.OutcomeConstStrKey, MatsConverter.AsString(AuthOutcome.Incomplete));
                            propertyBag.ReadyForUpload = true;
                        }
                        else
                        {
                            // not ready for upload...
                            continue;
                        }
                    }

                    retval.Add(kvp.Value);
                    keysToRemove.Add(kvp.Key);
                }

                foreach (string key in keysToRemove)
                {
                    _actionIdToPropertyBag.Remove(key);
                }

                return(retval);
            }
        }
 public void AddContext(IEnumerable <IPropertyBag> propertyBags)
 {
     foreach (var propertyBag in propertyBags)
     {
         propertyBag.Add(ContextPropertyNames.AppAudienceConstStrKey, MatsConverter.AsString(AudienceType));
         propertyBag.Add(ContextPropertyNames.AppNameConstStrKey, AppName);
         propertyBag.Add(ContextPropertyNames.AppVerConstStrKey, AppVersion);
         propertyBag.Add(ContextPropertyNames.DeviceNetworkStateConstStrKey, DeviceNetworkState);
         propertyBag.Add(ContextPropertyNames.DptiConstStrKey, DptiInternal);
         propertyBag.Add(ContextPropertyNames.SessionIdConstStrKey, SessionId);
         propertyBag.Add(ContextPropertyNames.TypeConstStrKey, ContextPropertyValues.AuthenticationConstStrValue);
         propertyBag.Add(ContextPropertyNames.MatsSdkVerConstStrKey, ContextPropertyValues.MatsSdkVerConstStrValue);
         propertyBag.Add(ContextPropertyNames.PlatformConstStrKey, Platform);
     }
 }
Пример #7
0
        private void EndGenericAction(string actionId, string outcome, ErrorSource errorSource, string error, string errorDescription, string accountCid)
        {
            if (string.IsNullOrEmpty(actionId))
            {
                // This is an invalid action; we do not want to upload it.
                _errorStore.ReportError("Tried to end an action with an empty actionId", ErrorType.Action, ErrorSeverity.Warning);
                return;
            }

            ActionPropertyBag propertyBag = GetActionPropertyBagFromId(actionId);

            if (propertyBag == null)
            {
                _errorStore.ReportError("Trying to end an action that doesn't exist or was already uploaded", ErrorType.Action, ErrorSeverity.Warning);
                return;
            }

            if (propertyBag.ReadyForUpload)
            {
                return;
            }

            int startingCount = 1;
            var endTime       = DateTime.UtcNow;

            propertyBag.Add(ActionPropertyNames.OutcomeConstStrKey, outcome);
            propertyBag.Add(ActionPropertyNames.FailureSourceConstStrKey, MatsConverter.AsString(errorSource));
            propertyBag.Add(ActionPropertyNames.FailureConstStrKey, error);
            propertyBag.Add(ActionPropertyNames.FailureDescriptionConstStrKey, errorDescription);
            propertyBag.Add(ActionPropertyNames.EndTimeConstStrKey, DateTimeUtils.GetMillisecondsSinceEpoch(endTime));
            // propertyBag->Add(ActionPropertyNames::getAccountIdConstStrKey(), accountCid);  Commenting this out for GDPR reasons; once pipeline supports this we can upload again.
            propertyBag.Add(ActionPropertyNames.CountConstStrKey, startingCount);
            PopulateDuration(propertyBag);

            //Check if should aggregate here
            var contents = propertyBag.GetContents();

            if (_eventFilter.ShouldAggregateAction(contents))
            {
                EndAggregatedAction(actionId, propertyBag);
            }
            else
            {
                propertyBag.ReadyForUpload = true;
            }
        }
Пример #8
0
        private ActionArtifacts CreateGenericAction(MatsScenario scenario, string correlationId, ActionType actionType)
        {
            string     actionId = MatsId.Create();
            MatsAction action   = new MatsAction(actionId, scenario, correlationId);

            string corrIdTrim = correlationId.TrimCurlyBraces();

            var propertyBag    = new ActionPropertyBag(_errorStore);
            var startTimePoint = DateTime.UtcNow;

            propertyBag.Add(ActionPropertyNames.UploadIdConstStrKey, MatsId.Create());
            propertyBag.Add(ActionPropertyNames.ActionTypeConstStrKey, MatsConverter.AsString(actionType));
            propertyBag.Add(ScenarioPropertyNames.IdConstStrKey, scenario?.ScenarioId);
            propertyBag.Add(ActionPropertyNames.CorrelationIdConstStrKey, corrIdTrim);
            propertyBag.Add(ActionPropertyNames.StartTimeConstStrKey, DateTimeUtils.GetMillisecondsSinceEpoch(startTimePoint));

            lock (_lockActionIdToPropertyBag)
            {
                _actionIdToPropertyBag[actionId] = propertyBag;
            }

            return(new ActionArtifacts(action, propertyBag));
        }
Пример #9
0
 public void EndMsalAction(MatsAction action, AuthOutcome outcome, ErrorSource errorSource, string error, string errorDescription)
 {
     EndGenericAction(action.ActionId, MatsConverter.AsString(outcome), errorSource, error, errorDescription, string.Empty);
 }
Пример #10
0
        public MatsAction StartMsalAction(MatsScenario scenario, string correlationId, IEnumerable <string> scopes)
        {
            var actionArtifacts = CreateGenericAction(scenario, correlationId, ActionType.Msal);

            actionArtifacts.PropertyBag.Add(ActionPropertyNames.IdentityServiceConstStrKey, MatsConverter.AsString(IdentityService.AAD));
            SetScopesProperty(actionArtifacts.PropertyBag, scopes);
            return(actionArtifacts.Action);
        }