Mercurial > kallithea
annotate rhodecode/lib/base.py @ 4006:cdf10b3df899
Allow RhodeCode maintainers to specify a custom bug tracker.
This allows people who maintain large RhodeCode installations to setup their
own bug tracker and respond to requests against their specific installation.
The maintainer is then free to forward problems with RhodeCode to the
canonical issue tracker on bitbucket.
If the config option "bugtracker" is present, its value will be used with the
"Report a bug" button. If left blank, this disables the button. If no value is
present, then the default is used. This is so that the new config option
doesn't break installations of RhodeCode upgrading to a newer version and to
allow easier installation for the common use case.
author | Jonathan Sternberg <jonathansternberg@gmail.com> |
---|---|
date | Mon, 17 Jun 2013 12:41:28 -0400 |
parents | b58ed6d608cc |
children | 9b4ba12ef8c3 |
rev | line source |
---|---|
0 | 1 """The base Controller API |
2 | |
3 Provides the BaseController class for subclassing. | |
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 |
2912
976e2b032650
patched basic auth function to overcome git issues with proxy that doesn't send both username and password. ref #586
Marcin Kuzminski <marcin@python-works.com>
parents:
2752
diff
changeset
|
11 from paste.httpheaders import WWW_AUTHENTICATE, AUTHORIZATION |
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
|
12 |
1373
66f03a87141c
Fixes issue #201
Marcin Kuzminski <marcin@python-works.com>
parents:
1366
diff
changeset
|
13 from pylons import config, tmpl_context as c, request, session, url |
0 | 14 from pylons.controllers import WSGIController |
1373
66f03a87141c
Fixes issue #201
Marcin Kuzminski <marcin@python-works.com>
parents:
1366
diff
changeset
|
15 from pylons.controllers.util import redirect |
0 | 16 from pylons.templating import render_mako as render |
1304
5a96551ee9c0
gui-improvments
Marcin Kuzminski <marcin@python-works.com>
parents:
1282
diff
changeset
|
17 |
1718
f78bee8eec78
reduce cookie size for better support of client side sessions
Marcin Kuzminski <marcin@python-works.com>
parents:
1702
diff
changeset
|
18 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
|
19 |
2726
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
20 from rhodecode.lib.utils2 import str2bool, safe_unicode, AttributeDict,\ |
3087
a797ada9d2ad
added option to ini file to define lightweight dashboard items per page before pagination
Marcin Kuzminski <marcin@python-works.com>
parents:
2958
diff
changeset
|
21 safe_str, safe_int |
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
|
22 from rhodecode.lib.auth import AuthUser, get_container_username, authfunc,\ |
3146
c5169e445fb8
Full IP restrictions enabled
Marcin Kuzminski <marcin@python-works.com>
parents:
3125
diff
changeset
|
23 HasPermissionAnyMiddleware, CookieStoreWrapper |
3693
6843cabe9925
removed duplicated logic of how we invalidate caches for repos
Marcin Kuzminski <marcin@python-works.com>
parents:
3669
diff
changeset
|
24 from rhodecode.lib.utils import get_repo_slug |
547
1e757ac98988
renamed project to rhodecode
Marcin Kuzminski <marcin@python-works.com>
parents:
537
diff
changeset
|
25 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
|
26 |
2955
9c85d884315b
don't use config for visual settings. It totally doesn't work on multi instance mode
Marcin Kuzminski <marcin@python-works.com>
parents:
2952
diff
changeset
|
27 from rhodecode.model.db import Repository, RhodeCodeUi, User, RhodeCodeSetting |
1702
8cb7f5c4d494
#302 - basic notification system, models+tests
Marcin Kuzminski <marcin@python-works.com>
parents:
1630
diff
changeset
|
28 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
|
29 from rhodecode.model.scm import ScmModel |
2726
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
30 from rhodecode.model.meta import Session |
665
070f32743632
Moved out reposcan into hg Model.
Marcin Kuzminski <marcin@python-works.com>
parents:
659
diff
changeset
|
31 |
1373
66f03a87141c
Fixes issue #201
Marcin Kuzminski <marcin@python-works.com>
parents:
1366
diff
changeset
|
32 log = logging.getLogger(__name__) |
1307 | 33 |
1813
a8c66e870bd0
implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents:
1763
diff
changeset
|
34 |
3669
b66fd6de093c
fixed multiple IP addresses in each of extracted IP.
Marcin Kuzminski <marcin@python-works.com>
parents:
3631
diff
changeset
|
35 def _filter_proxy(ip): |
b66fd6de093c
fixed multiple IP addresses in each of extracted IP.
Marcin Kuzminski <marcin@python-works.com>
parents:
3631
diff
changeset
|
36 """ |
3987
b58ed6d608cc
Use space after , in lists
Mads Kiilerich <madski@unity3d.com>
parents:
3960
diff
changeset
|
37 HEADERS can have multiple ips inside the left-most being the original |
3669
b66fd6de093c
fixed multiple IP addresses in each of extracted IP.
Marcin Kuzminski <marcin@python-works.com>
parents:
3631
diff
changeset
|
38 client, and each successive proxy that passed the request adding the IP |
b66fd6de093c
fixed multiple IP addresses in each of extracted IP.
Marcin Kuzminski <marcin@python-works.com>
parents:
3631
diff
changeset
|
39 address where it received the request from. |
b66fd6de093c
fixed multiple IP addresses in each of extracted IP.
Marcin Kuzminski <marcin@python-works.com>
parents:
3631
diff
changeset
|
40 |
b66fd6de093c
fixed multiple IP addresses in each of extracted IP.
Marcin Kuzminski <marcin@python-works.com>
parents:
3631
diff
changeset
|
41 :param ip: |
b66fd6de093c
fixed multiple IP addresses in each of extracted IP.
Marcin Kuzminski <marcin@python-works.com>
parents:
3631
diff
changeset
|
42 """ |
b66fd6de093c
fixed multiple IP addresses in each of extracted IP.
Marcin Kuzminski <marcin@python-works.com>
parents:
3631
diff
changeset
|
43 if ',' in ip: |
b66fd6de093c
fixed multiple IP addresses in each of extracted IP.
Marcin Kuzminski <marcin@python-works.com>
parents:
3631
diff
changeset
|
44 _ips = ip.split(',') |
b66fd6de093c
fixed multiple IP addresses in each of extracted IP.
Marcin Kuzminski <marcin@python-works.com>
parents:
3631
diff
changeset
|
45 _first_ip = _ips[0].strip() |
b66fd6de093c
fixed multiple IP addresses in each of extracted IP.
Marcin Kuzminski <marcin@python-works.com>
parents:
3631
diff
changeset
|
46 log.debug('Got multiple IPs %s, using %s' % (','.join(_ips), _first_ip)) |
b66fd6de093c
fixed multiple IP addresses in each of extracted IP.
Marcin Kuzminski <marcin@python-works.com>
parents:
3631
diff
changeset
|
47 return _first_ip |
b66fd6de093c
fixed multiple IP addresses in each of extracted IP.
Marcin Kuzminski <marcin@python-works.com>
parents:
3631
diff
changeset
|
48 return ip |
b66fd6de093c
fixed multiple IP addresses in each of extracted IP.
Marcin Kuzminski <marcin@python-works.com>
parents:
3631
diff
changeset
|
49 |
b66fd6de093c
fixed multiple IP addresses in each of extracted IP.
Marcin Kuzminski <marcin@python-works.com>
parents:
3631
diff
changeset
|
50 |
2374
be2163ef127e
Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents:
2184
diff
changeset
|
51 def _get_ip_addr(environ): |
be2163ef127e
Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents:
2184
diff
changeset
|
52 proxy_key = 'HTTP_X_REAL_IP' |
be2163ef127e
Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents:
2184
diff
changeset
|
53 proxy_key2 = 'HTTP_X_FORWARDED_FOR' |
be2163ef127e
Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents:
2184
diff
changeset
|
54 def_key = 'REMOTE_ADDR' |
be2163ef127e
Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents:
2184
diff
changeset
|
55 |
3153
8046d1979674
fix multiple ips addresses in X_FORWARDER_FOR header
Marcin Kuzminski <marcin@python-works.com>
parents:
3147
diff
changeset
|
56 ip = environ.get(proxy_key) |
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
|
57 if ip: |
3669
b66fd6de093c
fixed multiple IP addresses in each of extracted IP.
Marcin Kuzminski <marcin@python-works.com>
parents:
3631
diff
changeset
|
58 return _filter_proxy(ip) |
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
|
59 |
3153
8046d1979674
fix multiple ips addresses in X_FORWARDER_FOR header
Marcin Kuzminski <marcin@python-works.com>
parents:
3147
diff
changeset
|
60 ip = environ.get(proxy_key2) |
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
|
61 if ip: |
3669
b66fd6de093c
fixed multiple IP addresses in each of extracted IP.
Marcin Kuzminski <marcin@python-works.com>
parents:
3631
diff
changeset
|
62 return _filter_proxy(ip) |
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
|
63 |
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
|
64 ip = environ.get(def_key, '0.0.0.0') |
3669
b66fd6de093c
fixed multiple IP addresses in each of extracted IP.
Marcin Kuzminski <marcin@python-works.com>
parents:
3631
diff
changeset
|
65 return _filter_proxy(ip) |
2374
be2163ef127e
Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents:
2184
diff
changeset
|
66 |
be2163ef127e
Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents:
2184
diff
changeset
|
67 |
2490
7a5eeafb1a9a
better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents:
2486
diff
changeset
|
68 def _get_access_path(environ): |
7a5eeafb1a9a
better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents:
2486
diff
changeset
|
69 path = environ.get('PATH_INFO') |
7a5eeafb1a9a
better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents:
2486
diff
changeset
|
70 org_req = environ.get('pylons.original_request') |
7a5eeafb1a9a
better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents:
2486
diff
changeset
|
71 if org_req: |
7a5eeafb1a9a
better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents:
2486
diff
changeset
|
72 path = org_req.environ.get('PATH_INFO') |
7a5eeafb1a9a
better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents:
2486
diff
changeset
|
73 return path |
7a5eeafb1a9a
better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents:
2486
diff
changeset
|
74 |
7a5eeafb1a9a
better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents:
2486
diff
changeset
|
75 |
2132
9f5582151d53
Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents:
2109
diff
changeset
|
76 class BasicAuth(AuthBasicAuthenticator): |
9f5582151d53
Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents:
2109
diff
changeset
|
77 |
9f5582151d53
Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents:
2109
diff
changeset
|
78 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
|
79 self.realm = realm |
9f5582151d53
Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents:
2109
diff
changeset
|
80 self.authfunc = authfunc |
9f5582151d53
Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents:
2109
diff
changeset
|
81 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
|
82 |
9f5582151d53
Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents:
2109
diff
changeset
|
83 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
|
84 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
|
85 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
|
86 # 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
|
87 # RhodeCode config |
9f5582151d53
Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents:
2109
diff
changeset
|
88 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
|
89 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
|
90 |
2912
976e2b032650
patched basic auth function to overcome git issues with proxy that doesn't send both username and password. ref #586
Marcin Kuzminski <marcin@python-works.com>
parents:
2752
diff
changeset
|
91 def authenticate(self, environ): |
976e2b032650
patched basic auth function to overcome git issues with proxy that doesn't send both username and password. ref #586
Marcin Kuzminski <marcin@python-works.com>
parents:
2752
diff
changeset
|
92 authorization = AUTHORIZATION(environ) |
976e2b032650
patched basic auth function to overcome git issues with proxy that doesn't send both username and password. ref #586
Marcin Kuzminski <marcin@python-works.com>
parents:
2752
diff
changeset
|
93 if not authorization: |
976e2b032650
patched basic auth function to overcome git issues with proxy that doesn't send both username and password. ref #586
Marcin Kuzminski <marcin@python-works.com>
parents:
2752
diff
changeset
|
94 return self.build_authentication() |
976e2b032650
patched basic auth function to overcome git issues with proxy that doesn't send both username and password. ref #586
Marcin Kuzminski <marcin@python-works.com>
parents:
2752
diff
changeset
|
95 (authmeth, auth) = authorization.split(' ', 1) |
976e2b032650
patched basic auth function to overcome git issues with proxy that doesn't send both username and password. ref #586
Marcin Kuzminski <marcin@python-works.com>
parents:
2752
diff
changeset
|
96 if 'basic' != authmeth.lower(): |
976e2b032650
patched basic auth function to overcome git issues with proxy that doesn't send both username and password. ref #586
Marcin Kuzminski <marcin@python-works.com>
parents:
2752
diff
changeset
|
97 return self.build_authentication() |
976e2b032650
patched basic auth function to overcome git issues with proxy that doesn't send both username and password. ref #586
Marcin Kuzminski <marcin@python-works.com>
parents:
2752
diff
changeset
|
98 auth = auth.strip().decode('base64') |
976e2b032650
patched basic auth function to overcome git issues with proxy that doesn't send both username and password. ref #586
Marcin Kuzminski <marcin@python-works.com>
parents:
2752
diff
changeset
|
99 _parts = auth.split(':', 1) |
976e2b032650
patched basic auth function to overcome git issues with proxy that doesn't send both username and password. ref #586
Marcin Kuzminski <marcin@python-works.com>
parents:
2752
diff
changeset
|
100 if len(_parts) == 2: |
976e2b032650
patched basic auth function to overcome git issues with proxy that doesn't send both username and password. ref #586
Marcin Kuzminski <marcin@python-works.com>
parents:
2752
diff
changeset
|
101 username, password = _parts |
976e2b032650
patched basic auth function to overcome git issues with proxy that doesn't send both username and password. ref #586
Marcin Kuzminski <marcin@python-works.com>
parents:
2752
diff
changeset
|
102 if self.authfunc(environ, username, password): |
976e2b032650
patched basic auth function to overcome git issues with proxy that doesn't send both username and password. ref #586
Marcin Kuzminski <marcin@python-works.com>
parents:
2752
diff
changeset
|
103 return username |
976e2b032650
patched basic auth function to overcome git issues with proxy that doesn't send both username and password. ref #586
Marcin Kuzminski <marcin@python-works.com>
parents:
2752
diff
changeset
|
104 return self.build_authentication() |
976e2b032650
patched basic auth function to overcome git issues with proxy that doesn't send both username and password. ref #586
Marcin Kuzminski <marcin@python-works.com>
parents:
2752
diff
changeset
|
105 |
976e2b032650
patched basic auth function to overcome git issues with proxy that doesn't send both username and password. ref #586
Marcin Kuzminski <marcin@python-works.com>
parents:
2752
diff
changeset
|
106 __call__ = authenticate |
976e2b032650
patched basic auth function to overcome git issues with proxy that doesn't send both username and password. ref #586
Marcin Kuzminski <marcin@python-works.com>
parents:
2752
diff
changeset
|
107 |
2132
9f5582151d53
Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents:
2109
diff
changeset
|
108 |
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
|
109 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
|
110 |
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
|
111 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
|
112 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
|
113 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
|
114 # 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
|
115 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
|
116 #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
|
117 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
|
118 config.get('auth_ret_code')) |
3125
9b92cf5a0cca
Added UserIpMap interface for allowed IP addresses and IP restriction access
Marcin Kuzminski <marcin@python-works.com>
parents:
3087
diff
changeset
|
119 self.ip_addr = '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
|
120 |
1978
164199e476e9
code garden, pep8
Marcin Kuzminski <marcin@python-works.com>
parents:
1818
diff
changeset
|
121 def _handle_request(self, environ, start_response): |
164199e476e9
code garden, pep8
Marcin Kuzminski <marcin@python-works.com>
parents:
1818
diff
changeset
|
122 raise NotImplementedError() |
164199e476e9
code garden, pep8
Marcin Kuzminski <marcin@python-works.com>
parents:
1818
diff
changeset
|
123 |
1813
a8c66e870bd0
implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents:
1763
diff
changeset
|
124 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
|
125 """ |
a8c66e870bd0
implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents:
1763
diff
changeset
|
126 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
|
127 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
|
128 |
a8c66e870bd0
implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents:
1763
diff
changeset
|
129 :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
|
130 """ |
a8c66e870bd0
implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents:
1763
diff
changeset
|
131 try: |
a8c66e870bd0
implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents:
1763
diff
changeset
|
132 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
|
133 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
|
134 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
|
135 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
|
136 _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
|
137 data[1] = _repo_name |
3631
10b4e34841a4
Don't catch all exceptions
Marcin Kuzminski <marcin@python-works.com>
parents:
3580
diff
changeset
|
138 except Exception: |
1813
a8c66e870bd0
implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents:
1763
diff
changeset
|
139 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
|
140 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
|
141 ) |
a8c66e870bd0
implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents:
1763
diff
changeset
|
142 ) |
a8c66e870bd0
implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents:
1763
diff
changeset
|
143 |
a8c66e870bd0
implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents:
1763
diff
changeset
|
144 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
|
145 |
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
|
146 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
|
147 """ |
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
|
148 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
|
149 |
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
|
150 :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
|
151 """ |
3693
6843cabe9925
removed duplicated logic of how we invalidate caches for repos
Marcin Kuzminski <marcin@python-works.com>
parents:
3669
diff
changeset
|
152 ScmModel().mark_for_invalidation(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
|
153 |
3125
9b92cf5a0cca
Added UserIpMap interface for allowed IP addresses and IP restriction access
Marcin Kuzminski <marcin@python-works.com>
parents:
3087
diff
changeset
|
154 def _check_permission(self, action, user, repo_name, ip_addr=None): |
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
|
155 """ |
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
|
156 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
|
157 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
|
158 |
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
|
159 :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
|
160 :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
|
161 :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
|
162 """ |
3125
9b92cf5a0cca
Added UserIpMap interface for allowed IP addresses and IP restriction access
Marcin Kuzminski <marcin@python-works.com>
parents:
3087
diff
changeset
|
163 #check IP |
3146
c5169e445fb8
Full IP restrictions enabled
Marcin Kuzminski <marcin@python-works.com>
parents:
3125
diff
changeset
|
164 authuser = AuthUser(user_id=user.user_id, ip_addr=ip_addr) |
c5169e445fb8
Full IP restrictions enabled
Marcin Kuzminski <marcin@python-works.com>
parents:
3125
diff
changeset
|
165 if not authuser.ip_allowed: |
3125
9b92cf5a0cca
Added UserIpMap interface for allowed IP addresses and IP restriction access
Marcin Kuzminski <marcin@python-works.com>
parents:
3087
diff
changeset
|
166 return False |
9b92cf5a0cca
Added UserIpMap interface for allowed IP addresses and IP restriction access
Marcin Kuzminski <marcin@python-works.com>
parents:
3087
diff
changeset
|
167 else: |
9b92cf5a0cca
Added UserIpMap interface for allowed IP addresses and IP restriction access
Marcin Kuzminski <marcin@python-works.com>
parents:
3087
diff
changeset
|
168 log.info('Access for IP:%s allowed' % (ip_addr)) |
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
|
169 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
|
170 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
|
171 '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
|
172 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
|
173 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
|
174 |
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
|
175 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
|
176 #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
|
177 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
|
178 '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
|
179 '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
|
180 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
|
181 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
|
182 |
1813
a8c66e870bd0
implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents:
1763
diff
changeset
|
183 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
|
184 |
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
|
185 def _get_ip_addr(self, environ): |
2374
be2163ef127e
Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents:
2184
diff
changeset
|
186 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
|
187 |
2668
f0851f37d6be
Implementes #509 require SSL flag now works for both git and mercurial.
Marcin Kuzminski <marcin@python-works.com>
parents:
2490
diff
changeset
|
188 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
|
189 """ |
f0851f37d6be
Implementes #509 require SSL flag now works for both git and mercurial.
Marcin Kuzminski <marcin@python-works.com>
parents:
2490
diff
changeset
|
190 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
|
191 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
|
192 """ |
f0851f37d6be
Implementes #509 require SSL flag now works for both git and mercurial.
Marcin Kuzminski <marcin@python-works.com>
parents:
2490
diff
changeset
|
193 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
|
194 #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
|
195 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
|
196 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
|
197 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
|
198 % 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
|
199 return False |
2674
a221706dab50
merged + fixed pull request #62: Implemented metatags and visualisation options.
Marcin Kuzminski <marcin@python-works.com>
parents:
2668
diff
changeset
|
200 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
|
201 |
2726
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
202 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
|
203 """ |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
204 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
|
205 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
|
206 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
|
207 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
|
208 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
|
209 |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
210 """ |
2752
6d904a0cd48d
added new suite of tests for VCS operations
Marcin Kuzminski <marcin@python-works.com>
parents:
2726
diff
changeset
|
211 locked = False # defines that locked error should be thrown to user |
2726
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
212 make_lock = None |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
213 repo = Repository.get_by_repo_name(repo) |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
214 user = User.get(user_id) |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
215 |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
216 # 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
|
217 # server see all operation on changeset; bookmarks, phases and |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
218 # 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
|
219 # locking on those |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
220 obsolete_call = environ['QUERY_STRING'] in ['cmd=listkeys',] |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
221 locked_by = repo.locked |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
222 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
|
223 if action == 'push': |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
224 #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
|
225 user_id, _date = repo.locked |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
226 if user.user_id == user_id: |
2752
6d904a0cd48d
added new suite of tests for VCS operations
Marcin Kuzminski <marcin@python-works.com>
parents:
2726
diff
changeset
|
227 log.debug('Got push from user %s, now unlocking' % (user)) |
2726
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
228 # unlock if we have push from user who locked |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
229 make_lock = False |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
230 else: |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
231 # 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
|
232 locked = True |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
233 if action == 'pull': |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
234 if repo.locked[0] and repo.locked[1]: |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
235 locked = True |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
236 else: |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
237 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
|
238 make_lock = True |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
239 |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
240 else: |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
241 log.debug('Repository %s do not have locking enabled' % (repo)) |
2752
6d904a0cd48d
added new suite of tests for VCS operations
Marcin Kuzminski <marcin@python-works.com>
parents:
2726
diff
changeset
|
242 log.debug('FINAL locking values make_lock:%s,locked:%s,locked_by:%s' |
6d904a0cd48d
added new suite of tests for VCS operations
Marcin Kuzminski <marcin@python-works.com>
parents:
2726
diff
changeset
|
243 % (make_lock, locked, locked_by)) |
2726
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
244 return make_lock, locked, locked_by |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
245 |
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
|
246 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
|
247 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
|
248 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
|
249 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
|
250 finally: |
1763
d09c52be40e0
logger name update
Marcin Kuzminski <marcin@python-works.com>
parents:
1761
diff
changeset
|
251 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
|
252 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
|
253 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
|
254 |
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
|
255 |
0 | 256 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
|
257 |
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
|
258 def __before__(self): |
3125
9b92cf5a0cca
Added UserIpMap interface for allowed IP addresses and IP restriction access
Marcin Kuzminski <marcin@python-works.com>
parents:
3087
diff
changeset
|
259 """ |
9b92cf5a0cca
Added UserIpMap interface for allowed IP addresses and IP restriction access
Marcin Kuzminski <marcin@python-works.com>
parents:
3087
diff
changeset
|
260 __before__ is called before controller methods and after __call__ |
9b92cf5a0cca
Added UserIpMap interface for allowed IP addresses and IP restriction access
Marcin Kuzminski <marcin@python-works.com>
parents:
3087
diff
changeset
|
261 """ |
548
b75b77ef649d
renamed hg_app to rhodecode
Marcin Kuzminski <marcin@python-works.com>
parents:
547
diff
changeset
|
262 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
|
263 c.rhodecode_instanceid = config.get('instance_id') |
890
042d38683d42
implemented #89 google analytics code
Marcin Kuzminski <marcin@python-works.com>
parents:
812
diff
changeset
|
264 c.rhodecode_name = config.get('rhodecode_title') |
4006
cdf10b3df899
Allow RhodeCode maintainers to specify a custom bug tracker.
Jonathan Sternberg <jonathansternberg@gmail.com>
parents:
3987
diff
changeset
|
265 c.rhodecode_bugtracker = config.get('bugtracker', 'http://bitbucket.org/marcinkuzminski/rhodecode/issues') |
1629
2196aa27954b
implements #293 gravatar link should be disabled when use_gravatar = false
Marcin Kuzminski <marcin@python-works.com>
parents:
1628
diff
changeset
|
266 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
|
267 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
|
268 # Visual options |
a221706dab50
merged + fixed pull request #62: Implemented metatags and visualisation options.
Marcin Kuzminski <marcin@python-works.com>
parents:
2668
diff
changeset
|
269 c.visual = AttributeDict({}) |
2955
9c85d884315b
don't use config for visual settings. It totally doesn't work on multi instance mode
Marcin Kuzminski <marcin@python-works.com>
parents:
2952
diff
changeset
|
270 rc_config = RhodeCodeSetting.get_app_settings() |
3904
fe053a42c4ce
added dashboard items config in visual settings
Marcin Kuzminski <marcin@python-works.com>
parents:
3752
diff
changeset
|
271 ## DB stored |
2955
9c85d884315b
don't use config for visual settings. It totally doesn't work on multi instance mode
Marcin Kuzminski <marcin@python-works.com>
parents:
2952
diff
changeset
|
272 c.visual.show_public_icon = str2bool(rc_config.get('rhodecode_show_public_icon')) |
9c85d884315b
don't use config for visual settings. It totally doesn't work on multi instance mode
Marcin Kuzminski <marcin@python-works.com>
parents:
2952
diff
changeset
|
273 c.visual.show_private_icon = str2bool(rc_config.get('rhodecode_show_private_icon')) |
9c85d884315b
don't use config for visual settings. It totally doesn't work on multi instance mode
Marcin Kuzminski <marcin@python-works.com>
parents:
2952
diff
changeset
|
274 c.visual.stylify_metatags = str2bool(rc_config.get('rhodecode_stylify_metatags')) |
3904
fe053a42c4ce
added dashboard items config in visual settings
Marcin Kuzminski <marcin@python-works.com>
parents:
3752
diff
changeset
|
275 c.visual.dashboard_items = safe_int(rc_config.get('rhodecode_dashboard_items', 100)) |
3308
72a91632b731
repository extra fields implementation
Marcin Kuzminski <marcin@python-works.com>
parents:
3168
diff
changeset
|
276 c.visual.repository_fields = str2bool(rc_config.get('rhodecode_repository_fields')) |
3910
36f7562a5919
Implements #842 RhodeCode version disclosure.
Marcin Kuzminski <marcin@python-works.com>
parents:
3904
diff
changeset
|
277 c.visual.show_version = str2bool(rc_config.get('rhodecode_show_version')) |
36f7562a5919
Implements #842 RhodeCode version disclosure.
Marcin Kuzminski <marcin@python-works.com>
parents:
3904
diff
changeset
|
278 |
3904
fe053a42c4ce
added dashboard items config in visual settings
Marcin Kuzminski <marcin@python-works.com>
parents:
3752
diff
changeset
|
279 ## INI stored |
fe053a42c4ce
added dashboard items config in visual settings
Marcin Kuzminski <marcin@python-works.com>
parents:
3752
diff
changeset
|
280 self.cut_off_limit = int(config.get('cut_off_limit')) |
3920
985db7f7b9b2
Added flag to controll option for changing the repos path location
Marcin Kuzminski <marcin@python-works.com>
parents:
3910
diff
changeset
|
281 c.visual.allow_repo_location_change = str2bool(config.get('allow_repo_location_change', True)) |
3904
fe053a42c4ce
added dashboard items config in visual settings
Marcin Kuzminski <marcin@python-works.com>
parents:
3752
diff
changeset
|
282 |
3580
7b9d4f6bb04e
show only open pull requests in the counter, and use repo context bar in pull requests view
Marcin Kuzminski <marcin@python-works.com>
parents:
3552
diff
changeset
|
283 c.repo_name = get_repo_slug(request) # can be empty |
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
|
284 c.backends = BACKENDS.keys() |
1702
8cb7f5c4d494
#302 - basic notification system, models+tests
Marcin Kuzminski <marcin@python-works.com>
parents:
1630
diff
changeset
|
285 c.unread_notifications = NotificationModel()\ |
8cb7f5c4d494
#302 - basic notification system, models+tests
Marcin Kuzminski <marcin@python-works.com>
parents:
1630
diff
changeset
|
286 .get_unread_cnt_for_user(c.rhodecode_user.user_id) |
1749
8ecc6b8229a5
commit less models
Marcin Kuzminski <marcin@python-works.com>
parents:
1728
diff
changeset
|
287 self.sa = meta.Session |
1045
3fc9183e05dd
another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents:
1038
diff
changeset
|
288 self.scm_model = ScmModel(self.sa) |
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
|
289 |
0 | 290 def __call__(self, environ, start_response): |
291 """Invoke the Controller""" | |
292 # WSGIController.__call__ dispatches to the Controller method | |
293 # the request is routed to. This routing information is | |
294 # available in environ['pylons.routes_dict'] | |
295 try: | |
2374
be2163ef127e
Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents:
2184
diff
changeset
|
296 self.ip_addr = _get_ip_addr(environ) |
1628
de71a4bde097
Some code cleanups and fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
1622
diff
changeset
|
297 # 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
|
298 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
|
299 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
|
300 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
|
301 username = get_container_username(environ, config) |
3125
9b92cf5a0cca
Added UserIpMap interface for allowed IP addresses and IP restriction access
Marcin Kuzminski <marcin@python-works.com>
parents:
3087
diff
changeset
|
302 auth_user = AuthUser(user_id, api_key, username, self.ip_addr) |
1728
07e56179633e
- fixes celery sqlalchemy session issues for async forking
Marcin Kuzminski <marcin@python-works.com>
parents:
1718
diff
changeset
|
303 request.user = auth_user |
1628
de71a4bde097
Some code cleanups and fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
1622
diff
changeset
|
304 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
|
305 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
|
306 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
|
307 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
|
308 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
|
309 ) |
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
|
310 log.info('IP: %s User: %s accessed %s' % ( |
2490
7a5eeafb1a9a
better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents:
2486
diff
changeset
|
311 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
|
312 ) |
0 | 313 return WSGIController.__call__(self, environ, start_response) |
314 finally: | |
51 | 315 meta.Session.remove() |
1045
3fc9183e05dd
another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents:
1038
diff
changeset
|
316 |
3fc9183e05dd
another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents:
1038
diff
changeset
|
317 |
3fc9183e05dd
another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents:
1038
diff
changeset
|
318 class BaseRepoController(BaseController): |
3fc9183e05dd
another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents:
1038
diff
changeset
|
319 """ |
1628
de71a4bde097
Some code cleanups and fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
1622
diff
changeset
|
320 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
|
321 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
|
322 |
1628
de71a4bde097
Some code cleanups and fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
1622
diff
changeset
|
323 c.rhodecode_repo: instance of scm repository |
de71a4bde097
Some code cleanups and fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
1622
diff
changeset
|
324 c.rhodecode_db_repo: instance of db |
de71a4bde097
Some code cleanups and fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
1622
diff
changeset
|
325 c.repository_followers: number of followers |
de71a4bde097
Some code cleanups and fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
1622
diff
changeset
|
326 c.repository_forks: number of forks |
3527
87c97fcea029
Adding the context bar too all pages related to a Repository.
Leonardo <leo@unity3d.com>
parents:
3308
diff
changeset
|
327 c.repository_following: weather the current user is following the current repo |
1045
3fc9183e05dd
another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents:
1038
diff
changeset
|
328 """ |
3fc9183e05dd
another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents:
1038
diff
changeset
|
329 |
3fc9183e05dd
another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents:
1038
diff
changeset
|
330 def __before__(self): |
3fc9183e05dd
another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents:
1038
diff
changeset
|
331 super(BaseRepoController, self).__before__() |
3fc9183e05dd
another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents:
1038
diff
changeset
|
332 if c.repo_name: |
3fc9183e05dd
another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents:
1038
diff
changeset
|
333 |
2440
1bc579bcd67a
- pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents:
2374
diff
changeset
|
334 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
|
335 c.rhodecode_repo = c.rhodecode_db_repo.scm_instance |
2937
d439d408b415
Update last_change from VCS data on request.
Marcin Kuzminski <marcin@python-works.com>
parents:
2936
diff
changeset
|
336 # update last change according to VCS data |
3147
8182ebed2922
Added full last changeset info to lightweight dashboard
Marcin Kuzminski <marcin@python-works.com>
parents:
3146
diff
changeset
|
337 dbr.update_changeset_cache(dbr.get_changeset()) |
1373
66f03a87141c
Fixes issue #201
Marcin Kuzminski <marcin@python-works.com>
parents:
1366
diff
changeset
|
338 if c.rhodecode_repo is None: |
66f03a87141c
Fixes issue #201
Marcin Kuzminski <marcin@python-works.com>
parents:
1366
diff
changeset
|
339 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
|
340 '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
|
341 |
1373
66f03a87141c
Fixes issue #201
Marcin Kuzminski <marcin@python-works.com>
parents:
1366
diff
changeset
|
342 redirect(url('home')) |
1304
5a96551ee9c0
gui-improvments
Marcin Kuzminski <marcin@python-works.com>
parents:
1282
diff
changeset
|
343 |
2440
1bc579bcd67a
- pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents:
2374
diff
changeset
|
344 # 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
|
345 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
|
346 c.repository_forks = self.scm_model.get_forks(dbr) |
2478
8eab81115660
white space cleanup
Marcin Kuzminski <marcin@python-works.com>
parents:
2440
diff
changeset
|
347 c.repository_pull_requests = self.scm_model.get_pull_requests(dbr) |
3527
87c97fcea029
Adding the context bar too all pages related to a Repository.
Leonardo <leo@unity3d.com>
parents:
3308
diff
changeset
|
348 c.repository_following = self.scm_model.is_following_repo(c.repo_name, |
87c97fcea029
Adding the context bar too all pages related to a Repository.
Leonardo <leo@unity3d.com>
parents:
3308
diff
changeset
|
349 self.rhodecode_user.user_id) |