def twitter_get_oauth_url(callback_url):
    """ Gets the Twitter Oauth url """

    consumer_token, consumer_secret = dbwrapper.get_service_tokens('Twitter')
    auth = tweepy.OAuthHandler(consumer_token, consumer_secret, callback_url)

    try:
        redirect_url = auth.get_authorization_url()
    except tweepy.TweepError:
        return False

    return redirect_url, auth.request_token.key, auth.request_token.secret
    def oauth_dance(self, **kwargs):
        """ Performs oauth dance for the supported services
            with helper functions located in servicewrapper.
        """

        if len(kwargs) != 0:
            self._services.update(kwargs)

        if 'user' in self._services:

            authtoken = dbwrapper.add_user(self._services['user'])

            cherrypy.session['tokens'] = {}
            cherrypy.session['tokens']['user'] = self._services['user']
            cherrypy.session['tokens']['authtoken'] = authtoken

            # delete user from the dict because this method is called again
            # in the oauth dance loop adn we don't want to add user again
            if 'user' in self._services: del self._services['user']

            cherrypy.lib.sessions.save()

        # get the Oauth urls for every service
        if len(self._services['Twitter']) > 1:

            url, key, secret = servicewrapper.twitter_get_oauth_url(
                self._callback_url)

            cherrypy.session['tokens']['twitter_key'] = key
            cherrypy.session['tokens']['twitter_secret'] = secret
            raise cherrypy.HTTPRedirect(url)

        if len(self._services['Foursquare']) > 1:

            url = servicewrapper.foursquare_get_oauth_url(self._callback_url)
            raise cherrypy.HTTPRedirect(url)

        if len(self._services['Facebook']) > 1:

            # Facebook module does not support Oauth so it's implemented here
            app_id, temp = dbwrapper.get_service_tokens('Facebook')

            args = dict(client_id=app_id,
                        redirect_uri=self._callback_url,
                        scope='publish_actions')

            raise cherrypy.HTTPRedirect(
                "https://www.facebook.com/dialog/oauth?" +
                urllib.urlencode(args))

        raise cherrypy.InternalRedirect('success')
def foursquare_get_oauth_url(callback_url):
    """ This is not guaranteened to work... some problems in SSL with Foursquare.
        Foursquare uses a wildcard SSL cert so this needs a workaround.
        """

    consumer_token, consumer_secret = dbwrapper.get_service_tokens(
        'Foursquare')
    client = foursquare.Foursquare(consumer_token,
                                   consumer_secret,
                                   redirect_uri=unicode(callback_url))
    try:
        auth_uri = client.oauth.auth_url()
    except:
        print 'Error! Failed to get request token.'

    return auth_uri
def twitter(authtoken, bac, service, lat, lon):
    """ Twitter data posting """

    key, secret = dbwrapper.get_service_tokens('Twitter')
    data = dbwrapper.get_user_data(authtoken)
    status = 'Promilleja veressä: %s ‰' % bac

    try:
        auth = tweepy.OAuthHandler(key, secret)
        auth.set_access_token(data[3], data[4])
        api = tweepy.API(auth)
        api.update_status(status=status, lat=str(lat), long=str(lon))
        return True

    except:
        return False
def foursquare_save_access_token(authtoken, code, callback_url):
    """ This is not guaranteened to work... some problems in SSL with Foursquare.
        Foursquare uses a wildcard SSL cert so this needs a workaround. """

    try:
        consumer_token, consumer_secret = dbwrapper.get_service_tokens(
            'Foursquare')

        client = foursquare.Foursquare(consumer_token, consumer_secret,
                                       callback_url)

        access_token = client.oauth.get_token(code)
        dbwrapper.update_user(authtoken, fq_token=access_token)

        return True

    except Exception as e:
        print e
        return False
def facebook_save_access_token(authtoken, code, callback_url):
    """ Saves Facebook user tokens, Oauth is done manually since the module
        does not support it """

    app_id, secret = dbwrapper.get_service_tokens('Facebook')

    args = dict(client_id=app_id, redirect_uri=callback_url)
    args["client_secret"] = secret.strip()
    args["code"] = code
    url = "https://graph.facebook.com/oauth/access_token?" + urllib.urlencode(
        args)

    try:
        response = cgi.parse_qs(urllib.urlopen(url).read())
        access_token = response["access_token"][-1]
        dbwrapper.update_user(authtoken, fb_token=access_token)
        return True

    except:
        return False