Example #1
0
        private static string GenerateAppCallbackUrl(SalesforceConnectedServiceInstance salesforceInstance, Project project)
        {
            string            callbackUrl;
            WebServerFlowInfo webServerFlowInfo = salesforceInstance.RuntimeAuthentication as WebServerFlowInfo;

            if (webServerFlowInfo != null)
            {
                webServerFlowInfo.RedirectUri = new Uri(
                    Constants.OAuthRedirectHandlerPathFormat.FormatInvariantCulture(salesforceInstance.DesignerData.ServiceName),
                    UriKind.Relative);

                string appUriAuthority;
                try
                {
                    Property iisURLProp = project.Properties.Item("WebApplication.IISUrl");
                    appUriAuthority = (string)iisURLProp.Value;
                }
                catch (ArgumentException)
                {
                    // The user's project doesn't contain a "WebApplication.IISUrl" property, default it to localhost.
                    appUriAuthority = "http://localhost/";
                }

                callbackUrl = new Uri(new Uri(appUriAuthority), webServerFlowInfo.RedirectUri).ToString();
            }
            else
            {
                callbackUrl = "vs://ConnectedService";
            }

            return(callbackUrl);
        }
Example #2
0
        private static ConnectedApp ConstructConnectedApp(
            SalesforceConnectedServiceInstance salesforceInstance,
            Project project)
        {
            ConnectedApp connectedApp = new ConnectedApp();

            connectedApp.contactEmail = salesforceInstance.DesignTimeAuthentication.UserName;
            connectedApp.fullName     = salesforceInstance.ConnectedAppName;
            connectedApp.label        = salesforceInstance.ConnectedAppName;

            ConnectedAppOauthConfig oauthConfig = new ConnectedAppOauthConfig();

            connectedApp.oauthConfig = oauthConfig;
            oauthConfig.callbackUrl  = ConnectedAppHelper.GenerateAppCallbackUrl(salesforceInstance, project);
            oauthConfig.scopes       = new ConnectedAppOauthAccessScope[]
            {
                ConnectedAppOauthAccessScope.Api,
                ConnectedAppOauthAccessScope.Basic,
                ConnectedAppOauthAccessScope.RefreshToken,
            };

            string secret = Guid.NewGuid().ToString("N");

            salesforceInstance.RuntimeAuthentication.ConsumerSecret = secret;
            oauthConfig.consumerSecret = secret;

            return(connectedApp);
        }
Example #3
0
 public void TrackWizardFinishedEvent(SalesforceConnectedServiceInstance salesforceInstance, ObjectSelectionViewModel objectSelectionViewModel)
 {
     this.TrackEvent(
         TelemetryHelper.WizardFinishedEventName,
         salesforceInstance,
         null,
         (measurements) => measurements.Add(TelemetryHelper.ObjectAvailableCountDataName, objectSelectionViewModel.GetAvailableObjectCount()));
 }
Example #4
0
 public void TrackFailedEvent(string eventName, SalesforceConnectedServiceInstance salesforceInstance, Exception e)
 {
     this.TrackEvent(
         eventName,
         salesforceInstance,
         (properties) =>
     {
         properties.Add(TelemetryHelper.ExceptionTypeDataName, e.GetType().FullName);
         properties.Add(TelemetryHelper.ExceptionDetailsDataName, e.ToString());
     },
         null);
 }
Example #5
0
 public void TrackCodeGeneratedEvent(SalesforceConnectedServiceInstance salesforceInstance, string templateName, bool usedCustomTemplate)
 {
     this.TrackEvent(
         TelemetryHelper.CodeGeneratedEventName,
         salesforceInstance,
         (properties) =>
     {
         properties.Add(TelemetryHelper.GeneratedCodeTemplateDataName, templateName);
         properties.Add(TelemetryHelper.GeneratedCodeUsedCustomTemplateDataName, usedCustomTemplate.ToString());
     },
         null);
 }
        public static async Task AddGeneratedCodeAsync(
            ConnectedServiceHandlerContext context,
            Project project,
            string templateFileName,
            string outputDirectory,
            Func <ITextTemplatingSessionHost, IEnumerable <ITextTemplatingSession> > getSessions,
            Func <IPreprocessedT4Template> getPreprocessedT4Template,
            Func <ITextTemplatingSession, string> getArtifactName)
        {
            string templatePath = Path.Combine(
                RegistryHelper.GetCurrentUsersVisualStudioLocation(),
                "Templates\\ConnectedServiceTemplates\\Visual C#\\Salesforce",
                templateFileName + ".tt");
            bool useCustomTemplate = File.Exists(templatePath);

            SalesforceConnectedServiceInstance salesforceInstance = (SalesforceConnectedServiceInstance)context.ServiceInstance;

            salesforceInstance.TelemetryHelper.TrackCodeGeneratedEvent(salesforceInstance, templateFileName, useCustomTemplate);

            ITextTemplating                       textTemplating = GeneratedCodeHelper.TextTemplating;
            ITextTemplatingSessionHost            sessionHost    = (ITextTemplatingSessionHost)textTemplating;
            Func <ITextTemplatingSession, string> generateText;

            if (useCustomTemplate)
            {
                // The current user has a customized template, process and use it.
                string customTemplate = File.ReadAllText(templatePath);
                generateText = (session) =>
                {
                    sessionHost.Session = session;
                    return(textTemplating.ProcessTemplate(templatePath, customTemplate));
                };
            }
            else
            {
                // No customized template exists for the current user, use the preprocessed one for increased performance.
                generateText = (session) =>
                {
                    IPreprocessedT4Template t4Template = getPreprocessedT4Template();
                    t4Template.Session = session;
                    t4Template.Initialize();
                    return(t4Template.TransformText());
                };
            }

            foreach (ITextTemplatingSession session in getSessions(sessionHost))
            {
                string generatedText = generateText(session);
                string tempFileName  = GeneratedCodeHelper.CreateTempFile(generatedText);
                string targetPath    = Path.Combine(outputDirectory, getArtifactName(session) + ".cs");
                await context.HandlerHelper.AddFileAsync(tempFileName, targetPath);
            }
        }
Example #7
0
        private static async Task CreateConnectedAppAsync(
            SalesforceConnectedServiceInstance salesforceInstance,
            MetadataService metadataService,
            ConnectedServiceLogger logger,
            Project project)
        {
            salesforceInstance.ConnectedAppName = ConnectedAppHelper.GetUniqueConnectedAppName(metadataService, project);
            ConnectedApp connectedApp = ConnectedAppHelper.ConstructConnectedApp(salesforceInstance, project);

            SaveResult[] saveResults = metadataService.createMetadata(new Metadata[] { connectedApp });

            if (ConnectedAppHelper.DoSaveResultsIndicateDuplicateValue(saveResults))
            {
                // The connected app failed to be created because one already exists with the specified name.  This implies that the
                // attempt to generate a unique name by reading the existing connected apps failed.  It is unknown at this point what
                // causes the Salesforce server to sometimes respond to a SOAP ReadMetadata request by returning nil for a Connected App
                // name that actually exists.  In this case, retry using a random number as the app name's suffix.

                Debug.Fail("A connected app named '{0}' already exists.  This implies that the Salesforce server responded to the SOAP ReadMetadata request to read this Connected App by returning nil for it even though it actually exists."
                           .FormatCurrentCulture(salesforceInstance.ConnectedAppName));

                string secondAttemptConnectedAppName = ConnectedAppHelper.GetUniqueConnectedAppName(metadataService, project, true);
                await logger.WriteMessageAsync(LoggerMessageCategory.Information, Resources.LogMessage_DuplicateConnectedAppName, salesforceInstance.ConnectedAppName, secondAttemptConnectedAppName);

                salesforceInstance.ConnectedAppName = secondAttemptConnectedAppName;
                connectedApp = ConnectedAppHelper.ConstructConnectedApp(salesforceInstance, project);
                saveResults  = metadataService.createMetadata(new Metadata[] { connectedApp });
            }

            if (saveResults.Length != 1 || !saveResults[0].success)
            {
                string errorMessages = saveResults.SelectMany(r => r.errors)
                                       .Select(e => e.message)
                                       .Aggregate((w, n) => w + "\r\n" + n);

                throw new InvalidOperationException(Resources.ConnectedAppHelper_FailedToCreateConnectedApp.FormatCurrentCulture(errorMessages));
            }
            else
            {
                ConnectedApp readConnectedApp = ConnectedAppHelper.GetConnectedAppByName(connectedApp.fullName, metadataService);
                if (readConnectedApp != null)
                {
                    salesforceInstance.RuntimeAuthentication.ConsumerKey = readConnectedApp.oauthConfig.consumerKey;
                }
                else
                {
                    await logger.WriteMessageAsync(LoggerMessageCategory.Warning, Resources.LogMessage_FailedReadingConnectedApp);

                    salesforceInstance.RuntimeAuthentication.ConsumerKey = Constants.ConfigValue_RequiredDefault;
                }
            }
        }
        private static async Task CreateConnectedAppAsync(
            SalesforceConnectedServiceInstance salesforceInstance,
            MetadataService metadataService,
            ConnectedServiceLogger logger,
            Project project)
        {
            salesforceInstance.ConnectedAppName = ConnectedAppHelper.GetUniqueConnectedAppName(metadataService, project);
            ConnectedApp connectedApp = ConnectedAppHelper.ConstructConnectedApp(salesforceInstance, project);
            SaveResult[] saveResults = metadataService.createMetadata(new Metadata[] { connectedApp });

            if (ConnectedAppHelper.DoSaveResultsIndicateDuplicateValue(saveResults))
            {
                // The connected app failed to be created because one already exists with the specified name.  This implies that the 
                // attempt to generate a unique name by reading the existing connected apps failed.  It is unknown at this point what 
                // causes the Salesforce server to sometimes respond to a SOAP ReadMetadata request by returning nil for a Connected App
                // name that actually exists.  In this case, retry using a random number as the app name's suffix.

                Debug.Fail("A connected app named '{0}' already exists.  This implies that the Salesforce server responded to the SOAP ReadMetadata request to read this Connected App by returning nil for it even though it actually exists."
                    .FormatCurrentCulture(salesforceInstance.ConnectedAppName));

                string secondAttemptConnectedAppName = ConnectedAppHelper.GetUniqueConnectedAppName(metadataService, project, true);
                await logger.WriteMessageAsync(LoggerMessageCategory.Information, Resources.LogMessage_DuplicateConnectedAppName, salesforceInstance.ConnectedAppName, secondAttemptConnectedAppName);
                
                salesforceInstance.ConnectedAppName = secondAttemptConnectedAppName;
                connectedApp = ConnectedAppHelper.ConstructConnectedApp(salesforceInstance, project);
                saveResults = metadataService.createMetadata(new Metadata[] { connectedApp });
            }

            if (saveResults.Length != 1 || !saveResults[0].success)
            {
                string errorMessages = saveResults.SelectMany(r => r.errors)
                   .Select(e => e.message)
                   .Aggregate((w, n) => w + "\r\n" + n);

                throw new InvalidOperationException(Resources.ConnectedAppHelper_FailedToCreateConnectedApp.FormatCurrentCulture(errorMessages));
            }
            else
            {
                ConnectedApp readConnectedApp = ConnectedAppHelper.GetConnectedAppByName(connectedApp.fullName, metadataService);
                if (readConnectedApp != null)
                {
                    salesforceInstance.RuntimeAuthentication.ConsumerKey = readConnectedApp.oauthConfig.consumerKey;
                }
                else
                {
                    await logger.WriteMessageAsync(LoggerMessageCategory.Warning, Resources.LogMessage_FailedReadingConnectedApp);

                    salesforceInstance.RuntimeAuthentication.ConsumerKey = Constants.ConfigValue_RequiredDefault;
                }
            }
        }
        public static async Task CreateConnectedAppAsync(
            SalesforceConnectedServiceInstance salesforceInstance,
            ConnectedServiceLogger logger,
            Project project)
        {
            using (MetadataService metadataService = new MetadataService())
            {
                metadataService.Url = salesforceInstance.DesignTimeAuthentication.MetadataServiceUrl;
                metadataService.SessionHeaderValue = new SessionHeader();
                metadataService.SessionHeaderValue.sessionId = salesforceInstance.DesignTimeAuthentication.AccessToken;

                await AuthenticationHelper.ExecuteSalesforceRequestAsync<SoapHeaderException>(
                    salesforceInstance.DesignTimeAuthentication,
                    async () => await ConnectedAppHelper.CreateConnectedAppAsync(salesforceInstance, metadataService, logger, project),
                    (e) => e.Message.StartsWith("INVALID_SESSION_ID", StringComparison.OrdinalIgnoreCase),
                    () => metadataService.SessionHeaderValue.sessionId = salesforceInstance.DesignTimeAuthentication.AccessToken);
            }
        }
Example #10
0
        public static async Task CreateConnectedAppAsync(
            SalesforceConnectedServiceInstance salesforceInstance,
            ConnectedServiceLogger logger,
            Project project)
        {
            using (MetadataService metadataService = new MetadataService())
            {
                metadataService.Url = salesforceInstance.DesignTimeAuthentication.MetadataServiceUrl;
                metadataService.SessionHeaderValue           = new SessionHeader();
                metadataService.SessionHeaderValue.sessionId = salesforceInstance.DesignTimeAuthentication.AccessToken;

                await AuthenticationHelper.ExecuteSalesforceRequestAsync <SoapHeaderException>(
                    salesforceInstance.DesignTimeAuthentication,
                    async() => await ConnectedAppHelper.CreateConnectedAppAsync(salesforceInstance, metadataService, logger, project),
                    (e) => e.Message.StartsWith("INVALID_SESSION_ID", StringComparison.OrdinalIgnoreCase),
                    () => metadataService.SessionHeaderValue.sessionId = salesforceInstance.DesignTimeAuthentication.AccessToken);
            }
        }
Example #11
0
        private static Dictionary <string, double> GetMeasurements(
            SalesforceConnectedServiceInstance salesforceInstance,
            Action <Dictionary <string, double> > addMeasurements)
        {
            Dictionary <string, double> measurements = new Dictionary <string, double>();

            if (salesforceInstance != null)
            {
                measurements.Add(TelemetryHelper.ObjectSelectedCountDataName, salesforceInstance.SelectedObjects.Count());
            }

            if (addMeasurements != null)
            {
                addMeasurements(measurements);
            }

            return(measurements);
        }
Example #12
0
        private void TrackEvent(
            string eventName,
            SalesforceConnectedServiceInstance salesforceInstance,
            Action <Dictionary <string, string> > addProperties,
            Action <Dictionary <string, double> > addMeasurements)
        {
            try
            {
                if (!this.isOptedIn)
                {
                    return;
                }

                Dictionary <string, string> properties   = TelemetryHelper.GetProperties(salesforceInstance, addProperties);
                Dictionary <string, double> measurements = TelemetryHelper.GetMeasurements(salesforceInstance, addMeasurements);
                this.TelemetryClient.TrackEvent(eventName, properties, measurements);
            }
            catch (Exception e) // Don't let a telemetry failure take down the provider
            {
                Debug.Fail(e.ToString());
            }
        }
Example #13
0
        private static Dictionary <string, string> GetProperties(
            SalesforceConnectedServiceInstance salesforceInstance,
            Action <Dictionary <string, string> > addProperties)
        {
            Dictionary <string, string> properties = new Dictionary <string, string>();

            if (salesforceInstance != null)
            {
                properties.Add(TelemetryHelper.RuntimeAuthenticationStrategyDataName, salesforceInstance.RuntimeAuthentication.AuthStrategy.ToString());
                properties.Add(TelemetryHelper.EnvironmentTypeDataName, salesforceInstance.DesignTimeAuthentication.EnvironmentType.ToString());

                if (salesforceInstance.RuntimeAuthentication is WebServerFlowInfo)
                {
                    properties.Add(TelemetryHelper.UsesCustomDomainDataName, ((WebServerFlowInfo)salesforceInstance.RuntimeAuthentication).HasMyDomain.ToString());
                }
            }

            if (addProperties != null)
            {
                addProperties(properties);
            }

            return(properties);
        }
 public void TrackWizardFinishedEvent(SalesforceConnectedServiceInstance salesforceInstance, ObjectSelectionViewModel objectSelectionViewModel)
 {
     this.TrackEvent(
         TelemetryHelper.WizardFinishedEventName,
         salesforceInstance,
         null,
         (measurements) => measurements.Add(TelemetryHelper.ObjectAvailableCountDataName, objectSelectionViewModel.GetAvailableObjectCount()));
 }
        private static Dictionary<string, double> GetMeasurements(
            SalesforceConnectedServiceInstance salesforceInstance,
            Action<Dictionary<string, double>> addMeasurements)
        {
            Dictionary<string, double> measurements = new Dictionary<string, double>();

            if (salesforceInstance != null)
            {
                measurements.Add(TelemetryHelper.ObjectSelectedCountDataName, salesforceInstance.SelectedObjects.Count());
            }

            if (addMeasurements != null)
            {
                addMeasurements(measurements);
            }

            return measurements;
        }
        private static Dictionary<string, string> GetProperties(
            SalesforceConnectedServiceInstance salesforceInstance,
            Action<Dictionary<string, string>> addProperties)
        {
            Dictionary<string, string> properties = new Dictionary<string, string>();

            if (salesforceInstance != null)
            {
                properties.Add(TelemetryHelper.RuntimeAuthenticationStrategyDataName, salesforceInstance.RuntimeAuthentication.AuthStrategy.ToString());
                properties.Add(TelemetryHelper.EnvironmentTypeDataName, salesforceInstance.DesignTimeAuthentication.EnvironmentType.ToString());

                if (salesforceInstance.RuntimeAuthentication is WebServerFlowInfo)
                {
                    properties.Add(TelemetryHelper.UsesCustomDomainDataName, ((WebServerFlowInfo)salesforceInstance.RuntimeAuthentication).HasMyDomain.ToString());
                }
            }

            if (addProperties != null)
            {
                addProperties(properties);
            }

            return properties;
        }
        private void TrackEvent(
            string eventName,
            SalesforceConnectedServiceInstance salesforceInstance,
            Action<Dictionary<string, string>> addProperties,
            Action<Dictionary<string, double>> addMeasurements)
        {
            try
            {
                if (!this.isOptedIn)
                {
                    return;
                }

                Dictionary<string, string> properties = TelemetryHelper.GetProperties(salesforceInstance, addProperties);
                Dictionary<string, double> measurements = TelemetryHelper.GetMeasurements(salesforceInstance, addMeasurements);
                this.TelemetryClient.TrackEvent(eventName, properties, measurements);
            }
            catch (Exception e) // Don't let a telemetry failure take down the provider
            {
                Debug.Fail(e.ToString());
            }
        }
        private static ConnectedApp ConstructConnectedApp(
            SalesforceConnectedServiceInstance salesforceInstance,
            Project project)
        {
            ConnectedApp connectedApp = new ConnectedApp();
            connectedApp.contactEmail = salesforceInstance.DesignTimeAuthentication.UserName;
            connectedApp.fullName = salesforceInstance.ConnectedAppName;
            connectedApp.label = salesforceInstance.ConnectedAppName;

            ConnectedAppOauthConfig oauthConfig = new ConnectedAppOauthConfig();
            connectedApp.oauthConfig = oauthConfig;
            oauthConfig.callbackUrl = ConnectedAppHelper.GenerateAppCallbackUrl(salesforceInstance, project);
            oauthConfig.scopes = new ConnectedAppOauthAccessScope[]
            {
                ConnectedAppOauthAccessScope.Api,
                ConnectedAppOauthAccessScope.Basic,
                ConnectedAppOauthAccessScope.RefreshToken,
            };

            string secret = Guid.NewGuid().ToString("N");
            salesforceInstance.RuntimeAuthentication.ConsumerSecret = secret;
            oauthConfig.consumerSecret = secret;

            return connectedApp;
        }
        private static string GenerateAppCallbackUrl(SalesforceConnectedServiceInstance salesforceInstance, Project project)
        {
            string callbackUrl;
            WebServerFlowInfo webServerFlowInfo = salesforceInstance.RuntimeAuthentication as WebServerFlowInfo;
            if (webServerFlowInfo != null)
            {
                webServerFlowInfo.RedirectUri = new Uri(
                    Constants.OAuthRedirectHandlerPathFormat.FormatInvariantCulture(salesforceInstance.DesignerData.ServiceName),
                    UriKind.Relative);

                string appUriAuthority;
                try
                {
                    Property iisURLProp = project.Properties.Item("WebApplication.IISUrl");
                    appUriAuthority = (string)iisURLProp.Value;
                }
                catch (ArgumentException)
                {
                    // The user's project doesn't contain a "WebApplication.IISUrl" property, default it to localhost.
                    appUriAuthority = "http://localhost/";
                }

                callbackUrl = new Uri(new Uri(appUriAuthority), webServerFlowInfo.RedirectUri).ToString();
            }
            else
            {
                callbackUrl = "vs://ConnectedService";
            }

            return callbackUrl;
        }
 public void TrackFailedEvent(string eventName, SalesforceConnectedServiceInstance salesforceInstance, Exception e)
 {
     this.TrackEvent(
         eventName,
         salesforceInstance,
         (properties) =>
         {
             properties.Add(TelemetryHelper.ExceptionTypeDataName, e.GetType().FullName);
             properties.Add(TelemetryHelper.ExceptionDetailsDataName, e.ToString());
         },
         null);
 }
 public void TrackUpdateServiceSucceededEvent(SalesforceConnectedServiceInstance salesforceInstance)
 {
     this.TrackEvent(TelemetryHelper.UpdateServiceSucceededEventName, salesforceInstance, null, null);
 }
 public void TrackUpdateServiceFailedEvent(SalesforceConnectedServiceInstance salesforceInstance, Exception e)
 {
     this.TrackFailedEvent(TelemetryHelper.UpdateServiceFailedEventName, salesforceInstance, e);
 }
Example #23
0
 public void TrackUpdateServiceSucceededEvent(SalesforceConnectedServiceInstance salesforceInstance)
 {
     this.TrackEvent(TelemetryHelper.UpdateServiceSucceededEventName, salesforceInstance, null, null);
 }
 public void TrackCodeGeneratedEvent(SalesforceConnectedServiceInstance salesforceInstance, string templateName, bool usedCustomTemplate)
 {
     this.TrackEvent(
         TelemetryHelper.CodeGeneratedEventName,
         salesforceInstance,
         (properties) =>
             {
                 properties.Add(TelemetryHelper.GeneratedCodeTemplateDataName, templateName);
                 properties.Add(TelemetryHelper.GeneratedCodeUsedCustomTemplateDataName, usedCustomTemplate.ToString());
             },
         null);
 }
Example #25
0
 public void TrackUpdateServiceFailedEvent(SalesforceConnectedServiceInstance salesforceInstance, Exception e)
 {
     this.TrackFailedEvent(TelemetryHelper.UpdateServiceFailedEventName, salesforceInstance, e);
 }