##// END OF EJS Templates
typo fix
typo fix

File last commit:

r2776:63e58ef8 merge default
r2832:b711b337 beta
Show More
base.py
303 lines | 11.3 KiB | text/x-python | PythonLexer
renamed project to rhodecode
r547 """The base Controller API
Provides the BaseController class for subclassing.
"""
Fixes issue #201...
r1373 import logging
Added Request time tracking
r1601 import time
implements #285: Implemented non changeable urls for clone url, and web views
r1813 import traceback
Wrapped calls for git and hg middleware in extra block that clears db Session....
r1761
from paste.auth.basic import AuthBasicAuthenticator
Alternative HTTP response codes when client failed to Authenticate correctly
r2132 from paste.httpexceptions import HTTPUnauthorized, HTTPForbidden
Implemented basic locking functionality....
r2726 from webob.exc import HTTPClientError
Alternative HTTP response codes when client failed to Authenticate correctly
r2132 from paste.httpheaders import WWW_AUTHENTICATE
Wrapped calls for git and hg middleware in extra block that clears db Session....
r1761
Fixes issue #201...
r1373 from pylons import config, tmpl_context as c, request, session, url
renamed project to rhodecode
r547 from pylons.controllers import WSGIController
Fixes issue #201...
r1373 from pylons.controllers.util import redirect
renamed project to rhodecode
r547 from pylons.templating import render_mako as render
gui-improvments
r1304
reduce cookie size for better support of client side sessions
r1718 from rhodecode import __version__, BACKENDS
Implemented basic locking functionality....
r2726 from rhodecode.lib.utils2 import str2bool, safe_unicode, AttributeDict,\
safe_str
Wrapped calls for git and hg middleware in extra block that clears db Session....
r1761 from rhodecode.lib.auth import AuthUser, get_container_username, authfunc,\
Added session wrapper, for rc 1.2.X compatibility. Adds backwards compatability...
r2030 HasPermissionAnyMiddleware, CookieStoreWrapper
Wrapped calls for git and hg middleware in extra block that clears db Session....
r1761 from rhodecode.lib.utils import get_repo_slug, invalidate_cache
renamed project to rhodecode
r547 from rhodecode.model import meta
reduce cookie size for better support of client side sessions
r1718
Implemented basic locking functionality....
r2726 from rhodecode.model.db import Repository, RhodeCodeUi, User
#302 - basic notification system, models+tests
r1702 from rhodecode.model.notification import NotificationModel
reduce cookie size for better support of client side sessions
r1718 from rhodecode.model.scm import ScmModel
Implemented basic locking functionality....
r2726 from rhodecode.model.meta import Session
Moved out reposcan into hg Model....
r665
Fixes issue #201...
r1373 log = logging.getLogger(__name__)
pep8ify
r1307
implements #285: Implemented non changeable urls for clone url, and web views
r1813
Add ip reference into BaseController
r2374 def _get_ip_addr(environ):
proxy_key = 'HTTP_X_REAL_IP'
proxy_key2 = 'HTTP_X_FORWARDED_FOR'
def_key = 'REMOTE_ADDR'
add IP into base logging, and change a little IP extraction login, if some header is passed as empty
r2486 ip = environ.get(proxy_key2)
if ip:
return ip
ip = environ.get(proxy_key)
if ip:
return ip
ip = environ.get(def_key, '0.0.0.0')
return ip
Add ip reference into BaseController
r2374
better path extraction method....
r2490 def _get_access_path(environ):
path = environ.get('PATH_INFO')
org_req = environ.get('pylons.original_request')
if org_req:
path = org_req.environ.get('PATH_INFO')
return path
Alternative HTTP response codes when client failed to Authenticate correctly
r2132 class BasicAuth(AuthBasicAuthenticator):
def __init__(self, realm, authfunc, auth_http_code=None):
self.realm = realm
self.authfunc = authfunc
self._rc_auth_http_code = auth_http_code
def build_authentication(self):
head = WWW_AUTHENTICATE.tuples('Basic realm="%s"' % self.realm)
if self._rc_auth_http_code and self._rc_auth_http_code == '403':
# return 403 if alternative http return code is specified in
# RhodeCode config
return HTTPForbidden(headers=head)
return HTTPUnauthorized(headers=head)
Wrapped calls for git and hg middleware in extra block that clears db Session....
r1761 class BaseVCSController(object):
implements #285: Implemented non changeable urls for clone url, and web views
r1813
Wrapped calls for git and hg middleware in extra block that clears db Session....
r1761 def __init__(self, application, config):
self.application = application
self.config = config
# base path of repo locations
self.basepath = self.config['base_path']
#authenticate this mercurial request using authfunc
Alternative HTTP response codes when client failed to Authenticate correctly
r2132 self.authenticate = BasicAuth('', authfunc,
config.get('auth_ret_code'))
Wrapped calls for git and hg middleware in extra block that clears db Session....
r1761 self.ipaddr = '0.0.0.0'
implements #285: Implemented non changeable urls for clone url, and web views
r1813
code garden, pep8
r1978 def _handle_request(self, environ, start_response):
raise NotImplementedError()
implements #285: Implemented non changeable urls for clone url, and web views
r1813 def _get_by_id(self, repo_name):
"""
Get's a special pattern _<ID> from clone url and tries to replace it
with a repository_name for support of _<ID> non changable urls
:param repo_name:
"""
try:
data = repo_name.split('/')
if len(data) >= 2:
by_id = data[1].split('_')
if len(by_id) == 2 and by_id[1].isdigit():
_repo_name = Repository.get(by_id[1]).repo_name
data[1] = _repo_name
except:
log.debug('Failed to extract repo_name from id %s' % (
traceback.format_exc()
)
)
return '/'.join(data)
Wrapped calls for git and hg middleware in extra block that clears db Session....
r1761 def _invalidate_cache(self, repo_name):
"""
Set's cache for this repository for invalidation on next access
implements #285: Implemented non changeable urls for clone url, and web views
r1813
Wrapped calls for git and hg middleware in extra block that clears db Session....
r1761 :param repo_name: full repo name, also a cache key
"""
invalidate_cache('get_repo_cached_%s' % repo_name)
implements #285: Implemented non changeable urls for clone url, and web views
r1813
Wrapped calls for git and hg middleware in extra block that clears db Session....
r1761 def _check_permission(self, action, user, repo_name):
"""
Checks permissions using action (push/pull) user and repository
name
:param action: push or pull action
:param user: user instance
:param repo_name: repository name
"""
if action == 'push':
if not HasPermissionAnyMiddleware('repository.write',
'repository.admin')(user,
repo_name):
return False
else:
#any other action need at least read permission
if not HasPermissionAnyMiddleware('repository.read',
'repository.write',
'repository.admin')(user,
repo_name):
return False
implements #285: Implemented non changeable urls for clone url, and web views
r1813 return True
Added HTTP_X_FORWARDED_FOR as another method of extracting IP for pull/push logs....
r2184 def _get_ip_addr(self, environ):
Add ip reference into BaseController
r2374 return _get_ip_addr(environ)
Added HTTP_X_FORWARDED_FOR as another method of extracting IP for pull/push logs....
r2184
Implementes #509 require SSL flag now works for both git and mercurial....
r2668 def _check_ssl(self, environ, start_response):
"""
Checks the SSL check flag and returns False if SSL is not present
and required True otherwise
"""
org_proto = environ['wsgi._org_proto']
#check if we have SSL required ! if not it's a bad request !
Added form for controlling mercurial extensions...
r2708 require_ssl = str2bool(RhodeCodeUi.get_by_key('push_ssl').ui_value)
Implementes #509 require SSL flag now works for both git and mercurial....
r2668 if require_ssl and org_proto == 'http':
log.debug('proto is %s and SSL is required BAD REQUEST !'
% org_proto)
return False
merged + fixed pull request #62: Implemented metatags and visualisation options....
r2674 return True
Implementes #509 require SSL flag now works for both git and mercurial....
r2668
Implemented basic locking functionality....
r2726 def _check_locking_state(self, environ, action, repo, user_id):
"""
Checks locking on this repository, if locking is enabled and lock is
present returns a tuple of make_lock, locked, locked_by.
make_lock can have 3 states None (do nothing) True, make lock
False release lock, This value is later propagated to hooks, which
do the locking. Think about this as signals passed to hooks what to do.
"""
added new suite of tests for VCS operations...
r2752 locked = False # defines that locked error should be thrown to user
Implemented basic locking functionality....
r2726 make_lock = None
repo = Repository.get_by_repo_name(repo)
user = User.get(user_id)
# this is kind of hacky, but due to how mercurial handles client-server
# server see all operation on changeset; bookmarks, phases and
# obsolescence marker in different transaction, we don't want to check
# locking on those
obsolete_call = environ['QUERY_STRING'] in ['cmd=listkeys',]
locked_by = repo.locked
if repo and repo.enable_locking and not obsolete_call:
if action == 'push':
#check if it's already locked !, if it is compare users
user_id, _date = repo.locked
if user.user_id == user_id:
added new suite of tests for VCS operations...
r2752 log.debug('Got push from user %s, now unlocking' % (user))
Implemented basic locking functionality....
r2726 # unlock if we have push from user who locked
make_lock = False
else:
# we're not the same user who locked, ban with 423 !
locked = True
if action == 'pull':
if repo.locked[0] and repo.locked[1]:
locked = True
else:
log.debug('Setting lock on repo %s by %s' % (repo, user))
make_lock = True
else:
log.debug('Repository %s do not have locking enabled' % (repo))
added new suite of tests for VCS operations...
r2752 log.debug('FINAL locking values make_lock:%s,locked:%s,locked_by:%s'
% (make_lock, locked, locked_by))
Implemented basic locking functionality....
r2726 return make_lock, locked, locked_by
Wrapped calls for git and hg middleware in extra block that clears db Session....
r1761 def __call__(self, environ, start_response):
start = time.time()
try:
return self._handle_request(environ, start_response)
finally:
logger name update
r1763 log = logging.getLogger('rhodecode.' + self.__class__.__name__)
Wrapped calls for git and hg middleware in extra block that clears db Session....
r1761 log.debug('Request time: %.3fs' % (time.time() - start))
meta.Session.remove()
renamed project to rhodecode
r547 class BaseController(WSGIController):
extended repo creation by repo type. fixed fork creation to maintain repo type.
r659
renamed project to rhodecode
r547 def __before__(self):
renamed hg_app to rhodecode
r548 c.rhodecode_version = __version__
implements #212 moved default encoding variable into rhodecode-config. It's now possible to change...
r2016 c.rhodecode_instanceid = config.get('instance_id')
implemented #89 google analytics code
r890 c.rhodecode_name = config.get('rhodecode_title')
implements #293 gravatar link should be disabled when use_gravatar = false
r1629 c.use_gravatar = str2bool(config.get('use_gravatar'))
fixes for #89 ga code
r891 c.ga_code = config.get('rhodecode_ga_code')
merged + fixed pull request #62: Implemented metatags and visualisation options....
r2674 # Visual options
c.visual = AttributeDict({})
c.visual.show_public_icon = str2bool(config.get('rhodecode_show_public_icon'))
c.visual.show_private_icon = str2bool(config.get('rhodecode_show_private_icon'))
c.visual.stylify_metatags = str2bool(config.get('rhodecode_stylify_metatags'))
renamed project to rhodecode
r547 c.repo_name = get_repo_slug(request)
extended repo creation by repo type. fixed fork creation to maintain repo type.
r659 c.backends = BACKENDS.keys()
#302 - basic notification system, models+tests
r1702 c.unread_notifications = NotificationModel()\
.get_unread_cnt_for_user(c.rhodecode_user.user_id)
implemented #89 google analytics code
r890 self.cut_off_limit = int(config.get('cut_off_limit'))
Major refactoring, removed when possible calls to app globals....
r1036
commit less models...
r1749 self.sa = meta.Session
another major codes rewrite:...
r1045 self.scm_model = ScmModel(self.sa)
Add ip reference into BaseController
r2374 self.ip_addr = ''
fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached...
r1366
renamed project to rhodecode
r547 def __call__(self, environ, start_response):
"""Invoke the Controller"""
# WSGIController.__call__ dispatches to the Controller method
# the request is routed to. This routing information is
# available in environ['pylons.routes_dict']
Added Request time tracking
r1601 start = time.time()
renamed project to rhodecode
r547 try:
Add ip reference into BaseController
r2374 self.ip_addr = _get_ip_addr(environ)
Some code cleanups and fixes
r1628 # make sure that we update permissions each time we call controller
Major rewrite of auth objects. Moved parts of filling user data into user model....
r1117 api_key = request.GET.get('api_key')
Added session wrapper, for rc 1.2.X compatibility. Adds backwards compatability...
r2030 cookie_store = CookieStoreWrapper(session.get('rhodecode_user'))
reduce cookie size for better support of client side sessions
r1718 user_id = cookie_store.get('user_id', None)
Liad Shani
Improved container-based auth support for middleware
r1630 username = get_container_username(environ, config)
Some code cleanups and fixes
r1628 auth_user = AuthUser(user_id, api_key, username)
- fixes celery sqlalchemy session issues for async forking...
r1728 request.user = auth_user
Some code cleanups and fixes
r1628 self.rhodecode_user = c.rhodecode_user = auth_user
Liad Shani
Added automatic logout of deactivated/deleted users
r1618 if not self.rhodecode_user.is_authenticated and \
self.rhodecode_user.user_id is not None:
Added session wrapper, for rc 1.2.X compatibility. Adds backwards compatability...
r2030 self.rhodecode_user.set_authenticated(
cookie_store.get('is_authenticated')
)
add IP into base logging, and change a little IP extraction login, if some header is passed as empty
r2486 log.info('IP: %s User: %s accessed %s' % (
better path extraction method....
r2490 self.ip_addr, auth_user, safe_unicode(_get_access_path(environ)))
fixed logging issue on non-ascii repos
r2027 )
renamed project to rhodecode
r547 return WSGIController.__call__(self, environ, start_response)
finally:
add IP into base logging, and change a little IP extraction login, if some header is passed as empty
r2486 log.info('IP: %s Request to %s time: %.3fs' % (
_get_ip_addr(environ),
better path extraction method....
r2490 safe_unicode(_get_access_path(environ)), time.time() - start)
fixed logging issue on non-ascii repos
r2027 )
renamed project to rhodecode
r547 meta.Session.remove()
another major codes rewrite:...
r1045
class BaseRepoController(BaseController):
"""
Some code cleanups and fixes
r1628 Base class for controllers responsible for loading all needed data for
repository loaded items are
source code cleanup: remove trailing white space, normalize file endings
r1203
Some code cleanups and fixes
r1628 c.rhodecode_repo: instance of scm repository
c.rhodecode_db_repo: instance of db
c.repository_followers: number of followers
c.repository_forks: number of forks
another major codes rewrite:...
r1045 """
def __before__(self):
super(BaseRepoController, self).__before__()
if c.repo_name:
- pull request generates overview based on it's params...
r2440 dbr = c.rhodecode_db_repo = Repository.get_by_repo_name(c.repo_name)
Fixes issue #201...
r1373 c.rhodecode_repo = c.rhodecode_db_repo.scm_instance
if c.rhodecode_repo is None:
log.error('%s this repository is present in database but it '
'cannot be created as an scm instance', c.repo_name)
fixed condition evaluated for gitrepo that returned null, simplified scm functions
r1282
Fixes issue #201...
r1373 redirect(url('home'))
gui-improvments
r1304
- pull request generates overview based on it's params...
r2440 # some globals counter for menu
c.repository_followers = self.scm_model.get_followers(dbr)
c.repository_forks = self.scm_model.get_forks(dbr)
white space cleanup
r2478 c.repository_pull_requests = self.scm_model.get_pull_requests(dbr)