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); }
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); }
public void TrackWizardFinishedEvent(SalesforceConnectedServiceInstance salesforceInstance, ObjectSelectionViewModel objectSelectionViewModel) { this.TrackEvent( TelemetryHelper.WizardFinishedEventName, salesforceInstance, null, (measurements) => measurements.Add(TelemetryHelper.ObjectAvailableCountDataName, objectSelectionViewModel.GetAvailableObjectCount())); }
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 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); } }
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); } }
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); } }
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 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 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); }
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); }
public void TrackUpdateServiceFailedEvent(SalesforceConnectedServiceInstance salesforceInstance, Exception e) { this.TrackFailedEvent(TelemetryHelper.UpdateServiceFailedEventName, salesforceInstance, e); }