annotate rhodecode/lib/base.py @ 2726:aa17c7a1b8a5 beta

Implemented basic locking functionality. - Reimplemented how githooks behave - emaulate pre-receive hook - install missing git hooks if they aren't already in repo
author Marcin Kuzminski <marcin@python-works.com>
date Wed, 22 Aug 2012 00:30:02 +0200
parents 9bce679a3f49
children 6d904a0cd48d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
1 """The base Controller API
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
2
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
3 Provides the BaseController class for subclassing.
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
4 """
1373
66f03a87141c Fixes issue #201
Marcin Kuzminski <marcin@python-works.com>
parents: 1366
diff changeset
5 import logging
1601
6f06daeed294 Added Request time tracking
Marcin Kuzminski <marcin@python-works.com>
parents: 1530
diff changeset
6 import time
1813
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
7 import traceback
1761
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
8
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
9 from paste.auth.basic import AuthBasicAuthenticator
2132
9f5582151d53 Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
10 from paste.httpexceptions import HTTPUnauthorized, HTTPForbidden
2726
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
11 from webob.exc import HTTPClientError
2132
9f5582151d53 Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
12 from paste.httpheaders import WWW_AUTHENTICATE
1761
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
13
1373
66f03a87141c Fixes issue #201
Marcin Kuzminski <marcin@python-works.com>
parents: 1366
diff changeset
14 from pylons import config, tmpl_context as c, request, session, url
0
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
15 from pylons.controllers import WSGIController
1373
66f03a87141c Fixes issue #201
Marcin Kuzminski <marcin@python-works.com>
parents: 1366
diff changeset
16 from pylons.controllers.util import redirect
0
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
17 from pylons.templating import render_mako as render
1304
5a96551ee9c0 gui-improvments
Marcin Kuzminski <marcin@python-works.com>
parents: 1282
diff changeset
18
1718
f78bee8eec78 reduce cookie size for better support of client side sessions
Marcin Kuzminski <marcin@python-works.com>
parents: 1702
diff changeset
19 from rhodecode import __version__, BACKENDS
f78bee8eec78 reduce cookie size for better support of client side sessions
Marcin Kuzminski <marcin@python-works.com>
parents: 1702
diff changeset
20
2726
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
21 from rhodecode.lib.utils2 import str2bool, safe_unicode, AttributeDict,\
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
22 safe_str
1761
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
23 from rhodecode.lib.auth import AuthUser, get_container_username, authfunc,\
2030
61f9aeb2129e Added session wrapper, for rc 1.2.X compatibility. Adds backwards compatability
Marcin Kuzminski <marcin@python-works.com>
parents: 2027
diff changeset
24 HasPermissionAnyMiddleware, CookieStoreWrapper
1761
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
25 from rhodecode.lib.utils import get_repo_slug, invalidate_cache
547
1e757ac98988 renamed project to rhodecode
Marcin Kuzminski <marcin@python-works.com>
parents: 537
diff changeset
26 from rhodecode.model import meta
1718
f78bee8eec78 reduce cookie size for better support of client side sessions
Marcin Kuzminski <marcin@python-works.com>
parents: 1702
diff changeset
27
2726
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
28 from rhodecode.model.db import Repository, RhodeCodeUi, User
1702
8cb7f5c4d494 #302 - basic notification system, models+tests
Marcin Kuzminski <marcin@python-works.com>
parents: 1630
diff changeset
29 from rhodecode.model.notification import NotificationModel
1718
f78bee8eec78 reduce cookie size for better support of client side sessions
Marcin Kuzminski <marcin@python-works.com>
parents: 1702
diff changeset
30 from rhodecode.model.scm import ScmModel
2726
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
31 from rhodecode.model.meta import Session
665
070f32743632 Moved out reposcan into hg Model.
Marcin Kuzminski <marcin@python-works.com>
parents: 659
diff changeset
32
1373
66f03a87141c Fixes issue #201
Marcin Kuzminski <marcin@python-works.com>
parents: 1366
diff changeset
33 log = logging.getLogger(__name__)
1307
c1516b35f91d pep8ify
Marcin Kuzminski <marcin@python-works.com>
parents: 1304
diff changeset
34
1813
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
35
2374
be2163ef127e Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents: 2184
diff changeset
36 def _get_ip_addr(environ):
be2163ef127e Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents: 2184
diff changeset
37 proxy_key = 'HTTP_X_REAL_IP'
be2163ef127e Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents: 2184
diff changeset
38 proxy_key2 = 'HTTP_X_FORWARDED_FOR'
be2163ef127e Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents: 2184
diff changeset
39 def_key = 'REMOTE_ADDR'
be2163ef127e Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents: 2184
diff changeset
40
2486
6f537e3da9c4 add IP into base logging, and change a little IP extraction login, if some header is passed as empty
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
41 ip = environ.get(proxy_key2)
6f537e3da9c4 add IP into base logging, and change a little IP extraction login, if some header is passed as empty
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
42 if ip:
6f537e3da9c4 add IP into base logging, and change a little IP extraction login, if some header is passed as empty
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
43 return ip
6f537e3da9c4 add IP into base logging, and change a little IP extraction login, if some header is passed as empty
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
44
6f537e3da9c4 add IP into base logging, and change a little IP extraction login, if some header is passed as empty
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
45 ip = environ.get(proxy_key)
6f537e3da9c4 add IP into base logging, and change a little IP extraction login, if some header is passed as empty
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
46
6f537e3da9c4 add IP into base logging, and change a little IP extraction login, if some header is passed as empty
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
47 if ip:
6f537e3da9c4 add IP into base logging, and change a little IP extraction login, if some header is passed as empty
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
48 return ip
6f537e3da9c4 add IP into base logging, and change a little IP extraction login, if some header is passed as empty
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
49
6f537e3da9c4 add IP into base logging, and change a little IP extraction login, if some header is passed as empty
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
50 ip = environ.get(def_key, '0.0.0.0')
6f537e3da9c4 add IP into base logging, and change a little IP extraction login, if some header is passed as empty
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
51 return ip
2374
be2163ef127e Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents: 2184
diff changeset
52
be2163ef127e Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents: 2184
diff changeset
53
2490
7a5eeafb1a9a better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents: 2486
diff changeset
54 def _get_access_path(environ):
7a5eeafb1a9a better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents: 2486
diff changeset
55 path = environ.get('PATH_INFO')
7a5eeafb1a9a better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents: 2486
diff changeset
56 org_req = environ.get('pylons.original_request')
7a5eeafb1a9a better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents: 2486
diff changeset
57 if org_req:
7a5eeafb1a9a better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents: 2486
diff changeset
58 path = org_req.environ.get('PATH_INFO')
7a5eeafb1a9a better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents: 2486
diff changeset
59 return path
7a5eeafb1a9a better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents: 2486
diff changeset
60
7a5eeafb1a9a better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents: 2486
diff changeset
61
2132
9f5582151d53 Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
62 class BasicAuth(AuthBasicAuthenticator):
9f5582151d53 Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
63
9f5582151d53 Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
64 def __init__(self, realm, authfunc, auth_http_code=None):
9f5582151d53 Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
65 self.realm = realm
9f5582151d53 Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
66 self.authfunc = authfunc
9f5582151d53 Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
67 self._rc_auth_http_code = auth_http_code
9f5582151d53 Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
68
9f5582151d53 Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
69 def build_authentication(self):
9f5582151d53 Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
70 head = WWW_AUTHENTICATE.tuples('Basic realm="%s"' % self.realm)
9f5582151d53 Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
71 if self._rc_auth_http_code and self._rc_auth_http_code == '403':
9f5582151d53 Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
72 # return 403 if alternative http return code is specified in
9f5582151d53 Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
73 # RhodeCode config
9f5582151d53 Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
74 return HTTPForbidden(headers=head)
9f5582151d53 Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
75 return HTTPUnauthorized(headers=head)
9f5582151d53 Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
76
9f5582151d53 Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
77
1761
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
78 class BaseVCSController(object):
1813
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
79
1761
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
80 def __init__(self, application, config):
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
81 self.application = application
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
82 self.config = config
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
83 # base path of repo locations
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
84 self.basepath = self.config['base_path']
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
85 #authenticate this mercurial request using authfunc
2132
9f5582151d53 Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
86 self.authenticate = BasicAuth('', authfunc,
9f5582151d53 Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
87 config.get('auth_ret_code'))
1761
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
88 self.ipaddr = '0.0.0.0'
1813
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
89
1978
164199e476e9 code garden, pep8
Marcin Kuzminski <marcin@python-works.com>
parents: 1818
diff changeset
90 def _handle_request(self, environ, start_response):
164199e476e9 code garden, pep8
Marcin Kuzminski <marcin@python-works.com>
parents: 1818
diff changeset
91 raise NotImplementedError()
164199e476e9 code garden, pep8
Marcin Kuzminski <marcin@python-works.com>
parents: 1818
diff changeset
92
1813
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
93 def _get_by_id(self, repo_name):
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
94 """
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
95 Get's a special pattern _<ID> from clone url and tries to replace it
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
96 with a repository_name for support of _<ID> non changable urls
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
97
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
98 :param repo_name:
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
99 """
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
100 try:
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
101 data = repo_name.split('/')
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
102 if len(data) >= 2:
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
103 by_id = data[1].split('_')
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
104 if len(by_id) == 2 and by_id[1].isdigit():
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
105 _repo_name = Repository.get(by_id[1]).repo_name
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
106 data[1] = _repo_name
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
107 except:
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
108 log.debug('Failed to extract repo_name from id %s' % (
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
109 traceback.format_exc()
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
110 )
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
111 )
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
112
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
113 return '/'.join(data)
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
114
1761
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
115 def _invalidate_cache(self, repo_name):
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
116 """
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
117 Set's cache for this repository for invalidation on next access
1813
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
118
1761
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
119 :param repo_name: full repo name, also a cache key
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
120 """
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
121 invalidate_cache('get_repo_cached_%s' % repo_name)
1813
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
122
1761
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
123 def _check_permission(self, action, user, repo_name):
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
124 """
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
125 Checks permissions using action (push/pull) user and repository
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
126 name
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
127
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
128 :param action: push or pull action
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
129 :param user: user instance
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
130 :param repo_name: repository name
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
131 """
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
132 if action == 'push':
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
133 if not HasPermissionAnyMiddleware('repository.write',
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
134 'repository.admin')(user,
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
135 repo_name):
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
136 return False
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
137
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
138 else:
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
139 #any other action need at least read permission
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
140 if not HasPermissionAnyMiddleware('repository.read',
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
141 'repository.write',
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
142 'repository.admin')(user,
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
143 repo_name):
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
144 return False
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
145
1813
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
146 return True
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1763
diff changeset
147
2184
79e4d6b9c1f0 Added HTTP_X_FORWARDED_FOR as another method of extracting IP for pull/push logs.
Marcin Kuzminski <marcin@python-works.com>
parents: 2132
diff changeset
148 def _get_ip_addr(self, environ):
2374
be2163ef127e Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents: 2184
diff changeset
149 return _get_ip_addr(environ)
2184
79e4d6b9c1f0 Added HTTP_X_FORWARDED_FOR as another method of extracting IP for pull/push logs.
Marcin Kuzminski <marcin@python-works.com>
parents: 2132
diff changeset
150
2668
f0851f37d6be Implementes #509 require SSL flag now works for both git and mercurial.
Marcin Kuzminski <marcin@python-works.com>
parents: 2490
diff changeset
151 def _check_ssl(self, environ, start_response):
f0851f37d6be Implementes #509 require SSL flag now works for both git and mercurial.
Marcin Kuzminski <marcin@python-works.com>
parents: 2490
diff changeset
152 """
f0851f37d6be Implementes #509 require SSL flag now works for both git and mercurial.
Marcin Kuzminski <marcin@python-works.com>
parents: 2490
diff changeset
153 Checks the SSL check flag and returns False if SSL is not present
f0851f37d6be Implementes #509 require SSL flag now works for both git and mercurial.
Marcin Kuzminski <marcin@python-works.com>
parents: 2490
diff changeset
154 and required True otherwise
f0851f37d6be Implementes #509 require SSL flag now works for both git and mercurial.
Marcin Kuzminski <marcin@python-works.com>
parents: 2490
diff changeset
155 """
f0851f37d6be Implementes #509 require SSL flag now works for both git and mercurial.
Marcin Kuzminski <marcin@python-works.com>
parents: 2490
diff changeset
156 org_proto = environ['wsgi._org_proto']
f0851f37d6be Implementes #509 require SSL flag now works for both git and mercurial.
Marcin Kuzminski <marcin@python-works.com>
parents: 2490
diff changeset
157 #check if we have SSL required ! if not it's a bad request !
2708
9bce679a3f49 Added form for controlling mercurial extensions
Marcin Kuzminski <marcin@python-works.com>
parents: 2674
diff changeset
158 require_ssl = str2bool(RhodeCodeUi.get_by_key('push_ssl').ui_value)
2668
f0851f37d6be Implementes #509 require SSL flag now works for both git and mercurial.
Marcin Kuzminski <marcin@python-works.com>
parents: 2490
diff changeset
159 if require_ssl and org_proto == 'http':
f0851f37d6be Implementes #509 require SSL flag now works for both git and mercurial.
Marcin Kuzminski <marcin@python-works.com>
parents: 2490
diff changeset
160 log.debug('proto is %s and SSL is required BAD REQUEST !'
f0851f37d6be Implementes #509 require SSL flag now works for both git and mercurial.
Marcin Kuzminski <marcin@python-works.com>
parents: 2490
diff changeset
161 % org_proto)
f0851f37d6be Implementes #509 require SSL flag now works for both git and mercurial.
Marcin Kuzminski <marcin@python-works.com>
parents: 2490
diff changeset
162 return False
2674
a221706dab50 merged + fixed pull request #62: Implemented metatags and visualisation options.
Marcin Kuzminski <marcin@python-works.com>
parents: 2668
diff changeset
163 return True
2668
f0851f37d6be Implementes #509 require SSL flag now works for both git and mercurial.
Marcin Kuzminski <marcin@python-works.com>
parents: 2490
diff changeset
164
2726
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
165 def _check_locking_state(self, environ, action, repo, user_id):
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
166 """
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
167 Checks locking on this repository, if locking is enabled and lock is
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
168 present returns a tuple of make_lock, locked, locked_by.
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
169 make_lock can have 3 states None (do nothing) True, make lock
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
170 False release lock, This value is later propagated to hooks, which
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
171 do the locking. Think about this as signals passed to hooks what to do.
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
172
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
173 """
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
174 locked = False
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
175 make_lock = None
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
176 repo = Repository.get_by_repo_name(repo)
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
177 user = User.get(user_id)
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
178
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
179 # this is kind of hacky, but due to how mercurial handles client-server
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
180 # server see all operation on changeset; bookmarks, phases and
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
181 # obsolescence marker in different transaction, we don't want to check
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
182 # locking on those
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
183 obsolete_call = environ['QUERY_STRING'] in ['cmd=listkeys',]
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
184 locked_by = repo.locked
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
185 if repo and repo.enable_locking and not obsolete_call:
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
186 if action == 'push':
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
187 #check if it's already locked !, if it is compare users
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
188 user_id, _date = repo.locked
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
189 if user.user_id == user_id:
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
190 log.debug('Got push from user, now unlocking' % (user))
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
191 # unlock if we have push from user who locked
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
192 make_lock = False
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
193 else:
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
194 # we're not the same user who locked, ban with 423 !
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
195 locked = True
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
196 if action == 'pull':
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
197 if repo.locked[0] and repo.locked[1]:
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
198 locked = True
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
199 else:
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
200 log.debug('Setting lock on repo %s by %s' % (repo, user))
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
201 make_lock = True
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
202
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
203 else:
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
204 log.debug('Repository %s do not have locking enabled' % (repo))
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
205
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
206 return make_lock, locked, locked_by
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2708
diff changeset
207
1761
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
208 def __call__(self, environ, start_response):
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
209 start = time.time()
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
210 try:
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
211 return self._handle_request(environ, start_response)
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
212 finally:
1763
d09c52be40e0 logger name update
Marcin Kuzminski <marcin@python-works.com>
parents: 1761
diff changeset
213 log = logging.getLogger('rhodecode.' + self.__class__.__name__)
1761
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
214 log.debug('Request time: %.3fs' % (time.time() - start))
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
215 meta.Session.remove()
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
216
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1749
diff changeset
217
0
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
218 class BaseController(WSGIController):
659
758f64f3fbda extended repo creation by repo type. fixed fork creation to maintain repo type.
Marcin Kuzminski <marcin@python-works.com>
parents: 629
diff changeset
219
185
3380ca40cdba added version generation to pylons_app and showed it into template. Propagated baseController with some data for acces into each controller. Fixed simplehg middleware to get proper name of application
Marcin Kuzminski <marcin@python-works.com>
parents: 169
diff changeset
220 def __before__(self):
548
b75b77ef649d renamed hg_app to rhodecode
Marcin Kuzminski <marcin@python-works.com>
parents: 547
diff changeset
221 c.rhodecode_version = __version__
2016
6020e3884a58 implements #212 moved default encoding variable into rhodecode-config. It's now possible to change
Marcin Kuzminski <marcin@python-works.com>
parents: 1978
diff changeset
222 c.rhodecode_instanceid = config.get('instance_id')
890
042d38683d42 implemented #89 google analytics code
Marcin Kuzminski <marcin@python-works.com>
parents: 812
diff changeset
223 c.rhodecode_name = config.get('rhodecode_title')
1629
2196aa27954b implements #293 gravatar link should be disabled when use_gravatar = false
Marcin Kuzminski <marcin@python-works.com>
parents: 1628
diff changeset
224 c.use_gravatar = str2bool(config.get('use_gravatar'))
891
cca7286401b3 fixes for #89 ga code
Marcin Kuzminski <marcin@python-works.com>
parents: 890
diff changeset
225 c.ga_code = config.get('rhodecode_ga_code')
2674
a221706dab50 merged + fixed pull request #62: Implemented metatags and visualisation options.
Marcin Kuzminski <marcin@python-works.com>
parents: 2668
diff changeset
226 # Visual options
a221706dab50 merged + fixed pull request #62: Implemented metatags and visualisation options.
Marcin Kuzminski <marcin@python-works.com>
parents: 2668
diff changeset
227 c.visual = AttributeDict({})
a221706dab50 merged + fixed pull request #62: Implemented metatags and visualisation options.
Marcin Kuzminski <marcin@python-works.com>
parents: 2668
diff changeset
228 c.visual.show_public_icon = str2bool(config.get('rhodecode_show_public_icon'))
a221706dab50 merged + fixed pull request #62: Implemented metatags and visualisation options.
Marcin Kuzminski <marcin@python-works.com>
parents: 2668
diff changeset
229 c.visual.show_private_icon = str2bool(config.get('rhodecode_show_private_icon'))
a221706dab50 merged + fixed pull request #62: Implemented metatags and visualisation options.
Marcin Kuzminski <marcin@python-works.com>
parents: 2668
diff changeset
230 c.visual.stylify_metatags = str2bool(config.get('rhodecode_stylify_metatags'))
a221706dab50 merged + fixed pull request #62: Implemented metatags and visualisation options.
Marcin Kuzminski <marcin@python-works.com>
parents: 2668
diff changeset
231
185
3380ca40cdba added version generation to pylons_app and showed it into template. Propagated baseController with some data for acces into each controller. Fixed simplehg middleware to get proper name of application
Marcin Kuzminski <marcin@python-works.com>
parents: 169
diff changeset
232 c.repo_name = get_repo_slug(request)
659
758f64f3fbda extended repo creation by repo type. fixed fork creation to maintain repo type.
Marcin Kuzminski <marcin@python-works.com>
parents: 629
diff changeset
233 c.backends = BACKENDS.keys()
1702
8cb7f5c4d494 #302 - basic notification system, models+tests
Marcin Kuzminski <marcin@python-works.com>
parents: 1630
diff changeset
234 c.unread_notifications = NotificationModel()\
8cb7f5c4d494 #302 - basic notification system, models+tests
Marcin Kuzminski <marcin@python-works.com>
parents: 1630
diff changeset
235 .get_unread_cnt_for_user(c.rhodecode_user.user_id)
890
042d38683d42 implemented #89 google analytics code
Marcin Kuzminski <marcin@python-works.com>
parents: 812
diff changeset
236 self.cut_off_limit = int(config.get('cut_off_limit'))
1036
405b80e4ccd5 Major refactoring, removed when possible calls to app globals.
Marcin Kuzminski <marcin@python-works.com>
parents: 891
diff changeset
237
1749
8ecc6b8229a5 commit less models
Marcin Kuzminski <marcin@python-works.com>
parents: 1728
diff changeset
238 self.sa = meta.Session
1045
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1038
diff changeset
239 self.scm_model = ScmModel(self.sa)
2374
be2163ef127e Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents: 2184
diff changeset
240 self.ip_addr = ''
1366
9c0f5d558789 fixes #200, rewrote the whole caching mechanism to get rid of such problems. Now cached instances are attached
Marcin Kuzminski <marcin@python-works.com>
parents: 1351
diff changeset
241
0
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
242 def __call__(self, environ, start_response):
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
243 """Invoke the Controller"""
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
244 # WSGIController.__call__ dispatches to the Controller method
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
245 # the request is routed to. This routing information is
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
246 # available in environ['pylons.routes_dict']
1601
6f06daeed294 Added Request time tracking
Marcin Kuzminski <marcin@python-works.com>
parents: 1530
diff changeset
247 start = time.time()
0
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
248 try:
2374
be2163ef127e Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents: 2184
diff changeset
249 self.ip_addr = _get_ip_addr(environ)
1628
de71a4bde097 Some code cleanups and fixes
Marcin Kuzminski <marcin@python-works.com>
parents: 1622
diff changeset
250 # make sure that we update permissions each time we call controller
1117
6eb5bb24a948 Major rewrite of auth objects. Moved parts of filling user data into user model.
Marcin Kuzminski <marcin@python-works.com>
parents: 1045
diff changeset
251 api_key = request.GET.get('api_key')
2030
61f9aeb2129e Added session wrapper, for rc 1.2.X compatibility. Adds backwards compatability
Marcin Kuzminski <marcin@python-works.com>
parents: 2027
diff changeset
252 cookie_store = CookieStoreWrapper(session.get('rhodecode_user'))
1718
f78bee8eec78 reduce cookie size for better support of client side sessions
Marcin Kuzminski <marcin@python-works.com>
parents: 1702
diff changeset
253 user_id = cookie_store.get('user_id', None)
1630
25d8e4836bc2 Improved container-based auth support for middleware
Liad Shani <liadff@gmail.com>
parents: 1629
diff changeset
254 username = get_container_username(environ, config)
1628
de71a4bde097 Some code cleanups and fixes
Marcin Kuzminski <marcin@python-works.com>
parents: 1622
diff changeset
255 auth_user = AuthUser(user_id, api_key, username)
1728
07e56179633e - fixes celery sqlalchemy session issues for async forking
Marcin Kuzminski <marcin@python-works.com>
parents: 1718
diff changeset
256 request.user = auth_user
1628
de71a4bde097 Some code cleanups and fixes
Marcin Kuzminski <marcin@python-works.com>
parents: 1622
diff changeset
257 self.rhodecode_user = c.rhodecode_user = auth_user
1618
9353189b7675 Added automatic logout of deactivated/deleted users
Liad Shani <liadff@gmail.com>
parents: 1617
diff changeset
258 if not self.rhodecode_user.is_authenticated and \
9353189b7675 Added automatic logout of deactivated/deleted users
Liad Shani <liadff@gmail.com>
parents: 1617
diff changeset
259 self.rhodecode_user.user_id is not None:
2030
61f9aeb2129e Added session wrapper, for rc 1.2.X compatibility. Adds backwards compatability
Marcin Kuzminski <marcin@python-works.com>
parents: 2027
diff changeset
260 self.rhodecode_user.set_authenticated(
61f9aeb2129e Added session wrapper, for rc 1.2.X compatibility. Adds backwards compatability
Marcin Kuzminski <marcin@python-works.com>
parents: 2027
diff changeset
261 cookie_store.get('is_authenticated')
61f9aeb2129e Added session wrapper, for rc 1.2.X compatibility. Adds backwards compatability
Marcin Kuzminski <marcin@python-works.com>
parents: 2027
diff changeset
262 )
2486
6f537e3da9c4 add IP into base logging, and change a little IP extraction login, if some header is passed as empty
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
263 log.info('IP: %s User: %s accessed %s' % (
2490
7a5eeafb1a9a better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents: 2486
diff changeset
264 self.ip_addr, auth_user, safe_unicode(_get_access_path(environ)))
2027
88d5e42a66c3 fixed logging issue on non-ascii repos
Marcin Kuzminski <marcin@python-works.com>
parents: 2025
diff changeset
265 )
0
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
266 return WSGIController.__call__(self, environ, start_response)
564e40829f80 initial commit.
Marcin Kuzminski
parents:
diff changeset
267 finally:
2486
6f537e3da9c4 add IP into base logging, and change a little IP extraction login, if some header is passed as empty
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
268 log.info('IP: %s Request to %s time: %.3fs' % (
6f537e3da9c4 add IP into base logging, and change a little IP extraction login, if some header is passed as empty
Marcin Kuzminski <marcin@python-works.com>
parents: 2478
diff changeset
269 _get_ip_addr(environ),
2490
7a5eeafb1a9a better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents: 2486
diff changeset
270 safe_unicode(_get_access_path(environ)), time.time() - start)
2027
88d5e42a66c3 fixed logging issue on non-ascii repos
Marcin Kuzminski <marcin@python-works.com>
parents: 2025
diff changeset
271 )
51
a699c0088344 fixed sqlalchemy session bug,
marcink
parents: 17
diff changeset
272 meta.Session.remove()
1045
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1038
diff changeset
273
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1038
diff changeset
274
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1038
diff changeset
275 class BaseRepoController(BaseController):
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1038
diff changeset
276 """
1628
de71a4bde097 Some code cleanups and fixes
Marcin Kuzminski <marcin@python-works.com>
parents: 1622
diff changeset
277 Base class for controllers responsible for loading all needed data for
de71a4bde097 Some code cleanups and fixes
Marcin Kuzminski <marcin@python-works.com>
parents: 1622
diff changeset
278 repository loaded items are
1203
6832ef664673 source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents: 1117
diff changeset
279
1628
de71a4bde097 Some code cleanups and fixes
Marcin Kuzminski <marcin@python-works.com>
parents: 1622
diff changeset
280 c.rhodecode_repo: instance of scm repository
de71a4bde097 Some code cleanups and fixes
Marcin Kuzminski <marcin@python-works.com>
parents: 1622
diff changeset
281 c.rhodecode_db_repo: instance of db
de71a4bde097 Some code cleanups and fixes
Marcin Kuzminski <marcin@python-works.com>
parents: 1622
diff changeset
282 c.repository_followers: number of followers
de71a4bde097 Some code cleanups and fixes
Marcin Kuzminski <marcin@python-works.com>
parents: 1622
diff changeset
283 c.repository_forks: number of forks
1045
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1038
diff changeset
284 """
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1038
diff changeset
285
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1038
diff changeset
286 def __before__(self):
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1038
diff changeset
287 super(BaseRepoController, self).__before__()
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1038
diff changeset
288 if c.repo_name:
3fc9183e05dd another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents: 1038
diff changeset
289
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2374
diff changeset
290 dbr = c.rhodecode_db_repo = Repository.get_by_repo_name(c.repo_name)
1373
66f03a87141c Fixes issue #201
Marcin Kuzminski <marcin@python-works.com>
parents: 1366
diff changeset
291 c.rhodecode_repo = c.rhodecode_db_repo.scm_instance
66f03a87141c Fixes issue #201
Marcin Kuzminski <marcin@python-works.com>
parents: 1366
diff changeset
292
66f03a87141c Fixes issue #201
Marcin Kuzminski <marcin@python-works.com>
parents: 1366
diff changeset
293 if c.rhodecode_repo is None:
66f03a87141c Fixes issue #201
Marcin Kuzminski <marcin@python-works.com>
parents: 1366
diff changeset
294 log.error('%s this repository is present in database but it '
66f03a87141c Fixes issue #201
Marcin Kuzminski <marcin@python-works.com>
parents: 1366
diff changeset
295 'cannot be created as an scm instance', c.repo_name)
1282
faaadfc3c359 fixed condition evaluated for gitrepo that returned null, simplified scm functions
Marcin Kuzminski <marcin@python-works.com>
parents: 1203
diff changeset
296
1373
66f03a87141c Fixes issue #201
Marcin Kuzminski <marcin@python-works.com>
parents: 1366
diff changeset
297 redirect(url('home'))
1304
5a96551ee9c0 gui-improvments
Marcin Kuzminski <marcin@python-works.com>
parents: 1282
diff changeset
298
2440
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2374
diff changeset
299 # some globals counter for menu
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2374
diff changeset
300 c.repository_followers = self.scm_model.get_followers(dbr)
1bc579bcd67a - pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents: 2374
diff changeset
301 c.repository_forks = self.scm_model.get_forks(dbr)
2478
8eab81115660 white space cleanup
Marcin Kuzminski <marcin@python-works.com>
parents: 2440
diff changeset
302 c.repository_pull_requests = self.scm_model.get_pull_requests(dbr)