Files
@ 93bd77e1f3c1
Branch filter:
Location: kallithea/pylons_app/lib/simplehg.py - annotation
93bd77e1f3c1
3.2 KiB
text/x-python
Changed auth basic handler only for mercurial request.
70b1e5d1e20d 70b1e5d1e20d 93bd77e1f3c1 93bd77e1f3c1 f8ae5c1dfae2 93bd77e1f3c1 93bd77e1f3c1 f8ae5c1dfae2 93bd77e1f3c1 93bd77e1f3c1 70b1e5d1e20d 70b1e5d1e20d 70b1e5d1e20d 70b1e5d1e20d 70b1e5d1e20d 93bd77e1f3c1 93bd77e1f3c1 93bd77e1f3c1 70b1e5d1e20d 70b1e5d1e20d 70b1e5d1e20d 70b1e5d1e20d 70b1e5d1e20d 93bd77e1f3c1 93bd77e1f3c1 93bd77e1f3c1 93bd77e1f3c1 93bd77e1f3c1 93bd77e1f3c1 93bd77e1f3c1 93bd77e1f3c1 93bd77e1f3c1 93bd77e1f3c1 93bd77e1f3c1 93bd77e1f3c1 f8ae5c1dfae2 f8ae5c1dfae2 f8ae5c1dfae2 f8ae5c1dfae2 f8ae5c1dfae2 f8ae5c1dfae2 cc5cf1a93902 cc5cf1a93902 52bbeb1e813f 52bbeb1e813f cc5cf1a93902 f8ae5c1dfae2 f8ae5c1dfae2 f8ae5c1dfae2 f8ae5c1dfae2 52bbeb1e813f 52bbeb1e813f 52bbeb1e813f 52bbeb1e813f cc5cf1a93902 70b1e5d1e20d cc5cf1a93902 cc5cf1a93902 cc5cf1a93902 cc5cf1a93902 70b1e5d1e20d cc5cf1a93902 cc5cf1a93902 cc5cf1a93902 cc5cf1a93902 cc5cf1a93902 cc5cf1a93902 cc5cf1a93902 cc5cf1a93902 cc5cf1a93902 cc5cf1a93902 93bd77e1f3c1 93bd77e1f3c1 cc5cf1a93902 70b1e5d1e20d 70b1e5d1e20d 70b1e5d1e20d 70b1e5d1e20d 70b1e5d1e20d 70b1e5d1e20d 70b1e5d1e20d 70b1e5d1e20d 70b1e5d1e20d cc5cf1a93902 cc5cf1a93902 | from mercurial.hgweb import hgweb
from mercurial.hgweb.request import wsgiapplication
from paste.auth.basic import AuthBasicAuthenticator
from paste.httpheaders import REMOTE_USER, AUTH_TYPE
from pylons.controllers.util import abort
from pylons_app.lib.auth import authfunc
from pylons_app.lib.utils import make_ui, invalidate_cache
from webob.exc import HTTPNotFound
import os
class SimpleHg(object):
def __init__(self, application, config):
self.application = application
self.config = config
#authenticate this mercurial request using
realm = '%s %s' % (config['repos_name'], 'mercurial repository')
self.authenticate = AuthBasicAuthenticator(realm, authfunc)
def __call__(self, environ, start_response):
if not is_mercurial(environ):
return self.application(environ, start_response)
else:
#===================================================================
# AUTHENTICATE THIS MERCURIAL REQUEST
#===================================================================
username = REMOTE_USER(environ)
if not username:
result = self.authenticate(environ)
if isinstance(result, str):
AUTH_TYPE.update(environ, 'basic')
REMOTE_USER.update(environ, result)
else:
return result.wsgi_application(environ, start_response)
try:
repo_name = environ['PATH_INFO'].split('/')[1]
except:
return HTTPNotFound()(environ, start_response)
#since we wrap into hgweb, just reset the path
environ['PATH_INFO'] = '/'
self.baseui = make_ui()
self.basepath = self.baseui.configitems('paths')[0][1]\
.replace('*', '')
self.repo_path = os.path.join(self.basepath, repo_name)
try:
app = wsgiapplication(self._make_app)
except Exception as e:
return HTTPNotFound()(environ, start_response)
"""we know that some change was made to repositories and we should
invalidate the cache to see the changes right away"""
invalidate_cache('full_changelog', repo_name)
return app(environ, start_response)
def _make_app(self):
hgserve = hgweb(self.repo_path)
return self.load_web_settings(hgserve)
def load_web_settings(self, hgserve):
repoui = make_ui(os.path.join(self.repo_path, '.hg', 'hgrc'), False)
#set the global ui for hgserve
hgserve.repo.ui = self.baseui
if repoui:
#set the repository based config
hgserve.repo.ui = repoui
return hgserve
def is_mercurial(environ):
"""
Returns True if request's target is mercurial server - header
``HTTP_ACCEPT`` of such request would start with ``application/mercurial``.
"""
http_accept = environ.get('HTTP_ACCEPT')
if http_accept and http_accept.startswith('application/mercurial'):
return True
return False
|