Esempio n. 1
0
        private async void CmBDiscoveryServiceUrl_KeyDown(object sender, KeyEventArgs e)
        {
            if (!IsControlsEnabled)
            {
                return;
            }

            if (e.Key != Key.Enter)
            {
                return;
            }

            string discoveryServiceUrl = cmBDiscoveryServiceUrl.Text?.Trim();

            if (string.IsNullOrEmpty(discoveryServiceUrl))
            {
                return;
            }

            if (!discoveryServiceUrl.EndsWith(Properties.MessageBoxStrings.DefaultDiscoveryServiceUrlSuffix, StringComparison.InvariantCultureIgnoreCase))
            {
                discoveryServiceUrl = discoveryServiceUrl.TrimEnd('/') + Properties.MessageBoxStrings.DefaultDiscoveryServiceUrlSuffix;
            }

            if (!Uri.TryCreate(discoveryServiceUrl, UriKind.Absolute, out Uri discoveryServiceUri))
            {
                _iWriteToOutput.WriteToOutput(null, Properties.WindowStatusStrings.DiscoveryServiceCouldNotBeReceived);
                _iWriteToOutput.ActivateOutputWindow(null, this);
                return;
            }

            ToggleControls(null, false, Properties.WindowStatusStrings.DiscoveringOrganizations);

            try
            {
                this._itemsSource.Clear();

                var serviceManagement = await CreateManagementAsync(discoveryServiceUri);

                if (serviceManagement == null)
                {
                    ToggleControls(null, true, Properties.WindowStatusStrings.DiscoveryServiceConfigurationCouldNotBeReceived);
                    _iWriteToOutput.ActivateOutputWindow(null, this);
                    return;
                }

                var user = cmBDiscoveryServiceUser.SelectedItem as ConnectionUserData;

                var discoveryService = QuickConnection.CreateDiscoveryService(serviceManagement, user?.Username, user?.Password);

                if (discoveryService == null)
                {
                    ToggleControls(null, true, Properties.WindowStatusStrings.DiscoveryServiceCouldNotBeReceived);
                    _iWriteToOutput.ActivateOutputWindow(null, this);
                    return;
                }

                var repository = new DiscoveryServiceRepository(discoveryService);

                var orgs = await repository.DiscoverOrganizationsAsync();

                this._itemsSource.Clear();

                foreach (var org in orgs.OrderBy(o => o.UniqueName).ThenBy(o => o.OrganizationId))
                {
                    var viewItem = new OrganizationDetailViewItem(discoveryServiceUri, user, org);

                    this._itemsSource.Add(viewItem);
                }

                ToggleControls(null, true, Properties.WindowStatusStrings.DiscoveringOrganizationsCompleted);
            }
            catch (Exception ex)
            {
                ToggleControls(null, true, Properties.WindowStatusStrings.DiscoveringOrganizationsFailed);
                _iWriteToOutput.WriteErrorToOutput(null, ex);
            }
        }
        private static async Task <Tuple <OrganizationServiceProxy, OrganizationDetail> > ConnectInternal(ConnectionData connectionData, bool withDiscoveryRequest)
        {
            OrganizationServiceProxy serviceProxy       = null;
            OrganizationDetail       organizationDetail = null;

            Uri orgUri = null;

            if ((withDiscoveryRequest || string.IsNullOrEmpty(connectionData.OrganizationUrl)) &&
                !string.IsNullOrEmpty(connectionData.DiscoveryUrl) &&
                Uri.TryCreate(connectionData.DiscoveryUrl, UriKind.Absolute, out var discoveryUri)
                )
            {
                var disco = CreateDiscoveryService(connectionData, discoveryUri, connectionData.User?.Username, connectionData.User?.Password);

                if (disco != null)
                {
                    using (disco)
                    {
                        var repositoryDiscoveryService = new DiscoveryServiceRepository(disco);

                        var orgs = await repositoryDiscoveryService.DiscoverOrganizationsAsync();

                        if (orgs.Count == 1)
                        {
                            organizationDetail = orgs[0];
                        }
                        else if (orgs.Count > 0)
                        {
                            organizationDetail = orgs.FirstOrDefault(a => string.Equals(a.UniqueName, connectionData.UniqueOrgName, StringComparison.InvariantCultureIgnoreCase));

                            if (organizationDetail == null)
                            {
                                organizationDetail = orgs.FirstOrDefault();
                            }
                        }

                        if (organizationDetail != null && organizationDetail.Endpoints.ContainsKey(EndpointType.OrganizationService))
                        {
                            orgUri = new Uri(organizationDetail.Endpoints[EndpointType.OrganizationService]);
                        }
                    }
                }
            }

            if (!string.IsNullOrEmpty(connectionData.OrganizationUrl) &&
                Uri.TryCreate(connectionData.OrganizationUrl, UriKind.RelativeOrAbsolute, out Uri custromOrgUri)
                )
            {
                orgUri = custromOrgUri;
            }

            if (orgUri != null)
            {
                var serviceManagement = GetOrganizationServiceConfiguration(connectionData, orgUri);

                if (serviceManagement != null)
                {
                    var credentials = GetCredentials(serviceManagement, connectionData.User?.Username, connectionData.User?.Password);

                    if (serviceManagement.AuthenticationType != AuthenticationProviderType.ActiveDirectory &&
                        serviceManagement.AuthenticationType != AuthenticationProviderType.None
                        )
                    {
                        AuthenticationCredentials tokenCredentials = serviceManagement.Authenticate(credentials);

                        serviceProxy = new OrganizationServiceProxy(serviceManagement, tokenCredentials.SecurityTokenResponse);
                    }
                    else
                    {
                        serviceProxy = new OrganizationServiceProxy(serviceManagement, credentials.ClientCredentials);
                    }

                    serviceProxy.EnableProxyTypes();
                    serviceProxy.Timeout = TimeSpan.FromMinutes(30);
                }
            }

            return(Tuple.Create(serviceProxy, organizationDetail));
        }