annotate rhodecode/lib/middleware/simplehg.py @ 3625:260a7a01b054 beta

follow Python conventions for boolean values True and False might be singletons and the "default" values for "boolean" expressions, but "all" values in Python has a boolean value and should be evaluated as such. Checking with 'is True' and 'is False' is thus confusing, error prone and unnessarily complex. If we anywhere rely and nullable boolean fields from the database layer and don't want the null value to be treated as False then we should check explicitly for null with 'is None'.
author Mads Kiilerich <madski@unity3d.com>
date Thu, 28 Mar 2013 01:10:45 +0100
parents 238486bb71ab
children 10b4e34841a4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
903
04c9bb9ca6d6 code docs, updates
Marcin Kuzminski <marcin@python-works.com>
parents: 902
diff changeset
1 # -*- coding: utf-8 -*-
04c9bb9ca6d6 code docs, updates
Marcin Kuzminski <marcin@python-works.com>
parents: 902
diff changeset
2 """
04c9bb9ca6d6 code docs, updates
Marcin Kuzminski <marcin@python-works.com>
parents: 902
diff changeset
3 rhodecode.lib.middleware.simplehg
04c9bb9ca6d6 code docs, updates
Marcin Kuzminski <marcin@python-works.com>
parents: 902
diff changeset
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
04c9bb9ca6d6 code docs, updates
Marcin Kuzminski <marcin@python-works.com>
parents: 902
diff changeset
5
1203
6832ef664673 source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents: 1128
diff changeset
6 SimpleHG middleware for handling mercurial protocol request
903
04c9bb9ca6d6 code docs, updates
Marcin Kuzminski <marcin@python-works.com>
parents: 902
diff changeset
7 (push/clone etc.). It's implemented with basic auth function
1203
6832ef664673 source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents: 1128
diff changeset
8
903
04c9bb9ca6d6 code docs, updates
Marcin Kuzminski <marcin@python-works.com>
parents: 902
diff changeset
9 :created_on: Apr 28, 2010
04c9bb9ca6d6 code docs, updates
Marcin Kuzminski <marcin@python-works.com>
parents: 902
diff changeset
10 :author: marcink
1824
89efedac4e6c 2012 copyrights
Marcin Kuzminski <marcin@python-works.com>
parents: 1818
diff changeset
11 :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
903
04c9bb9ca6d6 code docs, updates
Marcin Kuzminski <marcin@python-works.com>
parents: 902
diff changeset
12 :license: GPLv3, see COPYING for more details.
04c9bb9ca6d6 code docs, updates
Marcin Kuzminski <marcin@python-works.com>
parents: 902
diff changeset
13 """
1206
a671db5bdd58 fixed license issue #149
Marcin Kuzminski <marcin@python-works.com>
parents: 1203
diff changeset
14 # This program is free software: you can redistribute it and/or modify
a671db5bdd58 fixed license issue #149
Marcin Kuzminski <marcin@python-works.com>
parents: 1203
diff changeset
15 # it under the terms of the GNU General Public License as published by
a671db5bdd58 fixed license issue #149
Marcin Kuzminski <marcin@python-works.com>
parents: 1203
diff changeset
16 # the Free Software Foundation, either version 3 of the License, or
a671db5bdd58 fixed license issue #149
Marcin Kuzminski <marcin@python-works.com>
parents: 1203
diff changeset
17 # (at your option) any later version.
1203
6832ef664673 source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents: 1128
diff changeset
18 #
252
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
19 # This program is distributed in the hope that it will be useful,
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
20 # but WITHOUT ANY WARRANTY; without even the implied warranty of
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
22 # GNU General Public License for more details.
1203
6832ef664673 source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents: 1128
diff changeset
23 #
252
3782a6d698af licensing updates, code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 248
diff changeset
24 # You should have received a copy of the GNU General Public License
1206
a671db5bdd58 fixed license issue #149
Marcin Kuzminski <marcin@python-works.com>
parents: 1203
diff changeset
25 # along with this program. If not, see <http://www.gnu.org/licenses/>.
392
b27d32cb3157 Implemented hooks system,
Marcin Kuzminski <marcin@python-works.com>
parents: 385
diff changeset
26
910
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
27 import os
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
28 import logging
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
29 import traceback
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
30
343
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
31 from mercurial.error import RepoError
1495
5bd42279930c #176 LookupError: 00changelog.i@66f0739d7517: no node
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
32 from mercurial.hgweb import hgweb_mod
910
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
33
177
93bd77e1f3c1 Changed auth basic handler only for mercurial request.
Marcin Kuzminski <marcin@python-works.com>
parents: 171
diff changeset
34 from paste.httpheaders import REMOTE_USER, AUTH_TYPE
2668
f0851f37d6be Implementes #509 require SSL flag now works for both git and mercurial.
Marcin Kuzminski <marcin@python-works.com>
parents: 2525
diff changeset
35 from webob.exc import HTTPNotFound, HTTPForbidden, HTTPInternalServerError, \
f0851f37d6be Implementes #509 require SSL flag now works for both git and mercurial.
Marcin Kuzminski <marcin@python-works.com>
parents: 2525
diff changeset
36 HTTPBadRequest, HTTPNotAcceptable
910
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
37
3577
238486bb71ab Switched handling of RhodeCode extra params in consistent way
Marcin Kuzminski <marcin@python-works.com>
parents: 3522
diff changeset
38 from rhodecode.lib.utils2 import safe_str, fix_PATH, get_server_url,\
238486bb71ab Switched handling of RhodeCode extra params in consistent way
Marcin Kuzminski <marcin@python-works.com>
parents: 3522
diff changeset
39 _set_extras
1761
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1630
diff changeset
40 from rhodecode.lib.base import BaseVCSController
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1630
diff changeset
41 from rhodecode.lib.auth import get_container_username
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1630
diff changeset
42 from rhodecode.lib.utils import make_ui, is_valid_repo, ui_sections
2716
4c71667160e5 use os.environ as a fallback for getting special info from hooks, this will allow
Marcin Kuzminski <marcin@python-works.com>
parents: 2673
diff changeset
43 from rhodecode.lib.compat import json
1497
71738535ed78 Removed deprecated usage of UserModel() in simplehg and simplegit
Marcin Kuzminski <marcin@python-works.com>
parents: 1495
diff changeset
44 from rhodecode.model.db import User
2726
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2716
diff changeset
45 from rhodecode.lib.exceptions import HTTPLockedRC
910
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
46
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
47
197
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
48 log = logging.getLogger(__name__)
177
93bd77e1f3c1 Changed auth basic handler only for mercurial request.
Marcin Kuzminski <marcin@python-works.com>
parents: 171
diff changeset
49
1275
2723276285ae pep8ify middlewares
Marcin Kuzminski <marcin@python-works.com>
parents: 1206
diff changeset
50
756
01be209b9828 project refactoring, cleaned up lib.utils from rarly used functions, and place them
Marcin Kuzminski <marcin@python-works.com>
parents: 719
diff changeset
51 def is_mercurial(environ):
2100
f0649c7cf94a fixed some unicode problems with waitress
Marcin Kuzminski <marcin@python-works.com>
parents: 2026
diff changeset
52 """
f0649c7cf94a fixed some unicode problems with waitress
Marcin Kuzminski <marcin@python-works.com>
parents: 2026
diff changeset
53 Returns True if request's target is mercurial server - header
756
01be209b9828 project refactoring, cleaned up lib.utils from rarly used functions, and place them
Marcin Kuzminski <marcin@python-works.com>
parents: 719
diff changeset
54 ``HTTP_ACCEPT`` of such request would start with ``application/mercurial``.
01be209b9828 project refactoring, cleaned up lib.utils from rarly used functions, and place them
Marcin Kuzminski <marcin@python-works.com>
parents: 719
diff changeset
55 """
01be209b9828 project refactoring, cleaned up lib.utils from rarly used functions, and place them
Marcin Kuzminski <marcin@python-works.com>
parents: 719
diff changeset
56 http_accept = environ.get('HTTP_ACCEPT')
2100
f0649c7cf94a fixed some unicode problems with waitress
Marcin Kuzminski <marcin@python-works.com>
parents: 2026
diff changeset
57 path_info = environ['PATH_INFO']
756
01be209b9828 project refactoring, cleaned up lib.utils from rarly used functions, and place them
Marcin Kuzminski <marcin@python-works.com>
parents: 719
diff changeset
58 if http_accept and http_accept.startswith('application/mercurial'):
2100
f0649c7cf94a fixed some unicode problems with waitress
Marcin Kuzminski <marcin@python-works.com>
parents: 2026
diff changeset
59 ishg_path = True
f0649c7cf94a fixed some unicode problems with waitress
Marcin Kuzminski <marcin@python-works.com>
parents: 2026
diff changeset
60 else:
f0649c7cf94a fixed some unicode problems with waitress
Marcin Kuzminski <marcin@python-works.com>
parents: 2026
diff changeset
61 ishg_path = False
f0649c7cf94a fixed some unicode problems with waitress
Marcin Kuzminski <marcin@python-works.com>
parents: 2026
diff changeset
62
f0649c7cf94a fixed some unicode problems with waitress
Marcin Kuzminski <marcin@python-works.com>
parents: 2026
diff changeset
63 log.debug('pathinfo: %s detected as HG %s' % (
f0649c7cf94a fixed some unicode problems with waitress
Marcin Kuzminski <marcin@python-works.com>
parents: 2026
diff changeset
64 path_info, ishg_path)
f0649c7cf94a fixed some unicode problems with waitress
Marcin Kuzminski <marcin@python-works.com>
parents: 2026
diff changeset
65 )
f0649c7cf94a fixed some unicode problems with waitress
Marcin Kuzminski <marcin@python-works.com>
parents: 2026
diff changeset
66 return ishg_path
756
01be209b9828 project refactoring, cleaned up lib.utils from rarly used functions, and place them
Marcin Kuzminski <marcin@python-works.com>
parents: 719
diff changeset
67
1275
2723276285ae pep8ify middlewares
Marcin Kuzminski <marcin@python-works.com>
parents: 1206
diff changeset
68
1761
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1630
diff changeset
69 class SimpleHg(BaseVCSController):
111
70b1e5d1e20d simplehg, cleanup
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
70
1761
b265be1c6093 Wrapped calls for git and hg middleware in extra block that clears db Session.
Marcin Kuzminski <marcin@python-works.com>
parents: 1630
diff changeset
71 def _handle_request(self, environ, start_response):
111
70b1e5d1e20d simplehg, cleanup
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
72 if not is_mercurial(environ):
70b1e5d1e20d simplehg, cleanup
Marcin Kuzminski <marcin@python-works.com>
parents:
diff changeset
73 return self.application(environ, start_response)
2668
f0851f37d6be Implementes #509 require SSL flag now works for both git and mercurial.
Marcin Kuzminski <marcin@python-works.com>
parents: 2525
diff changeset
74 if not self._check_ssl(environ, start_response):
f0851f37d6be Implementes #509 require SSL flag now works for both git and mercurial.
Marcin Kuzminski <marcin@python-works.com>
parents: 2525
diff changeset
75 return HTTPNotAcceptable('SSL REQUIRED !')(environ, start_response)
665
070f32743632 Moved out reposcan into hg Model.
Marcin Kuzminski <marcin@python-works.com>
parents: 655
diff changeset
76
3125
9b92cf5a0cca Added UserIpMap interface for allowed IP addresses and IP restriction access
Marcin Kuzminski <marcin@python-works.com>
parents: 2969
diff changeset
77 ip_addr = self._get_ip_addr(environ)
2673
d5e42c00f3c1 white space cleanup
Marcin Kuzminski <marcin@python-works.com>
parents: 2668
diff changeset
78 username = None
898
9c4851dce8e6 fixed error propagation when using git/mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 756
diff changeset
79 # skip passing error to error controller
9c4851dce8e6 fixed error propagation when using git/mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 756
diff changeset
80 environ['pylons.status_code_redirect'] = True
1529
0b268dd369ec Fixed test_hg_operations test and added concurency test
Marcin Kuzminski <marcin@python-works.com>
parents: 1507
diff changeset
81
1495
5bd42279930c #176 LookupError: 00changelog.i@66f0739d7517: no node
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
82 #======================================================================
5bd42279930c #176 LookupError: 00changelog.i@66f0739d7517: no node
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
83 # EXTRACT REPOSITORY NAME FROM ENV
5bd42279930c #176 LookupError: 00changelog.i@66f0739d7517: no node
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
84 #======================================================================
5bd42279930c #176 LookupError: 00changelog.i@66f0739d7517: no node
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
85 try:
5bd42279930c #176 LookupError: 00changelog.i@66f0739d7517: no node
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
86 repo_name = environ['REPO_NAME'] = self.__get_repository(environ)
5bd42279930c #176 LookupError: 00changelog.i@66f0739d7517: no node
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
87 log.debug('Extracted repo name is %s' % repo_name)
5bd42279930c #176 LookupError: 00changelog.i@66f0739d7517: no node
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
88 except:
5bd42279930c #176 LookupError: 00changelog.i@66f0739d7517: no node
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
89 return HTTPInternalServerError()(environ, start_response)
665
070f32743632 Moved out reposcan into hg Model.
Marcin Kuzminski <marcin@python-works.com>
parents: 655
diff changeset
90
2122
c137b8a81f8e git+hg middleware do repo verification at earliest possible state, giving 404 as fast as possible. If repo is not found.
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
91 # quick check if that dir exists...
3625
260a7a01b054 follow Python conventions for boolean values
Mads Kiilerich <madski@unity3d.com>
parents: 3577
diff changeset
92 if not is_valid_repo(repo_name, self.basepath, 'hg'):
2122
c137b8a81f8e git+hg middleware do repo verification at earliest possible state, giving 404 as fast as possible. If repo is not found.
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
93 return HTTPNotFound()(environ, start_response)
c137b8a81f8e git+hg middleware do repo verification at earliest possible state, giving 404 as fast as possible. If repo is not found.
Marcin Kuzminski <marcin@python-works.com>
parents: 2109
diff changeset
94
910
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
95 #======================================================================
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
96 # GET ACTION PULL or PUSH
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
97 #======================================================================
1495
5bd42279930c #176 LookupError: 00changelog.i@66f0739d7517: no node
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
98 action = self.__get_action(environ)
2100
f0649c7cf94a fixed some unicode problems with waitress
Marcin Kuzminski <marcin@python-works.com>
parents: 2026
diff changeset
99
910
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
100 #======================================================================
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
101 # CHECK ANONYMOUS PERMISSION
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
102 #======================================================================
1495
5bd42279930c #176 LookupError: 00changelog.i@66f0739d7517: no node
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
103 if action in ['pull', 'push']:
910
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
104 anonymous_user = self.__get_user('default')
1495
5bd42279930c #176 LookupError: 00changelog.i@66f0739d7517: no node
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
105 username = anonymous_user.username
2021
a04844d9c85b better logging
Marcin Kuzminski <marcin@python-works.com>
parents: 2007
diff changeset
106 anonymous_perm = self._check_permission(action, anonymous_user,
3125
9b92cf5a0cca Added UserIpMap interface for allowed IP addresses and IP restriction access
Marcin Kuzminski <marcin@python-works.com>
parents: 2969
diff changeset
107 repo_name, ip_addr)
910
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
108
3625
260a7a01b054 follow Python conventions for boolean values
Mads Kiilerich <madski@unity3d.com>
parents: 3577
diff changeset
109 if not anonymous_perm or not anonymous_user.active:
260a7a01b054 follow Python conventions for boolean values
Mads Kiilerich <madski@unity3d.com>
parents: 3577
diff changeset
110 if not anonymous_perm:
1275
2723276285ae pep8ify middlewares
Marcin Kuzminski <marcin@python-works.com>
parents: 1206
diff changeset
111 log.debug('Not enough credentials to access this '
2723276285ae pep8ify middlewares
Marcin Kuzminski <marcin@python-works.com>
parents: 1206
diff changeset
112 'repository as anonymous user')
3625
260a7a01b054 follow Python conventions for boolean values
Mads Kiilerich <madski@unity3d.com>
parents: 3577
diff changeset
113 if not anonymous_user.active:
910
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
114 log.debug('Anonymous access is disabled, running '
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
115 'authentication')
918
b2d5868cc4b8 fixes #97 in simplehg and simplegit, force casting to headers
Marcin Kuzminski <marcin@python-works.com>
parents: 910
diff changeset
116 #==============================================================
1203
6832ef664673 source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents: 1128
diff changeset
117 # DEFAULT PERM FAILED OR ANONYMOUS ACCESS IS DISABLED SO WE
918
b2d5868cc4b8 fixes #97 in simplehg and simplegit, force casting to headers
Marcin Kuzminski <marcin@python-works.com>
parents: 910
diff changeset
118 # NEED TO AUTHENTICATE AND ASK FOR AUTH USER PERMISSIONS
b2d5868cc4b8 fixes #97 in simplehg and simplegit, force casting to headers
Marcin Kuzminski <marcin@python-works.com>
parents: 910
diff changeset
119 #==============================================================
607
ff449e9e6e38 fixed chrome repo switcher issue
Marcin Kuzminski <marcin@python-works.com>
parents: 606
diff changeset
120
1630
25d8e4836bc2 Improved container-based auth support for middleware
Liad Shani <liadff@gmail.com>
parents: 1620
diff changeset
121 # Attempting to retrieve username from the container
25d8e4836bc2 Improved container-based auth support for middleware
Liad Shani <liadff@gmail.com>
parents: 1620
diff changeset
122 username = get_container_username(environ, self.config)
25d8e4836bc2 Improved container-based auth support for middleware
Liad Shani <liadff@gmail.com>
parents: 1620
diff changeset
123
25d8e4836bc2 Improved container-based auth support for middleware
Liad Shani <liadff@gmail.com>
parents: 1620
diff changeset
124 # If not authenticated by the container, running basic auth
25d8e4836bc2 Improved container-based auth support for middleware
Liad Shani <liadff@gmail.com>
parents: 1620
diff changeset
125 if not username:
1401
b7563ad4e7ee Unicode fixes, added safe_str method for global str() operations +better test sandboxing
Marcin Kuzminski <marcin@python-works.com>
parents: 1321
diff changeset
126 self.authenticate.realm = \
b7563ad4e7ee Unicode fixes, added safe_str method for global str() operations +better test sandboxing
Marcin Kuzminski <marcin@python-works.com>
parents: 1321
diff changeset
127 safe_str(self.config['rhodecode_realm'])
910
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
128 result = self.authenticate(environ)
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
129 if isinstance(result, str):
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
130 AUTH_TYPE.update(environ, 'basic')
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
131 REMOTE_USER.update(environ, result)
1630
25d8e4836bc2 Improved container-based auth support for middleware
Liad Shani <liadff@gmail.com>
parents: 1620
diff changeset
132 username = result
910
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
133 else:
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
134 return result.wsgi_application(environ, start_response)
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
135
918
b2d5868cc4b8 fixes #97 in simplehg and simplegit, force casting to headers
Marcin Kuzminski <marcin@python-works.com>
parents: 910
diff changeset
136 #==============================================================
1630
25d8e4836bc2 Improved container-based auth support for middleware
Liad Shani <liadff@gmail.com>
parents: 1620
diff changeset
137 # CHECK PERMISSIONS FOR THIS REQUEST USING GIVEN USERNAME
918
b2d5868cc4b8 fixes #97 in simplehg and simplegit, force casting to headers
Marcin Kuzminski <marcin@python-works.com>
parents: 910
diff changeset
138 #==============================================================
2500
94ef0b609d17 possible fix for #486 undefined variable username
Marcin Kuzminski <marcin@python-works.com>
parents: 2203
diff changeset
139 try:
94ef0b609d17 possible fix for #486 undefined variable username
Marcin Kuzminski <marcin@python-works.com>
parents: 2203
diff changeset
140 user = self.__get_user(username)
94ef0b609d17 possible fix for #486 undefined variable username
Marcin Kuzminski <marcin@python-works.com>
parents: 2203
diff changeset
141 if user is None or not user.active:
94ef0b609d17 possible fix for #486 undefined variable username
Marcin Kuzminski <marcin@python-works.com>
parents: 2203
diff changeset
142 return HTTPForbidden()(environ, start_response)
94ef0b609d17 possible fix for #486 undefined variable username
Marcin Kuzminski <marcin@python-works.com>
parents: 2203
diff changeset
143 username = user.username
94ef0b609d17 possible fix for #486 undefined variable username
Marcin Kuzminski <marcin@python-works.com>
parents: 2203
diff changeset
144 except:
94ef0b609d17 possible fix for #486 undefined variable username
Marcin Kuzminski <marcin@python-works.com>
parents: 2203
diff changeset
145 log.error(traceback.format_exc())
94ef0b609d17 possible fix for #486 undefined variable username
Marcin Kuzminski <marcin@python-works.com>
parents: 2203
diff changeset
146 return HTTPInternalServerError()(environ, start_response)
910
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
147
2500
94ef0b609d17 possible fix for #486 undefined variable username
Marcin Kuzminski <marcin@python-works.com>
parents: 2203
diff changeset
148 #check permissions for this repository
3125
9b92cf5a0cca Added UserIpMap interface for allowed IP addresses and IP restriction access
Marcin Kuzminski <marcin@python-works.com>
parents: 2969
diff changeset
149 perm = self._check_permission(action, user, repo_name, ip_addr)
3625
260a7a01b054 follow Python conventions for boolean values
Mads Kiilerich <madski@unity3d.com>
parents: 3577
diff changeset
150 if not perm:
2500
94ef0b609d17 possible fix for #486 undefined variable username
Marcin Kuzminski <marcin@python-works.com>
parents: 2203
diff changeset
151 return HTTPForbidden()(environ, start_response)
665
070f32743632 Moved out reposcan into hg Model.
Marcin Kuzminski <marcin@python-works.com>
parents: 655
diff changeset
152
2100
f0649c7cf94a fixed some unicode problems with waitress
Marcin Kuzminski <marcin@python-works.com>
parents: 2026
diff changeset
153 # extras are injected into mercurial UI object and later available
f0649c7cf94a fixed some unicode problems with waitress
Marcin Kuzminski <marcin@python-works.com>
parents: 2026
diff changeset
154 # in hg hooks executed by rhodecode
2857
bad89b2fe618 Pass on RhodeCode config file down to a python-based Hg hook via the extras pseudo-config key, see https://bitbucket.org/marcinkuzminski/rhodecode/issue/558/access-to-rhodecode-config-from-a-hg
Vincent Caron <vcaron@bearstech.com>
parents: 2726
diff changeset
155 from rhodecode import CONFIG
2969
5085e51fba3a Implemented #628: Pass server URL to rc-extensions hooks
Marcin Kuzminski <marcin@python-works.com>
parents: 2869
diff changeset
156 server_url = get_server_url(environ)
2100
f0649c7cf94a fixed some unicode problems with waitress
Marcin Kuzminski <marcin@python-works.com>
parents: 2026
diff changeset
157 extras = {
3125
9b92cf5a0cca Added UserIpMap interface for allowed IP addresses and IP restriction access
Marcin Kuzminski <marcin@python-works.com>
parents: 2969
diff changeset
158 'ip': ip_addr,
2100
f0649c7cf94a fixed some unicode problems with waitress
Marcin Kuzminski <marcin@python-works.com>
parents: 2026
diff changeset
159 'username': username,
f0649c7cf94a fixed some unicode problems with waitress
Marcin Kuzminski <marcin@python-works.com>
parents: 2026
diff changeset
160 'action': action,
2203
d9972f76322e added emulation of pull hook for git-backend, and dummy git-push hook
Marcin Kuzminski <marcin@python-works.com>
parents: 2184
diff changeset
161 'repository': repo_name,
d9972f76322e added emulation of pull hook for git-backend, and dummy git-push hook
Marcin Kuzminski <marcin@python-works.com>
parents: 2184
diff changeset
162 'scm': 'hg',
2857
bad89b2fe618 Pass on RhodeCode config file down to a python-based Hg hook via the extras pseudo-config key, see https://bitbucket.org/marcinkuzminski/rhodecode/issue/558/access-to-rhodecode-config-from-a-hg
Vincent Caron <vcaron@bearstech.com>
parents: 2726
diff changeset
163 'config': CONFIG['__file__'],
2969
5085e51fba3a Implemented #628: Pass server URL to rc-extensions hooks
Marcin Kuzminski <marcin@python-works.com>
parents: 2869
diff changeset
164 'server_url': server_url,
2726
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2716
diff changeset
165 'make_lock': None,
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2716
diff changeset
166 'locked_by': [None, None]
2100
f0649c7cf94a fixed some unicode problems with waitress
Marcin Kuzminski <marcin@python-works.com>
parents: 2026
diff changeset
167 }
1275
2723276285ae pep8ify middlewares
Marcin Kuzminski <marcin@python-works.com>
parents: 1206
diff changeset
168 #======================================================================
343
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
169 # MERCURIAL REQUEST HANDLING
1275
2723276285ae pep8ify middlewares
Marcin Kuzminski <marcin@python-works.com>
parents: 1206
diff changeset
170 #======================================================================
2100
f0649c7cf94a fixed some unicode problems with waitress
Marcin Kuzminski <marcin@python-works.com>
parents: 2026
diff changeset
171 repo_path = os.path.join(safe_str(self.basepath), safe_str(repo_name))
1495
5bd42279930c #176 LookupError: 00changelog.i@66f0739d7517: no node
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
172 log.debug('Repository path is %s' % repo_path)
1529
0b268dd369ec Fixed test_hg_operations test and added concurency test
Marcin Kuzminski <marcin@python-works.com>
parents: 1507
diff changeset
173
2726
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2716
diff changeset
174 # CHECK LOCKING only if it's not ANONYMOUS USER
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2716
diff changeset
175 if username != User.DEFAULT_USER:
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2716
diff changeset
176 log.debug('Checking locking on repository')
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2716
diff changeset
177 (make_lock,
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2716
diff changeset
178 locked,
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2716
diff changeset
179 locked_by) = self._check_locking_state(
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2716
diff changeset
180 environ=environ, action=action,
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2716
diff changeset
181 repo=repo_name, user_id=user.user_id
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2716
diff changeset
182 )
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2716
diff changeset
183 # store the make_lock for later evaluation in hooks
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2716
diff changeset
184 extras.update({'make_lock': make_lock,
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2716
diff changeset
185 'locked_by': locked_by})
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2716
diff changeset
186
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2716
diff changeset
187 # set the environ variables for this request
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2716
diff changeset
188 os.environ['RC_SCM_DATA'] = json.dumps(extras)
2869
ccbdff90e5a0 fix for issue #578 git hooks sometimes cannot be executed due to different python they runned under, this commit tries to fix that by altering the PATH env variable using current python that rhodecode is running
Marcin Kuzminski <marcin@python-works.com>
parents: 2857
diff changeset
189 fix_PATH()
2726
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2716
diff changeset
190 log.debug('HOOKS extras is %s' % extras)
1495
5bd42279930c #176 LookupError: 00changelog.i@66f0739d7517: no node
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
191 baseui = make_ui('db')
5bd42279930c #176 LookupError: 00changelog.i@66f0739d7517: no node
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
192 self.__inject_extras(repo_path, baseui, extras)
1529
0b268dd369ec Fixed test_hg_operations test and added concurency test
Marcin Kuzminski <marcin@python-works.com>
parents: 1507
diff changeset
193
343
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
194 try:
3135
e7ba69286276 logging: include more info in action logging
Mads Kiilerich <madski@unity3d.com>
parents: 3125
diff changeset
195 log.info('%s action on HG repo "%s" by "%s" from %s' %
e7ba69286276 logging: include more info in action logging
Mads Kiilerich <madski@unity3d.com>
parents: 3125
diff changeset
196 (action, repo_name, username, ip_addr))
1495
5bd42279930c #176 LookupError: 00changelog.i@66f0739d7517: no node
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
197 app = self.__make_app(repo_path, baseui, extras)
5bd42279930c #176 LookupError: 00changelog.i@66f0739d7517: no node
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
198 return app(environ, start_response)
503
3d6d548ad3cc Added user action mapper to map push to changeset.
Marcin Kuzminski <marcin@python-works.com>
parents: 445
diff changeset
199 except RepoError, e:
343
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
200 if str(e).find('not found') != -1:
334
6c23e72437e3 mercurial middleware now returns 500's instead of 404 on errors and 404 when repo not found, added tracebacks
Marcin Kuzminski <marcin@python-works.com>
parents: 331
diff changeset
201 return HTTPNotFound()(environ, start_response)
2726
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2716
diff changeset
202 except HTTPLockedRC, e:
3522
7174ee850baa configurable locking codes.
Marcin Kuzminski <marcin@python-works.com>
parents: 3278
diff changeset
203 _code = CONFIG.get('lock_ret_code')
7174ee850baa configurable locking codes.
Marcin Kuzminski <marcin@python-works.com>
parents: 3278
diff changeset
204 log.debug('Repository LOCKED ret code %s!' % (_code))
2726
aa17c7a1b8a5 Implemented basic locking functionality.
Marcin Kuzminski <marcin@python-works.com>
parents: 2716
diff changeset
205 return e(environ, start_response)
343
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
206 except Exception:
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
207 log.error(traceback.format_exc())
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
208 return HTTPInternalServerError()(environ, start_response)
3278
c2bf0fa7b3cb git hook handler shouldn't ever use cache instances
Marcin Kuzminski <marcin@python-works.com>
parents: 3135
diff changeset
209 finally:
c2bf0fa7b3cb git hook handler shouldn't ever use cache instances
Marcin Kuzminski <marcin@python-works.com>
parents: 3135
diff changeset
210 # invalidate cache on push
c2bf0fa7b3cb git hook handler shouldn't ever use cache instances
Marcin Kuzminski <marcin@python-works.com>
parents: 3135
diff changeset
211 if action == 'push':
c2bf0fa7b3cb git hook handler shouldn't ever use cache instances
Marcin Kuzminski <marcin@python-works.com>
parents: 3135
diff changeset
212 self._invalidate_cache(repo_name)
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
213
1495
5bd42279930c #176 LookupError: 00changelog.i@66f0739d7517: no node
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
214 def __make_app(self, repo_name, baseui, extras):
1276
88e750527c7c small rewrite for injecting rhodecode_extras into ui. instead of injecting to hgweb instance, inject to ui and pass to hgweb. It's simpler and more readable.
Marcin Kuzminski <marcin@python-works.com>
parents: 1275
diff changeset
215 """
88e750527c7c small rewrite for injecting rhodecode_extras into ui. instead of injecting to hgweb instance, inject to ui and pass to hgweb. It's simpler and more readable.
Marcin Kuzminski <marcin@python-works.com>
parents: 1275
diff changeset
216 Make an wsgi application using hgweb, and inject generated baseui
88e750527c7c small rewrite for injecting rhodecode_extras into ui. instead of injecting to hgweb instance, inject to ui and pass to hgweb. It's simpler and more readable.
Marcin Kuzminski <marcin@python-works.com>
parents: 1275
diff changeset
217 instance, additionally inject some extras into ui object
910
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
218 """
1495
5bd42279930c #176 LookupError: 00changelog.i@66f0739d7517: no node
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
219 return hgweb_mod.hgweb(repo_name, name=repo_name, baseui=baseui)
910
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
220
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
221 def __get_repository(self, environ):
1276
88e750527c7c small rewrite for injecting rhodecode_extras into ui. instead of injecting to hgweb instance, inject to ui and pass to hgweb. It's simpler and more readable.
Marcin Kuzminski <marcin@python-works.com>
parents: 1275
diff changeset
222 """
88e750527c7c small rewrite for injecting rhodecode_extras into ui. instead of injecting to hgweb instance, inject to ui and pass to hgweb. It's simpler and more readable.
Marcin Kuzminski <marcin@python-works.com>
parents: 1275
diff changeset
223 Get's repository name out of PATH_INFO header
1203
6832ef664673 source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents: 1128
diff changeset
224
910
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
225 :param environ: environ where PATH_INFO is stored
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
226 """
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
227 try:
1813
a8c66e870bd0 implements #285: Implemented non changeable urls for clone url, and web views
Marcin Kuzminski <marcin@python-works.com>
parents: 1761
diff changeset
228 environ['PATH_INFO'] = self._get_by_id(environ['PATH_INFO'])
910
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
229 repo_name = '/'.join(environ['PATH_INFO'].split('/')[1:])
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
230 if repo_name.endswith('/'):
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
231 repo_name = repo_name.rstrip('/')
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
232 except:
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
233 log.error(traceback.format_exc())
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
234 raise
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
235
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
236 return repo_name
811fa5d45de8 Rewrite simehg for enabling cloning with raw url for anonymous access + some optimizations for making less queries when authenticating users.
Marcin Kuzminski <marcin@python-works.com>
parents: 903
diff changeset
237
343
6484963056cd implemented cache for repeated queries in simplehg mercurial requests
Marcin Kuzminski <marcin@python-works.com>
parents: 341
diff changeset
238 def __get_user(self, username):
1530
04027bdb876c Refactoring of model get functions
Marcin Kuzminski <marcin@python-works.com>
parents: 1529
diff changeset
239 return User.get_by_username(username)
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
240
197
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
241 def __get_action(self, environ):
1276
88e750527c7c small rewrite for injecting rhodecode_extras into ui. instead of injecting to hgweb instance, inject to ui and pass to hgweb. It's simpler and more readable.
Marcin Kuzminski <marcin@python-works.com>
parents: 1275
diff changeset
242 """
88e750527c7c small rewrite for injecting rhodecode_extras into ui. instead of injecting to hgweb instance, inject to ui and pass to hgweb. It's simpler and more readable.
Marcin Kuzminski <marcin@python-works.com>
parents: 1275
diff changeset
243 Maps mercurial request commands into a clone,pull or push command.
606
f31f1327c1e9 Fixed journal action loggin doubled messages.
Marcin Kuzminski <marcin@python-works.com>
parents: 605
diff changeset
244 This should always return a valid command string
1203
6832ef664673 source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents: 1128
diff changeset
245
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
246 :param environ:
197
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
247 """
330
4c9a295d80a4 added new command mappings for mercurial 1.6
Marcin Kuzminski <marcin@python-works.com>
parents: 317
diff changeset
248 mapping = {'changegroup': 'pull',
4c9a295d80a4 added new command mappings for mercurial 1.6
Marcin Kuzminski <marcin@python-works.com>
parents: 317
diff changeset
249 'changegroupsubset': 'pull',
4c9a295d80a4 added new command mappings for mercurial 1.6
Marcin Kuzminski <marcin@python-works.com>
parents: 317
diff changeset
250 'stream_out': 'pull',
654
7f5976da192c #48 rewrite action loggers into hooks with all changesets that are inside a push
Marcin Kuzminski <marcin@python-works.com>
parents: 629
diff changeset
251 'listkeys': 'pull',
330
4c9a295d80a4 added new command mappings for mercurial 1.6
Marcin Kuzminski <marcin@python-works.com>
parents: 317
diff changeset
252 'unbundle': 'push',
4c9a295d80a4 added new command mappings for mercurial 1.6
Marcin Kuzminski <marcin@python-works.com>
parents: 317
diff changeset
253 'pushkey': 'push', }
197
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
254 for qry in environ['QUERY_STRING'].split('&'):
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
255 if qry.startswith('cmd'):
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
256 cmd = qry.split('=')[-1]
1275
2723276285ae pep8ify middlewares
Marcin Kuzminski <marcin@python-works.com>
parents: 1206
diff changeset
257 if cmd in mapping:
197
da59b7e07e3c Changed import to base. Removed action logging from auth to simplehg.
Marcin Kuzminski <marcin@python-works.com>
parents: 194
diff changeset
258 return mapping[cmd]
2501
044c31d67ccc make get_action always return action
Marcin Kuzminski <marcin@python-works.com>
parents: 2500
diff changeset
259
2525
c35980ae7958 Don't always return action, raise an Exception if we cannot check what the action is
Marcin Kuzminski <marcin@python-works.com>
parents: 2501
diff changeset
260 return 'pull'
c35980ae7958 Don't always return action, raise an Exception if we cannot check what the action is
Marcin Kuzminski <marcin@python-works.com>
parents: 2501
diff changeset
261
c35980ae7958 Don't always return action, raise an Exception if we cannot check what the action is
Marcin Kuzminski <marcin@python-works.com>
parents: 2501
diff changeset
262 raise Exception('Unable to detect pull/push action !!'
c35980ae7958 Don't always return action, raise an Exception if we cannot check what the action is
Marcin Kuzminski <marcin@python-works.com>
parents: 2501
diff changeset
263 'Are you using non standard command or client ?')
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
264
1529
0b268dd369ec Fixed test_hg_operations test and added concurency test
Marcin Kuzminski <marcin@python-works.com>
parents: 1507
diff changeset
265 def __inject_extras(self, repo_path, baseui, extras={}):
1321
560206522815 fixed local hgrc settings, patch introduced by Marc Villetard
Marcin Kuzminski <marcin@python-works.com>
parents: 1293
diff changeset
266 """
560206522815 fixed local hgrc settings, patch introduced by Marc Villetard
Marcin Kuzminski <marcin@python-works.com>
parents: 1293
diff changeset
267 Injects some extra params into baseui instance
1818
cf51bbfb120e auto white-space removal
Marcin Kuzminski <marcin@python-works.com>
parents: 1813
diff changeset
268
1321
560206522815 fixed local hgrc settings, patch introduced by Marc Villetard
Marcin Kuzminski <marcin@python-works.com>
parents: 1293
diff changeset
269 also overwrites global settings with those takes from local hgrc file
1818
cf51bbfb120e auto white-space removal
Marcin Kuzminski <marcin@python-works.com>
parents: 1813
diff changeset
270
1321
560206522815 fixed local hgrc settings, patch introduced by Marc Villetard
Marcin Kuzminski <marcin@python-works.com>
parents: 1293
diff changeset
271 :param baseui: baseui instance
560206522815 fixed local hgrc settings, patch introduced by Marc Villetard
Marcin Kuzminski <marcin@python-works.com>
parents: 1293
diff changeset
272 :param extras: dict with extra params to put into baseui
560206522815 fixed local hgrc settings, patch introduced by Marc Villetard
Marcin Kuzminski <marcin@python-works.com>
parents: 1293
diff changeset
273 """
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
274
1495
5bd42279930c #176 LookupError: 00changelog.i@66f0739d7517: no node
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
275 hgrc = os.path.join(repo_path, '.hg', 'hgrc')
5bd42279930c #176 LookupError: 00changelog.i@66f0739d7517: no node
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
276
5bd42279930c #176 LookupError: 00changelog.i@66f0739d7517: no node
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
277 # make our hgweb quiet so it doesn't print output
5bd42279930c #176 LookupError: 00changelog.i@66f0739d7517: no node
Marcin Kuzminski <marcin@python-works.com>
parents: 1401
diff changeset
278 baseui.setconfig('ui', 'quiet', 'true')
665
070f32743632 Moved out reposcan into hg Model.
Marcin Kuzminski <marcin@python-works.com>
parents: 655
diff changeset
279
341
1ef52a70f3b7 Made config file free configuration based on database and capable of beeing manage via application settings + some code cleanups
Marcin Kuzminski <marcin@python-works.com>
parents: 340
diff changeset
280 repoui = make_ui('file', hgrc, False)
605
72bed56219d6 security bugfix simplehg wasn't checking for permissions on remote commands different than pull or push.
Marcin Kuzminski <marcin@python-works.com>
parents: 549
diff changeset
281
114
cc5cf1a93902 Implemented simplehg middleware,moved make_ui functions to lib.utils
Marcin Kuzminski <marcin@python-works.com>
parents: 111
diff changeset
282 if repoui:
385
eda5f01de3c4 fixes #20 hg middleware breaks ui() instance when repository has hgrc file.
Marcin Kuzminski <marcin@python-works.com>
parents: 381
diff changeset
283 #overwrite our ui instance with the section from hgrc file
eda5f01de3c4 fixes #20 hg middleware breaks ui() instance when repository has hgrc file.
Marcin Kuzminski <marcin@python-works.com>
parents: 381
diff changeset
284 for section in ui_sections:
eda5f01de3c4 fixes #20 hg middleware breaks ui() instance when repository has hgrc file.
Marcin Kuzminski <marcin@python-works.com>
parents: 381
diff changeset
285 for k, v in repoui.configitems(section):
1321
560206522815 fixed local hgrc settings, patch introduced by Marc Villetard
Marcin Kuzminski <marcin@python-works.com>
parents: 1293
diff changeset
286 baseui.setconfig(section, k, v)
3577
238486bb71ab Switched handling of RhodeCode extra params in consistent way
Marcin Kuzminski <marcin@python-works.com>
parents: 3522
diff changeset
287 _set_extras(extras)