def build_fs(self, current_user, credentials, root=None, callback_url=None, request=None, session=None): """Build dropbox filesystem.""" url = url_for('oauthclient.login', remote_app='dropbox') client_id = oauth.remote_apps['dropbox'].consumer_key user_id = current_user.get_id() token = RemoteToken.get(user_id, client_id) if token is not None: credentials = {'access_token': token.access_token} try: filesystem = DropboxFS(root, credentials) filesystem.about() return filesystem except ResourceNotFoundError: if (root != "/"): filesystem = DropboxFS("/", credentials) filesystem.makedir(root, recursive=True) filesystem = DropboxFS(root, credentials) return filesystem except: raise CloudRedirectUrl(url, __name__) else: raise CloudRedirectUrl(url, __name__)
def get_api(user_id=None): """ Get an authenticated GitHub API interface """ if user_id: access_token = RemoteToken.get(user_id, get_client_id()).access_token else: access_token = get_remote().get_request_token()[0] return init_api(access_token)
def build_fs(self, current_user, credentials, root=None, callback_url=None, request=None, session=None): """Build google drive filesystem.""" url = url_for('oauthclient.login', remote_app='google_drive') client_id = oauth.remote_apps['google_drive'].consumer_key client_secret = oauth.remote_apps['google_drive'].consumer_secret user_id = current_user.get_id() token = RemoteToken.get(user_id, client_id) if token is not None: credentials = { 'access_token': token.access_token, 'client_id': client_id, 'client_secret': client_secret, 'refresh_token': token.remote_account.extra_data.get('refresh_token'), 'token_expiry': None, 'token_uri': 'https://accounts.google.com/o/oauth2/token' } try: filesystem = GoogleDriveFS(root, credentials) filesystem.about() return filesystem except Exception: raise CloudRedirectUrl(url, __name__) else: raise CloudRedirectUrl(url, __name__)
def get_token(user_id=None): """ Retrieve token for linked GitHub account """ session_token = None if user_id is None: session_token = token_getter(get_remote()) if session_token: token = RemoteToken.get(current_user.get_id(), get_client_id(), access_token=session_token[0]) return token return None
def get_token(user_id=None): """ Retrieve token for linked GitHub account """ session_token = None if user_id is None: session_token = token_getter(get_remote()) if session_token: token = RemoteToken.get( current_user.get_id(), get_client_id(), access_token=session_token[0] ) return token return None
def disconnect(remote): """ Authorized callback handler for GitHub """ # User must be authenticated if not current_user.is_authenticated(): return current_app.login_manager.unauthorized() token = RemoteToken.get(current_user.get_id(), remote.consumer_key) if token: disconnect_github.delay( remote.name, token.access_token, token.remote_account.extra_data ) token.remote_account.delete() return redirect(url_for('oauthclient_settings.index'))
def disconnect(remote): """ Disconnect callback handler for GitHub. This is a test """ # User must be authenticated if not current_user.is_authenticated(): return current_app.login_manager.unauthorized() token = RemoteToken.get(current_user.get_id(), remote.consumer_key) if token: disconnect_github.delay(remote.name, token.access_token, token.remote_account.extra_data) token.remote_account.delete() return redirect(url_for('oauthclient_settings.index'))
def setUp(self): # Create celery application self.create_celery_app() self.app.extensions['zenodo_github.request_factory'] = partial( tclient_request_factory, self.client ) # Run Flask initialization code - to before_first_request functions # being executed with self.app.test_request_context(''): self.app.try_trigger_before_first_request_functions() self.app.preprocess_request() # Create a user from invenio.modules.accounts.models import User self.user = User( email='*****@*****.**', nickname='githubuser' ) self.user.password = "******" db.session.add(self.user) db.session.commit() # Create GitHub link from invenio.modules.oauthclient.models import RemoteToken from zenodo.modules.github.helpers import get_client_id from zenodo.modules.github.utils import init_account self.remote_token = RemoteToken.create( self.user.id, get_client_id(), "test", "", ) # Init GitHub account and mock up GitHub API httpretty.enable() fixtures.register_github_api() init_account(self.remote_token) httpretty.disable()
def setUp(self): # Create celery application self.create_celery_app() self.app.extensions['zenodo_github.request_factory'] = partial( tclient_request_factory, self.client) # Run Flask initialization code - to before_first_request functions # being executed with self.app.test_request_context(''): self.app.try_trigger_before_first_request_functions() self.app.preprocess_request() # Create a user from invenio.modules.accounts.models import User self.user = User(email='*****@*****.**', nickname='githubuser') self.user.password = "******" db.session.add(self.user) db.session.commit() # Create GitHub link from invenio.modules.oauthclient.models import RemoteToken from zenodo.modules.github.helpers import get_client_id from zenodo.modules.github.utils import init_account self.remote_token = RemoteToken.create( self.user.id, get_client_id(), "test", "", ) # Init GitHub account and mock up GitHub API httpretty.enable() fixtures.register_github_api() init_account(self.remote_token) httpretty.disable()
def build_fs(self, current_user, credentials, root=None, callback_url=None, request=None, session=None): url = url_for('oauthclient.login', remote_app='dropbox') client_id = oauth.remote_apps['dropbox'].consumer_key user_id = current_user.get_id() token = RemoteToken.get(user_id, client_id) if token is not None: credentials = {'access_token': token.access_token} try: filesystem = DropboxFS(root, credentials) filesystem.about() return filesystem except ResourceNotFoundError: if(root != "/"): filesystem = DropboxFS("/", credentials) filesystem.makedir(root, recursive=True) filesystem = DropboxFS(root, credentials) return filesystem except: raise CloudRedirectUrl(url, __name__) else: raise CloudRedirectUrl(url, __name__)
def test_token_getter_setter(self, save_session): from invenio.modules.oauthclient.models import RemoteToken from invenio.modules.oauthclient.handlers import token_getter from invenio.modules.oauthclient.client import oauth user = MagicMock() user.get_id = MagicMock(return_value=1) user.is_authenticated = MagicMock(return_value=True) with patch('flask.ext.login._get_user', return_value=user): with self.app.test_client() as c: # First call login to be redirected res = c.get(url_for("oauthclient.login", remote_app='full')) assert res.status_code == 302 assert res.location.startswith( oauth.remote_apps['full'].authorize_url ) # Mock resposen class self.mock_response(app='full') # Imitate that the user authorized our request in the remote # application. c.get(url_for( "oauthclient.authorized", remote_app='full', code='test', )) # Assert if every is as it should be. assert session['oauth_token_full'] == ('test_access_token', '') t = RemoteToken.get(1, "fullid") assert t.remote_account.client_id == 'fullid' assert t.access_token == 'test_access_token' assert RemoteToken.query.count() == 1 self.mock_response(app='full', data={ "access_token": "new_access_token", "scope": "", "token_type": "bearer" }) c.get(url_for( "oauthclient.authorized", remote_app='full', code='test', )) t = RemoteToken.get(1, "fullid") assert t.access_token == 'new_access_token' assert RemoteToken.query.count() == 1 val = token_getter(oauth.remote_apps['full']) assert val == ('new_access_token', '') # Disconnect account res = c.get(url_for( "oauthclient.disconnect", remote_app='full', )) assert res.status_code == 302 assert res.location.endswith( url_for('oauthclient_settings.index') ) # Assert that remote account have been removed. t = RemoteToken.get(1, "fullid") assert t is None
def test_token_getter_setter(self, session, save_session): from invenio.modules.oauthclient.models import RemoteToken from invenio.modules.oauthclient.handlers import token_getter from invenio.modules.oauthclient.client import oauth # Mock user user = MagicMock() user.get_id = MagicMock(return_value=1) user.is_authenticated = MagicMock(return_value=True) # Mock session id session.sid = '1234' with patch('flask_login._get_user', return_value=user): with self.app.test_client() as c: # First call login to be redirected res = c.get(url_for("oauthclient.login", remote_app='full')) assert res.status_code == 302 assert res.location.startswith( oauth.remote_apps['full'].authorize_url ) state = parse_qs(urlparse(res.location).query)['state'][0] # Mock resposen class self.mock_response(app='full') # Imitate that the user authorized our request in the remote # application. c.get(url_for( "oauthclient.authorized", remote_app='full', code='test', state=state, )) # Assert if everything is as it should be. from flask import session as flask_session assert flask_session['oauth_token_full'] == \ ('test_access_token', '') t = RemoteToken.get(1, "fullid") assert t.remote_account.client_id == 'fullid' assert t.access_token == 'test_access_token' assert RemoteToken.query.count() == 1 # Mock a new authorized request self.mock_response(app='full', data={ "access_token": "new_access_token", "scope": "", "token_type": "bearer" }) c.get(url_for( "oauthclient.authorized", remote_app='full', code='test', state=state )) t = RemoteToken.get(1, "fullid") assert t.access_token == 'new_access_token' assert RemoteToken.query.count() == 1 val = token_getter(oauth.remote_apps['full']) assert val == ('new_access_token', '') # Disconnect account res = c.get(url_for( "oauthclient.disconnect", remote_app='full', )) assert res.status_code == 302 assert res.location.endswith( url_for('oauthclient_settings.index') ) # Assert that remote account have been removed. t = RemoteToken.get(1, "fullid") assert t is None