blob: 77a58fa41beb40e201ca5a6128de9354b57d1e9d [file] [log] [blame]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001= Gerrit Code Review - Access Controls
Shawn O. Pearce4b122b82009-02-18 18:22:14 -08002
3Access controls in Gerrit are group based. Every user account is a
4member of one or more groups, and access and privileges are granted
Matt Fischer620255a2011-03-22 14:28:23 -05005to those groups. Access rights cannot be granted to individual
6users.
Shawn O. Pearce4b122b82009-02-18 18:22:14 -08007
Jeff Gastonca20ec62018-10-16 12:42:35 -04008To view/edit the access controls for a specific project, first
9navigate to the projects page: for example,
Marian Harbach34253372019-12-10 18:01:31 +010010https://gerrit-review.googlesource.com/admin/repos/[role=external,window=_blank]. Then click on
Jeff Gastonca20ec62018-10-16 12:42:35 -040011the individual project, and then click Access. This will bring you
12to a url that looks like
Marian Harbach34253372019-12-10 18:01:31 +010013https://gerrit-review.googlesource.com/admin/repos/gerrit,access[role=external,window=_blank]
Shawn O. Pearce4b122b82009-02-18 18:22:14 -080014
Edwin Kempin4bf01962014-04-16 16:47:10 +020015[[system_groups]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -080016== System Groups
Shawn O. Pearce4b122b82009-02-18 18:22:14 -080017
Anita Kuno178f64b2014-04-22 18:52:28 -040018Gerrit comes with the following system groups:
Khai Do4245e6f2013-10-11 18:14:31 +020019
Khai Do4245e6f2013-10-11 18:14:31 +020020* Anonymous Users
21* Change Owner
Khai Do4245e6f2013-10-11 18:14:31 +020022* Project Owners
23* Registered Users
24
25The system groups are assigned special access and membership management
Jonathan Nieder2b2d62b2014-05-07 19:40:58 -070026privileges.
Shawn O. Pearce4b122b82009-02-18 18:22:14 -080027
Fredrik Luthandera8aa9c52013-05-09 14:50:39 +020028
Fredrik Luthander8fa3d262011-11-07 17:04:01 +010029[[anonymous_users]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -080030=== Anonymous Users
Shawn O. Pearce4b122b82009-02-18 18:22:14 -080031
32All users are automatically a member of this group. Users who are
33not signed in are a member of only this group, and no others.
34
35Any access rights assigned to this group are inherited by all users.
36
37Administrators and project owners can grant access rights to this
38group in order to permit anonymous users to view project changes,
39without requiring sign in first. Currently it is only worthwhile
Fredrik Luthander5e1b51b2012-01-20 13:06:06 +010040to grant `Read` access to this group as Gerrit requires an account
Shawn O. Pearce4b122b82009-02-18 18:22:14 -080041identity for all other operations.
42
Fredrik Luthandera8aa9c52013-05-09 14:50:39 +020043
Fredrik Luthander8fa3d262011-11-07 17:04:01 +010044[[project_owners]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -080045=== Project Owners
Fredrik Luthander8fa3d262011-11-07 17:04:01 +010046
47Access rights assigned to this group are always evaluated within the
48context of a project to which the access rights apply. These rights
49therefore apply to all the users who are owners of this project.
50
51By assigning access rights to this group on a parent project Gerrit
52administrators can define a set of default access rights for
Fredrik Luthanderea13ca52011-12-29 11:36:48 +010053<<category_owner,project owners>>. Child projects inherit these
Fredrik Luthander8fa3d262011-11-07 17:04:01 +010054access rights where they are resolved to the users that own the child
55project. Having default access rights for
Fredrik Luthanderea13ca52011-12-29 11:36:48 +010056<<category_owner,project owners>> assigned on a parent project may
Fredrik Luthander8fa3d262011-11-07 17:04:01 +010057avoid the need to initially configure access rights for
58newly created child projects.
59
Fredrik Luthandera8aa9c52013-05-09 14:50:39 +020060
Khai Do4245e6f2013-10-11 18:14:31 +020061[[change_owner]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -080062=== Change Owner
Khai Do4245e6f2013-10-11 18:14:31 +020063
64Access rights assigned to this group are always evaluated within the
65context of a change to which the access rights apply. These rights
66therefore apply to the user who is the owner of this change.
67
68It is typical to assign a label to this group, allowing the change
69owner to vote on his change, but not actually cause it to become
70approved or rejected.
71
Fredrik Luthander8fa3d262011-11-07 17:04:01 +010072[[registered_users]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -080073=== Registered Users
Shawn O. Pearce4b122b82009-02-18 18:22:14 -080074
75All signed-in users are automatically a member of this group (and
Fredrik Luthander54abc352012-01-20 16:18:41 +010076also <<anonymous_users,'Anonymous Users'>>, see above).
Shawn O. Pearce4b122b82009-02-18 18:22:14 -080077
78Any access rights assigned to this group are inherited by all
79users as soon as they sign-in to Gerrit. If OpenID authentication
80is being employed, moving from only 'Anonymous Users' into this
81group is very easy. Caution should be taken when assigning any
82permissions to this group.
83
Dave Borowitz01c1b1f2013-02-27 13:49:04 -080084It is typical to assign `Code-Review -1..+1` to this group,
Shawn O. Pearce4b122b82009-02-18 18:22:14 -080085allowing signed-in users to vote on a change, but not actually
86cause it to become approved or rejected.
87
88Registered users are always permitted to make and publish comments
Fredrik Luthander5e1b51b2012-01-20 13:06:06 +010089on any change in any project they have `Read` access to.
Shawn O. Pearce4b122b82009-02-18 18:22:14 -080090
91
Jonathan Nieder2b2d62b2014-05-07 19:40:58 -070092== Predefined Groups
93
94Predefined groups differs from system groups by the fact that they
95exist in the ACCOUNT_GROUPS table (like normal groups) but predefined groups
96are created on Gerrit site initialization and unique UUIDs are assigned
97to those groups. These UUIDs are different on different Gerrit sites.
98
99Gerrit comes with two predefined groups:
100
101* Administrators
102* Non-Interactive Users
103
104
105[[administrators]]
106=== Administrators
107
Edwin Kempin17287422016-04-07 08:44:39 +0200108This is a predefined group, created on Gerrit site initialization, that
109has the capability link:access-control.html#capability_administrateServer[
110'Administrate Server'] assigned.
Jonathan Nieder2b2d62b2014-05-07 19:40:58 -0700111
Edwin Kempin17287422016-04-07 08:44:39 +0200112It is a normal Gerrit group without magic. This means if you remove
113the 'Administrate Server' capability from it, its members are no longer
114Gerrit administrators, despite the group name. The group may also be
115renamed.
Jonathan Nieder2b2d62b2014-05-07 19:40:58 -0700116
117
118[[non-interactive_users]]
119=== Non-Interactive Users
120
121This is the Gerrit "batch" identity. The capabilities
122link:access-control.html#capability_priority['Priority BATCH'] and
123link:access-control.html#capability_streamEvents['Stream Events']
124are assigned to this predefined group on Gerrit site creation.
125
126The members of this group are not expected to perform interactive
127operations on the Gerrit web front-end.
128
129However, sometimes such a user may need a separate thread pool in
130order to prevent it from grabbing threads from the interactive users.
131
132These users live in a second thread pool, which separates operations
133made by the non-interactive users from the ones made by the interactive
134users. This ensures that the interactive users can keep working when
135resources are tight.
136
137
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800138== Account Groups
Shawn O. Pearce4b122b82009-02-18 18:22:14 -0800139
140Account groups contain a list of zero or more user account members,
141added individually by a group owner. Any user account listed as
142a group member is given any access rights granted to the group.
143
Shawn O. Pearce4b122b82009-02-18 18:22:14 -0800144Every group has one other group designated as its owner. Users who
145are members of the owner group can:
146
Fredrik Luthander8fa3d262011-11-07 17:04:01 +0100147* Add users and other groups to this group
148* Remove users and other groups from this group
Shawn O. Pearce4b122b82009-02-18 18:22:14 -0800149* Change the name of this group
150* Change the description of this group
151* Change the owner of this group, to another group
152
153It is permissible for a group to own itself, allowing the group
154members to directly manage who their peers are.
155
156Newly created groups are automatically created as owning themselves,
157with the creating user as the only member. This permits the group
158creator to add additional members, and change the owner to another
159group if desired.
160
161It is somewhat common to create two groups at the same time,
162for example `Foo` and `Foo-admin`, where the latter group
163`Foo-admin` owns both itself and also group `Foo`. Users who
164are members of `Foo-admin` can thus control the membership of
165`Foo`, without actually having the access rights granted to `Foo`.
166This configuration can help prevent accidental submits when the
167members of `Foo` have submit rights on a project, and the members of
168`Foo-admin` typically do not need to have such rights.
169
Fredrik Luthandera8aa9c52013-05-09 14:50:39 +0200170
Thanh Ha6eed43f2013-04-11 21:03:55 -0400171[[ldap_groups]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800172== LDAP Groups
Thanh Ha6eed43f2013-04-11 21:03:55 -0400173
174LDAP groups are Account Groups that are maintained inside of your
175LDAP instance. If you are using LDAP to manage your groups they will
176not appear in the Groups list. However you can use them just like
177regular Account Groups by prefixing your group with "ldap/" in the
178Access Control for a project. For example "ldap/foo-project" will
179add the LDAP "foo-project" group to the access list.
180
Shawn O. Pearce4b122b82009-02-18 18:22:14 -0800181
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800182== Project Access Control Lists
Shawn O. Pearce4b122b82009-02-18 18:22:14 -0800183
lincolnfa7bdd32010-04-22 14:23:05 -0300184A system wide access control list affecting all projects is stored in
Shawn O. Pearcea0631822011-06-14 11:18:18 -0700185project "`All-Projects`". This inheritance can be configured
lincolnfa7bdd32010-04-22 14:23:05 -0300186through link:cmd-set-project-parent.html[gerrit set-project-parent].
Shawn O. Pearce4b122b82009-02-18 18:22:14 -0800187
188Per-project access control lists are also supported.
189
190Users are permitted to use the maximum range granted to any of their
Dave Borowitz01c1b1f2013-02-27 13:49:04 -0800191groups on a label. For example, a user is a member of `Foo Leads`, and
192the following ACLs are granted on a project:
Shawn O. Pearce4b122b82009-02-18 18:22:14 -0800193
Karsten Dambekalnsa7f72a22011-03-25 14:21:59 +0100194[options="header"]
Dave Borowitz01c1b1f2013-02-27 13:49:04 -0800195|===================================================
196|Group |Reference Name |Label |Range
197|Anonymous Users |refs/heads/* |Code-Review|-1..+1
198|Registered Users|refs/heads/* |Code-Review|-1..+2
199|Foo Leads |refs/heads/* |Code-Review|-2..0
200|===================================================
Shawn O. Pearce4b122b82009-02-18 18:22:14 -0800201
202Then the effective range permitted to be used by the user is
203`-2..+2`, as the user is a member of all three groups (see above
204about the system groups) and the maximum range is chosen (so the
205lowest value granted to any group, and the highest value granted
206to any group).
207
Nico Sallembienee6eaf02010-02-01 13:24:49 -0800208Reference-level access control is also possible.
209
210Permissions can be set on a single reference name to match one
211branch (e.g. `refs/heads/master`), or on a reference namespace
Jonathan Nieder5758f182015-03-30 11:28:55 -0700212(e.g. `+refs/heads/*+`) to match any branch starting with that
Sebastian Schuberth7bcfbaf2016-05-23 14:06:03 +0200213prefix. So a permission with `+refs/heads/*+` will match all of
214`refs/heads/master`, `refs/heads/experimental`, `refs/heads/release/1.0` etc.
Nico Sallembienee6eaf02010-02-01 13:24:49 -0800215
Shawn O. Pearce6d6d4512010-07-15 11:42:34 -0700216Reference names can also be described with a regular expression
Edwin Kempina2bf0832011-09-08 14:23:30 +0200217by prefixing the reference name with `^`. For example
218`^refs/heads/[a-z]{1,8}` matches all lower case branch names
Shawn O. Pearce6d6d4512010-07-15 11:42:34 -0700219between 1 and 8 characters long. Within a regular expression `.`
220is a wildcard matching any character, but may be escaped as `\.`.
Marian Harbach34253372019-12-10 18:01:31 +0100221The link:http://www.brics.dk/automaton/[dk.brics.automaton library,role=external,window=_blank]
Magnus Bäcke5611832011-02-02 08:57:15 +0100222is used for evaluation of regular expression access control
223rules. See the library documentation for details on this
Doug Claare852eb32016-03-18 14:43:28 -0700224particular regular expression flavor. One quirk is that the
225shortest possible pattern expansion must be a valid ref name:
226thus `^refs/heads/.*/name` will fail because `refs/heads//name`
227is not a valid reference, but `^refs/heads/.+/name` will work.
Shawn O. Pearce6d6d4512010-07-15 11:42:34 -0700228
Edwin Kempin311d5702017-07-28 15:10:24 +0200229[[sharded-user-id]]
Edwin Kempinad6f15b2016-05-04 18:20:05 +0200230References can have the user name or the sharded account ID of the
231current user automatically included, creating dynamic access controls
232that change to match the currently logged in user. For example to
233provide a personal sandbox space to all developers,
234`+refs/heads/sandbox/${username}/*+` allows the user 'joe' to use
235'refs/heads/sandbox/joe/foo'. The sharded account ID can be used to
236give users access to their user branch in the `All-Users` repository,
237for example `+refs/users/${shardeduserid}+` is resolved to
238'refs/users/23/1011123' if the account ID of the current user is
239`1011123`.
Shawn O. Pearce6d6d4512010-07-15 11:42:34 -0700240
Nico Sallembienee6eaf02010-02-01 13:24:49 -0800241When evaluating a reference-level access right, Gerrit will use
Nico Sallembiena78a37c2010-05-04 11:49:12 -0700242the full set of access rights to determine if the user
243is allowed to perform a given action. For example, if a user is a
244member of `Foo Leads`, they are reviewing a change destined for
245the `refs/heads/qa` branch, and the following ACLs are granted
246on the project:
Nico Sallembienee6eaf02010-02-01 13:24:49 -0800247
Karsten Dambekalnsa7f72a22011-03-25 14:21:59 +0100248[options="header"]
Fredrik Luthander54abc352012-01-20 16:18:41 +0100249|===============================================================
Dave Borowitz01c1b1f2013-02-27 13:49:04 -0800250|Group |Reference Name|Label |Range |Exclusive
251|Registered Users |refs/heads/* |Code-Review| -1..+1 |
252|Foo Leads |refs/heads/* |Code-Review| -2..+2 |
253|QA Leads |refs/heads/qa |Code-Review| -2..+2 |
Fredrik Luthander54abc352012-01-20 16:18:41 +0100254|===============================================================
Nico Sallembienee6eaf02010-02-01 13:24:49 -0800255
Nico Sallembiena78a37c2010-05-04 11:49:12 -0700256Then the effective range permitted to be used by the user is
257`-2..+2`, as the user's membership of `Foo Leads` effectively grant
258them access to the entire reference space, thanks to the wildcard.
259
260Gerrit also supports exclusive reference-level access control.
261
262It is possible to configure Gerrit to grant an exclusive ref level
263access control so that only users of a specific group can perform
Fredrik Luthander54abc352012-01-20 16:18:41 +0100264an operation on a project/reference pair. This is done by ticking
265the exclusive flag when setting the permission for the
266`refs/heads/qa` branch.
Nico Sallembiena78a37c2010-05-04 11:49:12 -0700267
268For example, if a user who is a member of `Foo Leads` tries to
269review a change destined for branch `refs/heads/qa` in a project,
270and the following ACLs are granted:
271
Karsten Dambekalnsa7f72a22011-03-25 14:21:59 +0100272[options="header"]
Fredrik Luthander54abc352012-01-20 16:18:41 +0100273|==============================================================
Dave Borowitz01c1b1f2013-02-27 13:49:04 -0800274|Group |Reference Name|Label |Range |Exclusive
275|Registered Users|refs/heads/* |Code-Review| -1..+1 |
276|Foo Leads |refs/heads/* |Code-Review| -2..+2 |
277|QA Leads |refs/heads/qa |Code-Review| -2..+2 |X
Fredrik Luthander54abc352012-01-20 16:18:41 +0100278|==============================================================
Nico Sallembiena78a37c2010-05-04 11:49:12 -0700279
Dave Borowitz01c1b1f2013-02-27 13:49:04 -0800280Then this user will not have `Code-Review` rights on that change,
Nico Sallembiena78a37c2010-05-04 11:49:12 -0700281since there is an exclusive access right in place for the
282`refs/heads/qa` branch. This allows locking down access for a
283particular branch to a limited set of users, bypassing inherited
284rights and wildcards.
285
Dave Borowitz01c1b1f2013-02-27 13:49:04 -0800286In order to grant the ability to `Code-Review` to the members of
Nico Sallembiena78a37c2010-05-04 11:49:12 -0700287`Foo Leads`, in `refs/heads/qa` then the following access rights
288would be needed:
289
Karsten Dambekalnsa7f72a22011-03-25 14:21:59 +0100290[options="header"]
Fredrik Luthander54abc352012-01-20 16:18:41 +0100291|==============================================================
292|Group |Reference Name|Category |Range |Exclusive
Dave Borowitz01c1b1f2013-02-27 13:49:04 -0800293|Registered Users|refs/heads/* |Code-Review| -1..+1 |
294|Foo Leads |refs/heads/* |Code-Review| -2..+2 |
295|QA Leads |refs/heads/qa |Code-Review| -2..+2 |X
296|Foo Leads |refs/heads/qa |Code-Review| -2..+2 |
Fredrik Luthander54abc352012-01-20 16:18:41 +0100297|==============================================================
Nico Sallembiena78a37c2010-05-04 11:49:12 -0700298
Fredrik Luthandera8aa9c52013-05-09 14:50:39 +0200299
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800300=== OpenID Authentication
Shawn O. Pearcea2299662009-02-25 14:34:40 -0800301
302If the Gerrit instance is configured to use OpenID authentication,
303an account's effective group membership will be restricted to only
304the `Anonymous Users` and `Registered Users` groups, unless *all*
305of its OpenID identities match one or more of the patterns listed
Shawn O. Pearced7c026d2009-08-05 20:11:22 -0700306in the `auth.trustedOpenID` list from `gerrit.config`.
Shawn O. Pearcea2299662009-02-25 14:34:40 -0800307
Fredrik Luthandera8aa9c52013-05-09 14:50:39 +0200308
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800309=== All Projects
Shawn O. Pearce4b122b82009-02-18 18:22:14 -0800310
Shawn O. Pearcea0631822011-06-14 11:18:18 -0700311Any access right granted to a group within `All-Projects`
Shawn O. Pearce4b122b82009-02-18 18:22:14 -0800312is automatically inherited by every other project in the same
313Gerrit instance. These rights can be seen, but not modified,
314in any other project's `Access` administration tab.
315
Fredrik Luthanderd9960882011-11-08 01:42:19 +0100316Only members of the groups with the `Administrate Server` capability
317may edit the access control list for `All-Projects`. By default this
318capability is given to the group `Administrators`, but can be given
319to more groups.
Shawn O. Pearcee2c2a222010-05-11 13:43:45 -0700320
321Ownership of this project cannot be delegated to another group.
322This restriction is by design. Granting ownership to another
323group gives nearly the same level of access as membership in
324`Administrators` does, as group members would be able to alter
Fredrik Luthanderd9960882011-11-08 01:42:19 +0100325permissions for every managed project including global capabilities.
Shawn O. Pearcee2c2a222010-05-11 13:43:45 -0700326
Fredrik Luthandera8aa9c52013-05-09 14:50:39 +0200327
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800328=== Per-Project
Shawn O. Pearce4b122b82009-02-18 18:22:14 -0800329
Fredrik Luthanderda867882011-12-21 18:28:40 +0100330The per-project ACL is evaluated before the global `All-Projects` ACL,
331permitting some limited override capability to project owners. This
Fredrik Luthander5e1b51b2012-01-20 13:06:06 +0100332behavior is generally only useful on the `Read` category when
333granting 'DENY' within a specific project to deny a group access.
Shawn O. Pearce4b122b82009-02-18 18:22:14 -0800334
335
Fredrik Luthander98030252012-04-13 11:01:22 +0200336[[references]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800337== Special and magic references
Fredrik Luthander98030252012-04-13 11:01:22 +0200338
339The reference namespaces used in git are generally two, one for branches and
340one for tags:
341
342* +refs/heads/*+
343* +refs/tags/*+
344
345However, every reference under +refs/*+ is really available, and in Gerrit this
346opportunity for giving other refs a special meaning is used. In Gerrit they
347are sometimes used as magic/virtual references that give the push to Gerrit a
348special meaning.
349
350
351[[references_special]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800352=== Special references
Fredrik Luthander98030252012-04-13 11:01:22 +0200353
354The special references have content that's either generated by Gerrit or
355contains important project configuration that Gerrit needs. When making
356changes to these references, Gerrit will take extra precautions to verify the
357contents compatibility at upload time.
358
359
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800360==== refs/changes/*
Fredrik Luthander98030252012-04-13 11:01:22 +0200361
362Under this namespace each uploaded patch set for every change gets a static
363reference in their git. The format is convenient but still intended to scale to
364hundreds of thousands of patch sets. To access a given patch set you will
365need the change number and patch set number.
366
Yuxuan 'fishy' Wangd85b6872013-11-15 11:47:46 -0800367--
Fredrik Luthander98030252012-04-13 11:01:22 +0200368'refs/changes/'<last two digits of change number>/
369 <change number>/
370 <patch set number>
Yuxuan 'fishy' Wangd85b6872013-11-15 11:47:46 -0800371--
Fredrik Luthander98030252012-04-13 11:01:22 +0200372
373You can also find these static references linked on the page of each change.
374
375
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800376==== refs/meta/config
Fredrik Luthander98030252012-04-13 11:01:22 +0200377
Matt Baker3a40c6d2013-11-26 21:01:17 -0700378This is where the Gerrit configuration of each project resides. This
Fredrik Luthander98030252012-04-13 11:01:22 +0200379branch contains several files of importance: +project.config+, +groups+ and
Matt Baker3a40c6d2013-11-26 21:01:17 -0700380+rules.pl+. Together they control access and behavior during the change
Fredrik Luthander98030252012-04-13 11:01:22 +0200381review process.
382
383
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800384==== refs/meta/dashboards/*
Fredrik Luthander98030252012-04-13 11:01:22 +0200385
386There's a dedicated page where you can read more about
387link:user-dashboards.html[User Dashboards].
388
389
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800390==== refs/notes/review
Fredrik Luthander98030252012-04-13 11:01:22 +0200391
392Autogenerated copy of review notes for all changes in the git. Each log entry
393on the refs/notes/review branch also references the patch set on which the
394review is made. This functionality is provided by the review-notes plugin.
395
396
397[[references_magic]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800398=== Magic references
Fredrik Luthander98030252012-04-13 11:01:22 +0200399
400These are references with added functionality to them compared to a regular
401git push operation.
402
Edwin Kempin4bf01962014-04-16 16:47:10 +0200403[[refs_for]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800404==== refs/for/<branch ref>
Fredrik Luthander98030252012-04-13 11:01:22 +0200405
406Most prominent is the `refs/for/<branch ref>` reference which is the reference
407upon which we build the code review intercept before submitting a commit to
408the branch it's uploaded to.
409
410Further documentation on how to push can be found on the
411link:user-upload.html#push_create[Upload changes] page.
412
413
Fredrik Luthander5ccf2e42013-05-08 01:06:25 +0200414[[access_categories]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800415== Access Categories
Shawn O. Pearce4b122b82009-02-18 18:22:14 -0800416
Fredrik Luthander5ccf2e42013-05-08 01:06:25 +0200417Gerrit has several permission categories that can be granted to groups
418within projects, enabling functionality for that group's members.
Shawn O. Pearce4b122b82009-02-18 18:22:14 -0800419
Fredrik Luthandera8aa9c52013-05-09 14:50:39 +0200420
Chad Horohoe029c85a2012-06-07 16:10:14 -0400421[[category_abandon]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800422=== Abandon
Chad Horohoe029c85a2012-06-07 16:10:14 -0400423
424This category controls whether users are allowed to abandon changes
425to projects in Gerrit. It can give permission to abandon a specific
426change to a given ref.
427
Aaron Gableb9b4ba92016-11-08 14:44:36 -0800428The uploader of a change, anyone granted the <<category_owner,`Owner`>>
429permission at the ref or project level, and anyone granted the
430<<capability_administrateServer,`Administrate Server`>>
431permission can also Abandon changes.
432
David Pursehousec795eb12013-07-05 14:20:28 +0900433This also grants the permission to restore a change if the user also
434has link:#category_push[push permission] on the change's destination
435ref.
Chad Horohoe35ced0a2012-06-27 19:20:34 -0400436
Fredrik Luthandera8aa9c52013-05-09 14:50:39 +0200437
Fredrik Luthandere9eeeea2011-12-08 16:45:32 +0100438[[category_create]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800439=== Create Reference
Fredrik Luthandere9eeeea2011-12-08 16:45:32 +0100440
441The create reference category controls whether it is possible to
442create new references, branches or tags. This implies that the
443reference must not already exist, it's not a destructive permission
David Pursehouse221d4f62012-06-08 17:38:08 +0900444in that you can't overwrite or remove any previously existing
Fredrik Luthandere9eeeea2011-12-08 16:45:32 +0100445references (and also discard any commits in the process).
446
447It's probably most common to either permit the creation of a single
448branch in many gits (by granting permission on a parent project), or
449to grant this permission to a name pattern of branches.
450
451This permission is often given in conjunction with regular push
452branch permissions, allowing the holder of both to create new branches
453as well as bypass review for new commits on that branch.
454
David Pursehouse221d4f62012-06-08 17:38:08 +0900455To push lightweight (non-annotated) tags, grant
Jonathan Nieder5758f182015-03-30 11:28:55 -0700456`Create Reference` for reference name `+refs/tags/*+`, as lightweight
Edwin Kempin94db6b62016-09-02 14:37:17 +0200457tags are implemented just like branches in Git. To push a lightweight
458tag on a new commit (commit not reachable from any branch/tag) grant
Edwin Kempin439dd1f2016-09-05 16:25:12 +0200459`Push` permission on `+refs/tags/*+` too. The `Push` permission on
460`+refs/tags/*+` also allows fast-forwarding of lightweight tags.
Fredrik Luthandere9eeeea2011-12-08 16:45:32 +0100461
462For example, to grant the possibility to create new branches under the
463namespace `foo`, you have to grant this permission on
Jonathan Nieder5758f182015-03-30 11:28:55 -0700464`+refs/heads/foo/*+` for the group that should have it.
Fredrik Luthandere9eeeea2011-12-08 16:45:32 +0100465Finally, if you plan to grant each user a personal namespace in
466where they are free to create as many branches as they wish, you
467should grant the create reference permission so it's possible
468to create new branches. This is done by using the special
469`${username}` keyword in the reference pattern, e.g.
Jonathan Nieder5758f182015-03-30 11:28:55 -0700470`+refs/heads/sandbox/${username}/*+`. If you do, it's also recommended
Fredrik Luthandere9eeeea2011-12-08 16:45:32 +0100471you grant the users the push force permission to be able to clean up
472stale branches.
473
Edwin Kempin4666bd92016-09-07 11:43:59 +0200474[[category_delete]]
475=== Delete Reference
476
477The delete reference category controls whether it is possible to delete
478references, branches or tags. It doesn't allow any other update of
479references.
480
481Deletion of references is also possible if `Push` with the force option
482is granted, however that includes the permission to fast-forward and
Brian Bamsch2f6d7142017-05-23 14:41:30 -0700483force-update references to existing and new commits. Being able to push
Edwin Kempin4666bd92016-09-07 11:43:59 +0200484references for new commits is bad if bypassing of code review must be
485prevented.
486
Fredrik Luthandere9eeeea2011-12-08 16:45:32 +0100487
Fredrik Luthander8f430f12011-12-27 13:40:43 +0100488[[category_forge_author]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800489=== Forge Author
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100490
491Normally Gerrit requires the author and the committer identity
492lines in a Git commit object (or tagger line in an annotated tag) to
493match one of the registered email addresses of the uploading user.
Fredrik Luthander8f430f12011-12-27 13:40:43 +0100494This permission allows users to bypass parts of that validation, which
495may be necessary when mirroring changes from an upstream project.
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100496
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100497Permits the use of an unverified author line in commit objects.
498This can be useful when applying patches received by email from
4993rd parties, when cherry-picking changes written by others across
500branches, or when amending someone else's commit to fix up a minor
501problem before submitting.
Fredrik Luthander8f430f12011-12-27 13:40:43 +0100502
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100503By default this is granted to `Registered Users` in all projects,
504but a site administrator may disable it if verified authorship
505is required.
506
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100507
Fredrik Luthander8f430f12011-12-27 13:40:43 +0100508[[category_forge_committer]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800509=== Forge Committer
Fredrik Luthander8f430f12011-12-27 13:40:43 +0100510
511Normally Gerrit requires the author and the committer identity
512lines in a Git commit object (or tagger line in an annotated tag) to
513match one of the registered email addresses of the uploading user.
514This permission allows users to bypass parts of that validation, which
515may be necessary when mirroring changes from an upstream project.
516
517Allows the use of an unverified committer line in commit objects, or an
518unverified tagger line in annotated tag objects. Typically this is only
519required when mirroring commits from an upstream project repository.
520
521
522[[category_forge_server]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800523=== Forge Server
Fredrik Luthander8f430f12011-12-27 13:40:43 +0100524
525Normally Gerrit requires the author and the committer identity
526lines in a Git commit object (or tagger line in an annotated tag) to
527match one of the registered email addresses of the uploading user.
528This permission allows users to bypass parts of that validation, which
529may be necessary when mirroring changes from an upstream project.
530
531Allows the use of the server's own name and email on the committer
532line of a new commit object. This should only be necessary when force
533pushing a commit history which has been rewritten by 'git filter-branch'
534and that contains merge commits previously created by this Gerrit Code
535Review server.
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100536
Fredrik Luthanderea13ca52011-12-29 11:36:48 +0100537
538[[category_owner]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800539=== Owner
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100540
541The `Owner` category controls which groups can modify the project's
542configuration. Users who are members of an owner group can:
543
544* Change the project description
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100545* Grant/revoke any access rights, including `Owner`
546
Mani Chandel7ec4ac72013-12-10 14:50:33 +0530547To get SSH branch access project owners must grant an access right to a group
548they are a member of, just like for any other user.
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100549
550Ownership over a particular branch subspace may be delegated by
551entering a branch pattern. To delegate control over all branches
552that begin with `qa/` to the QA group, add `Owner` category
Jonathan Nieder5758f182015-03-30 11:28:55 -0700553for reference `+refs/heads/qa/*+`. Members of the QA group can
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100554further refine access, but only for references that begin with
Fredrik Luthander8fa3d262011-11-07 17:04:01 +0100555`refs/heads/qa/`. See <<project_owners,project owners>> to find
556out more about this role.
557
Edwin Kempin362fc852016-12-05 17:32:04 +0100558For the `All-Projects` root project any `Owner` access right on
559'refs/*' is ignored since this permission would allow users to edit the
560global capabilities, which is the same as being able to administrate
561the Gerrit server (e.g. the user could assign the `Administrate Server`
562capability to the own account).
563
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100564
Fredrik Luthanderea13ca52011-12-29 11:36:48 +0100565[[category_push]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800566=== Push
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100567
Fredrik Luthanderea13ca52011-12-29 11:36:48 +0100568This category controls how users are allowed to upload new commits
569to projects in Gerrit. It can either give permission to push
570directly into a branch, bypassing any code review process
571that would otherwise be used. Or it may give permission to upload
572new changes for code review, this depends on which namespace the
573permission is granted to.
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100574
Fredrik Luthanderea13ca52011-12-29 11:36:48 +0100575[[category_push_direct]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800576==== Direct Push
Fredrik Luthanderea13ca52011-12-29 11:36:48 +0100577
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100578Any existing branch can be fast-forwarded to a new commit.
Robin Rosenberg524a3032012-10-14 14:24:36 +0200579Creation of new branches is controlled by the
Fredrik Luthanderea13ca52011-12-29 11:36:48 +0100580link:access-control.html#category_create['Create Reference']
581category. Deletion of existing branches is rejected. This is the
582safest mode as commits cannot be discarded.
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100583
Fredrik Luthanderea13ca52011-12-29 11:36:48 +0100584* Force option
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100585+
Gert van Dijk8c5e33c2017-10-19 22:38:06 +0200586Implies <<category_delete,Delete Reference>>. Since a force push is
Fredrik Luthanderea13ca52011-12-29 11:36:48 +0100587effectively a delete immediately followed by a create, but performed
588atomically on the server and logged, this option also permits forced
589push updates to branches. Enabling this option allows existing commits
590to be discarded from a project history.
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100591
Fredrik Luthanderea13ca52011-12-29 11:36:48 +0100592The push category is primarily useful for projects that only want to
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100593take advantage of Gerrit's access control features and do not need
594its code review functionality. Projects that need to require code
595reviews should not grant this category.
596
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100597
Dave Borowitzaa912272018-04-24 12:48:09 -0400598[[category_push_review]]
599==== Upload To Code Review
600
601The `Push` access right granted on the namespace
602`refs/for/refs/heads/BRANCH` permits the user to upload a non-merge
603commit to the project's `refs/for/BRANCH` namespace, creating a new
604change for code review.
605
606A user must be able to clone or fetch the project in order to create
607a new commit on their local system, so in practice they must also
608have the `Read` access granted to upload a change.
609
610For an open source, public Gerrit installation, it is common to grant
611`Push` for `+refs/for/refs/heads/*+` to `Registered Users` in the
612`All-Projects` ACL. For more private installations, its common to
613grant `Push` for `+refs/for/refs/heads/*+` to all users of a project.
614
615* Force option
616+
617The force option has no function when granted to a branch in the
618`+refs/for/refs/heads/*+` namespace.
619
620
David Pursehouse596f3642016-08-31 10:25:19 +0900621[[category_add_patch_set]]
622=== Add Patch Set
623
624This category controls which users are allowed to upload new patch sets to
625existing changes. Irrespective of this permission, change owners are always
Dave Borowitz942a8fe2018-04-24 11:56:17 -0400626allowed to upload new patch sets for their changes. This permission needs to be
627set on `refs/for/*`.
David Pursehouse596f3642016-08-31 10:25:19 +0900628
Dave Borowitz942a8fe2018-04-24 11:56:17 -0400629By default, this permission is granted to `Registered Users` on `refs/for/*`,
Aaron Gablebf7f41a2016-09-20 15:25:00 -0700630allowing all registered users to upload a new patch set to any change. Revoking
631this permission (by granting it to no groups and setting the "Exclusive" flag)
632will prevent users from uploading a patch set to a change they do not own.
David Pursehouse596f3642016-08-31 10:25:19 +0900633
634
Fredrik Luthanderbf568572012-01-18 11:17:00 +0100635[[category_push_merge]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800636=== Push Merge Commits
Fredrik Luthanderbf568572012-01-18 11:17:00 +0100637
Magnus Bäck282c1022012-04-18 15:39:17 -0400638The `Push Merge Commit` access right permits the user to upload merge
Gustaf Lundha28a1d22013-05-08 15:05:12 +0100639commits. It's an add-on to the <<category_push,Push>> access right, and
Magnus Bäck282c1022012-04-18 15:39:17 -0400640so it won't be sufficient with only `Push Merge Commit` granted for a
641push to happen. Some projects wish to restrict merges to being created
642by Gerrit. By granting `Push` without `Push Merge Commit`, the only
Edwin Kempinaef5d6e2012-01-24 09:04:54 +0100643merges that enter the system will be those created by Gerrit.
Fredrik Luthanderbf568572012-01-18 11:17:00 +0100644
Dave Borowitz942a8fe2018-04-24 11:56:17 -0400645The reference name connected to a `Push Merge Commit` entry must always
646be prefixed with `refs/for/`, for example `refs/for/refs/heads/BRANCH`.
647This applies even for an entry that complements a `Push` entry for
648`refs/heads/BRANCH` that allows direct pushes of non-merge commits, and
649the intention of the `Push Merge Commit` entry is to allow direct pushes
650of merge commits.
651
Fredrik Luthandera8aa9c52013-05-09 14:50:39 +0200652
Fredrik Luthanderd7749862012-01-20 07:29:43 +0100653[[category_push_annotated]]
Edwin Kempin62c15682016-09-05 14:32:38 +0200654[[category_create_annotated]]
655=== Create Annotated Tag
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100656
David Pursehouse690cebe2012-12-12 19:22:45 +0900657This category permits users to push an annotated tag object into the
658project's repository. Typically this would be done with a command line
659such as:
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100660
Michael Ochmannb99feab2016-07-06 14:10:22 +0200661----
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100662 git push ssh://USER@HOST:PORT/PROJECT tag v1.0
Michael Ochmannb99feab2016-07-06 14:10:22 +0200663----
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100664
David Pursehouse690cebe2012-12-12 19:22:45 +0900665Or:
666
Michael Ochmannb99feab2016-07-06 14:10:22 +0200667----
David Pursehouse690cebe2012-12-12 19:22:45 +0900668 git push https://HOST/PROJECT tag v1.0
Michael Ochmannb99feab2016-07-06 14:10:22 +0200669----
David Pursehouse690cebe2012-12-12 19:22:45 +0900670
David Pursehouseb429ce12012-12-12 11:04:40 +0900671Tags must be annotated (created with `git tag -a`), should exist in
672the `refs/tags/` namespace, and should be new.
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100673
674This category is intended to be used to publish tags when a project
675reaches a stable release point worth remembering in history.
676
Fredrik Luthanderd7749862012-01-20 07:29:43 +0100677It allows for a new annotated (unsigned) tag to be created. The
678tagger email address must be verified for the current user.
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100679
680To push tags created by users other than the current user (such
Fredrik Luthanderd7749862012-01-20 07:29:43 +0100681as tags mirrored from an upstream project), `Forge Committer Identity`
Edwin Kempin62c15682016-09-05 14:32:38 +0200682must be also granted in addition to `Create Annotated Tag`.
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100683
Fredrik Luthanderd7749862012-01-20 07:29:43 +0100684To push lightweight (non annotated) tags, grant
685<<category_create,`Create Reference`>> for reference name
Jonathan Nieder5758f182015-03-30 11:28:55 -0700686`+refs/tags/*+`, as lightweight tags are implemented just like
Fredrik Luthanderd7749862012-01-20 07:29:43 +0100687branches in Git.
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100688
Fredrik Luthanderd7749862012-01-20 07:29:43 +0100689To delete or overwrite an existing tag, grant `Push` with the force
Jonathan Nieder5758f182015-03-30 11:28:55 -0700690option enabled for reference name `+refs/tags/*+`, as deleting a tag
Fredrik Luthanderd7749862012-01-20 07:29:43 +0100691requires the same permission as deleting a branch.
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100692
Edwin Kempin94db6b62016-09-02 14:37:17 +0200693To push an annotated tag on a new commit (commit not reachable from any
694branch/tag) grant `Push` permission on `+refs/tags/*+` too.
Edwin Kempin439dd1f2016-09-05 16:25:12 +0200695The `Push` permission on `+refs/tags/*+` does *not* allow updating of annotated
Edwin Kempin0a41b9c2016-09-05 16:38:51 +0200696tags, not even fast-forwarding of annotated tags. Update of annotated tags
697is only allowed by granting `Push` with `force` option on `+refs/tags/*+`.
Edwin Kempin94db6b62016-09-02 14:37:17 +0200698
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100699
David Pursehouseb429ce12012-12-12 11:04:40 +0900700[[category_push_signed]]
Edwin Kempin62c15682016-09-05 14:32:38 +0200701[[category_create_signed]]
702=== Create Signed Tag
David Pursehouseb429ce12012-12-12 11:04:40 +0900703
David Pursehouse690cebe2012-12-12 19:22:45 +0900704This category permits users to push a PGP signed tag object into the
705project's repository. Typically this would be done with a command
706line such as:
David Pursehouseb429ce12012-12-12 11:04:40 +0900707
Michael Ochmannb99feab2016-07-06 14:10:22 +0200708----
David Pursehouseb429ce12012-12-12 11:04:40 +0900709 git push ssh://USER@HOST:PORT/PROJECT tag v1.0
Michael Ochmannb99feab2016-07-06 14:10:22 +0200710----
David Pursehouseb429ce12012-12-12 11:04:40 +0900711
David Pursehouse690cebe2012-12-12 19:22:45 +0900712Or:
713
Michael Ochmannb99feab2016-07-06 14:10:22 +0200714----
David Pursehouse690cebe2012-12-12 19:22:45 +0900715 git push https://HOST/PROJECT tag v1.0
Michael Ochmannb99feab2016-07-06 14:10:22 +0200716----
David Pursehouse690cebe2012-12-12 19:22:45 +0900717
David Pursehouseb429ce12012-12-12 11:04:40 +0900718Tags must be signed (created with `git tag -s`), should exist in the
719`refs/tags/` namespace, and should be new.
720
721
Fredrik Luthander5e1b51b2012-01-20 13:06:06 +0100722[[category_read]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800723=== Read
Fredrik Luthander5e1b51b2012-01-20 13:06:06 +0100724
725The `Read` category controls visibility to the project's
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100726changes, comments, code diffs, and Git access over SSH or HTTP.
Fredrik Luthander5e1b51b2012-01-20 13:06:06 +0100727A user must have this access granted in order to see a project, its
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100728changes, or any of its data.
729
Nasser Grainawi990284e2019-05-24 11:12:47 -0600730[[read_special_behaviors]]
731==== Special behaviors
732
733This category has multiple special behaviors:
734
735The per-project ACL is evaluated before the global all projects ACL.
736If the per-project ACL has granted `Read` with 'DENY', and does not
737otherwise grant `Read` with 'ALLOW', then a `Read` in the all projects
738ACL is ignored. This behavior is useful to hide a handful of projects
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100739on an otherwise public server.
740
Nasser Grainawi990284e2019-05-24 11:12:47 -0600741You cannot grant `Read` on the `refs/tags/` namespace. Visibility to
742`refs/tags/` is derived from `Read` grants on refs namespaces other than
743`refs/tags/`, `refs/changes/`, and `refs/cache-automerge/` by finding
744tags reachable from those refs. For example, if a tag `refs/tags/test`
745points to a commit on the branch `refs/heads/master`, then allowing
746`Read` access to `refs/heads/master` would also allow access to
747`refs/tags/test`. If a tag is reachable from multiple refs, allowing
748access to any of those refs allows access to the tag.
749
750[[read_typical_usage]]
751==== Typical usage
752
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100753For an open source, public Gerrit installation it is common to grant
Fredrik Luthander5e1b51b2012-01-20 13:06:06 +0100754`Read` to `Anonymous Users` in the `All-Projects` ACL, enabling
755casual browsing of any project's changes, as well as fetching any
756project's repository over SSH or HTTP. New projects can be
757temporarily hidden from public view by granting `Read` with 'DENY'
758to `Anonymous Users` and granting `Read` to the project owner's
759group within the per-project ACL.
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100760
761For a private Gerrit installation using a trusted HTTP authentication
Fredrik Luthander5e1b51b2012-01-20 13:06:06 +0100762source, granting `Read` to `Registered Users` may be more
Fredrik Luthanderdb7679a2011-11-03 08:52:56 +0100763typical, enabling read access only to those users who have been
764able to authenticate through the HTTP access controls. This may
765be suitable in a corporate deployment if the HTTP access control
766is already restricted to the correct set of users.
767
Fredrik Luthander5e1b51b2012-01-20 13:06:06 +0100768
Edwin Kempinfd330fc2012-05-09 21:09:55 +0200769[[category_rebase]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800770=== Rebase
Edwin Kempinfd330fc2012-05-09 21:09:55 +0200771
772This category permits users to rebase changes via the web UI by pushing
773the `Rebase Change` button.
774
775The change owner and submitters can always rebase changes in the web UI
776(even without having the `Rebase` access right assigned).
777
778Users without this access right who are able to upload new patch sets
779can still do the rebase locally and upload the rebased commit as a new
780patch set.
781
Fredrik Luthandera8aa9c52013-05-09 14:50:39 +0200782
Chad Horohoec626f3c2012-09-13 11:04:20 -0700783[[category_remove_reviewer]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800784=== Remove Reviewer
Chad Horohoec626f3c2012-09-13 11:04:20 -0700785
786This category permits users to remove other users from the list of
787reviewers on a change.
788
David Pursehouseb3d13832014-12-04 14:50:37 +0900789Change owners can always remove reviewers who have given a zero or positive
790score (even without having the `Remove Reviewer` access right assigned).
791
792Project owners and site administrators can always remove any reviewer (even
793without having the `Remove Reviewer` access right assigned).
Chad Horohoec626f3c2012-09-13 11:04:20 -0700794
795Users without this access right can only remove themselves from the
796reviewer list on a change.
797
Edwin Kempinfd330fc2012-05-09 21:09:55 +0200798
Fredrik Luthander5ccf2e42013-05-08 01:06:25 +0200799[[category_review_labels]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800800=== Review Labels
Fredrik Luthander5ccf2e42013-05-08 01:06:25 +0200801
802For every configured label `My-Name` in the project, there is a
803corresponding permission `label-My-Name` with a range corresponding to
Shawn Pearce9d783122013-06-11 18:18:03 -0700804the defined values. There is also a corresponding `labelAs-My-Name`
805permission that enables editing another user's label.
Fredrik Luthander5ccf2e42013-05-08 01:06:25 +0200806
807Gerrit comes pre-configured with a default 'Code-Review' label that can
808be granted to groups within projects, enabling functionality for that
809group's members. link:config-labels.html[Custom labels] may also be
810defined globally or on a per-project basis.
811
812
Fredrik Luthander5e1b51b2012-01-20 13:06:06 +0100813[[category_submit]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800814=== Submit
Shawn O. Pearce4b122b82009-02-18 18:22:14 -0800815
David Pursehouse6bf46ed2015-02-04 20:31:23 +0900816This category permits users to submit changes.
Shawn O. Pearce4b122b82009-02-18 18:22:14 -0800817
818Submitting a change causes it to be merged into the destination
819branch as soon as possible, making it a permanent part of the
David Pursehouse22bd6f92014-02-20 21:11:01 +0900820project's history.
Shawn O. Pearce4b122b82009-02-18 18:22:14 -0800821
Dave Borowitz01c1b1f2013-02-27 13:49:04 -0800822In order to submit, all labels (such as `Verified` and `Code-Review`,
823above) must enable submit, and also must not block it. See above for
824details on each label.
Shawn O. Pearce4b122b82009-02-18 18:22:14 -0800825
Edwin Kempinbfa06212013-04-04 16:06:39 +0200826To link:user-upload.html#auto_merge[immediately submit a change on push]
Dave Borowitz942a8fe2018-04-24 11:56:17 -0400827the caller needs to have the Submit permission on `refs/for/<ref>`
828(e.g. on `refs/for/refs/heads/master`).
Edwin Kempinbfa06212013-04-04 16:06:39 +0200829
Edwin Kempin1493bd62016-12-02 10:12:17 +0100830Submitting to the `refs/meta/config` branch is only allowed to project
831owners. Any explicit submit permissions for non-project-owners on this
832branch are ignored. By submitting to the `refs/meta/config` branch the
833configuration of the project is changed, which can include changes to
834the access rights of the project. Allowing this to be done by a
835non-project-owner would open a security hole enabling editing of access
836rights, and thus granting of powers beyond submitting to the
837configuration.
838
David Pursehouse22bd6f92014-02-20 21:11:01 +0900839[[category_submit_on_behalf_of]]
840=== Submit (On Behalf Of)
841
842This category permits users who have also been granted the `Submit`
Dave Borowitzc6d143d2016-02-24 12:32:23 -0500843permission to submit changes on behalf of another user, by using the
844`on_behalf_of` field in link:rest-api-changes.html#submit-input[SubmitInput]
845when link:rest-api-changes.html#submit-change[submitting using the REST API].
David Pursehouse22bd6f92014-02-20 21:11:01 +0900846
847Note that this permission is named `submitAs` in the `project.config`
848file.
Fredrik Luthanderbc75ef72012-01-26 15:57:08 +0100849
Edwin Kempin98ddc8a2017-02-21 11:56:08 +0100850[[category_view_private_changes]]
851=== View Private Changes
852
Edwin Kempin311be602018-12-28 14:03:50 +0100853This category permits users to view all private changes and all change edit refs.
Edwin Kempin98ddc8a2017-02-21 11:56:08 +0100854
855The change owner and any explicitly added reviewers can always see
856private changes (even without having the `View Private Changes` access
857right assigned).
858
David Pursehousebe7f4582012-12-12 11:21:29 +0900859
Paladox none580ae0e2017-02-12 18:15:48 +0000860[[category_delete_own_changes]]
861=== Delete Own Changes
862
863This category permits users to delete their own changes if they are not merged
864yet. This means only own changes that are open or abandoned can be deleted.
865
David Pursehouse42488f82018-07-05 13:24:47 +0900866[[category_delete_changes]]
867=== Delete Changes
868
869This category permits users to delete other users' changes if they are not merged
870yet. This means only changes that are open or abandoned can be deleted.
871
872Having this permission implies having the link:#category_delete_own_changes[
873Delete Own Changes] permission.
874
875Administrators may always delete changes without having this permission.
876
David Pursehouse59aee362012-11-15 17:25:17 +0900877[[category_edit_topic_name]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800878=== Edit Topic Name
David Pursehouse59aee362012-11-15 17:25:17 +0900879
880This category permits users to edit the topic name of a change that
881is uploaded for review.
882
883The change owner, branch owners, project owners, and site administrators
884can always edit the topic name (even without having the `Edit Topic Name`
885access right assigned).
886
Edwin Kempin1f77b532013-11-08 07:16:31 +0100887Whether the topic can be edited on closed changes can be controlled
888by the 'Force Edit' flag. If this flag is not set the topic can only be
889edited on open changes.
890
David Pursehouse59aee362012-11-15 17:25:17 +0900891
David Pursehousede711702014-09-10 16:23:34 +0200892[[category_edit_hashtags]]
893=== Edit Hashtags
894
Dave Borowitzdaf0f0f2018-03-15 10:37:54 -0400895This category permits users to add or remove
896link:intro-user.html#hashtags[hashtags] on a change that is uploaded for review.
David Pursehousede711702014-09-10 16:23:34 +0200897
898The change owner, branch owners, project owners, and site administrators
899can always edit or remove hashtags (even without having the `Edit Hashtags`
900access right assigned).
901
Sven Selberga3ca6042016-09-13 16:16:54 +0200902[[category_edit_assigned_to]]
903=== Edit Assignee
904
905This category permits users to set who is assigned to a change that is
906uploaded for review.
907
908The change owner, ref owners, and the user currently assigned to a change
909can always change the assignee.
David Pursehousede711702014-09-10 16:23:34 +0200910
Edwin Kempin4bf01962014-04-16 16:47:10 +0200911[[example_roles]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800912== Examples of typical roles in a project
Fredrik Luthanderbc75ef72012-01-26 15:57:08 +0100913
914Below follows a set of typical roles on a server and which access
915rights these roles typically should be granted. You may see them as
David Pursehouse221d4f62012-06-08 17:38:08 +0900916general guidelines for a typical way to set up your project on a
Fredrik Luthanderbc75ef72012-01-26 15:57:08 +0100917brand new Gerrit instance.
918
Fredrik Luthandera8aa9c52013-05-09 14:50:39 +0200919
Fredrik Luthanderbc75ef72012-01-26 15:57:08 +0100920[[examples_contributor]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800921=== Contributor
Fredrik Luthanderbc75ef72012-01-26 15:57:08 +0100922
923This is the typical user on a public server. They are able to read
924your project and upload new changes to it. They are able to give
925feedback on other changes as well, but are unable to block or approve
926any changes.
927
928Suggested access rights to grant:
929
Nasser Grainawi990284e2019-05-24 11:12:47 -0600930* xref:category_read[`Read`] on 'refs/heads/\*'
Dave Borowitzaa912272018-04-24 12:48:09 -0400931* xref:category_push[`Push`] to 'refs/for/refs/heads/*'
Dave Borowitz01c1b1f2013-02-27 13:49:04 -0800932* link:config-labels.html#label_Code-Review[`Code-Review`] with range '-1' to '+1' for 'refs/heads/*'
Fredrik Luthanderbc75ef72012-01-26 15:57:08 +0100933
Fredrik Luthanderd6c59252014-03-17 00:56:04 +0100934If it's desired to have the possibility to upload temporarily hidden
935changes there's a specific permission for that. This enables someone
936to add specific reviewers for early feedback before making the change
David Ostrovsky6ffb7d92017-02-13 21:16:58 +0100937publicly visible.
Fredrik Luthanderd6c59252014-03-17 00:56:04 +0100938
Fredrik Luthanderbc75ef72012-01-26 15:57:08 +0100939
Fredrik Luthander654161c2012-01-31 14:42:36 +0100940[[examples_developer]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800941=== Developer
Fredrik Luthander654161c2012-01-31 14:42:36 +0100942
943This is the typical core developer on a public server. They are able
944to read the project, upload changes to a branch. They are allowed to
945push merge commits to merge branches together. Also, they are allowed
946to forge author identity, thus handling commits belonging to others
947than themselves, effectively allowing them to transfer commits
948between different branches.
949
950They are furthermore able to code review and verify commits, and
951eventually submit them. If you have an automated CI system that
952builds all uploaded patch sets you might want to skip the
953verification rights for the developer and let the CI system do that
954exclusively.
955
956Suggested access rights to grant:
957
Nasser Grainawi990284e2019-05-24 11:12:47 -0600958* xref:category_read[`Read`] on 'refs/heads/\*'
Dave Borowitzaa912272018-04-24 12:48:09 -0400959* xref:category_push[`Push`] to 'refs/for/refs/heads/*'
Dave Borowitz942a8fe2018-04-24 11:56:17 -0400960* xref:category_push_merge[`Push merge commit`] to 'refs/for/refs/heads/*'
Dave Borowitz01c1b1f2013-02-27 13:49:04 -0800961* xref:category_forge_author[`Forge Author Identity`] to 'refs/heads/*'
962* link:config-labels.html#label_Code-Review[`Label: Code-Review`] with range '-2' to '+2' for 'refs/heads/*'
Peter Jönsson3bfcae72013-07-17 22:06:32 +0200963* link:config-labels.html#label_Verified[`Label: Verified`] with range '-1' to '+1' for 'refs/heads/*'
Edwin Kempin7b1897c2015-04-16 15:13:44 +0200964* xref:category_submit[`Submit`] on 'refs/heads/*'
Fredrik Luthander654161c2012-01-31 14:42:36 +0100965
966If the project is small or the developers are seasoned it might make
967sense to give them the freedom to push commits directly to a branch.
968
969Optional access rights to grant:
970
971* <<category_push,`Push`>> to 'refs/heads/*'
972* <<category_push_merge,`Push merge commit`>> to 'refs/heads/*'
973
974
Fredrik Luthanderf2105be2012-01-27 12:44:05 +0100975[[examples_cisystem]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800976=== CI system
Fredrik Luthanderf2105be2012-01-27 12:44:05 +0100977
Gustaf Lundha28a1d22013-05-08 15:05:12 +0100978A typical Continuous Integration system should be able to download new changes
Fredrik Luthanderf2105be2012-01-27 12:44:05 +0100979to build and then leave a verdict somehow.
980
981As an example, the popular
Marian Harbach34253372019-12-10 18:01:31 +0100982link:https://wiki.jenkins-ci.org/display/JENKINS/Gerrit+Trigger[gerrit-trigger plugin,role=external,window=_blank]
Fredrik Luthanderf2105be2012-01-27 12:44:05 +0100983for Jenkins/Hudson can set labels at:
984
985* The start of a build
986* A successful build
987* An unstable build (tests fails)
988* A failed build
989
Peter Jönsson3bfcae72013-07-17 22:06:32 +0200990Usually the range chosen for this verdict is the `Verified` label. Depending on
Fredrik Luthanderf2105be2012-01-27 12:44:05 +0100991the size of your project and discipline of involved developers you might want
Peter Jönsson3bfcae72013-07-17 22:06:32 +0200992to limit access right to the +1 `Verified` label to the CI system only. That
Fredrik Luthanderf2105be2012-01-27 12:44:05 +0100993way it's guaranteed that submitted commits always get built and pass tests
994successfully.
995
996If the build doesn't complete successfully the CI system can set the
Peter Jönsson3bfcae72013-07-17 22:06:32 +0200997`Verified` label to -1. However that means that a failed build will block
998submit of the change even if someone else sets `Verified` +1. Depending on the
Fredrik Luthanderf2105be2012-01-27 12:44:05 +0100999project and how much the CI system can be trusted for accurate results, a
1000blocking label might not be feasible. A recommended alternative is to set the
1001label `Code-review` to -1 instead, as it isn't a blocking label but still
David Pursehouse221d4f62012-06-08 17:38:08 +09001002shows a red label in the Gerrit UI. Optionally, to enable the possibility to
1003deliver different results (build error vs unstable for instance), it's also
Fredrik Luthanderf2105be2012-01-27 12:44:05 +01001004possible to set `Code-review` +1 as well.
1005
Edwin Kempina2e13cf2012-03-30 09:02:36 +02001006If pushing new changes is granted, it's possible to automate cherry-pick of
Fredrik Luthanderf2105be2012-01-27 12:44:05 +01001007submitted changes for upload to other branches under certain conditions. This
1008is probably not the first step of what a project wants to automate however,
1009and so the push right can be found under the optional section.
1010
1011Suggested access rights to grant, that won't block changes:
1012
Nasser Grainawi990284e2019-05-24 11:12:47 -06001013* xref:category_read[`Read`] on 'refs/heads/\*'
Dave Borowitz01c1b1f2013-02-27 13:49:04 -08001014* link:config-labels.html#label_Code-Review[`Label: Code-Review`] with range '-1' to '0' for 'refs/heads/*'
Peter Jönsson3bfcae72013-07-17 22:06:32 +02001015* link:config-labels.html#label_Verified[`Label: Verified`] with range '0' to '+1' for 'refs/heads/*'
Fredrik Luthanderf2105be2012-01-27 12:44:05 +01001016
1017Optional access rights to grant:
1018
Dave Borowitz01c1b1f2013-02-27 13:49:04 -08001019* link:config-labels.html#label_Code-Review[`Label: Code-Review`] with range '-1' to '+1' for 'refs/heads/*'
Dave Borowitzaa912272018-04-24 12:48:09 -04001020* xref:category_push[`Push`] to 'refs/for/refs/heads/*'
1021
Fredrik Luthanderf2105be2012-01-27 12:44:05 +01001022
Fredrik Luthanderfe720022012-03-22 17:29:39 +01001023[[examples_integrator]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001024=== Integrator
Fredrik Luthanderfe720022012-03-22 17:29:39 +01001025
1026Integrators are like developers but with some additional rights granted due
1027to their administrative role in a project. They can upload or push any commit
1028with any committer email (not just their own) and they can also create new
1029tags and branches.
1030
1031Suggested access rights to grant:
1032
1033* <<examples_developer,Developer rights>>
1034* <<category_push,`Push`>> to 'refs/heads/*'
1035* <<category_push_merge,`Push merge commit`>> to 'refs/heads/*'
Fredrik Luthander404a2852012-10-10 08:51:22 +02001036* <<category_forge_committer,`Forge Committer Identity`>> to 'refs/for/refs/heads/*'
Fredrik Luthanderfe720022012-03-22 17:29:39 +01001037* <<category_create,`Create Reference`>> to 'refs/heads/*'
Edwin Kempin62c15682016-09-05 14:32:38 +02001038* <<category_create_annotated,`Create Annotated Tag`>> to 'refs/tags/*'
Fredrik Luthanderfe720022012-03-22 17:29:39 +01001039
1040
Fredrik Luthander9c645362012-03-22 18:10:42 +01001041[[examples_project-owner]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001042=== Project owner
Fredrik Luthander9c645362012-03-22 18:10:42 +01001043
1044The project owner is almost like an integrator but with additional destructive
1045power in the form of being able to delete branches. Optionally these users
1046also have the power to configure access rights in gits assigned to them.
1047
1048[WARNING]
Gustaf Lundha28a1d22013-05-08 15:05:12 +01001049These users should be really knowledgeable about git, for instance knowing why
Fredrik Luthander9c645362012-03-22 18:10:42 +01001050tags never should be removed from a server. This role is granted potentially
1051destructive access rights and cleaning up after such a mishap could be time
1052consuming!
1053
1054Suggested access rights to grant:
1055
1056* <<examples_integrator,Integrator rights>>
1057* <<category_push,`Push`>> with the force option to 'refs/heads/\*' and 'refs/tags/*'
1058
1059Optional access right to grant:
1060
1061* <<category_owner,`Owner`>> in the gits they mostly work with.
1062
Fredrik Luthandera8aa9c52013-05-09 14:50:39 +02001063
Fredrik Luthander5a8e7d82012-03-22 17:29:39 +01001064[[examples_administrator]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001065=== Administrator
Fredrik Luthander5a8e7d82012-03-22 17:29:39 +01001066
1067The administrator role is the most powerful role known in the Gerrit universe.
Fredrik Luthanderb8eaa082014-03-17 01:02:22 +01001068This role may grant itself (or others) any access right. By default the
Fredrik Luthander5a8e7d82012-03-22 17:29:39 +01001069<<administrators,`Administrators` group>> is the group that has this role.
1070
1071Mandatory access rights:
1072
1073* <<capability_administrateServer,The `Administrate Server` capability>>
1074
1075Suggested access rights to grant:
1076
Fredrik Luthanderb8eaa082014-03-17 01:02:22 +01001077* <<examples_project-owner,`Project owner rights`>>
1078* Any <<global_capabilities,`capabilities`>> needed by the administrator
Fredrik Luthander5a8e7d82012-03-22 17:29:39 +01001079
Fredrik Luthandera8aa9c52013-05-09 14:50:39 +02001080
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001081== Enforcing site wide access policies
Sasa Zivkovd589f462013-02-12 14:27:09 +01001082
Jonathan Nieder5758f182015-03-30 11:28:55 -07001083By granting the <<category_owner,`Owner`>> access right on the `+refs/*+` to a
Sasa Zivkovd589f462013-02-12 14:27:09 +01001084group, Gerrit administrators can delegate the responsibility of maintaining
1085access rights for that project to that group.
1086
1087In a corporate deployment it is often necessary to enforce some access
1088policies. An example could be that no-one can update or delete a tag, not even
1089the project owners. The 'ALLOW' and 'DENY' rules are not enough for this
1090purpose as project owners can grant themselves any access right they wish and,
1091thus, effectively override any inherited access rights from the
1092"`All-Projects`" or some other common parent project.
1093
1094What is needed is a mechanism to block a permission in a parent project so
1095that even project owners cannot allow a blocked permission in their child
1096project. Still, project owners should retain the possibility to manage all
1097non-blocked rules as they wish. This gives best of both worlds:
1098
1099* Gerrit administrators can concentrate on enforcing site wide policies
1100 and providing a meaningful set of default access permissions
1101* Project owners can manage access rights of their projects without a danger
1102 of violating a site wide policy
1103
Fredrik Luthandera8aa9c52013-05-09 14:50:39 +02001104
Edwin Kempin60ab8532013-03-27 14:33:46 +01001105[[block]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001106=== 'BLOCK' access rule
Sasa Zivkovd589f462013-02-12 14:27:09 +01001107
Tyler Ciprianiefd09b62019-03-27 21:36:09 -06001108The 'BLOCK' rule can be used to take away rights from users. The BLOCK rule
1109works across project inheritance, from the top down, so an administrator can
1110use 'BLOCK' rules to enforce site-wide restrictions.
1111
1112For example, if a user in the 'Foo Users' group tries to push to
1113'refs/heads/mater' with the permissions below, that user will be blocked
1114
1115[options="header"]
1116|=========================================================================
1117|Project | Inherits From |Reference Name |Permissions |
1118|All-Projects | - |refs/* |push = block Foo Users |
1119|Foo | All-Projects |refs/heads/* |push = Foo Users |
1120|=========================================================================
1121
1122'BLOCK' rules are evaluated starting from the parent project, and after a 'BLOCK'
1123rule is found to apply, further rules are ignored. Hence, in this example, the
1124permissions on child-project is ignored.
1125
1126----
1127All-Projects: project.config
1128 [access "refs/heads/*"]
1129 push = block group X
1130
1131child-project: project.config
1132 [access "refs/heads/*"]
1133 exclusiveGroupPermissions = push
1134 push = group X
1135----
1136
1137In this case push for group 'X' will be blocked, even though the Exclusive
1138flag was set for the child-project.
Sasa Zivkovd589f462013-02-12 14:27:09 +01001139
1140A 'BLOCK' rule that blocks the 'push' permission blocks any type of push,
1141force or not. A blocking force push rule blocks only force pushes, but
1142allows non-forced pushes if an 'ALLOW' rule would have permitted it.
1143
Tyler Ciprianiefd09b62019-03-27 21:36:09 -06001144It is also possible to block label ranges. To block a group 'X' from voting
Sasa Zivkovd589f462013-02-12 14:27:09 +01001145'-2' and '+2', but keep their existing voting permissions for the '-1..+1'
1146range intact we would define:
1147
Michael Ochmannb99feab2016-07-06 14:10:22 +02001148----
Sasa Zivkovd589f462013-02-12 14:27:09 +01001149 [access "refs/heads/*"]
1150 label-Code-Review = block -2..+2 group X
Michael Ochmannb99feab2016-07-06 14:10:22 +02001151----
Sasa Zivkovd589f462013-02-12 14:27:09 +01001152
1153The interpretation of the 'min..max' range in case of a blocking rule is: block
1154every vote from '-INFINITE..min' and 'max..INFINITE'. For the example above it
1155means that the range '-1..+1' is not affected by this block.
1156
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001157=== 'BLOCK' and 'ALLOW' rules in the same access section
Sasa Zivkovcff084b2013-01-15 18:52:32 +01001158
1159When an access section of a project contains a 'BLOCK' and an 'ALLOW' rule for
1160the same permission then this 'ALLOW' rule overrides the 'BLOCK' rule:
1161
Michael Ochmannb99feab2016-07-06 14:10:22 +02001162----
Sasa Zivkovcff084b2013-01-15 18:52:32 +01001163 [access "refs/heads/*"]
1164 push = block group X
1165 push = group Y
Michael Ochmannb99feab2016-07-06 14:10:22 +02001166----
Sasa Zivkovcff084b2013-01-15 18:52:32 +01001167
1168In this case a user which is a member of the group 'Y' will still be allowed to
1169push to 'refs/heads/*' even if it is a member of the group 'X'.
1170
Tyler Ciprianiefd09b62019-03-27 21:36:09 -06001171=== 'BLOCK' and 'ALLOW' rules in the same project with the Exclusive flag
1172
1173When a project contains a 'BLOCK' and 'ALLOW' that uses the Exclusive flag in a
1174more specific reference, the 'ALLOW' rule with the Exclusive flag will override
1175the 'BLOCK' rule:
1176
1177----
1178 [access "refs/*"]
1179 read = block group X
1180
1181 [access "refs/heads/*"]
1182 exclusiveGroupPermissions = read
1183 read = group X
1184----
1185
1186In this case a user which is a member of the group 'X' will still be allowed to
1187read 'refs/heads/*'.
1188
Michael Ochmann8129ece2016-07-08 11:25:25 +02001189[NOTE]
1190An 'ALLOW' rule overrides a 'BLOCK' rule only when both of them are
Sasa Zivkovcff084b2013-01-15 18:52:32 +01001191inside the same access section of the same project. An 'ALLOW' rule in a
1192different access section of the same project or in any access section in an
1193inheriting project cannot override a 'BLOCK' rule.
1194
Fredrik Luthandera8aa9c52013-05-09 14:50:39 +02001195
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001196=== Examples
Sasa Zivkovd589f462013-02-12 14:27:09 +01001197
1198The following examples show some possible use cases for the 'BLOCK' rules.
1199
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001200==== Make sure no one can update or delete a tag
Sasa Zivkovd589f462013-02-12 14:27:09 +01001201
1202This requirement is quite common in a corporate deployment where
1203reproducibility of a build must be guaranteed. To achieve that we block 'push'
1204permission for the <<anonymous_users,'Anonymous Users'>> in "`All-Projects`":
1205
Michael Ochmannb99feab2016-07-06 14:10:22 +02001206----
Sasa Zivkovd589f462013-02-12 14:27:09 +01001207 [access "refs/tags/*"]
1208 push = block group Anonymous Users
Michael Ochmannb99feab2016-07-06 14:10:22 +02001209----
Sasa Zivkovd589f462013-02-12 14:27:09 +01001210
1211By blocking the <<anonymous_users,'Anonymous Users'>> we effectively block
1212everyone as everyone is a member of that group. Note that the permission to
1213create a tag is still necessary. Assuming that only <<category_owner,project
1214owners>> are allowed to create tags, we would extend the example above:
1215
Michael Ochmannb99feab2016-07-06 14:10:22 +02001216----
Sasa Zivkovd589f462013-02-12 14:27:09 +01001217 [access "refs/tags/*"]
1218 push = block group Anonymous Users
1219 create = group Project Owners
1220 pushTag = group Project Owners
Michael Ochmannb99feab2016-07-06 14:10:22 +02001221----
Fredrik Luthander9c645362012-03-22 18:10:42 +01001222
Fredrik Luthandera8aa9c52013-05-09 14:50:39 +02001223
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001224==== Let only a dedicated group vote in a special category
Sasa Zivkovcff084b2013-01-15 18:52:32 +01001225
1226Assume there is a more restrictive process for submitting changes in stable
1227release branches which is manifested as a new voting category
1228'Release-Process'. Assume we want to make sure that only a 'Release Engineers'
1229group can vote in this category and that even project owners cannot approve
1230this category. We have to block everyone except the 'Release Engineers' to vote
1231in this category and, of course, allow 'Release Engineers' to vote in that
1232category. In the "`All-Projects`" we define the following rules:
1233
Michael Ochmannb99feab2016-07-06 14:10:22 +02001234----
Sasa Zivkovcff084b2013-01-15 18:52:32 +01001235 [access "refs/heads/stable*"]
Gustaf Lundha28a1d22013-05-08 15:05:12 +01001236 label-Release-Process = block -1..+1 group Anonymous Users
1237 label-Release-Process = -1..+1 group Release Engineers
Michael Ochmannb99feab2016-07-06 14:10:22 +02001238----
Sasa Zivkovcff084b2013-01-15 18:52:32 +01001239
David Pursehouse8becc2a2013-04-23 18:51:04 +09001240[[global_capabilities]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001241== Global Capabilities
Fredrik Luthander80ebf9d2012-02-13 09:32:43 +01001242
David Pursehouse8becc2a2013-04-23 18:51:04 +09001243The global capabilities control actions that the administrators of
Fredrik Luthander80ebf9d2012-02-13 09:32:43 +01001244the server can perform which usually affect the entire
1245server in some way. The administrators may delegate these
1246capabilities to trusted groups of users.
1247
1248Delegation of capabilities allows groups to be granted a subset of
1249administrative capabilities without being given complete
1250administrative control of the server. This makes it possible to
1251keep fewer users in the administrators group, even while spreading
1252much of the server administration burden out to more users.
1253
David Pursehouse8becc2a2013-04-23 18:51:04 +09001254Global capabilities are assigned to groups in the access rights settings
1255of the root project ("`All-Projects`").
1256
Fredrik Luthander80ebf9d2012-02-13 09:32:43 +01001257Below you find a list of capabilities available:
1258
1259
David Pursehouse11c4c5f2013-06-09 08:07:23 +09001260[[capability_accessDatabase]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001261=== Access Database
David Pursehouse11c4c5f2013-06-09 08:07:23 +09001262
Edwin Kempin0f595f62018-12-10 11:48:42 +01001263Allow users to view code review metadata refs in repositories.
David Pursehouse11c4c5f2013-06-09 08:07:23 +09001264
1265
Fredrik Luthander426885f2012-02-13 09:56:57 +01001266[[capability_administrateServer]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001267=== Administrate Server
Fredrik Luthander426885f2012-02-13 09:56:57 +01001268
1269This is in effect the owner and administrator role of the Gerrit
Edwin Kempin17287422016-04-07 08:44:39 +02001270instance. Any members of a group granted this capability will be
Fredrik Luthander426885f2012-02-13 09:56:57 +01001271able to grant any access right to any group. They will also have all
1272capabilities granted to them automatically.
1273
Edwin Kempin17287422016-04-07 08:44:39 +02001274In most installations only those users who have direct filesystem and
1275database access should be granted this capability.
1276
1277This capability does not imply any other access rights. Users that have
1278this capability do not automatically get code review approval or submit
1279rights in projects. This is a feature designed to permit administrative
1280users to otherwise access Gerrit as any other normal user would,
1281without needing two different accounts.
1282
Fredrik Luthander426885f2012-02-13 09:56:57 +01001283
Bruce Zu4512fe62014-11-18 17:39:41 +08001284[[capability_batchChangesLimit]]
1285=== Batch Changes Limit
1286
1287Allow site administrators to configure the batch changes limit for
1288users to override the system config
1289link:config-gerrit.html#receive.maxBatchChanges['receive.maxBatchChanges'].
1290
1291Administrators can add a global block to `All-Projects` with group(s)
1292that should have different limits.
1293
1294When applying a batch changes limit to a user the largest value
1295granted by any of their groups is used. 0 means no limit.
1296
1297
Fredrik Luthanderb02afca2012-02-13 09:59:48 +01001298[[capability_createAccount]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001299=== Create Account
Fredrik Luthanderb02afca2012-02-13 09:59:48 +01001300
Fredrik Luthander79d38152012-03-13 09:52:22 +01001301Allow link:cmd-create-account.html[account creation over the ssh prompt].
Fredrik Luthanderb02afca2012-02-13 09:59:48 +01001302This capability allows the granted group members to create non-interactive
1303service accounts. These service accounts are generally used for automation
1304and made to be members of the
1305link:access-control.html#non-interactive_users['Non-Interactive users'] group.
1306
1307
Fredrik Luthander79d38152012-03-13 09:52:22 +01001308[[capability_createGroup]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001309=== Create Group
Fredrik Luthander79d38152012-03-13 09:52:22 +01001310
1311Allow group creation. Groups are used to grant users access to different
1312actions in projects. This capability allows the granted group members to
1313either link:cmd-create-group.html[create new groups via ssh] or via the web UI.
1314
1315
1316[[capability_createProject]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001317=== Create Project
Fredrik Luthander79d38152012-03-13 09:52:22 +01001318
1319Allow project creation. This capability allows the granted group to
1320either link:cmd-create-project.html[create new git projects via ssh]
1321or via the web UI.
1322
Fredrik Luthandera8aa9c52013-05-09 14:50:39 +02001323
Sasa Zivkov812f4892012-06-21 16:25:21 +02001324[[capability_emailReviewers]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001325=== Email Reviewers
Sasa Zivkov812f4892012-06-21 16:25:21 +02001326
1327Allow or deny sending email to change reviewers and watchers. This can be used
1328to deny build bots from emailing reviewers and people who watch the change.
1329Instead, only the authors of the change and those who starred it will be
1330emailed. The allow rules are evaluated before deny rules, however the default
1331is to allow emailing, if no explicit rule is matched.
Fredrik Luthander79d38152012-03-13 09:52:22 +01001332
Fredrik Luthandera8aa9c52013-05-09 14:50:39 +02001333
Fredrik Luthander74ad0d02012-03-13 13:06:30 +01001334[[capability_flushCaches]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001335=== Flush Caches
Fredrik Luthander74ad0d02012-03-13 13:06:30 +01001336
Fredrik Luthander48603002012-03-21 18:17:17 +01001337Allow the flushing of Gerrit's caches. This capability allows the granted
Fredrik Luthander74ad0d02012-03-13 13:06:30 +01001338group to link:cmd-flush-caches.html[flush some or all Gerrit caches via ssh].
1339
1340[NOTE]
1341This capability doesn't imply permissions to the show-caches command. For that
1342you need the <<capability_viewCaches,view caches capability>>.
1343
1344
Fredrik Luthander46843022012-03-13 16:11:02 +01001345[[capability_kill]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001346=== Kill Task
Fredrik Luthander46843022012-03-13 16:11:02 +01001347
1348Allow the operation of the link:cmd-kill.html[kill command over ssh]. The
1349kill command ends tasks that currently occupy the Gerrit server, usually
1350a replication task or a user initiated task such as an upload-pack or
Gustaf Lundha28a1d22013-05-08 15:05:12 +01001351receive-pack.
Fredrik Luthander46843022012-03-13 16:11:02 +01001352
Dave Borowitz664d0402015-06-11 15:35:48 -04001353[[capability_maintainServer]]
1354=== Maintain Server
1355
1356Allow basic, constrained server maintenance tasks, such as flushing caches and
1357reindexing changes. Does not grant arbitrary database access, read/write, or
1358ACL management permissions, as might the
1359<<capability_administrateServer,administrate server capability>>.
1360
1361Implies the following capabilities:
1362
1363* <<capability_flushCaches,Flush Caches>>
1364* <<capability_kill,Kill Task>>
1365* <<capability_runGC,Run Garbage Collection>>
1366* <<capability_viewCaches,View Caches>>
1367* <<capability_viewQueue,View Queue>>
1368
David Ostrovskyaa49e272014-07-22 00:55:47 +02001369[[capability_modifyAccount]]
1370=== Modify Account
1371
1372Allow to link:cmd-set-account.html[modify accounts over the ssh prompt].
1373This capability allows the granted group members to modify any user account
Edwin Kempined777162017-11-15 08:23:40 -08001374setting. In addition this capability is required to view secondary emails
1375of other accounts.
Fredrik Luthander46843022012-03-13 16:11:02 +01001376
1377[[capability_priority]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001378=== Priority
Fredrik Luthander46843022012-03-13 16:11:02 +01001379
1380This capability allows users to use
1381link:config-gerrit.html#sshd.batchThreads[the thread pool reserved] for
1382link:access-control.html#non-interactive_users['Non-Interactive Users'].
1383It's a binary value in that granted users either have access to the thread
1384pool, or they don't.
1385
1386There are three modes for this capability and they're listed by rising
1387priority:
1388
1389No capability configured.::
1390The user isn't a member of a group with any priority capability granted. By
1391default the user is then in the 'INTERACTIVE' thread pool.
1392
1393'BATCH'::
1394If there's a thread pool configured for 'Non-Interactive Users' and a user is
1395granted the priority capability with the 'BATCH' mode selected, the user ends
1396up in the separate batch user thread pool. This is true unless the user is
1397also granted the below 'INTERACTIVE' option.
1398
1399'INTERACTIVE'::
1400If a user is granted the priority capability with the 'INTERACTIVE' option,
1401regardless if they also have the 'BATCH' option or not, they are in the
1402'INTERACTIVE' thread pool.
1403
1404
Fredrik Luthander80ebf9d2012-02-13 09:32:43 +01001405[[capability_queryLimit]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001406=== Query Limit
Fredrik Luthander80ebf9d2012-02-13 09:32:43 +01001407
1408Allow site administrators to configure the query limit for users to
1409be above the default hard-coded value of 500. Administrators can add
David Pursehouseb5d99aaf2013-08-09 11:02:48 +09001410a global block to `All-Projects` with group(s) that should have different
1411limits.
Fredrik Luthander80ebf9d2012-02-13 09:32:43 +01001412
1413When applying a query limit to a user the largest value granted by
1414any of their groups is used.
1415
1416This limit applies not only to the link:cmd-query.html[`gerrit query`]
Luca Milanesio1e5d6792019-02-07 20:21:13 +00001417command, but also to the web UI results pagination size in the new
Luca Milanesio5017ba52019-02-01 11:56:42 +01001418PolyGerrit UI and, limited to the full project list, in the old GWT UI.
Fredrik Luthander80ebf9d2012-02-13 09:32:43 +01001419
1420
Sabari Ajay Kumarda8a8ef2018-11-24 23:40:57 -08001421[[capability_readAs]]
1422=== Read As
1423
1424Allow users to impersonate any user to see which refs they can read.
1425
1426
Shawn Pearcebb027b02013-06-10 14:35:39 -07001427[[capability_runAs]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001428=== Run As
Shawn Pearcebb027b02013-06-10 14:35:39 -07001429
Shawn Pearcef3ffd082013-06-12 11:21:35 -07001430Allow users to impersonate any other user with the `X-Gerrit-RunAs`
1431HTTP header on REST API calls, or the link:cmd-suexec.html[suexec]
1432SSH command.
1433
1434When impersonating an administrator the Administrate Server capability
1435is not honored. This security feature tries to prevent a role with
1436Run As capability from modifying the access controls in All-Projects,
1437however modification may still be possible if the impersonated user
1438has permission to push or submit changes on `refs/meta/config`. Run
1439As also blocks using most capabilities including Create User, Run
1440Garbage Collection, etc., unless the capability is also explicitly
1441granted to a group the administrator is a member of.
1442
1443Administrators do not automatically inherit this capability; it must
1444be explicitly granted.
Shawn Pearcebb027b02013-06-10 14:35:39 -07001445
1446
Edwin Kempin619169b2012-02-09 15:47:52 +01001447[[capability_runGC]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001448=== Run Garbage Collection
Edwin Kempin619169b2012-02-09 15:47:52 +01001449
1450Allow users to run the Git garbage collection for the repositories of
1451all projects.
1452
1453
Ed Bartoshd168b812013-04-13 20:15:58 +03001454[[capability_streamEvents]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001455=== Stream Events
Ed Bartoshd168b812013-04-13 20:15:58 +03001456
1457Allow performing streaming of Gerrit events. This capability
1458allows the granted group to
1459link:cmd-stream-events.html[stream Gerrit events via ssh].
1460
1461
Han-Wen Nienhuysa0ce3bb2018-04-17 14:35:10 +02001462[[capability_viewAccess]]
1463=== View Access
1464
1465Allow checking access rights for arbitrary (user, project) pairs,
1466using the link:rest-api-projects.html#check-access[check.access]
1467endpoint
1468
Dave Borowitzf3548a92014-02-20 11:02:19 -08001469[[capability_viewAllAccounts]]
1470=== View All Accounts
1471
1472Allow viewing all accounts for purposes of auto-completion, regardless
1473of link:config-gerrit.html#accounts.visibility[accounts.visibility]
1474setting.
1475
Edwin Kempined777162017-11-15 08:23:40 -08001476This capability allows to view all accounts but not all account data.
1477E.g. secondary emails of all accounts can only be viewed with the
1478link:#capability_modifyAccount[Modify Account] capability.
1479
Dave Borowitzf3548a92014-02-20 11:02:19 -08001480
Fredrik Luthander9c7da662012-03-13 17:49:27 +01001481[[capability_viewCaches]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001482=== View Caches
Fredrik Luthander9c7da662012-03-13 17:49:27 +01001483
Fredrik Luthander48603002012-03-21 18:17:17 +01001484Allow querying for status of Gerrit's internal caches. This capability allows
Fredrik Luthander9c7da662012-03-13 17:49:27 +01001485the granted group to
1486link:cmd-show-caches.html[look at some or all Gerrit caches via ssh].
1487
1488
Fredrik Luthander48603002012-03-21 18:17:17 +01001489[[capability_viewConnections]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001490=== View Connections
Fredrik Luthander48603002012-03-21 18:17:17 +01001491
1492Allow querying for status of Gerrit's current client connections. This
1493capability allows the granted group to
1494link:cmd-show-connections.html[look at Gerrit's current connections via ssh].
1495
1496
Edwin Kempin362b14d12014-05-09 14:18:12 +02001497[[capability_viewPlugins]]
1498=== View Plugins
1499
1500Allow viewing the list of installed plugins.
1501
1502
Fredrik Luthander48603002012-03-21 18:17:17 +01001503[[capability_viewQueue]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001504=== View Queue
Fredrik Luthander48603002012-03-21 18:17:17 +01001505
1506Allow querying for status of Gerrit's internal task queue. This capability
1507allows the granted group to
1508link:cmd-show-queue.html[look at the Gerrit task queue via ssh].
1509
1510
Han-Wen Nienhuyscc3bd442018-02-01 19:30:30 +01001511[[reference]]
1512== Permission evaluation reference
1513
1514Permission evaluation is expressed in the following concepts:
1515
1516* PermisssionRule: a single combination of {ALLOW, DENY, BLOCK} and
1517group, and optionally a vote range and an 'exclusive' bit.
1518
1519* Permission: groups PermissionRule by permission name. All
1520PermissionRules for same access type (eg. "read", "push") are grouped
1521into a Permission implicitly. The exclusive bit lives here.
1522
1523* AccessSection: ties a list of Permissions to a single ref pattern.
1524Each AccessSection comes from a single project.
1525
1526
1527
1528Here is how these play out in a link:config-project-config.html[project.config] file:
1529
1530----
1531 # An AccessSection
1532 [access "refs/heads/stable/*"]
1533 exclusiveGroupPermissions = create
1534
1535 # Each of the following lines corresponds to a PermissionRule
1536 # The next two PermissionRule together form the "read" Permission
1537 read = group Administrators
1538 read = group Registered Users
1539
1540 # A Permission with a block and block-override
1541 create = block group Registered Users
1542 create = group Project Owners
1543
1544 # A Permission and PermissionRule for a label
1545 label-Code-Review = -2..+2 group Project Owners
1546----
1547
1548=== Ref permissions
1549
1550Access to refs can be blocked, allowed or denied.
1551
1552==== BLOCK
1553
1554For blocking access, all rules marked BLOCK are tested, and if one
1555such rule matches, the user is denied access.
1556
1557The rules are ordered by inheritance, starting from All-Projects down.
1558Within a project, more specific ref patterns come first. The downward
1559ordering lets administrators enforce access rules across all projects
1560in a site.
1561
1562BLOCK rules can have exceptions defined on the same project (eg. BLOCK
1563anonymous users, ie. everyone, but make an exception for Admin users),
1564either by:
1565
15661. adding ALLOW PermissionRules in the same Permission. This implies
1567they apply to the same ref pattern.
1568
15692. adding an ALLOW Permission in the same project with a more specific
1570ref pattern, but marked "exclusive". This allows them to apply to
1571different ref patterns.
1572
1573Such additions not only bypass BLOCK rules, but they will also grant
1574permissions when they are processed in the ALLOW/DENY processing, as
1575described in the next subsection.
1576
1577==== ALLOW
1578
1579For allowing access, all ALLOW/DENY rules that might apply to a ref
1580are tested until one granting access is found, or until either an
1581"exclusive" rule ends the search, or all rules have been tested.
1582
1583The rules are ordered from specific ref patterns to general patterns,
1584and for equally specific patterns, from originating project up to
1585All-Projects.
1586
1587This ordering lets project owners apply permissions specific to their
1588project, overwriting the site defaults specified in All-Projects.
1589
1590==== DENY
1591
1592DENY is processed together with ALLOW.
1593
1594As said, during ALLOW/DENY processing, rules are tried out one by one.
1595For each (permission, ref-pattern, group) only a single rule
1596ALLOW/DENY rule is picked. If that first rule is a DENY rule, any
1597following ALLOW rules for the same (permission, ref-pattern, group)
1598will be ignored, canceling out their effect.
1599
1600DENY is confusing because it only works on a specific (ref-pattern,
1601group) pair. The parent project can undo the effect of a DENY rule by
1602introducing an extra rule which features a more general ref pattern or
1603a different group.
1604
1605==== DENY/ALLOW example
1606
1607Consider the ref "refs/a" and the following configuration:
1608----
1609
1610child-project: project.config
1611 [access "refs/a"]
1612 read = deny group A
1613
1614All-Projects: project.config
1615 [access "refs/a"]
1616 read = group A # ALLOW
1617 [access "refs/*"]
1618 read = group B # ALLOW
1619----
1620
1621When determining access, first "read = DENY group A" on "refs/a" is
1622encountered. The following rule to consider is "ALLOW read group A" on
1623"refs/a". The latter rule applies to the same (permission,
1624ref-pattern, group) tuple, so it it is ignored.
1625
1626The DENY rule does not affect the last rule for "refs/*", since that
1627has a different ref pattern and a different group. If group B is a
1628superset of group A, the last rule will still grant group A access to
1629"refs/a".
1630
1631
1632==== Double use of exclusive
1633
1634An 'exclusive' permission is evaluated both during BLOCK processing
1635and during ALLOW/DENY: when looking BLOCK, 'exclusive' stops the
1636search downward, while the same permission in the ALLOW/DENY
1637processing will stop looking upward for further rule matches
1638
1639==== Force permission
1640
1641The 'force' setting may be set on ALLOW and BLOCK rules. In the case
1642of ALLOW, the 'force' option makes the permission stronger (allowing
1643both forced and unforced actions). For BLOCK, the 'force' option makes
1644it weaker (the BLOCK with 'force' only blocks forced actions).
1645
1646
1647=== Labels
1648
1649Labels use the same mechanism, with the following observations:
1650
1651* The 'force' setting has no effect on label ranges.
1652
1653* BLOCK specifies the values that a group cannot vote, eg.
David Shevitzc89249b2018-09-21 10:04:20 -07001654+
Han-Wen Nienhuyscc3bd442018-02-01 19:30:30 +01001655----
1656 label-Code-Review = block -2..+2 group Anonymous Users
1657----
David Shevitzc89249b2018-09-21 10:04:20 -07001658+
Han-Wen Nienhuyscc3bd442018-02-01 19:30:30 +01001659prevents all users from voting -2 or +2.
1660
1661* DENY works for votes too, with the same caveats
1662
1663* The blocked vote range is the union of the all the blocked vote
1664ranges across projects, so in
David Shevitzc89249b2018-09-21 10:04:20 -07001665+
Han-Wen Nienhuyscc3bd442018-02-01 19:30:30 +01001666----
1667All-Projects: project.config
1668 label-Code-Review = block -2..+1 group A
1669
1670Child-Project: project-config
1671 label-Code-Review = block -1..+2 group A
1672----
David Shevitzc89249b2018-09-21 10:04:20 -07001673+
Han-Wen Nienhuyscc3bd442018-02-01 19:30:30 +01001674members of group A cannot vote at all in the Child-Project.
1675
1676
1677* The allowed vote range is the union of vote ranges allowed by all of
1678the ALLOW rules. For example, in
David Shevitzc89249b2018-09-21 10:04:20 -07001679+
Han-Wen Nienhuyscc3bd442018-02-01 19:30:30 +01001680----
1681 label-Code-Review = -2..+1 group A
1682 label-Code-Review = -1..+2 group B
1683----
David Shevitzc89249b2018-09-21 10:04:20 -07001684+
Han-Wen Nienhuyscc3bd442018-02-01 19:30:30 +01001685a user that is both in A and B can vote -2..2.
1686
1687
Shawn O. Pearce5500e692009-05-28 15:55:01 -07001688GERRIT
1689------
1690Part of link:index.html[Gerrit Code Review]
Yuxuan 'fishy' Wang99cb68d2013-10-31 17:26:00 -07001691
1692SEARCHBOX
1693---------