Mercurial > kallithea
annotate rhodecode/lib/base.py @ 3574:000653f7cdf9 beta
avoid displaying repr of internal classes in user facing messages
The context of the message will tell where the problem was and there is no reason to show
... does not exist for this repository <MercurialRepository at /home/marcink/repos/rhodecode>
author | Mads Kiilerich <madski@unity3d.com> |
---|---|
date | Thu, 21 Mar 2013 11:17:01 +0100 |
parents | 7967d00e4692 |
children | 7b9d4f6bb04e |
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 |
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
|
24 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
|
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 |
2374
be2163ef127e
Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents:
2184
diff
changeset
|
35 def _get_ip_addr(environ): |
be2163ef127e
Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents:
2184
diff
changeset
|
36 proxy_key = 'HTTP_X_REAL_IP' |
be2163ef127e
Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents:
2184
diff
changeset
|
37 proxy_key2 = 'HTTP_X_FORWARDED_FOR' |
be2163ef127e
Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents:
2184
diff
changeset
|
38 def_key = 'REMOTE_ADDR' |
be2163ef127e
Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents:
2184
diff
changeset
|
39 |
3153
8046d1979674
fix multiple ips addresses in X_FORWARDER_FOR header
Marcin Kuzminski <marcin@python-works.com>
parents:
3147
diff
changeset
|
40 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
|
41 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
|
42 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
|
43 |
3153
8046d1979674
fix multiple ips addresses in X_FORWARDER_FOR header
Marcin Kuzminski <marcin@python-works.com>
parents:
3147
diff
changeset
|
44 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
|
45 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
|
46 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
|
47 |
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 ip = environ.get(def_key, '0.0.0.0') |
3493
64371c42e2f1
handle all cases with proxy IP addresses, not only for X_FORWARDED_FOR
Marcin Kuzminski <marcin@python-works.com>
parents:
3489
diff
changeset
|
49 |
64371c42e2f1
handle all cases with proxy IP addresses, not only for X_FORWARDED_FOR
Marcin Kuzminski <marcin@python-works.com>
parents:
3489
diff
changeset
|
50 # HEADERS can have mutliple ips inside |
64371c42e2f1
handle all cases with proxy IP addresses, not only for X_FORWARDED_FOR
Marcin Kuzminski <marcin@python-works.com>
parents:
3489
diff
changeset
|
51 # the left-most being the original client, and each successive proxy |
64371c42e2f1
handle all cases with proxy IP addresses, not only for X_FORWARDED_FOR
Marcin Kuzminski <marcin@python-works.com>
parents:
3489
diff
changeset
|
52 # that passed the request adding the IP address where it received the |
64371c42e2f1
handle all cases with proxy IP addresses, not only for X_FORWARDED_FOR
Marcin Kuzminski <marcin@python-works.com>
parents:
3489
diff
changeset
|
53 # request from. |
64371c42e2f1
handle all cases with proxy IP addresses, not only for X_FORWARDED_FOR
Marcin Kuzminski <marcin@python-works.com>
parents:
3489
diff
changeset
|
54 if ',' in ip: |
64371c42e2f1
handle all cases with proxy IP addresses, not only for X_FORWARDED_FOR
Marcin Kuzminski <marcin@python-works.com>
parents:
3489
diff
changeset
|
55 ip = ip.split(',')[0].strip() |
64371c42e2f1
handle all cases with proxy IP addresses, not only for X_FORWARDED_FOR
Marcin Kuzminski <marcin@python-works.com>
parents:
3489
diff
changeset
|
56 |
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 return ip |
2374
be2163ef127e
Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents:
2184
diff
changeset
|
58 |
be2163ef127e
Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents:
2184
diff
changeset
|
59 |
2490
7a5eeafb1a9a
better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents:
2486
diff
changeset
|
60 def _get_access_path(environ): |
7a5eeafb1a9a
better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents:
2486
diff
changeset
|
61 path = environ.get('PATH_INFO') |
7a5eeafb1a9a
better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents:
2486
diff
changeset
|
62 org_req = environ.get('pylons.original_request') |
7a5eeafb1a9a
better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents:
2486
diff
changeset
|
63 if org_req: |
7a5eeafb1a9a
better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents:
2486
diff
changeset
|
64 path = org_req.environ.get('PATH_INFO') |
7a5eeafb1a9a
better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents:
2486
diff
changeset
|
65 return path |
7a5eeafb1a9a
better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents:
2486
diff
changeset
|
66 |
7a5eeafb1a9a
better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents:
2486
diff
changeset
|
67 |
2132
9f5582151d53
Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents:
2109
diff
changeset
|
68 class BasicAuth(AuthBasicAuthenticator): |
9f5582151d53
Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents:
2109
diff
changeset
|
69 |
9f5582151d53
Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents:
2109
diff
changeset
|
70 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
|
71 self.realm = realm |
9f5582151d53
Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents:
2109
diff
changeset
|
72 self.authfunc = authfunc |
9f5582151d53
Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents:
2109
diff
changeset
|
73 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
|
74 |
9f5582151d53
Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents:
2109
diff
changeset
|
75 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
|
76 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
|
77 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
|
78 # 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
|
79 # RhodeCode config |
9f5582151d53
Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents:
2109
diff
changeset
|
80 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
|
81 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
|
82 |
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
|
83 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
|
84 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
|
85 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
|
86 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
|
87 (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
|
88 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
|
89 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
|
90 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
|
91 _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
|
92 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
|
93 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
|
94 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
|
95 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
|
96 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
|
97 |
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 __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
|
99 |
2132
9f5582151d53
Alternative HTTP response codes when client failed to Authenticate correctly
Marcin Kuzminski <marcin@python-works.com>
parents:
2109
diff
changeset
|
100 |
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
|
101 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
|
102 |
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
|
103 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
|
104 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
|
105 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
|
106 # 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
|
107 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
|
108 #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
|
109 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
|
110 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
|
111 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
|
112 |
1978
164199e476e9
code garden, pep8
Marcin Kuzminski <marcin@python-works.com>
parents:
1818
diff
changeset
|
113 def _handle_request(self, environ, start_response): |
164199e476e9
code garden, pep8
Marcin Kuzminski <marcin@python-works.com>
parents:
1818
diff
changeset
|
114 raise NotImplementedError() |
164199e476e9
code garden, pep8
Marcin Kuzminski <marcin@python-works.com>
parents:
1818
diff
changeset
|
115 |
1813
a8c66e870bd0
implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents:
1763
diff
changeset
|
116 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
|
117 """ |
a8c66e870bd0
implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents:
1763
diff
changeset
|
118 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
|
119 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
|
120 |
a8c66e870bd0
implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents:
1763
diff
changeset
|
121 :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
|
122 """ |
a8c66e870bd0
implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents:
1763
diff
changeset
|
123 try: |
a8c66e870bd0
implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents:
1763
diff
changeset
|
124 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
|
125 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
|
126 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
|
127 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
|
128 _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
|
129 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
|
130 except: |
a8c66e870bd0
implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents:
1763
diff
changeset
|
131 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
|
132 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
|
133 ) |
a8c66e870bd0
implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents:
1763
diff
changeset
|
134 ) |
a8c66e870bd0
implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents:
1763
diff
changeset
|
135 |
a8c66e870bd0
implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents:
1763
diff
changeset
|
136 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
|
137 |
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
|
138 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
|
139 """ |
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 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
|
141 |
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
|
142 :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
|
143 """ |
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 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
|
145 |
3125
9b92cf5a0cca
Added UserIpMap interface for allowed IP addresses and IP restriction access
Marcin Kuzminski <marcin@python-works.com>
parents:
3087
diff
changeset
|
146 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
|
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 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
|
149 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
|
150 |
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 :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
|
152 :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
|
153 :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
|
154 """ |
3125
9b92cf5a0cca
Added UserIpMap interface for allowed IP addresses and IP restriction access
Marcin Kuzminski <marcin@python-works.com>
parents:
3087
diff
changeset
|
155 #check IP |
3146
c5169e445fb8
Full IP restrictions enabled
Marcin Kuzminski <marcin@python-works.com>
parents:
3125
diff
changeset
|
156 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
|
157 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
|
158 return False |
9b92cf5a0cca
Added UserIpMap interface for allowed IP addresses and IP restriction access
Marcin Kuzminski <marcin@python-works.com>
parents:
3087
diff
changeset
|
159 else: |
9b92cf5a0cca
Added UserIpMap interface for allowed IP addresses and IP restriction access
Marcin Kuzminski <marcin@python-works.com>
parents:
3087
diff
changeset
|
160 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
|
161 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
|
162 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
|
163 '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
|
164 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
|
165 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
|
166 |
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
|
167 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
|
168 #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
|
169 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
|
170 '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 |
1813
a8c66e870bd0
implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents:
1763
diff
changeset
|
175 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
|
176 |
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
|
177 def _get_ip_addr(self, environ): |
2374
be2163ef127e
Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents:
2184
diff
changeset
|
178 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
|
179 |
2668
f0851f37d6be
Implementes #509 require SSL flag now works for both git and mercurial.
Marcin Kuzminski <marcin@python-works.com>
parents:
2490
diff
changeset
|
180 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
|
181 """ |
f0851f37d6be
Implementes #509 require SSL flag now works for both git and mercurial.
Marcin Kuzminski <marcin@python-works.com>
parents:
2490
diff
changeset
|
182 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
|
183 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
|
184 """ |
f0851f37d6be
Implementes #509 require SSL flag now works for both git and mercurial.
Marcin Kuzminski <marcin@python-works.com>
parents:
2490
diff
changeset
|
185 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
|
186 #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
|
187 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
|
188 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
|
189 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
|
190 % 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
|
191 return False |
2674
a221706dab50
merged + fixed pull request #62: Implemented metatags and visualisation options.
Marcin Kuzminski <marcin@python-works.com>
parents:
2668
diff
changeset
|
192 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
|
193 |
2726
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
194 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
|
195 """ |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
196 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
|
197 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
|
198 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
|
199 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
|
200 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
|
201 |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
202 """ |
2752
6d904a0cd48d
added new suite of tests for VCS operations
Marcin Kuzminski <marcin@python-works.com>
parents:
2726
diff
changeset
|
203 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
|
204 make_lock = None |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
205 repo = Repository.get_by_repo_name(repo) |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
206 user = User.get(user_id) |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
207 |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
208 # 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
|
209 # server see all operation on changeset; bookmarks, phases and |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
210 # 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
|
211 # locking on those |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
212 obsolete_call = environ['QUERY_STRING'] in ['cmd=listkeys',] |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
213 locked_by = repo.locked |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
214 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
|
215 if action == 'push': |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
216 #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
|
217 user_id, _date = repo.locked |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
218 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
|
219 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
|
220 # unlock if we have push from user who locked |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
221 make_lock = False |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
222 else: |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
223 # 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
|
224 locked = True |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
225 if action == 'pull': |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
226 if repo.locked[0] and repo.locked[1]: |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
227 locked = True |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
228 else: |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
229 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
|
230 make_lock = True |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
231 |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
232 else: |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
233 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
|
234 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
|
235 % (make_lock, locked, locked_by)) |
2726
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
236 return make_lock, locked, locked_by |
aa17c7a1b8a5
Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents:
2708
diff
changeset
|
237 |
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
|
238 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
|
239 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
|
240 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
|
241 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
|
242 finally: |
1763
d09c52be40e0
logger name update
Marcin Kuzminski <marcin@python-works.com>
parents:
1761
diff
changeset
|
243 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
|
244 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
|
245 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
|
246 |
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 |
0 | 248 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
|
249 |
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
|
250 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
|
251 """ |
9b92cf5a0cca
Added UserIpMap interface for allowed IP addresses and IP restriction access
Marcin Kuzminski <marcin@python-works.com>
parents:
3087
diff
changeset
|
252 __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
|
253 """ |
548
b75b77ef649d
renamed hg_app to rhodecode
Marcin Kuzminski <marcin@python-works.com>
parents:
547
diff
changeset
|
254 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
|
255 c.rhodecode_instanceid = config.get('instance_id') |
890
042d38683d42
implemented #89 google analytics code
Marcin Kuzminski <marcin@python-works.com>
parents:
812
diff
changeset
|
256 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
|
257 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
|
258 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
|
259 # Visual options |
a221706dab50
merged + fixed pull request #62: Implemented metatags and visualisation options.
Marcin Kuzminski <marcin@python-works.com>
parents:
2668
diff
changeset
|
260 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
|
261 rc_config = RhodeCodeSetting.get_app_settings() |
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
|
262 |
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
|
263 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
|
264 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
|
265 c.visual.stylify_metatags = str2bool(rc_config.get('rhodecode_stylify_metatags')) |
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
|
266 c.visual.lightweight_dashboard = str2bool(rc_config.get('rhodecode_lightweight_dashboard')) |
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
|
267 c.visual.lightweight_dashboard_items = safe_int(config.get('dashboard_items', 100)) |
3308
72a91632b731
repository extra fields implementation
Marcin Kuzminski <marcin@python-works.com>
parents:
3168
diff
changeset
|
268 c.visual.repository_fields = str2bool(rc_config.get('rhodecode_repository_fields')) |
2674
a221706dab50
merged + fixed pull request #62: Implemented metatags and visualisation options.
Marcin Kuzminski <marcin@python-works.com>
parents:
2668
diff
changeset
|
269 |
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
|
270 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
|
271 c.backends = BACKENDS.keys() |
1702
8cb7f5c4d494
#302 - basic notification system, models+tests
Marcin Kuzminski <marcin@python-works.com>
parents:
1630
diff
changeset
|
272 c.unread_notifications = NotificationModel()\ |
8cb7f5c4d494
#302 - basic notification system, models+tests
Marcin Kuzminski <marcin@python-works.com>
parents:
1630
diff
changeset
|
273 .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
|
274 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
|
275 |
1749
8ecc6b8229a5
commit less models
Marcin Kuzminski <marcin@python-works.com>
parents:
1728
diff
changeset
|
276 self.sa = meta.Session |
1045
3fc9183e05dd
another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents:
1038
diff
changeset
|
277 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
|
278 |
0 | 279 def __call__(self, environ, start_response): |
280 """Invoke the Controller""" | |
281 # WSGIController.__call__ dispatches to the Controller method | |
282 # the request is routed to. This routing information is | |
283 # available in environ['pylons.routes_dict'] | |
284 try: | |
2374
be2163ef127e
Add ip reference into BaseController
Marcin Kuzminski <marcin@python-works.com>
parents:
2184
diff
changeset
|
285 self.ip_addr = _get_ip_addr(environ) |
1628
de71a4bde097
Some code cleanups and fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
1622
diff
changeset
|
286 # 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
|
287 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
|
288 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
|
289 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
|
290 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
|
291 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
|
292 request.user = auth_user |
1628
de71a4bde097
Some code cleanups and fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
1622
diff
changeset
|
293 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
|
294 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
|
295 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
|
296 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
|
297 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
|
298 ) |
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
|
299 log.info('IP: %s User: %s accessed %s' % ( |
2490
7a5eeafb1a9a
better path extraction method.
Marcin Kuzminski <marcin@python-works.com>
parents:
2486
diff
changeset
|
300 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
|
301 ) |
0 | 302 return WSGIController.__call__(self, environ, start_response) |
303 finally: | |
51 | 304 meta.Session.remove() |
1045
3fc9183e05dd
another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents:
1038
diff
changeset
|
305 |
3fc9183e05dd
another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents:
1038
diff
changeset
|
306 |
3fc9183e05dd
another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents:
1038
diff
changeset
|
307 class BaseRepoController(BaseController): |
3fc9183e05dd
another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents:
1038
diff
changeset
|
308 """ |
1628
de71a4bde097
Some code cleanups and fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
1622
diff
changeset
|
309 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
|
310 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
|
311 |
1628
de71a4bde097
Some code cleanups and fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
1622
diff
changeset
|
312 c.rhodecode_repo: instance of scm repository |
de71a4bde097
Some code cleanups and fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
1622
diff
changeset
|
313 c.rhodecode_db_repo: instance of db |
de71a4bde097
Some code cleanups and fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
1622
diff
changeset
|
314 c.repository_followers: number of followers |
de71a4bde097
Some code cleanups and fixes
Marcin Kuzminski <marcin@python-works.com>
parents:
1622
diff
changeset
|
315 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
|
316 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
|
317 """ |
3fc9183e05dd
another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents:
1038
diff
changeset
|
318 |
3fc9183e05dd
another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents:
1038
diff
changeset
|
319 def __before__(self): |
3fc9183e05dd
another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents:
1038
diff
changeset
|
320 super(BaseRepoController, self).__before__() |
3fc9183e05dd
another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents:
1038
diff
changeset
|
321 if c.repo_name: |
3fc9183e05dd
another major codes rewrite:
Marcin Kuzminski <marcin@python-works.com>
parents:
1038
diff
changeset
|
322 |
2440
1bc579bcd67a
- pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents:
2374
diff
changeset
|
323 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
|
324 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
|
325 # 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
|
326 dbr.update_changeset_cache(dbr.get_changeset()) |
1373
66f03a87141c
Fixes issue #201
Marcin Kuzminski <marcin@python-works.com>
parents:
1366
diff
changeset
|
327 if c.rhodecode_repo is None: |
66f03a87141c
Fixes issue #201
Marcin Kuzminski <marcin@python-works.com>
parents:
1366
diff
changeset
|
328 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
|
329 '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
|
330 |
1373
66f03a87141c
Fixes issue #201
Marcin Kuzminski <marcin@python-works.com>
parents:
1366
diff
changeset
|
331 redirect(url('home')) |
1304
5a96551ee9c0
gui-improvments
Marcin Kuzminski <marcin@python-works.com>
parents:
1282
diff
changeset
|
332 |
2440
1bc579bcd67a
- pull request generates overview based on it's params
Marcin Kuzminski <marcin@python-works.com>
parents:
2374
diff
changeset
|
333 # 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
|
334 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
|
335 c.repository_forks = self.scm_model.get_forks(dbr) |
2478
8eab81115660
white space cleanup
Marcin Kuzminski <marcin@python-works.com>
parents:
2440
diff
changeset
|
336 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
|
337 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
|
338 self.rhodecode_user.user_id) |