##// END OF EJS Templates
repo-forks: security, check for access to fork_id parameter to prevent...
marcink -
r2173:d100eea4 default
parent child Browse files
Show More
@@ -1,223 +1,233 b''
1 1 # -*- coding: utf-8 -*-
2 2
3 3 # Copyright (C) 2011-2017 RhodeCode GmbH
4 4 #
5 5 # This program is free software: you can redistribute it and/or modify
6 6 # it under the terms of the GNU Affero General Public License, version 3
7 7 # (only), as published by the Free Software Foundation.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU Affero General Public License
15 15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 16 #
17 17 # This program is dual-licensed. If you wish to learn more about the
18 18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 20
21 21 import logging
22 22
23 23 from pyramid.view import view_config
24 24 from pyramid.httpexceptions import HTTPFound
25 25
26 26 from rhodecode.apps._base import RepoAppView
27 27 from rhodecode.lib import helpers as h
28 28 from rhodecode.lib import audit_logger
29 29 from rhodecode.lib.auth import (
30 LoginRequired, HasRepoPermissionAnyDecorator, CSRFRequired)
30 LoginRequired, HasRepoPermissionAnyDecorator, CSRFRequired,
31 HasRepoPermissionAny)
31 32 from rhodecode.lib.exceptions import AttachedForksError
32 33 from rhodecode.lib.utils2 import safe_int
33 34 from rhodecode.lib.vcs import RepositoryError
34 35 from rhodecode.model.db import Session, UserFollowing, User, Repository
35 36 from rhodecode.model.repo import RepoModel
36 37 from rhodecode.model.scm import ScmModel
37 38
38 39 log = logging.getLogger(__name__)
39 40
40 41
41 42 class RepoSettingsView(RepoAppView):
42 43
43 44 def load_default_context(self):
44 45 c = self._get_local_tmpl_context()
45 46
46 47 self._register_global_c(c)
47 48 return c
48 49
49 50 @LoginRequired()
50 51 @HasRepoPermissionAnyDecorator('repository.admin')
51 52 @view_config(
52 53 route_name='edit_repo_advanced', request_method='GET',
53 54 renderer='rhodecode:templates/admin/repos/repo_edit.mako')
54 55 def edit_advanced(self):
55 56 c = self.load_default_context()
56 57 c.active = 'advanced'
57 58
58 59 c.default_user_id = User.get_default_user().user_id
59 60 c.in_public_journal = UserFollowing.query() \
60 61 .filter(UserFollowing.user_id == c.default_user_id) \
61 62 .filter(UserFollowing.follows_repository == self.db_repo).scalar()
62 63
63 64 c.has_origin_repo_read_perm = False
64 65 if self.db_repo.fork:
65 66 c.has_origin_repo_read_perm = h.HasRepoPermissionAny(
66 67 'repository.write', 'repository.read', 'repository.admin')(
67 68 self.db_repo.fork.repo_name, 'repo set as fork page')
68 69
69 70 return self._get_template_context(c)
70 71
71 72 @LoginRequired()
72 73 @HasRepoPermissionAnyDecorator('repository.admin')
73 74 @CSRFRequired()
74 75 @view_config(
75 76 route_name='edit_repo_advanced_delete', request_method='POST',
76 77 renderer='rhodecode:templates/admin/repos/repo_edit.mako')
77 78 def edit_advanced_delete(self):
78 79 """
79 80 Deletes the repository, or shows warnings if deletion is not possible
80 81 because of attached forks or other errors.
81 82 """
82 83 _ = self.request.translate
83 84 handle_forks = self.request.POST.get('forks', None)
84 85
85 86 try:
86 87 _forks = self.db_repo.forks.count()
87 88 if _forks and handle_forks:
88 89 if handle_forks == 'detach_forks':
89 90 handle_forks = 'detach'
90 91 h.flash(_('Detached %s forks') % _forks, category='success')
91 92 elif handle_forks == 'delete_forks':
92 93 handle_forks = 'delete'
93 94 h.flash(_('Deleted %s forks') % _forks, category='success')
94 95
95 96 old_data = self.db_repo.get_api_data()
96 97 RepoModel().delete(self.db_repo, forks=handle_forks)
97 98
98 99 repo = audit_logger.RepoWrap(repo_id=None,
99 100 repo_name=self.db_repo.repo_name)
100 101 audit_logger.store_web(
101 102 'repo.delete', action_data={'old_data': old_data},
102 103 user=self._rhodecode_user, repo=repo)
103 104
104 105 ScmModel().mark_for_invalidation(self.db_repo_name, delete=True)
105 106 h.flash(
106 107 _('Deleted repository `%s`') % self.db_repo_name,
107 108 category='success')
108 109 Session().commit()
109 110 except AttachedForksError:
110 111 repo_advanced_url = h.route_path(
111 112 'edit_repo_advanced', repo_name=self.db_repo_name,
112 113 _anchor='advanced-delete')
113 114 delete_anchor = h.link_to(_('detach or delete'), repo_advanced_url)
114 115 h.flash(_('Cannot delete `{repo}` it still contains attached forks. '
115 116 'Try using {delete_or_detach} option.')
116 117 .format(repo=self.db_repo_name, delete_or_detach=delete_anchor),
117 118 category='warning')
118 119
119 120 # redirect to advanced for forks handle action ?
120 121 raise HTTPFound(repo_advanced_url)
121 122
122 123 except Exception:
123 124 log.exception("Exception during deletion of repository")
124 125 h.flash(_('An error occurred during deletion of `%s`')
125 126 % self.db_repo_name, category='error')
126 127 # redirect to advanced for more deletion options
127 128 raise HTTPFound(
128 129 h.route_path('edit_repo_advanced', repo_name=self.db_repo_name,
129 130 _anchor='advanced-delete'))
130 131
131 132 raise HTTPFound(h.route_path('home'))
132 133
133 134 @LoginRequired()
134 135 @HasRepoPermissionAnyDecorator('repository.admin')
135 136 @CSRFRequired()
136 137 @view_config(
137 138 route_name='edit_repo_advanced_journal', request_method='POST',
138 139 renderer='rhodecode:templates/admin/repos/repo_edit.mako')
139 140 def edit_advanced_journal(self):
140 141 """
141 142 Set's this repository to be visible in public journal,
142 143 in other words making default user to follow this repo
143 144 """
144 145 _ = self.request.translate
145 146
146 147 try:
147 148 user_id = User.get_default_user().user_id
148 149 ScmModel().toggle_following_repo(self.db_repo.repo_id, user_id)
149 150 h.flash(_('Updated repository visibility in public journal'),
150 151 category='success')
151 152 Session().commit()
152 153 except Exception:
153 154 h.flash(_('An error occurred during setting this '
154 155 'repository in public journal'),
155 156 category='error')
156 157
157 158 raise HTTPFound(
158 159 h.route_path('edit_repo_advanced', repo_name=self.db_repo_name))
159 160
160 161 @LoginRequired()
161 162 @HasRepoPermissionAnyDecorator('repository.admin')
162 163 @CSRFRequired()
163 164 @view_config(
164 165 route_name='edit_repo_advanced_fork', request_method='POST',
165 166 renderer='rhodecode:templates/admin/repos/repo_edit.mako')
166 167 def edit_advanced_fork(self):
167 168 """
168 169 Mark given repository as a fork of another
169 170 """
170 171 _ = self.request.translate
171 172
172 new_fork_id = self.request.POST.get('id_fork_of')
173 try:
173 new_fork_id = safe_int(self.request.POST.get('id_fork_of'))
174
175 # valid repo, re-check permissions
176 if new_fork_id:
177 repo = Repository.get(new_fork_id)
178 # ensure we have at least read access to the repo we mark
179 perm_check = HasRepoPermissionAny(
180 'repository.read', 'repository.write', 'repository.admin')
174 181
175 if new_fork_id and not new_fork_id.isdigit():
176 log.error('Given fork id %s is not an INT', new_fork_id)
182 if repo and perm_check(repo_name=repo.repo_name):
183 new_fork_id = repo.repo_id
184 else:
185 new_fork_id = None
177 186
178 fork_id = safe_int(new_fork_id)
187 try:
179 188 repo = ScmModel().mark_as_fork(
180 self.db_repo_name, fork_id, self._rhodecode_user.user_id)
189 self.db_repo_name, new_fork_id, self._rhodecode_user.user_id)
181 190 fork = repo.fork.repo_name if repo.fork else _('Nothing')
182 191 Session().commit()
183 h.flash(_('Marked repo %s as fork of %s') % (self.db_repo_name, fork),
192 h.flash(
193 _('Marked repo %s as fork of %s') % (self.db_repo_name, fork),
184 194 category='success')
185 195 except RepositoryError as e:
186 196 log.exception("Repository Error occurred")
187 197 h.flash(str(e), category='error')
188 except Exception as e:
198 except Exception:
189 199 log.exception("Exception while editing fork")
190 200 h.flash(_('An error occurred during this operation'),
191 201 category='error')
192 202
193 203 raise HTTPFound(
194 204 h.route_path('edit_repo_advanced', repo_name=self.db_repo_name))
195 205
196 206 @LoginRequired()
197 207 @HasRepoPermissionAnyDecorator('repository.admin')
198 208 @CSRFRequired()
199 209 @view_config(
200 210 route_name='edit_repo_advanced_locking', request_method='POST',
201 211 renderer='rhodecode:templates/admin/repos/repo_edit.mako')
202 212 def edit_advanced_locking(self):
203 213 """
204 214 Toggle locking of repository
205 215 """
206 216 _ = self.request.translate
207 217 set_lock = self.request.POST.get('set_lock')
208 218 set_unlock = self.request.POST.get('set_unlock')
209 219
210 220 try:
211 221 if set_lock:
212 222 Repository.lock(self.db_repo, self._rhodecode_user.user_id,
213 223 lock_reason=Repository.LOCK_WEB)
214 224 h.flash(_('Locked repository'), category='success')
215 225 elif set_unlock:
216 226 Repository.unlock(self.db_repo)
217 227 h.flash(_('Unlocked repository'), category='success')
218 228 except Exception as e:
219 229 log.exception("Exception during unlocking")
220 230 h.flash(_('An error occurred during unlocking'), category='error')
221 231
222 232 raise HTTPFound(
223 233 h.route_path('edit_repo_advanced', repo_name=self.db_repo_name))
@@ -1,284 +1,285 b''
1 1
2 2 /******************************************************************************
3 3 * *
4 4 * DO NOT CHANGE THIS FILE MANUALLY *
5 5 * *
6 6 * *
7 7 * This file is automatically generated when the app starts up with *
8 8 * generate_js_files = true *
9 9 * *
10 10 * To add a route here pass jsroute=True to the route definition in the app *
11 11 * *
12 12 ******************************************************************************/
13 13 function registerRCRoutes() {
14 14 // routes registration
15 15 pyroutes.register('favicon', '/favicon.ico', []);
16 16 pyroutes.register('robots', '/robots.txt', []);
17 17 pyroutes.register('auth_home', '/_admin/auth*traverse', []);
18 18 pyroutes.register('global_integrations_new', '/_admin/integrations/new', []);
19 19 pyroutes.register('global_integrations_home', '/_admin/integrations', []);
20 20 pyroutes.register('global_integrations_list', '/_admin/integrations/%(integration)s', ['integration']);
21 21 pyroutes.register('global_integrations_create', '/_admin/integrations/%(integration)s/new', ['integration']);
22 22 pyroutes.register('global_integrations_edit', '/_admin/integrations/%(integration)s/%(integration_id)s', ['integration', 'integration_id']);
23 23 pyroutes.register('repo_group_integrations_home', '/%(repo_group_name)s/settings/integrations', ['repo_group_name']);
24 24 pyroutes.register('repo_group_integrations_new', '/%(repo_group_name)s/settings/integrations/new', ['repo_group_name']);
25 25 pyroutes.register('repo_group_integrations_list', '/%(repo_group_name)s/settings/integrations/%(integration)s', ['repo_group_name', 'integration']);
26 26 pyroutes.register('repo_group_integrations_create', '/%(repo_group_name)s/settings/integrations/%(integration)s/new', ['repo_group_name', 'integration']);
27 27 pyroutes.register('repo_group_integrations_edit', '/%(repo_group_name)s/settings/integrations/%(integration)s/%(integration_id)s', ['repo_group_name', 'integration', 'integration_id']);
28 28 pyroutes.register('repo_integrations_home', '/%(repo_name)s/settings/integrations', ['repo_name']);
29 29 pyroutes.register('repo_integrations_new', '/%(repo_name)s/settings/integrations/new', ['repo_name']);
30 30 pyroutes.register('repo_integrations_list', '/%(repo_name)s/settings/integrations/%(integration)s', ['repo_name', 'integration']);
31 31 pyroutes.register('repo_integrations_create', '/%(repo_name)s/settings/integrations/%(integration)s/new', ['repo_name', 'integration']);
32 32 pyroutes.register('repo_integrations_edit', '/%(repo_name)s/settings/integrations/%(integration)s/%(integration_id)s', ['repo_name', 'integration', 'integration_id']);
33 33 pyroutes.register('ops_ping', '/_admin/ops/ping', []);
34 34 pyroutes.register('ops_error_test', '/_admin/ops/error', []);
35 35 pyroutes.register('ops_redirect_test', '/_admin/ops/redirect', []);
36 36 pyroutes.register('ops_ping_legacy', '/_admin/ping', []);
37 37 pyroutes.register('ops_error_test_legacy', '/_admin/error_test', []);
38 38 pyroutes.register('admin_home', '/_admin', []);
39 39 pyroutes.register('admin_audit_logs', '/_admin/audit_logs', []);
40 40 pyroutes.register('admin_audit_log_entry', '/_admin/audit_logs/%(audit_log_id)s', ['audit_log_id']);
41 41 pyroutes.register('pull_requests_global_0', '/_admin/pull_requests/%(pull_request_id)s', ['pull_request_id']);
42 42 pyroutes.register('pull_requests_global_1', '/_admin/pull-requests/%(pull_request_id)s', ['pull_request_id']);
43 43 pyroutes.register('pull_requests_global', '/_admin/pull-request/%(pull_request_id)s', ['pull_request_id']);
44 44 pyroutes.register('admin_settings_open_source', '/_admin/settings/open_source', []);
45 45 pyroutes.register('admin_settings_vcs_svn_generate_cfg', '/_admin/settings/vcs/svn_generate_cfg', []);
46 46 pyroutes.register('admin_settings_system', '/_admin/settings/system', []);
47 47 pyroutes.register('admin_settings_system_update', '/_admin/settings/system/updates', []);
48 48 pyroutes.register('admin_settings_sessions', '/_admin/settings/sessions', []);
49 49 pyroutes.register('admin_settings_sessions_cleanup', '/_admin/settings/sessions/cleanup', []);
50 50 pyroutes.register('admin_settings_process_management', '/_admin/settings/process_management', []);
51 51 pyroutes.register('admin_settings_process_management_signal', '/_admin/settings/process_management/signal', []);
52 52 pyroutes.register('admin_defaults_repositories', '/_admin/defaults/repositories', []);
53 53 pyroutes.register('admin_defaults_repositories_update', '/_admin/defaults/repositories/update', []);
54 54 pyroutes.register('admin_permissions_application', '/_admin/permissions/application', []);
55 55 pyroutes.register('admin_permissions_application_update', '/_admin/permissions/application/update', []);
56 56 pyroutes.register('admin_permissions_global', '/_admin/permissions/global', []);
57 57 pyroutes.register('admin_permissions_global_update', '/_admin/permissions/global/update', []);
58 58 pyroutes.register('admin_permissions_object', '/_admin/permissions/object', []);
59 59 pyroutes.register('admin_permissions_object_update', '/_admin/permissions/object/update', []);
60 60 pyroutes.register('admin_permissions_ips', '/_admin/permissions/ips', []);
61 61 pyroutes.register('admin_permissions_overview', '/_admin/permissions/overview', []);
62 62 pyroutes.register('admin_permissions_auth_token_access', '/_admin/permissions/auth_token_access', []);
63 63 pyroutes.register('admin_permissions_ssh_keys', '/_admin/permissions/ssh_keys', []);
64 64 pyroutes.register('admin_permissions_ssh_keys_data', '/_admin/permissions/ssh_keys/data', []);
65 65 pyroutes.register('admin_permissions_ssh_keys_update', '/_admin/permissions/ssh_keys/update', []);
66 66 pyroutes.register('users', '/_admin/users', []);
67 67 pyroutes.register('users_data', '/_admin/users_data', []);
68 68 pyroutes.register('users_create', '/_admin/users/create', []);
69 69 pyroutes.register('users_new', '/_admin/users/new', []);
70 70 pyroutes.register('user_edit', '/_admin/users/%(user_id)s/edit', ['user_id']);
71 71 pyroutes.register('user_edit_advanced', '/_admin/users/%(user_id)s/edit/advanced', ['user_id']);
72 72 pyroutes.register('user_edit_global_perms', '/_admin/users/%(user_id)s/edit/global_permissions', ['user_id']);
73 73 pyroutes.register('user_edit_global_perms_update', '/_admin/users/%(user_id)s/edit/global_permissions/update', ['user_id']);
74 74 pyroutes.register('user_update', '/_admin/users/%(user_id)s/update', ['user_id']);
75 75 pyroutes.register('user_delete', '/_admin/users/%(user_id)s/delete', ['user_id']);
76 76 pyroutes.register('user_force_password_reset', '/_admin/users/%(user_id)s/password_reset', ['user_id']);
77 77 pyroutes.register('user_create_personal_repo_group', '/_admin/users/%(user_id)s/create_repo_group', ['user_id']);
78 78 pyroutes.register('edit_user_auth_tokens', '/_admin/users/%(user_id)s/edit/auth_tokens', ['user_id']);
79 79 pyroutes.register('edit_user_auth_tokens_add', '/_admin/users/%(user_id)s/edit/auth_tokens/new', ['user_id']);
80 80 pyroutes.register('edit_user_auth_tokens_delete', '/_admin/users/%(user_id)s/edit/auth_tokens/delete', ['user_id']);
81 81 pyroutes.register('edit_user_ssh_keys', '/_admin/users/%(user_id)s/edit/ssh_keys', ['user_id']);
82 82 pyroutes.register('edit_user_ssh_keys_generate_keypair', '/_admin/users/%(user_id)s/edit/ssh_keys/generate', ['user_id']);
83 83 pyroutes.register('edit_user_ssh_keys_add', '/_admin/users/%(user_id)s/edit/ssh_keys/new', ['user_id']);
84 84 pyroutes.register('edit_user_ssh_keys_delete', '/_admin/users/%(user_id)s/edit/ssh_keys/delete', ['user_id']);
85 85 pyroutes.register('edit_user_emails', '/_admin/users/%(user_id)s/edit/emails', ['user_id']);
86 86 pyroutes.register('edit_user_emails_add', '/_admin/users/%(user_id)s/edit/emails/new', ['user_id']);
87 87 pyroutes.register('edit_user_emails_delete', '/_admin/users/%(user_id)s/edit/emails/delete', ['user_id']);
88 88 pyroutes.register('edit_user_ips', '/_admin/users/%(user_id)s/edit/ips', ['user_id']);
89 89 pyroutes.register('edit_user_ips_add', '/_admin/users/%(user_id)s/edit/ips/new', ['user_id']);
90 90 pyroutes.register('edit_user_ips_delete', '/_admin/users/%(user_id)s/edit/ips/delete', ['user_id']);
91 91 pyroutes.register('edit_user_perms_summary', '/_admin/users/%(user_id)s/edit/permissions_summary', ['user_id']);
92 92 pyroutes.register('edit_user_perms_summary_json', '/_admin/users/%(user_id)s/edit/permissions_summary/json', ['user_id']);
93 93 pyroutes.register('edit_user_groups_management', '/_admin/users/%(user_id)s/edit/groups_management', ['user_id']);
94 94 pyroutes.register('edit_user_groups_management_updates', '/_admin/users/%(user_id)s/edit/edit_user_groups_management/updates', ['user_id']);
95 95 pyroutes.register('edit_user_audit_logs', '/_admin/users/%(user_id)s/edit/audit', ['user_id']);
96 96 pyroutes.register('user_groups', '/_admin/user_groups', []);
97 97 pyroutes.register('user_groups_data', '/_admin/user_groups_data', []);
98 98 pyroutes.register('user_groups_new', '/_admin/user_groups/new', []);
99 99 pyroutes.register('user_groups_create', '/_admin/user_groups/create', []);
100 100 pyroutes.register('repos', '/_admin/repos', []);
101 101 pyroutes.register('repo_new', '/_admin/repos/new', []);
102 102 pyroutes.register('repo_create', '/_admin/repos/create', []);
103 103 pyroutes.register('channelstream_connect', '/_admin/channelstream/connect', []);
104 104 pyroutes.register('channelstream_subscribe', '/_admin/channelstream/subscribe', []);
105 105 pyroutes.register('channelstream_proxy', '/_channelstream', []);
106 106 pyroutes.register('login', '/_admin/login', []);
107 107 pyroutes.register('logout', '/_admin/logout', []);
108 108 pyroutes.register('register', '/_admin/register', []);
109 109 pyroutes.register('reset_password', '/_admin/password_reset', []);
110 110 pyroutes.register('reset_password_confirmation', '/_admin/password_reset_confirmation', []);
111 111 pyroutes.register('home', '/', []);
112 112 pyroutes.register('user_autocomplete_data', '/_users', []);
113 113 pyroutes.register('user_group_autocomplete_data', '/_user_groups', []);
114 114 pyroutes.register('repo_list_data', '/_repos', []);
115 115 pyroutes.register('goto_switcher_data', '/_goto_data', []);
116 116 pyroutes.register('journal', '/_admin/journal', []);
117 117 pyroutes.register('journal_rss', '/_admin/journal/rss', []);
118 118 pyroutes.register('journal_atom', '/_admin/journal/atom', []);
119 119 pyroutes.register('journal_public', '/_admin/public_journal', []);
120 120 pyroutes.register('journal_public_atom', '/_admin/public_journal/atom', []);
121 121 pyroutes.register('journal_public_atom_old', '/_admin/public_journal_atom', []);
122 122 pyroutes.register('journal_public_rss', '/_admin/public_journal/rss', []);
123 123 pyroutes.register('journal_public_rss_old', '/_admin/public_journal_rss', []);
124 124 pyroutes.register('toggle_following', '/_admin/toggle_following', []);
125 125 pyroutes.register('repo_creating', '/%(repo_name)s/repo_creating', ['repo_name']);
126 126 pyroutes.register('repo_creating_check', '/%(repo_name)s/repo_creating_check', ['repo_name']);
127 127 pyroutes.register('repo_summary_explicit', '/%(repo_name)s/summary', ['repo_name']);
128 128 pyroutes.register('repo_summary_commits', '/%(repo_name)s/summary-commits', ['repo_name']);
129 129 pyroutes.register('repo_commit', '/%(repo_name)s/changeset/%(commit_id)s', ['repo_name', 'commit_id']);
130 130 pyroutes.register('repo_commit_children', '/%(repo_name)s/changeset_children/%(commit_id)s', ['repo_name', 'commit_id']);
131 131 pyroutes.register('repo_commit_parents', '/%(repo_name)s/changeset_parents/%(commit_id)s', ['repo_name', 'commit_id']);
132 132 pyroutes.register('repo_commit_raw', '/%(repo_name)s/changeset-diff/%(commit_id)s', ['repo_name', 'commit_id']);
133 133 pyroutes.register('repo_commit_patch', '/%(repo_name)s/changeset-patch/%(commit_id)s', ['repo_name', 'commit_id']);
134 134 pyroutes.register('repo_commit_download', '/%(repo_name)s/changeset-download/%(commit_id)s', ['repo_name', 'commit_id']);
135 135 pyroutes.register('repo_commit_data', '/%(repo_name)s/changeset-data/%(commit_id)s', ['repo_name', 'commit_id']);
136 136 pyroutes.register('repo_commit_comment_create', '/%(repo_name)s/changeset/%(commit_id)s/comment/create', ['repo_name', 'commit_id']);
137 137 pyroutes.register('repo_commit_comment_preview', '/%(repo_name)s/changeset/%(commit_id)s/comment/preview', ['repo_name', 'commit_id']);
138 138 pyroutes.register('repo_commit_comment_delete', '/%(repo_name)s/changeset/%(commit_id)s/comment/%(comment_id)s/delete', ['repo_name', 'commit_id', 'comment_id']);
139 139 pyroutes.register('repo_commit_raw_deprecated', '/%(repo_name)s/raw-changeset/%(commit_id)s', ['repo_name', 'commit_id']);
140 140 pyroutes.register('repo_archivefile', '/%(repo_name)s/archive/%(fname)s', ['repo_name', 'fname']);
141 141 pyroutes.register('repo_files_diff', '/%(repo_name)s/diff/%(f_path)s', ['repo_name', 'f_path']);
142 142 pyroutes.register('repo_files_diff_2way_redirect', '/%(repo_name)s/diff-2way/%(f_path)s', ['repo_name', 'f_path']);
143 143 pyroutes.register('repo_files', '/%(repo_name)s/files/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
144 144 pyroutes.register('repo_files:default_path', '/%(repo_name)s/files/%(commit_id)s/', ['repo_name', 'commit_id']);
145 145 pyroutes.register('repo_files:default_commit', '/%(repo_name)s/files', ['repo_name']);
146 146 pyroutes.register('repo_files:rendered', '/%(repo_name)s/render/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
147 147 pyroutes.register('repo_files:annotated', '/%(repo_name)s/annotate/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
148 148 pyroutes.register('repo_files:annotated_previous', '/%(repo_name)s/annotate-previous/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
149 149 pyroutes.register('repo_nodetree_full', '/%(repo_name)s/nodetree_full/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
150 150 pyroutes.register('repo_nodetree_full:default_path', '/%(repo_name)s/nodetree_full/%(commit_id)s/', ['repo_name', 'commit_id']);
151 151 pyroutes.register('repo_files_nodelist', '/%(repo_name)s/nodelist/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
152 152 pyroutes.register('repo_file_raw', '/%(repo_name)s/raw/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
153 153 pyroutes.register('repo_file_download', '/%(repo_name)s/download/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
154 154 pyroutes.register('repo_file_download:legacy', '/%(repo_name)s/rawfile/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
155 155 pyroutes.register('repo_file_history', '/%(repo_name)s/history/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
156 156 pyroutes.register('repo_file_authors', '/%(repo_name)s/authors/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
157 157 pyroutes.register('repo_files_remove_file', '/%(repo_name)s/remove_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
158 158 pyroutes.register('repo_files_delete_file', '/%(repo_name)s/delete_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
159 159 pyroutes.register('repo_files_edit_file', '/%(repo_name)s/edit_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
160 160 pyroutes.register('repo_files_update_file', '/%(repo_name)s/update_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
161 161 pyroutes.register('repo_files_add_file', '/%(repo_name)s/add_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
162 162 pyroutes.register('repo_files_create_file', '/%(repo_name)s/create_file/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
163 163 pyroutes.register('repo_refs_data', '/%(repo_name)s/refs-data', ['repo_name']);
164 164 pyroutes.register('repo_refs_changelog_data', '/%(repo_name)s/refs-data-changelog', ['repo_name']);
165 165 pyroutes.register('repo_stats', '/%(repo_name)s/repo_stats/%(commit_id)s', ['repo_name', 'commit_id']);
166 166 pyroutes.register('repo_changelog', '/%(repo_name)s/changelog', ['repo_name']);
167 167 pyroutes.register('repo_changelog_file', '/%(repo_name)s/changelog/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
168 168 pyroutes.register('repo_changelog_elements', '/%(repo_name)s/changelog_elements', ['repo_name']);
169 169 pyroutes.register('repo_changelog_elements_file', '/%(repo_name)s/changelog_elements/%(commit_id)s/%(f_path)s', ['repo_name', 'commit_id', 'f_path']);
170 170 pyroutes.register('repo_compare_select', '/%(repo_name)s/compare', ['repo_name']);
171 171 pyroutes.register('repo_compare', '/%(repo_name)s/compare/%(source_ref_type)s@%(source_ref)s...%(target_ref_type)s@%(target_ref)s', ['repo_name', 'source_ref_type', 'source_ref', 'target_ref_type', 'target_ref']);
172 172 pyroutes.register('tags_home', '/%(repo_name)s/tags', ['repo_name']);
173 173 pyroutes.register('branches_home', '/%(repo_name)s/branches', ['repo_name']);
174 174 pyroutes.register('bookmarks_home', '/%(repo_name)s/bookmarks', ['repo_name']);
175 175 pyroutes.register('repo_fork_new', '/%(repo_name)s/fork', ['repo_name']);
176 176 pyroutes.register('repo_fork_create', '/%(repo_name)s/fork/create', ['repo_name']);
177 177 pyroutes.register('repo_forks_show_all', '/%(repo_name)s/forks', ['repo_name']);
178 178 pyroutes.register('repo_forks_data', '/%(repo_name)s/forks/data', ['repo_name']);
179 179 pyroutes.register('pullrequest_show', '/%(repo_name)s/pull-request/%(pull_request_id)s', ['repo_name', 'pull_request_id']);
180 180 pyroutes.register('pullrequest_show_all', '/%(repo_name)s/pull-request', ['repo_name']);
181 181 pyroutes.register('pullrequest_show_all_data', '/%(repo_name)s/pull-request-data', ['repo_name']);
182 182 pyroutes.register('pullrequest_repo_refs', '/%(repo_name)s/pull-request/refs/%(target_repo_name)s', ['repo_name', 'target_repo_name']);
183 183 pyroutes.register('pullrequest_repo_destinations', '/%(repo_name)s/pull-request/repo-destinations', ['repo_name']);
184 184 pyroutes.register('pullrequest_new', '/%(repo_name)s/pull-request/new', ['repo_name']);
185 185 pyroutes.register('pullrequest_create', '/%(repo_name)s/pull-request/create', ['repo_name']);
186 186 pyroutes.register('pullrequest_update', '/%(repo_name)s/pull-request/%(pull_request_id)s/update', ['repo_name', 'pull_request_id']);
187 187 pyroutes.register('pullrequest_merge', '/%(repo_name)s/pull-request/%(pull_request_id)s/merge', ['repo_name', 'pull_request_id']);
188 188 pyroutes.register('pullrequest_delete', '/%(repo_name)s/pull-request/%(pull_request_id)s/delete', ['repo_name', 'pull_request_id']);
189 189 pyroutes.register('pullrequest_comment_create', '/%(repo_name)s/pull-request/%(pull_request_id)s/comment', ['repo_name', 'pull_request_id']);
190 190 pyroutes.register('pullrequest_comment_delete', '/%(repo_name)s/pull-request/%(pull_request_id)s/comment/%(comment_id)s/delete', ['repo_name', 'pull_request_id', 'comment_id']);
191 191 pyroutes.register('edit_repo', '/%(repo_name)s/settings', ['repo_name']);
192 192 pyroutes.register('edit_repo_advanced', '/%(repo_name)s/settings/advanced', ['repo_name']);
193 193 pyroutes.register('edit_repo_advanced_delete', '/%(repo_name)s/settings/advanced/delete', ['repo_name']);
194 194 pyroutes.register('edit_repo_advanced_locking', '/%(repo_name)s/settings/advanced/locking', ['repo_name']);
195 195 pyroutes.register('edit_repo_advanced_journal', '/%(repo_name)s/settings/advanced/journal', ['repo_name']);
196 196 pyroutes.register('edit_repo_advanced_fork', '/%(repo_name)s/settings/advanced/fork', ['repo_name']);
197 197 pyroutes.register('edit_repo_caches', '/%(repo_name)s/settings/caches', ['repo_name']);
198 198 pyroutes.register('edit_repo_perms', '/%(repo_name)s/settings/permissions', ['repo_name']);
199 199 pyroutes.register('edit_repo_maintenance', '/%(repo_name)s/settings/maintenance', ['repo_name']);
200 200 pyroutes.register('edit_repo_maintenance_execute', '/%(repo_name)s/settings/maintenance/execute', ['repo_name']);
201 201 pyroutes.register('edit_repo_fields', '/%(repo_name)s/settings/fields', ['repo_name']);
202 202 pyroutes.register('edit_repo_fields_create', '/%(repo_name)s/settings/fields/create', ['repo_name']);
203 203 pyroutes.register('edit_repo_fields_delete', '/%(repo_name)s/settings/fields/%(field_id)s/delete', ['repo_name', 'field_id']);
204 204 pyroutes.register('repo_edit_toggle_locking', '/%(repo_name)s/settings/toggle_locking', ['repo_name']);
205 205 pyroutes.register('edit_repo_remote', '/%(repo_name)s/settings/remote', ['repo_name']);
206 206 pyroutes.register('edit_repo_remote_pull', '/%(repo_name)s/settings/remote/pull', ['repo_name']);
207 207 pyroutes.register('edit_repo_statistics', '/%(repo_name)s/settings/statistics', ['repo_name']);
208 208 pyroutes.register('edit_repo_statistics_reset', '/%(repo_name)s/settings/statistics/update', ['repo_name']);
209 209 pyroutes.register('edit_repo_issuetracker', '/%(repo_name)s/settings/issue_trackers', ['repo_name']);
210 210 pyroutes.register('edit_repo_issuetracker_test', '/%(repo_name)s/settings/issue_trackers/test', ['repo_name']);
211 211 pyroutes.register('edit_repo_issuetracker_delete', '/%(repo_name)s/settings/issue_trackers/delete', ['repo_name']);
212 212 pyroutes.register('edit_repo_issuetracker_update', '/%(repo_name)s/settings/issue_trackers/update', ['repo_name']);
213 213 pyroutes.register('edit_repo_vcs', '/%(repo_name)s/settings/vcs', ['repo_name']);
214 214 pyroutes.register('edit_repo_vcs_update', '/%(repo_name)s/settings/vcs/update', ['repo_name']);
215 215 pyroutes.register('edit_repo_vcs_svn_pattern_delete', '/%(repo_name)s/settings/vcs/svn_pattern/delete', ['repo_name']);
216 216 pyroutes.register('repo_reviewers', '/%(repo_name)s/settings/review/rules', ['repo_name']);
217 217 pyroutes.register('repo_default_reviewers_data', '/%(repo_name)s/settings/review/default-reviewers', ['repo_name']);
218 218 pyroutes.register('edit_repo_strip', '/%(repo_name)s/settings/strip', ['repo_name']);
219 219 pyroutes.register('strip_check', '/%(repo_name)s/settings/strip_check', ['repo_name']);
220 220 pyroutes.register('strip_execute', '/%(repo_name)s/settings/strip_execute', ['repo_name']);
221 pyroutes.register('edit_repo_audit_logs', '/%(repo_name)s/settings/audit_logs', ['repo_name']);
221 222 pyroutes.register('rss_feed_home', '/%(repo_name)s/feed/rss', ['repo_name']);
222 223 pyroutes.register('atom_feed_home', '/%(repo_name)s/feed/atom', ['repo_name']);
223 224 pyroutes.register('repo_summary', '/%(repo_name)s', ['repo_name']);
224 225 pyroutes.register('repo_summary_slash', '/%(repo_name)s/', ['repo_name']);
225 226 pyroutes.register('repo_group_home', '/%(repo_group_name)s', ['repo_group_name']);
226 227 pyroutes.register('repo_group_home_slash', '/%(repo_group_name)s/', ['repo_group_name']);
227 228 pyroutes.register('user_group_members_data', '/_admin/user_groups/%(user_group_id)s/members', ['user_group_id']);
228 229 pyroutes.register('edit_user_group_perms_summary', '/_admin/user_groups/%(user_group_id)s/edit/permissions_summary', ['user_group_id']);
229 230 pyroutes.register('edit_user_group_perms_summary_json', '/_admin/user_groups/%(user_group_id)s/edit/permissions_summary/json', ['user_group_id']);
230 231 pyroutes.register('edit_user_group', '/_admin/user_groups/%(user_group_id)s/edit', ['user_group_id']);
231 232 pyroutes.register('user_groups_update', '/_admin/user_groups/%(user_group_id)s/update', ['user_group_id']);
232 233 pyroutes.register('edit_user_group_global_perms', '/_admin/user_groups/%(user_group_id)s/edit/global_permissions', ['user_group_id']);
233 234 pyroutes.register('edit_user_group_global_perms_update', '/_admin/user_groups/%(user_group_id)s/edit/global_permissions/update', ['user_group_id']);
234 235 pyroutes.register('edit_user_group_perms', '/_admin/user_groups/%(user_group_id)s/edit/permissions', ['user_group_id']);
235 236 pyroutes.register('edit_user_group_perms_update', '/_admin/user_groups/%(user_group_id)s/edit/permissions/update', ['user_group_id']);
236 237 pyroutes.register('edit_user_group_advanced', '/_admin/user_groups/%(user_group_id)s/edit/advanced', ['user_group_id']);
237 238 pyroutes.register('edit_user_group_advanced_sync', '/_admin/user_groups/%(user_group_id)s/edit/advanced/sync', ['user_group_id']);
238 239 pyroutes.register('user_groups_delete', '/_admin/user_groups/%(user_group_id)s/delete', ['user_group_id']);
239 240 pyroutes.register('search', '/_admin/search', []);
240 241 pyroutes.register('search_repo', '/%(repo_name)s/search', ['repo_name']);
241 242 pyroutes.register('user_profile', '/_profiles/%(username)s', ['username']);
242 243 pyroutes.register('my_account_profile', '/_admin/my_account/profile', []);
243 244 pyroutes.register('my_account_edit', '/_admin/my_account/edit', []);
244 245 pyroutes.register('my_account_update', '/_admin/my_account/update', []);
245 246 pyroutes.register('my_account_password', '/_admin/my_account/password', []);
246 247 pyroutes.register('my_account_password_update', '/_admin/my_account/password/update', []);
247 248 pyroutes.register('my_account_auth_tokens', '/_admin/my_account/auth_tokens', []);
248 249 pyroutes.register('my_account_auth_tokens_add', '/_admin/my_account/auth_tokens/new', []);
249 250 pyroutes.register('my_account_auth_tokens_delete', '/_admin/my_account/auth_tokens/delete', []);
250 251 pyroutes.register('my_account_ssh_keys', '/_admin/my_account/ssh_keys', []);
251 252 pyroutes.register('my_account_ssh_keys_generate', '/_admin/my_account/ssh_keys/generate', []);
252 253 pyroutes.register('my_account_ssh_keys_add', '/_admin/my_account/ssh_keys/new', []);
253 254 pyroutes.register('my_account_ssh_keys_delete', '/_admin/my_account/ssh_keys/delete', []);
254 255 pyroutes.register('my_account_emails', '/_admin/my_account/emails', []);
255 256 pyroutes.register('my_account_emails_add', '/_admin/my_account/emails/new', []);
256 257 pyroutes.register('my_account_emails_delete', '/_admin/my_account/emails/delete', []);
257 258 pyroutes.register('my_account_repos', '/_admin/my_account/repos', []);
258 259 pyroutes.register('my_account_watched', '/_admin/my_account/watched', []);
259 260 pyroutes.register('my_account_perms', '/_admin/my_account/perms', []);
260 261 pyroutes.register('my_account_notifications', '/_admin/my_account/notifications', []);
261 262 pyroutes.register('my_account_notifications_toggle_visibility', '/_admin/my_account/toggle_visibility', []);
262 263 pyroutes.register('my_account_pullrequests', '/_admin/my_account/pull_requests', []);
263 264 pyroutes.register('my_account_pullrequests_data', '/_admin/my_account/pull_requests/data', []);
264 265 pyroutes.register('notifications_show_all', '/_admin/notifications', []);
265 266 pyroutes.register('notifications_mark_all_read', '/_admin/notifications/mark_all_read', []);
266 267 pyroutes.register('notifications_show', '/_admin/notifications/%(notification_id)s', ['notification_id']);
267 268 pyroutes.register('notifications_update', '/_admin/notifications/%(notification_id)s/update', ['notification_id']);
268 269 pyroutes.register('notifications_delete', '/_admin/notifications/%(notification_id)s/delete', ['notification_id']);
269 270 pyroutes.register('my_account_notifications_test_channelstream', '/_admin/my_account/test_channelstream', []);
270 271 pyroutes.register('gists_show', '/_admin/gists', []);
271 272 pyroutes.register('gists_new', '/_admin/gists/new', []);
272 273 pyroutes.register('gists_create', '/_admin/gists/create', []);
273 274 pyroutes.register('gist_show', '/_admin/gists/%(gist_id)s', ['gist_id']);
274 275 pyroutes.register('gist_delete', '/_admin/gists/%(gist_id)s/delete', ['gist_id']);
275 276 pyroutes.register('gist_edit', '/_admin/gists/%(gist_id)s/edit', ['gist_id']);
276 277 pyroutes.register('gist_edit_check_revision', '/_admin/gists/%(gist_id)s/edit/check_revision', ['gist_id']);
277 278 pyroutes.register('gist_update', '/_admin/gists/%(gist_id)s/update', ['gist_id']);
278 279 pyroutes.register('gist_show_rev', '/_admin/gists/%(gist_id)s/%(revision)s', ['gist_id', 'revision']);
279 280 pyroutes.register('gist_show_formatted', '/_admin/gists/%(gist_id)s/%(revision)s/%(format)s', ['gist_id', 'revision', 'format']);
280 281 pyroutes.register('gist_show_formatted_path', '/_admin/gists/%(gist_id)s/%(revision)s/%(format)s/%(f_path)s', ['gist_id', 'revision', 'format', 'f_path']);
281 282 pyroutes.register('debug_style_home', '/_admin/debug_style', []);
282 283 pyroutes.register('debug_style_template', '/_admin/debug_style/t/%(t_path)s', ['t_path']);
283 284 pyroutes.register('apiv2', '/_admin/api', []);
284 285 }
General Comments 0
You need to be logged in to leave comments. Login now