Merge branch 'master' of ssh://git.fedorahosted.org/git/fedora-infrastructure
This commit is contained in:
commit
3ae54e1139
3 changed files with 100 additions and 8 deletions
|
@ -177,9 +177,13 @@ class BaseClient(object):
|
||||||
|
|
||||||
if auth:
|
if auth:
|
||||||
req.add_header('Cookie', self.session.output(attrs=[],
|
req.add_header('Cookie', self.session.output(attrs=[],
|
||||||
header='').strip())
|
header='').strip())
|
||||||
|
elif self._sessionCookie:
|
||||||
|
# If the cookie exists, send it so that visit tracking works.
|
||||||
|
req.add_header('Cookie', self._sessionCookie.output(attrs=[],
|
||||||
|
header='').strip())
|
||||||
try:
|
try:
|
||||||
response = urllib2.urlopen(req).read()
|
response = urllib2.urlopen(req)
|
||||||
except urllib2.HTTPError, e:
|
except urllib2.HTTPError, e:
|
||||||
if e.msg == 'Forbidden':
|
if e.msg == 'Forbidden':
|
||||||
if (inspect.currentframe().f_back.f_code !=
|
if (inspect.currentframe().f_back.f_code !=
|
||||||
|
@ -195,8 +199,14 @@ class BaseClient(object):
|
||||||
log.error(e)
|
log.error(e)
|
||||||
raise ServerError, str(e)
|
raise ServerError, str(e)
|
||||||
|
|
||||||
|
# In case the server returned a new session cookie to us
|
||||||
try:
|
try:
|
||||||
data = simplejson.loads(response)
|
self._sessionCookie.load(response.headers['set-cookie'])
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
try:
|
||||||
|
data = simplejson.load(response)
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
regex = re.compile('<span class="fielderror">(.*)</span>')
|
regex = re.compile('<span class="fielderror">(.*)</span>')
|
||||||
match = regex.search(response)
|
match = regex.search(response)
|
||||||
|
|
|
@ -51,14 +51,15 @@ try:
|
||||||
except NameError:
|
except NameError:
|
||||||
from sets import Set as set, ImmutableSet as frozenset
|
from sets import Set as set, ImmutableSet as frozenset
|
||||||
|
|
||||||
FASURL = config.get('fas.url', 'https://admin.fedoraproject.org/admin/fas/')
|
|
||||||
|
|
||||||
class JsonFasIdentity(BaseClient):
|
class JsonFasIdentity(BaseClient):
|
||||||
'''Associate an identity with a person in the auth system.
|
'''Associate an identity with a person in the auth system.
|
||||||
'''
|
'''
|
||||||
|
cookieName = config.get('visit.cookie.name', 'tg-visit')
|
||||||
|
fasURL = config.get('fas.url', 'https://admin.fedoraproject.org/admin/fas/')
|
||||||
|
|
||||||
def __init__(self, visit_key, user=None, username=None, password=None,
|
def __init__(self, visit_key, user=None, username=None, password=None,
|
||||||
debug=False):
|
debug=False):
|
||||||
super(JsonFasIdentity, self).__init__(FASURL, debug=debug)
|
super(JsonFasIdentity, self).__init__(self.fasURL, debug=debug)
|
||||||
if user:
|
if user:
|
||||||
self._user = user
|
self._user = user
|
||||||
self._groups = frozenset(
|
self._groups = frozenset(
|
||||||
|
@ -74,7 +75,6 @@ class JsonFasIdentity(BaseClient):
|
||||||
# Set the cookie to the user's tg_visit key before requesting
|
# Set the cookie to the user's tg_visit key before requesting
|
||||||
# authentication. That way we link the two together.
|
# authentication. That way we link the two together.
|
||||||
self._sessionCookie = Cookie.SimpleCookie()
|
self._sessionCookie = Cookie.SimpleCookie()
|
||||||
self.cookieName = config.get('visit.cookie.name', 'tg-visit')
|
|
||||||
self._sessionCookie[self.cookieName] = self.visit_key
|
self._sessionCookie[self.cookieName] = self.visit_key
|
||||||
self.username = username
|
self.username = username
|
||||||
self.password = password
|
self.password = password
|
||||||
|
@ -139,7 +139,7 @@ class JsonFasIdentity(BaseClient):
|
||||||
'''
|
'''
|
||||||
if not self.visit_key:
|
if not self.visit_key:
|
||||||
return
|
return
|
||||||
# Call FASURL logout method
|
# Call Account System Server logout method
|
||||||
self.send_request('logout', auth=True)
|
self.send_request('logout', auth=True)
|
||||||
|
|
||||||
class JsonFasIdentityProvider(object):
|
class JsonFasIdentityProvider(object):
|
||||||
|
|
82
fas/fas/jsonfasvisit.py
Normal file
82
fas/fas/jsonfasvisit.py
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
'''
|
||||||
|
This plugin provides integration with the Fedora Account System using JSON
|
||||||
|
calls to the account system server.
|
||||||
|
'''
|
||||||
|
|
||||||
|
import Cookie
|
||||||
|
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
from sqlalchemy import *
|
||||||
|
from sqlalchemy.orm import class_mapper
|
||||||
|
|
||||||
|
from turbogears import config
|
||||||
|
from turbogears.visit.api import BaseVisitManager, Visit
|
||||||
|
from turbogears.database import get_engine, metadata, session, mapper
|
||||||
|
from turbogears.util import load_class
|
||||||
|
|
||||||
|
# Once this works, propogate the changes back to python-fedora and import as
|
||||||
|
# from fedora.tg.client import BaseClient
|
||||||
|
from client import BaseClient
|
||||||
|
|
||||||
|
import gettext
|
||||||
|
t = gettext.translation('python-fedora', '/usr/share/locale', fallback=True)
|
||||||
|
_ = t.ugettext
|
||||||
|
|
||||||
|
import logging
|
||||||
|
log = logging.getLogger("turbogears.identity.savisit")
|
||||||
|
|
||||||
|
class JsonFasVisitManager(BaseClient):
|
||||||
|
'''
|
||||||
|
This proxies visit requests to the Account System Server running remotely.
|
||||||
|
|
||||||
|
We don't need to worry about threading and other concerns because our proxy
|
||||||
|
doesn't cause any asynchronous calls.
|
||||||
|
'''
|
||||||
|
fasURL = config.get('fas.url', 'https://admin.fedoraproject.org/admin/fas')
|
||||||
|
cookieName = config.get('visit.cookie.name', 'tg-visit')
|
||||||
|
|
||||||
|
def __init__(self, timeout, debug=None):
|
||||||
|
super(JsonFasVisitManager,self).__init__(self.fasURL, debug=debug)
|
||||||
|
|
||||||
|
def create_model(self):
|
||||||
|
'''
|
||||||
|
Create the Visit table if it doesn't already exist
|
||||||
|
'''
|
||||||
|
# Not needed as the visit tables reside remotely in the FAS2 database.
|
||||||
|
pass
|
||||||
|
|
||||||
|
def new_visit_with_key(self, visit_key):
|
||||||
|
# Hit any URL in fas2 with the visit_key set. That will call the
|
||||||
|
# new_visit method in fas2
|
||||||
|
self._sessionCookie = Cookie.SimpleCookie()
|
||||||
|
self._sessionCookie[self.cookieName] = visit_key
|
||||||
|
data = self.send_request('', auth=True)
|
||||||
|
return Visit(self._sessionCookie[self.cookieName].value, True)
|
||||||
|
|
||||||
|
def visit_for_key(self, visit_key):
|
||||||
|
'''
|
||||||
|
Return the visit for this key or None if the visit doesn't exist or has
|
||||||
|
expired.
|
||||||
|
'''
|
||||||
|
# Hit any URL in fas2 with the visit_key set. That will call the
|
||||||
|
# new_visit method in fas2
|
||||||
|
self._sessionCookie = Cookie.SimpleCookie()
|
||||||
|
self._sessionCookie[self.cookieName] = visit_key
|
||||||
|
data = self.send_request('', auth=True)
|
||||||
|
# Knowing what happens in turbogears/visit/api.py when this is called,
|
||||||
|
# we can shortcircuit this step and avoid a round trip to the FAS
|
||||||
|
# server.
|
||||||
|
# if visit_key != self._sessionCookie[self.cookieName].value:
|
||||||
|
# # visit has expired
|
||||||
|
# return None
|
||||||
|
# # Hitting FAS has already updated the visit.
|
||||||
|
# return Visit(visit_key, False)
|
||||||
|
if visit_key != self._sessionCookie[self.cookieName].value:
|
||||||
|
return Visit(self._sessionCookie[self.cookieName].value, True)
|
||||||
|
else:
|
||||||
|
return Visit(visit_key, False)
|
||||||
|
|
||||||
|
def update_queued_visits(self, queue):
|
||||||
|
# Let the visit_manager on the FAS server manage this
|
||||||
|
pass
|
Loading…
Add table
Add a link
Reference in a new issue