Show More
@@ -46,6 +46,7 b' lang=en' | |||
|
46 | 46 | cache_dir = %(here)s/data |
|
47 | 47 | index_dir = %(here)s/data/index |
|
48 | 48 | cut_off_limit = 256000 |
|
49 | force_https = false | |
|
49 | 50 | |
|
50 | 51 | #################################### |
|
51 | 52 | ### CELERY CONFIG #### |
@@ -3,6 +3,25 b'' | |||
|
3 | 3 | Changelog |
|
4 | 4 | ========= |
|
5 | 5 | |
|
6 | 1.1.1 (**2011-01-06**) | |
|
7 | ---------------------- | |
|
8 | ||
|
9 | news | |
|
10 | ++++ | |
|
11 | ||
|
12 | - added force https option into ini files for easier https usage (no need to | |
|
13 | set server headers with this options) | |
|
14 | - small css updates | |
|
15 | ||
|
16 | fixes | |
|
17 | ++++ | |
|
18 | ||
|
19 | - fixed #96 redirect loop on files view on repositories without changesets | |
|
20 | - fixed #97 unicode string passed into server header in special cases (mod_wsgi) | |
|
21 | and server crashed with errors | |
|
22 | - fixed large tooltips problems on main page | |
|
23 | - fixed #92 whoosh indexer is more error proof | |
|
24 | ||
|
6 | 25 | 1.1.0 (**2010-12-18**) |
|
7 | 26 | ---------------------- |
|
8 | 27 |
@@ -157,6 +157,16 b' In order to make start using celery run:' | |||
|
157 | 157 | paster celeryd <configfile.ini> |
|
158 | 158 | |
|
159 | 159 | |
|
160 | HTTPS support | |
|
161 | ------------- | |
|
162 | ||
|
163 | There are two ways to enable https, first is to set HTTP_X_URL_SCHEME in | |
|
164 | Your http server headers, than rhodecode will recognise this headers and make | |
|
165 | proper https redirections, another way is to set `force_https = true` | |
|
166 | in the ini cofiguration to force using https, no headers are needed than to | |
|
167 | enable https | |
|
168 | ||
|
169 | ||
|
160 | 170 | Nginx virtual host example |
|
161 | 171 | -------------------------- |
|
162 | 172 | |
@@ -210,9 +220,36 b' in production.ini file::' | |||
|
210 | 220 | |
|
211 | 221 | To not have the statics served by the application. And improve speed. |
|
212 | 222 | |
|
213 | Apache reverse proxy | |
|
214 | -------------------- | |
|
215 | Tutorial can be found here | |
|
223 | ||
|
224 | Apache virtual host example | |
|
225 | --------------------------- | |
|
226 | ||
|
227 | Sample config for apache using proxy:: | |
|
228 | ||
|
229 | <VirtualHost *:80> | |
|
230 | ServerName hg.myserver.com | |
|
231 | ServerAlias hg.myserver.com | |
|
232 | ||
|
233 | <Proxy *> | |
|
234 | Order allow,deny | |
|
235 | Allow from all | |
|
236 | </Proxy> | |
|
237 | ||
|
238 | #important ! | |
|
239 | #Directive to properly generate url (clone url) for pylons | |
|
240 | ProxyPreserveHost On | |
|
241 | ||
|
242 | #rhodecode instance | |
|
243 | ProxyPass / http://127.0.0.1:5000/ | |
|
244 | ProxyPassReverse / http://127.0.0.1:5000/ | |
|
245 | ||
|
246 | #to enable https use line below | |
|
247 | #SetEnvIf X-Url-Scheme https HTTPS=1 | |
|
248 | ||
|
249 | </VirtualHost> | |
|
250 | ||
|
251 | ||
|
252 | Additional tutorial | |
|
216 | 253 | http://wiki.pylonshq.com/display/pylonscookbook/Apache+as+a+reverse+proxy+for+Pylons |
|
217 | 254 | |
|
218 | 255 |
@@ -46,6 +46,7 b' lang=en' | |||
|
46 | 46 | cache_dir = %(here)s/data |
|
47 | 47 | index_dir = %(here)s/data/index |
|
48 | 48 | cut_off_limit = 256000 |
|
49 | force_https = false | |
|
49 | 50 | |
|
50 | 51 | #################################### |
|
51 | 52 | ### CELERY CONFIG #### |
@@ -47,6 +47,7 b' cache_dir = %(here)s/data' | |||
|
47 | 47 | index_dir = %(here)s/data/index |
|
48 | 48 | app_instance_uuid = ${app_instance_uuid} |
|
49 | 49 | cut_off_limit = 256000 |
|
50 | force_https = false | |
|
50 | 51 | |
|
51 | 52 | #################################### |
|
52 | 53 | ### CELERY CONFIG #### |
@@ -39,7 +39,8 b' from rhodecode.lib.base import BaseContr' | |||
|
39 | 39 | from rhodecode.lib.utils import EmptyChangeset |
|
40 | 40 | from rhodecode.model.scm import ScmModel |
|
41 | 41 | |
|
42 | from vcs.exceptions import RepositoryError, ChangesetError | |
|
42 | from vcs.exceptions import RepositoryError, ChangesetError, \ | |
|
43 | ChangesetDoesNotExistError, EmptyRepositoryError | |
|
43 | 44 | from vcs.nodes import FileNode |
|
44 | 45 | from vcs.utils import diffs as differ |
|
45 | 46 | |
@@ -91,6 +92,10 b' class FilesController(BaseController):' | |||
|
91 | 92 | h.flash(str(e), category='warning') |
|
92 | 93 | redirect(h.url('files_home', repo_name=repo_name, revision=revision)) |
|
93 | 94 | |
|
95 | except EmptyRepositoryError, e: | |
|
96 | h.flash(_('There are no files yet'), category='warning') | |
|
97 | redirect(h.url('summary_home', repo_name=repo_name)) | |
|
98 | ||
|
94 | 99 | except RepositoryError, e: |
|
95 | 100 | h.flash(str(e), category='warning') |
|
96 | 101 | redirect(h.url('files_home', repo_name=repo_name, revision='tip')) |
@@ -116,10 +116,17 b' class WhooshIndexingDaemon(object):' | |||
|
116 | 116 | the instance of vcs backend""" |
|
117 | 117 | node = self.get_node(repo, path) |
|
118 | 118 | |
|
119 | #we just index the content of chosen files | |
|
120 | if node.extension in INDEX_EXTENSIONS: | |
|
121 | log.debug(' >> %s [WITH CONTENT]' % path) | |
|
119 | #we just index the content of chosen files, and skip binary files | |
|
120 | if node.extension in INDEX_EXTENSIONS and not node.is_binary: | |
|
121 | ||
|
122 | 122 | u_content = node.content |
|
123 | if not isinstance(u_content, unicode): | |
|
124 | log.warning(' >> %s Could not get this content as unicode ' | |
|
125 | 'replacing with empty content', path) | |
|
126 | u_content = u'' | |
|
127 | else: | |
|
128 | log.debug(' >> %s [WITH CONTENT]' % path) | |
|
129 | ||
|
123 | 130 | else: |
|
124 | 131 | log.debug(' >> %s' % path) |
|
125 | 132 | #just index file name without it's content |
@@ -1,8 +1,15 b'' | |||
|
1 | #!/usr/bin/env python | |
|
2 | # encoding: utf-8 | |
|
3 | # middleware to handle https correctly | |
|
4 | # Copyright (C) 2009-2010 Marcin Kuzminski <marcin@python-works.com> | |
|
5 | ||
|
1 | # -*- coding: utf-8 -*- | |
|
2 | """ | |
|
3 | rhodecode.lib.middleware.https_fixup | |
|
4 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
|
5 | ||
|
6 | middleware to handle https correctly | |
|
7 | ||
|
8 | :created_on: May 23, 2010 | |
|
9 | :author: marcink | |
|
10 | :copyright: (C) 2009-2011 Marcin Kuzminski <marcin@python-works.com> | |
|
11 | :license: GPLv3, see COPYING for more details. | |
|
12 | """ | |
|
6 | 13 | # This program is free software; you can redistribute it and/or |
|
7 | 14 | # modify it under the terms of the GNU General Public License |
|
8 | 15 | # as published by the Free Software Foundation; version 2 |
@@ -18,28 +25,28 b'' | |||
|
18 | 25 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, |
|
19 | 26 | # MA 02110-1301, USA. |
|
20 | 27 | |
|
21 | """ | |
|
22 | Created on May 23, 2010 | |
|
23 | ||
|
24 | @author: marcink | |
|
25 | """ | |
|
28 | from rhodecode.lib import str2bool | |
|
26 | 29 | |
|
27 | 30 | class HttpsFixup(object): |
|
28 | def __init__(self, app): | |
|
31 | def __init__(self, app, config): | |
|
29 | 32 | self.application = app |
|
30 | ||
|
33 | self.config = config | |
|
34 | ||
|
31 | 35 | def __call__(self, environ, start_response): |
|
32 | 36 | self.__fixup(environ) |
|
33 | 37 | return self.application(environ, start_response) |
|
34 | ||
|
35 | ||
|
38 | ||
|
39 | ||
|
36 | 40 | def __fixup(self, environ): |
|
37 | 41 | """Function to fixup the environ as needed. In order to use this |
|
38 | 42 | middleware you should set this header inside your |
|
39 | 43 | proxy ie. nginx, apache etc. |
|
40 | 44 | """ |
|
41 | 45 | proto = environ.get('HTTP_X_URL_SCHEME') |
|
42 | ||
|
46 | ||
|
47 | if str2bool(self.config.get('force_https')): | |
|
48 | proto = 'https' | |
|
49 | ||
|
43 | 50 | if proto == 'https': |
|
44 | 51 | environ['wsgi.url_scheme'] = proto |
|
45 | 52 | else: |
@@ -69,6 +69,8 b' class SimpleHg(object):' | |||
|
69 | 69 | proxy_key = 'HTTP_X_REAL_IP' |
|
70 | 70 | def_key = 'REMOTE_ADDR' |
|
71 | 71 | self.ipaddr = environ.get(proxy_key, environ.get(def_key, '0.0.0.0')) |
|
72 | # skip passing error to error controller | |
|
73 | environ['pylons.status_code_redirect'] = True | |
|
72 | 74 | |
|
73 | 75 | #=================================================================== |
|
74 | 76 | # AUTHENTICATE THIS MERCURIAL REQUEST |
@@ -76,7 +78,7 b' class SimpleHg(object):' | |||
|
76 | 78 | username = REMOTE_USER(environ) |
|
77 | 79 | |
|
78 | 80 | if not username: |
|
79 | self.authenticate.realm = self.config['rhodecode_realm'] | |
|
81 | self.authenticate.realm = str(self.config['rhodecode_realm']) | |
|
80 | 82 | result = self.authenticate(environ) |
|
81 | 83 | if isinstance(result, str): |
|
82 | 84 | AUTH_TYPE.update(environ, 'basic') |
@@ -905,20 +905,6 b' margin:0;' | |||
|
905 | 905 | padding:4px 8px; |
|
906 | 906 | } |
|
907 | 907 | |
|
908 | #content div.box div.form div.fields div.field div.input a.ui-input-file { | |
|
909 | width:28px; | |
|
910 | height:28px; | |
|
911 | display:inline; | |
|
912 | position:absolute; | |
|
913 | overflow:hidden; | |
|
914 | cursor:pointer; | |
|
915 | background:#e5e3e3 url("../images/button_browse.png") no-repeat; | |
|
916 | border:none; | |
|
917 | text-decoration:none; | |
|
918 | margin:0 0 0 6px; | |
|
919 | padding:0; | |
|
920 | } | |
|
921 | ||
|
922 | 908 | #content div.box div.form div.fields div.field div.textarea { |
|
923 | 909 | border-top:1px solid #b3b3b3; |
|
924 | 910 | border-left:1px solid #b3b3b3; |
@@ -978,15 +964,6 b' font-size:11px;' | |||
|
978 | 964 | padding:5px 5px 5px 0; |
|
979 | 965 | } |
|
980 | 966 | |
|
981 | #content div.box div.form div.fields div.field div.textarea table td table td a.mceButtonActive { | |
|
982 | background:#b1b1b1; | |
|
983 | } | |
|
984 | ||
|
985 | #content div.box div.form div.fields div.field div.select a.ui-selectmenu { | |
|
986 | color:#565656; | |
|
987 | text-decoration:none; | |
|
988 | } | |
|
989 | ||
|
990 | 967 | #content div.box div.form div.fields div.field input[type=text]:focus,#content div.box div.form div.fields div.field input[type=password]:focus,#content div.box div.form div.fields div.field input[type=file]:focus,#content div.box div.form div.fields div.field textarea:focus,#content div.box div.form div.fields div.field select:focus { |
|
991 | 968 | background:#f6f6f6; |
|
992 | 969 | border-color:#666; |
@@ -997,7 +974,7 b' margin:0;' | |||
|
997 | 974 | padding:0 0 0 8px; |
|
998 | 975 | } |
|
999 | 976 | |
|
1000 |
div.form div.fields div.field div.highlight .ui- |
|
|
977 | div.form div.fields div.field div.highlight .ui-button { | |
|
1001 | 978 | background:#4e85bb url("../images/button_highlight.png") repeat-x; |
|
1002 | 979 | border-top:1px solid #5c91a4; |
|
1003 | 980 | border-left:1px solid #2a6f89; |
@@ -1019,7 +996,7 b' margin:0;' | |||
|
1019 | 996 | padding:6px 12px; |
|
1020 | 997 | } |
|
1021 | 998 | |
|
1022 |
#content div.box div.form div.fields div.buttons div.highlight input.ui- |
|
|
999 | #content div.box div.form div.fields div.buttons div.highlight input.ui-button { | |
|
1023 | 1000 | background:#4e85bb url("../../images/button_highlight.png") repeat-x; |
|
1024 | 1001 | border-top:1px solid #5c91a4; |
|
1025 | 1002 | border-left:1px solid #2a6f89; |
@@ -1408,7 +1385,7 b' margin:0;' | |||
|
1408 | 1385 | padding:10px 0 0 150px; |
|
1409 | 1386 | } |
|
1410 | 1387 | |
|
1411 |
#register div.form div.fields div.buttons div.highlight input.ui- |
|
|
1388 | #register div.form div.fields div.buttons div.highlight input.ui-button { | |
|
1412 | 1389 | background:url("../images/button_highlight.png") repeat-x scroll 0 0 #4E85BB; |
|
1413 | 1390 | color:#FFF; |
|
1414 | 1391 | border-color:#5C91A4 #2B7089 #1A6480 #2A6F89; |
@@ -1614,10 +1591,18 b' padding:0;' | |||
|
1614 | 1591 | } |
|
1615 | 1592 | |
|
1616 | 1593 | div.browserblock .browser-header { |
|
1617 | border-bottom:1px solid #CCC; | |
|
1618 | 1594 | background:#FFF; |
|
1619 | color:blue; | |
|
1620 | 1595 | padding:10px 0; |
|
1596 | float:left; | |
|
1597 | } | |
|
1598 | ||
|
1599 | div.browserblock .browser-branch { | |
|
1600 | background:#FFF; | |
|
1601 | padding:20px 0 0 0; | |
|
1602 | float:left; | |
|
1603 | } | |
|
1604 | div.browserblock .browser-branch label { | |
|
1605 | color:#4A4A4A; | |
|
1621 | 1606 | } |
|
1622 | 1607 | |
|
1623 | 1608 | div.browserblock .browser-header span { |
@@ -1627,6 +1612,7 b' font-weight:700;' | |||
|
1627 | 1612 | |
|
1628 | 1613 | div.browserblock .browser-body { |
|
1629 | 1614 | background:#EEE; |
|
1615 | border-top:1px solid #CCC; | |
|
1630 | 1616 | } |
|
1631 | 1617 | |
|
1632 | 1618 | table.code-browser { |
@@ -1754,6 +1740,10 b' width:auto;' | |||
|
1754 | 1740 | opacity:1px; |
|
1755 | 1741 | padding:8px; |
|
1756 | 1742 | white-space: pre; |
|
1743 | -webkit-border-radius: 8px 8px 8px 8px; | |
|
1744 | -khtml-border-radius: 8px 8px 8px 8px; | |
|
1745 | -moz-border-radius: 8px 8px 8px 8px; | |
|
1746 | border-radius: 8px 8px 8px 8px; | |
|
1757 | 1747 | } |
|
1758 | 1748 | |
|
1759 | 1749 | .ac { |
@@ -2052,7 +2042,7 b' border-left:1px solid #316293;' | |||
|
2052 | 2042 | border:1px solid #316293; |
|
2053 | 2043 | } |
|
2054 | 2044 | |
|
2055 |
#content div.box div.title div.search div.button input.ui- |
|
|
2045 | #content div.box div.title div.search div.button input.ui-button { | |
|
2056 | 2046 | background:#4e85bb url("../../images/button_highlight.png") repeat-x; |
|
2057 | 2047 | border:1px solid #316293; |
|
2058 | 2048 | border-left:none; |
@@ -2066,7 +2056,7 b' border-left:none;' | |||
|
2066 | 2056 | color:#FFF; |
|
2067 | 2057 | } |
|
2068 | 2058 | |
|
2069 |
#content div.box div.form div.fields div.field div.highlight .ui- |
|
|
2059 | #content div.box div.form div.fields div.field div.highlight .ui-button { | |
|
2070 | 2060 | background:#4e85bb url("../../images/button_highlight.png") repeat-x; |
|
2071 | 2061 | border-top:1px solid #5c91a4; |
|
2072 | 2062 | border-left:1px solid #2a6f89; |
@@ -2211,7 +2201,7 b' font-weight:700;' | |||
|
2211 | 2201 | margin:0; |
|
2212 | 2202 | } |
|
2213 | 2203 | |
|
2214 |
div.form div.fields div.field div.button .ui- |
|
|
2204 | div.form div.fields div.field div.button .ui-button,#content div.box div.form div.fields div.buttons input.ui-button { | |
|
2215 | 2205 | background:#e5e3e3 url("../images/button.png") repeat-x; |
|
2216 | 2206 | border-top:1px solid #DDD; |
|
2217 | 2207 | border-left:1px solid #c6c6c6; |
@@ -2259,7 +2249,7 b' margin:6px 0 0;' | |||
|
2259 | 2249 | padding:0; |
|
2260 | 2250 | } |
|
2261 | 2251 | |
|
2262 |
#content div.box div.action div.button input.ui- |
|
|
2252 | #content div.box div.action div.button input.ui-button,#login div.form div.fields div.buttons input.ui-button,#register div.form div.fields div.buttons input.ui-button { | |
|
2263 | 2253 | background:#e5e3e3 url("../images/button.png") repeat-x; |
|
2264 | 2254 | border-top:1px solid #DDD; |
|
2265 | 2255 | border-left:1px solid #c6c6c6; |
General Comments 0
You need to be logged in to leave comments.
Login now