diff --git a/docs/config.rst b/docs/config.rst index 8c3ae1e..4a66173 100644 --- a/docs/config.rst +++ b/docs/config.rst @@ -133,6 +133,28 @@ To use this storage type, you need to install some additional dependencies:: pip install vdirsyncer[google] +Furthermore you need to register vdirsyncer as an application yourself to +obtain ``client_id`` and ``client_secret``, as it is against Google's Terms of +Service to hardcode those into opensource software: + +1. Go to the `Google API Manager `_ and + create a new project under any name. + +2. Within that project, enable the "CalDAV" and "CardDAV" APIs. There should be + a searchbox where you can just enter those terms. + +3. In the sidebar, select "Credentials" and create a new "OAuth Client ID". The + application type is "Other". + + You'll be prompted to create a OAuth consent screen first. Fill out that + form however you like. + +4. Finally you should have a Client ID and a Client secret. Provide these in + your storage config. + +You can select which calendars to sync on `CalDav settings page +`_. + .. autostorage:: vdirsyncer.storage.google.GoogleCalendarStorage .. autostorage:: vdirsyncer.storage.google.GoogleContactsStorage diff --git a/docs/supported.rst b/docs/supported.rst index e71d02d..3b4f34d 100644 --- a/docs/supported.rst +++ b/docs/supported.rst @@ -207,25 +207,8 @@ Vdirsyncer is continuously tested against the latest version of Baikal_. Google ------ -Using vdirsyncer with Google Calendar is possible, but it is not tested -frequently. - -:: - - [storage cal] - type = google_calendar - token_file = ~/.google-token - - [storage card] - type = google_contacts - token_file = ~/.google-token - -At first run you will be asked to authorize application for google account -access. Simply follow the instructions. - -- Google's CardDav implementation is very limited, may lead to data loss, use - with care. -- You can select which calendars to sync on `CalDav settings page - `_ +Using vdirsyncer with Google Calendar is possible as of 0.10, but it is not +tested frequently. You can use :storage:`google_contacts` and +:storage:`google_calendar`. For more information see :gh:`202` and :gh:`8`. diff --git a/vdirsyncer/storage/google.py b/vdirsyncer/storage/google.py index 263e100..0243650 100644 --- a/vdirsyncer/storage/google.py +++ b/vdirsyncer/storage/google.py @@ -14,10 +14,6 @@ logger = logging.getLogger(__name__) TOKEN_URL = 'https://accounts.google.com/o/oauth2/v2/auth' REFRESH_URL = 'https://www.googleapis.com/oauth2/v4/token' -CLIENT_ID = ('155040592229-mth5eiq7qt9dtk46j0vcnoometuab9mb' - '.apps.googleusercontent.com') -CLIENT_SECRET = 'flVXF7jB2A2-YC4rg2sUCCX1' - try: from requests_oauthlib import OAuth2Session have_oauth2 = True @@ -26,13 +22,7 @@ except ImportError: class GoogleSession(dav.DavSession): - def __init__(self, token_file, url=None, client_id=None, - client_secret=None): - # Not a default in function signature, otherwise these show up in user - # documentation - client_id = client_id or CLIENT_ID - client_secret = client_secret or CLIENT_SECRET - + def __init__(self, token_file, client_id, client_secret, url=None): # Required for discovering collections if url is not None: self.url = url @@ -96,8 +86,8 @@ class GoogleSession(dav.DavSession): GOOGLE_PARAMS_DOCS = ''' :param token_file: A filepath where access tokens are stored. - :param client_id/client_secret: OAuth credentials. Hardcoded ones are - provided, you shouldn't need this unless you hit API rate limits. + :param client_id/client_secret: OAuth credentials, obtained from the Google + API Manager. ''' @@ -124,8 +114,8 @@ class GoogleCalendarStorage(dav.CaldavStorage): storage_name = 'google_calendar' - def __init__(self, token_file, client_id=None, client_secret=None, - start_date=None, end_date=None, item_types=(), **kwargs): + def __init__(self, token_file, client_id, client_secret, start_date=None, + end_date=None, item_types=(), **kwargs): super(GoogleCalendarStorage, self).__init__( token_file=token_file, client_id=client_id, client_secret=client_secret, start_date=start_date, @@ -141,6 +131,11 @@ class GoogleCalendarStorage(dav.CaldavStorage): class GoogleContactsStorage(dav.CarddavStorage): __doc__ = '''Google contacts. + + .. note: Google's CardDAV implementation is allegedly a disaster in terms + of data safety. See `this blog post + `_ for the details. + Always back up your data. ''' + GOOGLE_PARAMS_DOCS class session_class(GoogleSession): @@ -151,8 +146,7 @@ class GoogleContactsStorage(dav.CarddavStorage): storage_name = 'google_contacts' - def __init__(self, token_file, client_id=None, client_secret=None, - **kwargs): + def __init__(self, token_file, client_id, client_secret, **kwargs): super(GoogleContactsStorage, self).__init__( token_file=token_file, client_id=client_id, client_secret=client_secret,