platypush/platypush/plugins/google/credentials.py

80 lines
2.6 KiB
Python
Raw Permalink Normal View History

import argparse
import httplib2
import os
import sys
from oauth2client import client
from oauth2client import tools
from oauth2client.file import Storage
def get_credentials_filename(*scopes):
from platypush.config import Config
scope_name = '-'.join([scope.split('/')[-1] for scope in scopes])
credentials_dir = os.path.join(
Config.get('workdir'), 'credentials', 'google')
os.makedirs(credentials_dir, exist_ok=True)
return os.path.join(credentials_dir, scope_name + '.json')
def get_credentials(scope):
credentials_file = get_credentials_filename(*sorted(scope.split(' ')))
if not os.path.exists(credentials_file):
2018-05-04 19:20:23 +02:00
raise RuntimeError(('Credentials file {} not found. Generate it through:\n' +
2021-04-05 00:58:44 +02:00
'\tpython -m platypush.plugins.google.credentials "{}" ' +
'<path to client_secret.json>\n' +
'\t\t[--auth_host_name AUTH_HOST_NAME]\n' +
'\t\t[--noauth_local_webserver]\n' +
'\t\t[--auth_host_port [AUTH_HOST_PORT [AUTH_HOST_PORT ...]]]\n' +
'\t\t[--logging_level [DEBUG,INFO,WARNING,ERROR,CRITICAL]]\n').
2018-05-04 19:20:23 +02:00
format(credentials_file, scope))
store = Storage(credentials_file)
credentials = store.get()
if not credentials or credentials.invalid:
credentials.refresh(httplib2.Http())
return credentials
def generate_credentials(client_secret_path, scope):
credentials_file = get_credentials_filename(*sorted(scope.split(' ')))
store = Storage(credentials_file)
flow = client.flow_from_clientsecrets(client_secret_path, scope)
flow.user_agent = 'Platypush'
flow.access_type = 'offline'
flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
2021-04-05 00:58:44 +02:00
tools.run_flow(flow, store, flags)
print('Storing credentials to ' + credentials_file)
def main():
"""
Generates a Google API credentials file given client secret JSON and scopes.
Usage::
python -m platypush.plugins.google.credentials [client_secret.json location] [comma-separated list of scopes]
"""
scope = sys.argv.pop(1) if len(sys.argv) > 1 \
2021-04-05 00:58:44 +02:00
else input('Space separated list of OAuth scopes: ')
client_secret_path = os.path.expanduser(
sys.argv.pop(1) if len(sys.argv) > 1
else input('Google credentials JSON file location: '))
# Uncomment to force headless (no browser spawned) authentication
# sys.argv.append('--noauth_local_webserver')
generate_credentials(client_secret_path, scope)
if __name__ == '__main__':
main()
# vim:sw=4:ts=4:et: