public static IWebDavClient CreateWebDavClient(
            string username,
            SecureString password,
            string serverUrl,
            TimeSpan timeout,
            ServerAdapterType serverAdapterType,
            bool closeConnectionAfterEachRequest,
            bool preemptiveAuthentication,
            bool forceBasicAuthentication,
            ProxyOptions proxyOptions,
            bool acceptInvalidChars
            )
        {
            switch (serverAdapterType)
            {
            case ServerAdapterType.WebDavHttpClientBased:
            case ServerAdapterType.WebDavHttpClientBasedWithGoogleOAuth:
                var productAndVersion = GetProductAndVersion();
                return(new DataAccess.HttpClientBasedClient.WebDavClient(
                           () => CreateHttpClient(username, password, serverUrl, timeout, serverAdapterType, proxyOptions, preemptiveAuthentication, forceBasicAuthentication),
                           productAndVersion.Item1,
                           productAndVersion.Item2,
                           closeConnectionAfterEachRequest,
                           acceptInvalidChars,
                           RequiresEtagsWithoutQuotes(serverUrl)));

            default:
                throw new ArgumentOutOfRangeException("serverAdapterType");
            }
        }
        public static IWebDavClient CreateWebDavClient(
            string username,
            string password,
            TimeSpan timeout,
            ServerAdapterType serverAdapterType,
            bool closeConnectionAfterEachRequest,
            ProxyOptions proxyOptions
            )
        {
            switch (serverAdapterType)
            {
            case ServerAdapterType.Default:
            case ServerAdapterType.GoogleOAuth:
                var productAndVersion = GetProductAndVersion();
                return(new DataAccess.HttpClientBasedClient.WebDavClient(
                           () => CreateHttpClient(username, password, timeout, serverAdapterType, proxyOptions),
                           productAndVersion.Item1,
                           productAndVersion.Item2,
                           closeConnectionAfterEachRequest));

            case ServerAdapterType.SynchronousWebRequestBased:
                return(new DataAccess.WebRequestBasedClient.WebDavClient(
                           username, password, timeout, timeout, closeConnectionAfterEachRequest));

            default:
                throw new ArgumentOutOfRangeException("serverAdapterType");
            }
        }
 private void CurrentOptions_OutlookFolderTypeChanged(object sender, EventArgs e)
 {
     if (_currentOptions.OutlookFolderType == OlItemType.olTaskItem)
     {
         _serverAdapterType = ServerAdapterType.GoogleTaskApi;
     }
     else
     {
         _serverAdapterType = ServerAdapterType.WebDavHttpClientBasedWithGoogleOAuth;
     }
 }
Пример #4
0
 public void CoerceServerAdapterType(OlItemType?itemType)
 {
     if (itemType == OlItemType.olTaskItem)
     {
         _serverAdapterType = ServerAdapterType.GoogleTaskApi;
     }
     else
     {
         _serverAdapterType = ServerAdapterType.WebDavHttpClientBasedWithGoogleOAuth;
     }
 }
 public void SetOptions(CalDavSynchronizer.Contracts.Options options)
 {
     EmailAddress = options.EmailAddress;
     if (!string.IsNullOrEmpty(options.CalenderUrl))
     {
         CalenderUrl = options.CalenderUrl;
     }
     else
     {
         CalenderUrl = OptionTasks.GoogleDavBaseUrl;
     }
     _serverAdapterType = options.ServerAdapterType;
 }
Пример #6
0
 public void SetOptions(Contracts.Options value)
 {
     _emailAddressTextBox.Text = value.EmailAddress;
     if (!string.IsNullOrEmpty(value.CalenderUrl))
     {
         _calenderUrlTextBox.Text = value.CalenderUrl;
     }
     else
     {
         _calenderUrlTextBox.Text = OptionTasks.GoogleDavBaseUrl;
     }
     _serverAdapterType      = value.ServerAdapterType;
     _networkAndProxyOptions = new NetworkAndProxyOptions(value.CloseAfterEachRequest, value.PreemptiveAuthentication, value.ForceBasicAuthentication, value.ProxyOptions ?? new ProxyOptions());
 }
        public static CardDavDataAccess CreateCardDavDataAccess(
            string calenderUrl,
            string username,
            string password,
            TimeSpan timeout,
            ServerAdapterType serverAdapterType)
        {
            var productAndVersion = GetProductAndVersion();

            var cardDavDataAccess = new CardDavDataAccess(
                new Uri(calenderUrl),
                new CardDavClient(
                    () => CreateHttpClient(username, password, timeout, serverAdapterType),
                    productAndVersion.Item1,
                    productAndVersion.Item2));

            return(cardDavDataAccess);
        }
    public static IWebDavClient CreateWebDavClient (
        string username,
        string password,
        TimeSpan timeout,
        ServerAdapterType serverAdapterType,
        bool closeConnectionAfterEachRequest,
        ProxyOptions proxyOptions
        )
    {
      switch (serverAdapterType)
      {
        case ServerAdapterType.Default:
        case ServerAdapterType.GoogleOAuth:
          var productAndVersion = GetProductAndVersion();
          return new DataAccess.HttpClientBasedClient.WebDavClient (
              () => CreateHttpClient (username, password, timeout, serverAdapterType, proxyOptions),
              productAndVersion.Item1,
              productAndVersion.Item2,
              closeConnectionAfterEachRequest);

        case ServerAdapterType.SynchronousWebRequestBased:
          return new DataAccess.WebRequestBasedClient.WebDavClient (
              username, password, timeout, timeout);
        default:
          throw new ArgumentOutOfRangeException ("serverAdapterType");
      }
    }
        private static async Task <HttpClient> CreateHttpClient(string username, string password, TimeSpan calDavConnectTimeout, ServerAdapterType serverAdapterType)
        {
            switch (serverAdapterType)
            {
            case ServerAdapterType.Default:
                var httpClientHandler = new HttpClientHandler();
                if (!string.IsNullOrEmpty(username))
                {
                    httpClientHandler.Credentials = new NetworkCredential(username, password);
                }
                var httpClient = new HttpClient(httpClientHandler);
                httpClient.Timeout = calDavConnectTimeout;
                return(httpClient);

            case ServerAdapterType.GoogleOAuth:
                return(await OAuth.Google.GoogleHttpClientFactory.CreateHttpClient(username, GetProductWithVersion()));

            default:
                throw new ArgumentOutOfRangeException("serverAdapterType");
            }
        }
Пример #10
0
    public static void DisplayTestReport (
        TestResult result,
        bool selectedSynchronizationModeRequiresWriteableServerResource,
        string selectedSynchronizationModeDisplayName,
        OlItemType? outlookFolderType,
        ServerAdapterType serverAdapterType)
    {
      bool hasError = false;
      bool hasWarning = false;
      var errorMessageBuilder = new StringBuilder ();

      var isCalendar = result.ResourceType.HasFlag (ResourceType.Calendar);
      var isAddressBook = result.ResourceType.HasFlag (ResourceType.AddressBook);
      var isGoogleTask = result.ResourceType.HasFlag (ResourceType.TaskList);

      if (isGoogleTask)
      {
        if (outlookFolderType != OlItemType.olTaskItem)
        {
          errorMessageBuilder.AppendLine ("- The outlook folder is not a task folder, or there is no folder selected.");
          hasError = true;
        }
      }
      else if (!isCalendar && !isAddressBook)
      {
        errorMessageBuilder.AppendLine ("- The specified Url is neither a calendar nor an addressbook!");
        hasError = true;
      }

      if (isCalendar && isAddressBook)
      {
        errorMessageBuilder.AppendLine ("- Ressources which are a calendar and an addressbook are not valid!");
        hasError = true;
      }

      if (isCalendar)
      {
        if (!result.CalendarProperties.HasFlag (CalendarProperties.CalendarAccessSupported))
        {
          errorMessageBuilder.AppendLine ("- The specified Url does not support calendar access.");
          hasError = true;
        }

        if (!result.CalendarProperties.HasFlag (CalendarProperties.SupportsCalendarQuery))
        {
          errorMessageBuilder.AppendLine ("- The specified Url does not support calendar queries. Some features like time range filter may not work!");
          hasWarning = true;
        }

        if (!result.CalendarProperties.HasFlag (CalendarProperties.IsWriteable))
        {
          if (selectedSynchronizationModeRequiresWriteableServerResource)
          {
            errorMessageBuilder.AppendFormat (
                "- The specified calendar is not writeable. Therefore it is not possible to use the synchronization mode '{0}'.",
                selectedSynchronizationModeDisplayName);
            errorMessageBuilder.AppendLine ();
            hasError = true;
          }
        }

        if (serverAdapterType == ServerAdapterType.WebDavHttpClientBasedWithGoogleOAuth)
        {
          if (outlookFolderType != OlItemType.olAppointmentItem)
          {
            errorMessageBuilder.AppendLine ("- The outlook folder is not a calendar folder, or there is no folder selected.");
            hasError = true;
          }
        }
        else if (outlookFolderType != OlItemType.olAppointmentItem && outlookFolderType != OlItemType.olTaskItem)
        {
          errorMessageBuilder.AppendLine ("- The outlook folder is not a calendar or task folder, or there is no folder selected.");
          hasError = true;
        }
      }

      if (isAddressBook)
      {
        if (!result.AddressBookProperties.HasFlag (AddressBookProperties.AddressBookAccessSupported))
        {
          errorMessageBuilder.AppendLine ("- The specified Url does not support address books.");
          hasError = true;
        }

        if (!result.AddressBookProperties.HasFlag (AddressBookProperties.IsWriteable))
        {
          if (selectedSynchronizationModeRequiresWriteableServerResource)
          {
            errorMessageBuilder.AppendFormat (
                "- The specified address book is not writeable. Therefore it is not possible to use the synchronization mode '{0}'.",
                selectedSynchronizationModeDisplayName);
            errorMessageBuilder.AppendLine ();
            hasError = true;
          }
        }

        if (outlookFolderType != OlItemType.olContactItem)
        {
          errorMessageBuilder.AppendLine ("- The outlook folder is not an address book, or there is no folder selected.");
          hasError = true;
        }
      }

      if (hasError)
        MessageBox.Show ("Connection test NOT successful:" + Environment.NewLine + errorMessageBuilder, OptionTasks.ConnectionTestCaption);
      else if (hasWarning)
        MessageBox.Show ("Connection test successful BUT:" + Environment.NewLine + errorMessageBuilder, OptionTasks.ConnectionTestCaption, MessageBoxButtons.OK, MessageBoxIcon.Warning);
      else
        MessageBox.Show ("Connection test successful.", OptionTasks.ConnectionTestCaption);
    }
        private static async Task <HttpClient> CreateHttpClient(string username, string password, TimeSpan calDavConnectTimeout, ServerAdapterType serverAdapterType, ProxyOptions proxyOptions)
        {
            IWebProxy proxy = (proxyOptions != null) ? CreateProxy(proxyOptions) : null;

            switch (serverAdapterType)
            {
            case ServerAdapterType.Default:
                var httpClientHandler = new HttpClientHandler();
                if (!string.IsNullOrEmpty(username))
                {
                    httpClientHandler.Credentials       = new NetworkCredential(username, password);
                    httpClientHandler.AllowAutoRedirect = false;
                }
                httpClientHandler.Proxy    = proxy;
                httpClientHandler.UseProxy = (proxy != null);

                var httpClient = new HttpClient(httpClientHandler);
                httpClient.Timeout = calDavConnectTimeout;
                return(httpClient);

            case ServerAdapterType.GoogleOAuth:
                return(await OAuth.Google.GoogleHttpClientFactory.CreateHttpClient(username, GetProductWithVersion(), proxy));

            default:
                throw new ArgumentOutOfRangeException("serverAdapterType");
            }
        }
        private static async System.Threading.Tasks.Task <HttpClient> CreateHttpClient(string username,
                                                                                       SecureString password,
                                                                                       string serverUrl,
                                                                                       TimeSpan calDavConnectTimeout,
                                                                                       ServerAdapterType serverAdapterType,
                                                                                       ProxyOptions proxyOptions,
                                                                                       bool preemptiveAuthentication,
                                                                                       bool forceBasicAuthentication)
        {
            IWebProxy proxy = (proxyOptions != null) ? CreateProxy(proxyOptions) : null;

            switch (serverAdapterType)
            {
            case ServerAdapterType.WebDavHttpClientBased:
                var httpClientHandler = new HttpClientHandler();
                if (!string.IsNullOrEmpty(username))
                {
                    var credentials = new NetworkCredential(username, password);
                    if (forceBasicAuthentication)
                    {
                        var cache = new CredentialCache();
                        cache.Add(new Uri(new Uri(serverUrl).GetLeftPart(UriPartial.Authority)), "Basic", credentials);
                        httpClientHandler.Credentials = cache;
                    }
                    else
                    {
                        httpClientHandler.Credentials = credentials;
                    }

                    httpClientHandler.AllowAutoRedirect = false;
                    httpClientHandler.PreAuthenticate   = preemptiveAuthentication;
                }
                httpClientHandler.Proxy    = proxy;
                httpClientHandler.UseProxy = (proxy != null);

                var httpClient = new HttpClient(httpClientHandler);
                httpClient.Timeout = calDavConnectTimeout;
                return(httpClient);

            case ServerAdapterType.WebDavHttpClientBasedWithGoogleOAuth:
                return(await OAuth.Google.GoogleHttpClientFactory.CreateHttpClient(username, GetProductWithVersion(), proxy));

            default:
                throw new ArgumentOutOfRangeException("serverAdapterType");
            }
        }
    private static async Task<HttpClient> CreateHttpClient (string username, string password, TimeSpan calDavConnectTimeout, ServerAdapterType serverAdapterType, ProxyOptions proxyOptions)
    {
      IWebProxy proxy = CreateProxy (proxyOptions);

      switch (serverAdapterType)
      {
        case ServerAdapterType.Default:
          var httpClientHandler = new HttpClientHandler();
          if (!string.IsNullOrEmpty (username))
          {
            httpClientHandler.Credentials = new NetworkCredential (username, password);
            httpClientHandler.AllowAutoRedirect = false;
          }
          httpClientHandler.Proxy = proxy;
          httpClientHandler.UseProxy = (proxy != null);

          var httpClient = new HttpClient (httpClientHandler);
          httpClient.Timeout = calDavConnectTimeout;
          return httpClient;
        case ServerAdapterType.GoogleOAuth:
          return await OAuth.Google.GoogleHttpClientFactory.CreateHttpClient (username, GetProductWithVersion(), proxy);
        default:
          throw new ArgumentOutOfRangeException ("serverAdapterType");
      }
    }
    public static CardDavDataAccess CreateCardDavDataAccess (
        string calenderUrl,
        string username,
        string password,
        TimeSpan timeout,
        ServerAdapterType serverAdapterType)
    {
      var productAndVersion = GetProductAndVersion();

      var cardDavDataAccess = new CardDavDataAccess (
          new Uri (calenderUrl),
          new CardDavClient (
              () => CreateHttpClient (username, password, timeout, serverAdapterType),
              productAndVersion.Item1,
              productAndVersion.Item2));
      return cardDavDataAccess;
    }
    private async Task TestGoogleConnection ()
    {
      StringBuilder errorMessageBuilder = new StringBuilder ();

      if (!OptionTasks.ValidateGoogleEmailAddress (errorMessageBuilder, _emailAddressTextBox.Text)) 
      {
        MessageBox.Show (errorMessageBuilder.ToString(), "The Email Address is invalid", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
      }
      if (UsedServerAdapterType == ServerAdapterType.GoogleTaskApi &&
          !string.IsNullOrWhiteSpace (_calenderUrlTextBox.Text) &&
          _calenderUrlTextBox.Text != c_googleDavBaseUrl)
      {
        var service = await OAuth.Google.GoogleHttpClientFactory.LoginToGoogleTasksService (_emailAddressTextBox.Text);

        try
        {
          TaskList task = await service.Tasklists.Get (_calenderUrlTextBox.Text).ExecuteAsync();
        }
        catch (Exception)
        {
          errorMessageBuilder.AppendFormat ("The tasklist with id '{0}' is invalid.", _calenderUrlTextBox.Text);
          MessageBox.Show(errorMessageBuilder.ToString(), "The tasklist is invalid", MessageBoxButtons.OK, MessageBoxIcon.Error);
          return;
        }
        TestResult result = new TestResult (ResourceType.TaskList, CalendarProperties.None, AddressBookProperties.None);

        OptionTasks.DisplayTestReport (result, false, _dependencies.SelectedSynchronizationModeDisplayName, _dependencies.OutlookFolderType, UsedServerAdapterType);
        return;
      }

      if (!OptionTasks.ValidateWebDavUrl (_calenderUrlTextBox.Text, errorMessageBuilder, false))
      {
        MessageBox.Show (errorMessageBuilder.ToString(), "The CalDav/CardDav Url is invalid", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
      }

      var enteredUri = new Uri (_calenderUrlTextBox.Text);
      var webDavClient = CreateWebDavClient ();

      Uri autoDiscoveredUrl;
      ResourceType autoDiscoveredResourceType;

      if (ConnectionTester.RequiresAutoDiscovery (enteredUri))
      {
        var calDavDataAccess = new CalDavDataAccess(enteredUri, webDavClient);
        IReadOnlyList<Tuple<Uri, string, string>> foundCaldendars = await calDavDataAccess.GetUserCalendarsNoThrow(false);

        var cardDavDataAccess = new CardDavDataAccess(enteredUri, webDavClient);
        IReadOnlyList<Tuple<Uri, string>> foundAddressBooks = await cardDavDataAccess.GetUserAddressBooksNoThrow(true);

        var service = await OAuth.Google.GoogleHttpClientFactory.LoginToGoogleTasksService(_emailAddressTextBox.Text);

        TaskLists taskLists = await service.Tasklists.List().ExecuteAsync();

        if (foundCaldendars.Count > 0 || foundAddressBooks.Count > 0 || taskLists.Items.Any())
        {
          ResourceType initalResourceType;
          if (_dependencies.OutlookFolderType == OlItemType.olContactItem)
          {
            initalResourceType = ResourceType.AddressBook;
          }
          else if (_dependencies.OutlookFolderType == OlItemType.olTaskItem)
          {
            initalResourceType = ResourceType.TaskList;
          }
          else
          {
            initalResourceType = ResourceType.Calendar;
          }

          using (SelectResourceForm listCalendarsForm =
              new SelectResourceForm(
                  foundCaldendars,
                  foundAddressBooks,
                  taskLists.Items.Select(i => Tuple.Create(i.Id, i.Title)).ToArray(),
                  initalResourceType))
          {
            if (listCalendarsForm.ShowDialog() == DialogResult.OK)
            {
              if (listCalendarsForm.ResourceType == ResourceType.TaskList)
              {
                autoDiscoveredUrl = null;
                _calenderUrlTextBox.Text = listCalendarsForm.SelectedUrl;
                UsedServerAdapterType = ServerAdapterType.GoogleTaskApi;
              }
              else
              {
                autoDiscoveredUrl = new Uri(enteredUri.GetLeftPart(UriPartial.Authority) + listCalendarsForm.SelectedUrl);
                UsedServerAdapterType = ServerAdapterType.WebDavHttpClientBasedWithGoogleOAuth;
              }
              autoDiscoveredResourceType = listCalendarsForm.ResourceType;
            }
            else
            {
              autoDiscoveredUrl = null;
              autoDiscoveredResourceType = ResourceType.None;
            }
          }
        }
        else
        {
          MessageBox.Show("No resources were found via autodiscovery!", OptionTasks.ConnectionTestCaption);
          autoDiscoveredUrl = null;
          autoDiscoveredResourceType = ResourceType.None;
        }
      }
      else
      {
        var result = await ConnectionTester.TestConnection (enteredUri, webDavClient, ResourceType.None);
        if (result.ResourceType != ResourceType.None)
        {
          _settingsFaultFinder.FixSynchronizationMode (result);
        }
        OptionTasks.DisplayTestReport (
            result,
            _dependencies.SelectedSynchronizationModeRequiresWriteableServerResource,
            _dependencies.SelectedSynchronizationModeDisplayName,
            _dependencies.OutlookFolderType,
            UsedServerAdapterType);
        return;
      }

      if (autoDiscoveredUrl != null)
      {
        _calenderUrlTextBox.Text = autoDiscoveredUrl.ToString();
        var finalResult =
          await ConnectionTester.TestConnection(autoDiscoveredUrl, webDavClient, autoDiscoveredResourceType);
        _settingsFaultFinder.FixSynchronizationMode(finalResult);

        OptionTasks.DisplayTestReport(
          finalResult,
          _dependencies.SelectedSynchronizationModeRequiresWriteableServerResource,
          _dependencies.SelectedSynchronizationModeDisplayName,
          _dependencies.OutlookFolderType,
          UsedServerAdapterType);
      }
      else if (UsedServerAdapterType == ServerAdapterType.GoogleTaskApi)
      {
        TestResult result = new TestResult(ResourceType.TaskList, CalendarProperties.None, AddressBookProperties.None);

        OptionTasks.DisplayTestReport (result,false,_dependencies.SelectedSynchronizationModeDisplayName, _dependencies.OutlookFolderType, UsedServerAdapterType);
      }
    }
 public void SetOptions (Contracts.Options value)
 {
   _emailAddressTextBox.Text = value.EmailAddress;
   if (!string.IsNullOrEmpty (value.CalenderUrl))
     _calenderUrlTextBox.Text = value.CalenderUrl;
   else
     _calenderUrlTextBox.Text = c_googleDavBaseUrl;
   UsedServerAdapterType = value.ServerAdapterType;
 }
 private static async Task<HttpClient> CreateHttpClient (string username, string password, TimeSpan calDavConnectTimeout, ServerAdapterType serverAdapterType)
 {
   switch (serverAdapterType)
   {
     case ServerAdapterType.Default:
       var httpClientHandler = new HttpClientHandler();
       if (!string.IsNullOrEmpty (username))
       {
         httpClientHandler.Credentials = new NetworkCredential (username, password);
       }
       var httpClient = new HttpClient (httpClientHandler);
       httpClient.Timeout = calDavConnectTimeout;
       return httpClient;
     case ServerAdapterType.GoogleOAuth:
       return await OAuth.Google.GoogleHttpClientFactory.CreateHttpClient (username, GetProductWithVersion());
     default:
       throw new ArgumentOutOfRangeException ("serverAdapterType");
   }
 }