Пример #1
0
    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__)
Пример #2
0
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)
Пример #3
0
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)
Пример #4
0
    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__)
Пример #5
0
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
Пример #6
0
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
Пример #7
0
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'))
Пример #8
0
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'))
Пример #9
0
    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()
Пример #10
0
    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()
Пример #11
0
    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__)
Пример #12
0
    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__)
Пример #13
0
    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
Пример #14
0
    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