def finish_login():
    # Get the token from the request itself (although we've stored it in a session variable)
    code = request.args.get("oauth_token", None)
    if code:
        # Make sure the passed-in code and our session-stored code match up.
        if session["twitter-req-token"]["oauth_token"] != code:
            session.pop("twitter-req-token", None)
            # fixme(mkrautz): Show a page explaining what went wrong, instead.
            abort(404)

            # Set up our client object to fetch our access token
        token = oauth.Token(code, session["twitter-req-token"]["oauth_token_secret"])
        consumer = oauth.Consumer(settings.TWITTER_CONSUMER_KEY, settings.TWITTER_CONSUMER_SECRET)
        client = oauth.Client(consumer, token)
        # Get the access token
        resp, content = client.request("https://api.twitter.com/oauth/access_token", "GET")
        data = dict(cgi.parse_qsl(content))

        # Get existing or create a new user.
        bu = BetaUser.get_twitter_user(data["user_id"])
        if not bu:
            bu = BetaUser(
                sid=data["user_id"],
                service=BetaUser.SERVICE_TWITTER,
                name=data["screen_name"],
                admin=False,
                lastlogin=datetime.datetime.now(),
            )
            bu.udid = None
        bu.lastlogin = datetime.datetime.now()
        bu.put()

        # Store the key for the currently logged-in betauser.
        session["betauser"] = bu.key()
        session.pop("twitter-req-token", None)
        session.permanent = True

        # Should we redirect to a specific page?
        login_redirect_url = session.pop("login-redirect-url", None)
        if login_redirect_url:
            return redirect(login_redirect_url)
            # Redirect to front page
        else:
            # fixme(mkrautz): See comment about the same thing in facebook.py.
            return redirect("http://mumble-ios.appspot.com")

    session.pop("twitter-req-token", None)
    abort(404)
def finish_login():
	# Fetch the code we've been passed from Facebook
	code = request.args.get('code', None)
	if not code:
		# fixme(mkrautz): Show a nice page here explaining what's wrong.
		abort(404)

	# Fetch our access token
	data = urlfetch.fetch('https://graph.facebook.com/oauth/access_token?' + urllib.urlencode({
		'client_id': settings.FACEBOOK_APP_ID,
		'client_secret': settings.FACEBOOK_APP_SECRET,
		'code': code,
		'redirect_uri': callback_url,
	}))
	args = dict(cgi.parse_qsl(data.content))
	access_token = args['access_token']

	# Fetch data about the user using our acquired access token.
	data = urlfetch.fetch('https://graph.facebook.com/me?access_token=' + access_token)
	login_data = json.loads(data.content)

	# Get existing user, or create a new one.
	bu = BetaUser.get_facebook_user(login_data['id'])
	if not bu:
		bu = BetaUser(sid=login_data['id'], service=BetaUser.SERVICE_FACEBOOK, name=login_data['name'], admin=False, lastlogin=datetime.datetime.now())
		bu.udid = None
	bu.lastlogin=datetime.datetime.now()
	bu.put()

	# Set the user's BetaUser key in a cookie, so we know
	# they're logged in (and which user they're logged in as).
	session['betauser'] = bu.key()
	session.permanent = True

	# Should we redirect to a specific page?
	login_redirect_url = session.pop('login-redirect-url', None)
	if login_redirect_url:
		return redirect(login_redirect_url)
	# Redirect to front page
	else:
		# We force a redirect to http:// (which means that even users on
		# https:// connections get redirected to the non-TLS version).
		# The reason for this is that App Engine's OpenID 'federated login'
		# feature seems to break when using https://. fixme(mkrautz): Look
		# into why that is.
		return redirect('http://mumble-ios.appspot.com')