Exemplo n.º 1
0
class FlickrService(object):

    def __init__(self, app=None):
        self.app = app
        self.client = None
        if app is not None:  # pragma: no cover
            self.init_app(app)

    def init_app(self, app): # pragma: no cover
        from flask import session
        from pybossa.core import importer
        self.client = OAuth().remote_app(
            'flickr',
            request_token_url='https://www.flickr.com/services/oauth/request_token',
            access_token_url='https://www.flickr.com/services/oauth/access_token',
            authorize_url='https://www.flickr.com/services/oauth/authorize',
            consumer_key=app.config['FLICKR_API_KEY'],
            consumer_secret=app.config['FLICKR_SHARED_SECRET'])
        tokengetter = functools.partial(self.get_flickr_token, session)
        self.client.tokengetter(tokengetter)
        importer_params = {'api_key': app.config['FLICKR_API_KEY']}
        importer.register_flickr_importer(importer_params)

    def get_user_albums(self, session):
        if (session.get('flickr_user') is not None and
                session.get('flickr_token') is not None):
            url = ('https://api.flickr.com/services/rest/?'
                   'method=flickr.photosets.getList&user_id=%s'
                   '&primary_photo_extras=url_q'
                   '&format=json&nojsoncallback=1'
                   % session.get('flickr_user').get('user_nsid'))
            res = self.client.get(url)
            if res.status == 200 and res.data.get('stat') == 'ok':
                albums = res.data['photosets']['photoset']
                return [self._extract_album_info(album) for album in albums]
            else:
                msg = ("Bad response from Flickr:\nStatus: %s, Content: %s"
                    % (res.status, res.data))
                self.app.logger.error(msg)
        return []

    def authorize(self, *args, **kwargs):
        return self.client.authorize(*args, **kwargs)

    def authorized_response(self):
        return self.client.authorized_response()

    def get_oauth_client(self):
        return self.client

    def get_flickr_token(self, session):
        return session.get('flickr_token')

    def _extract_album_info(self, album):
        info = {'title': album['title']['_content'],
                'photos': album['photos'],
                'id': album['id'],
                'thumbnail_url': album['primary_photo_extras']['url_q']}
        return info
Exemplo n.º 2
0
class GithubAuthenticator(Authenticator):
    is_oauth = True
    session_key = "github_token"

    def __init__(self, app):
        self.gh = OAuth(app).remote_app(
            "github",
            consumer_key=settings.auth_github_key,
            consumer_secret=settings.auth_github_secret,
            access_token_method="POST",
            access_token_url="https://github.com/login/oauth/access_token",
            authorize_url="https://github.com/login/oauth/authorize",
            base_url="https://api.github.com/",
            request_token_params={"scope": "read:org"},
            request_token_url=None,
        )
        self.gh.tokengetter(self.get_github_oauth_token)

    def get_github_oauth_token(self):
        return flask.session.get(self.session_key)

    def is_logged_in(self):
        return bool(flask.session.get(self.session_key))

    def is_allowed(self):
        if settings.auth_github_orgs not in ("all", "*"):
            org_names = {o["login"] for o in self.gh.get("user/orgs").data}
            if not _matches_conf(org_names, settings.auth_github_orgs):
                return False

        if settings.auth_github_teams not in ("all", "*"):
            team_names = {o["name"] for o in self.gh.get("user/teams").data}
            if not _matches_conf(team_names, settings.auth_github_teams):
                return False

        return True

    def login(self):
        return self.gh.authorize(callback=flask.url_for("authorized", _external=True))

    def oauth_authorize(self):
        resp = self.gh.authorized_response()

        if not resp or not resp.get("access_token"):
            flask.abort(
                403,
                "<br>".join(
                    (
                        "Access denied! Reason: %s" % flask.request.args["error"],
                        "Description: %s" % flask.request.args["error_description"],
                        flask.request.args["error_uri"],
                    )
                ),
            )

        flask.session[self.session_key] = (resp["access_token"], "")

    def logout(self):
        flask.session.pop(self.session_key, None)
Exemplo n.º 3
0
class FlickrService(object):

    """Class for Flickr integration."""

    def __init__(self, app=None):
        """Init method."""
        self.app = app
        self.client = None
        if app is not None:  # pragma: no cover
            self.init_app(app)

    def init_app(self, app):  # pragma: no cover
        """Method to init object following factories pattern."""
        from flask import session
        from pybossa.core import importer
        self.app = app
        self.client = OAuth().remote_app(
            'flickr',
            request_token_url='https://www.flickr.com/services/oauth/request_token',
            access_token_url='https://www.flickr.com/services/oauth/access_token',
            authorize_url='https://www.flickr.com/services/oauth/authorize',
            consumer_key=app.config['FLICKR_API_KEY'],
            consumer_secret=app.config['FLICKR_SHARED_SECRET'],
            access_token_method='GET')
        tokengetter = functools.partial(self.get_token, session)
        self.client.tokengetter(tokengetter)
        importer_params = {'api_key': app.config['FLICKR_API_KEY']}
        importer.register_flickr_importer(importer_params)

    def get_user_albums(self, session):
        """Get user albums from Flickr."""
        if (session.get('flickr_user') is not None and
                session.get('flickr_token') is not None):
            url = ('https://api.flickr.com/services/rest/?'
                   'method=flickr.photosets.getList&user_id=%s'
                   '&primary_photo_extras=url_q'
                   '&format=json&nojsoncallback=1'
                   % self._get_user_nsid(session))
            res = self.client.get(url, token='')
            if res.status == 200 and res.data.get('stat') == 'ok':
                albums = res.data['photosets']['photoset']
                return [self._extract_album_info(album) for album in albums]
            if self.app is not None:
                msg = ("Bad response from Flickr:\nStatus: %s, Content: %s"
                       % (res.status, res.data))
                self.app.logger.error(msg)
        return []

    def authorize(self, *args, **kwargs):
        """Authorize method."""
        return self.client.authorize(*args, **kwargs)

    def authorized_response(self):
        """Authorized response."""
        return self.client.authorized_response()

    def get_oauth_client(self):
        """Get OAuth client."""
        return self.client

    def get_token(self, session):
        """Get token from session."""
        token = session.get('flickr_token')
        if token is not None:
            token = (token['oauth_token'], token['oauth_token_secret'])
        return token

    def save_credentials(self, session, token, user):
        """Save credentials of user in session."""
        session['flickr_token'] = token
        session['flickr_user'] = user

    def remove_credentials(self, session):
        """Remove user credentials from session."""
        session.pop('flickr_token', None)
        session.pop('flickr_user', None)

    def _get_user_nsid(self, session):
        """Get session ID."""
        return session.get('flickr_user').get('user_nsid')

    def _extract_album_info(self, album):
        """Extract album information."""
        info = {'title': album['title']['_content'],
                'photos': album['photos'],
                'id': album['id'],
                'thumbnail_url': album['primary_photo_extras']['url_q']}
        return info
Exemplo n.º 4
0
class FlickrClient(object):

    """Class for Flickr integration."""

    def __init__(self, app=None):
        """Init method."""
        self.app = app
        self.oauth_client = None
        if app is not None:  # pragma: no cover
            self.init_app(app)

    def init_app(self, app):  # pragma: no cover
        """Method to init object following factories pattern."""
        from flask import session
        self.app = app
        self.oauth_client = OAuth().remote_app(
            'flickr',
            request_token_url='https://www.flickr.com/services/oauth/request_token',
            access_token_url='https://www.flickr.com/services/oauth/access_token',
            authorize_url='https://www.flickr.com/services/oauth/authorize',
            consumer_key=app.config['FLICKR_API_KEY'],
            consumer_secret=app.config['FLICKR_SHARED_SECRET'],
            access_token_method='GET')
        tokengetter = functools.partial(self.get_token, session)
        self.oauth_client.tokengetter(tokengetter)

    def get_user_albums(self, session):
        """Get user albums from Flickr."""
        if (session.get('flickr_user') is not None and
                session.get('flickr_token') is not None):
            url = ('https://api.flickr.com/services/rest/?'
                   'method=flickr.photosets.getList&user_id=%s'
                   '&primary_photo_extras=url_q'
                   '&format=json&nojsoncallback=1'
                   % self._get_user_nsid(session))
            res = self.oauth_client.get(url, token='')
            if res.status == 200 and res.data.get('stat') == 'ok':
                albums = res.data['photosets']['photoset']
                return [self._extract_album_info(album) for album in albums]
            if self.app is not None:
                msg = ("Bad response from Flickr:\nStatus: %s, Content: %s"
                       % (res.status, res.data))
                self.app.logger.error(msg)
        return []

    def authorize(self, *args, **kwargs):
        """Authorize method."""
        return self.oauth_client.authorize(*args, **kwargs)

    def authorized_response(self):
        """Authorized response."""
        return self.oauth_client.authorized_response()

    def get_oauth_client(self):
        """Get OAuth client."""
        return self.oauth_client

    def get_token(self, session):
        """Get token from session."""
        token = session.get('flickr_token')
        if token is not None:
            token = (token['oauth_token'], token['oauth_token_secret'])
        return token

    def save_credentials(self, session, token, user):
        """Save credentials of user in session."""
        session['flickr_token'] = token
        session['flickr_user'] = user

    def remove_credentials(self, session):
        """Remove user credentials from session."""
        session.pop('flickr_token', None)
        session.pop('flickr_user', None)

    def _get_user_nsid(self, session):
        """Get session ID."""
        return session.get('flickr_user').get('user_nsid')

    def _extract_album_info(self, album):
        """Extract album information."""
        info = {'title': album['title']['_content'],
                'photos': album['photos'],
                'id': album['id'],
                'thumbnail_url': album['primary_photo_extras']['url_q']}
        return info