public Task<bool> ChangeConnectionAsync(CrunchAuthorisationParameters crunchAuthorisationParameters)
        {
            return Task.Factory.StartNew(
                () =>
                    {
                        var consumer = CreateConsumer(crunchAuthorisationParameters);

                        string requestToken;
                        var userAuthorisationUri = consumer.RequestUserAuthorization(new Dictionary<string, string>(),
                                                                                     new Dictionary<string, string>(),
                                                                                     out requestToken);

                        var verifierTask = _requestTokenVerifier.Verify(userAuthorisationUri);

                        // wait synchronously for the result. We're already on a background thread, so we won't block the UI
                        var verifier = verifierTask.Result;
                        if (verifier != null)
                        {
                            var result = consumer.ProcessUserAuthorization(requestToken, verifier);

                            StoreParametersAndAccessToken(crunchAuthorisationParameters, result.AccessToken);
                            RaiseConnectionStatucChanged(EventArgs.Empty);
                            return true;
                        }
                        else
                        {
                            return false;
                        }

                    });
        }
 private void StoreParametersAndAccessToken(CrunchAuthorisationParameters crunchAuthorisationParameters, string accessToken)
 {
     Settings.Default.AccessTokenEndpoint = crunchAuthorisationParameters.AccessTokenEndpoint;
     Settings.Default.RequestTokenEndpoint = crunchAuthorisationParameters.RequestTokenEndpoint;
     Settings.Default.UserAuthorizationEndpoint = crunchAuthorisationParameters.UserAuthorizationEndpoint;
     Settings.Default.ConsumerKey = crunchAuthorisationParameters.ConsumerKey;
     Settings.Default.SharedSecret = crunchAuthorisationParameters.SharedSecret.EncryptAndEncodeAsBase64();
     Settings.Default.AccessToken = accessToken.EncryptAndEncodeAsBase64();
     Settings.Default.Save();
 }
        private static DesktopConsumer CreateConsumer(CrunchAuthorisationParameters crunchAuthorisationParameters)
        {
            var tokenManager = new InMemoryTokenManager(crunchAuthorisationParameters.ConsumerKey,
                                                        crunchAuthorisationParameters.SharedSecret);

            var serviceProviderDescription = CreateServiceProviderDescription(crunchAuthorisationParameters);

            var consumer = new DesktopConsumer(serviceProviderDescription, tokenManager);
            return consumer;
        }
 private static ServiceProviderDescription CreateServiceProviderDescription(CrunchAuthorisationParameters crunchAuthorisationParameters)
 {
     return new ServiceProviderDescription()
                {
                    ProtocolVersion = ProtocolVersion.V10a,
                    RequestTokenEndpoint =
                        new MessageReceivingEndpoint(crunchAuthorisationParameters.RequestTokenEndpoint,
                                                     HttpDeliveryMethods.PostRequest |HttpDeliveryMethods.AuthorizationHeaderRequest),
                    AccessTokenEndpoint =
                        new MessageReceivingEndpoint(crunchAuthorisationParameters.AccessTokenEndpoint,
                                                     HttpDeliveryMethods.PostRequest |HttpDeliveryMethods.AuthorizationHeaderRequest),
                    UserAuthorizationEndpoint =
                        new MessageReceivingEndpoint(crunchAuthorisationParameters.UserAuthorizationEndpoint,
                                                     HttpDeliveryMethods.PostRequest |HttpDeliveryMethods.AuthorizationHeaderRequest),
                    TamperProtectionElements =
                        new ITamperProtectionChannelBindingElement[] {new HmacSha1SigningBindingElement()},
                };
 }
        public CrunchAuthorisationParameters GetCurrentAuthorisationParameters()
        {
            var crunchAuthorisationParameters = new CrunchAuthorisationParameters(
                sharedSecret: Settings.Default.SharedSecret.IsNullOrWhiteSpace() ? "": Settings.Default.SharedSecret.DecryptBase64EncodedString(),
                accessTokenEndpoint: Settings.Default.AccessTokenEndpoint,
                consumerKey: Settings.Default.ConsumerKey,
                requestTokenEndpoint: Settings.Default.RequestTokenEndpoint,
                userAuthorizationEndpoint: Settings.Default.UserAuthorizationEndpoint
                );

            return crunchAuthorisationParameters;
        }