|  | :linkattrs: | 
|  | = Gerrit Code Review - Access Controls | 
|  |  | 
|  | Access controls in Gerrit are group based.  Every user account is a | 
|  | member of one or more groups, and access and privileges are granted | 
|  | to those groups.  Access rights cannot be granted to individual | 
|  | users. | 
|  |  | 
|  | To view/edit the access controls for a specific project, first | 
|  | navigate to the projects page: for example, | 
|  | https://gerrit-review.googlesource.com/admin/repos/[role=external,window=_blank]. Then click on | 
|  | the individual project, and then click Access. This will bring you | 
|  | to a url that looks like | 
|  | https://gerrit-review.googlesource.com/admin/repos/gerrit,access[role=external,window=_blank] | 
|  |  | 
|  | [[system_groups]] | 
|  | == System Groups | 
|  |  | 
|  | Gerrit comes with the following system groups: | 
|  |  | 
|  | * Anonymous Users | 
|  | * Change Owner | 
|  | * Project Owners | 
|  | * Registered Users | 
|  |  | 
|  | The system groups are assigned special access and membership management | 
|  | privileges. | 
|  |  | 
|  |  | 
|  | [[anonymous_users]] | 
|  | === Anonymous Users | 
|  |  | 
|  | All users are automatically a member of this group.  Users who are | 
|  | not signed in are a member of only this group, and no others. | 
|  |  | 
|  | Any access rights assigned to this group are inherited by all users. | 
|  |  | 
|  | Administrators and project owners can grant access rights to this | 
|  | group in order to permit anonymous users to view project changes, | 
|  | without requiring sign in first.  Currently it is only worthwhile | 
|  | to grant `Read` access to this group as Gerrit requires an account | 
|  | identity for all other operations. | 
|  |  | 
|  |  | 
|  | [[project_owners]] | 
|  | === Project Owners | 
|  |  | 
|  | Access rights assigned to this group are always evaluated within the | 
|  | context of a project to which the access rights apply. These rights | 
|  | therefore apply to all the users who are owners of this project. | 
|  |  | 
|  | By assigning access rights to this group on a parent project Gerrit | 
|  | administrators can define a set of default access rights for | 
|  | <<category_owner,project owners>>. Child projects inherit these | 
|  | access rights where they are resolved to the users that own the child | 
|  | project.  Having default access rights for | 
|  | <<category_owner,project owners>> assigned on a parent project may | 
|  | avoid the need to initially configure access rights for | 
|  | newly created child projects. | 
|  |  | 
|  |  | 
|  | [[change_owner]] | 
|  | === Change Owner | 
|  |  | 
|  | Access rights assigned to this group are always evaluated within the | 
|  | context of a change to which the access rights apply. These rights | 
|  | therefore apply to the user who is the owner of this change. | 
|  |  | 
|  | It is typical to assign a label to this group, allowing the change | 
|  | owner to vote on his change, but not actually cause it to become | 
|  | approved or rejected. | 
|  |  | 
|  | [[registered_users]] | 
|  | === Registered Users | 
|  |  | 
|  | All signed-in users are automatically a member of this group (and | 
|  | also <<anonymous_users,'Anonymous Users'>>, see above). | 
|  |  | 
|  | Any access rights assigned to this group are inherited by all | 
|  | users as soon as they sign-in to Gerrit.  If OpenID authentication | 
|  | is being employed, moving from only 'Anonymous Users' into this | 
|  | group is very easy.  Caution should be taken when assigning any | 
|  | permissions to this group. | 
|  |  | 
|  | It is typical to assign `Code-Review -1..+1` to this group, | 
|  | allowing signed-in users to vote on a change, but not actually | 
|  | cause it to become approved or rejected. | 
|  |  | 
|  | Registered users are always permitted to make and publish comments | 
|  | on any change in any project they have `Read` access to. | 
|  |  | 
|  |  | 
|  | == Predefined Groups | 
|  |  | 
|  | Predefined groups differs from system groups by the fact that they | 
|  | exist in the ACCOUNT_GROUPS table (like normal groups) but predefined groups | 
|  | are created on Gerrit site initialization and unique UUIDs are assigned | 
|  | to those groups. These UUIDs are different on different Gerrit sites. | 
|  |  | 
|  | Gerrit comes with two predefined groups: | 
|  |  | 
|  | * Administrators | 
|  | * Service Users | 
|  |  | 
|  |  | 
|  | [[administrators]] | 
|  | === Administrators | 
|  |  | 
|  | This is a predefined group, created on Gerrit site initialization, that | 
|  | has the capability link:access-control.html#capability_administrateServer[ | 
|  | 'Administrate Server'] assigned. | 
|  |  | 
|  | It is a normal Gerrit group without magic. This means if you remove | 
|  | the 'Administrate Server' capability from it, its members are no longer | 
|  | Gerrit administrators, despite the group name. The group may also be | 
|  | renamed. | 
|  |  | 
|  | anchor:non-interactive_users[] | 
|  |  | 
|  | [[service_users]] | 
|  | === Service Users | 
|  |  | 
|  | This is the Gerrit "batch" identity. The capabilities | 
|  | link:access-control.html#capability_priority['Priority BATCH'] and | 
|  | link:access-control.html#capability_streamEvents['Stream Events'] | 
|  | are assigned to this predefined group on Gerrit site creation. | 
|  |  | 
|  | The members of this group are not expected to perform interactive | 
|  | operations on the Gerrit web front-end. | 
|  |  | 
|  | However, sometimes such a user may need a separate thread pool in | 
|  | order to prevent it from grabbing threads from the interactive users. | 
|  |  | 
|  | These users live in a second thread pool, which separates operations | 
|  | made by the service users from the ones made by the interactive | 
|  | users. This ensures that the interactive users can keep working when | 
|  | resources are tight. | 
|  |  | 
|  | Before Gerrit 3.3, the 'Service Users' group was named 'Non-Interactive Users'. | 
|  |  | 
|  | == Account Groups | 
|  |  | 
|  | Account groups contain a list of zero or more user account members, | 
|  | added individually by a group owner.  Any user account listed as | 
|  | a group member is given any access rights granted to the group. | 
|  |  | 
|  | Every group has one other group designated as its owner.  Users who | 
|  | are members of the owner group can: | 
|  |  | 
|  | * Add users and other groups to this group | 
|  | * Remove users and other groups from this group | 
|  | * Change the name of this group | 
|  | * Change the description of this group | 
|  | * Change the owner of this group, to another group | 
|  |  | 
|  | It is permissible for a group to own itself, allowing the group | 
|  | members to directly manage who their peers are. | 
|  |  | 
|  | Newly created groups are automatically created as owning themselves, | 
|  | with the creating user as the only member.  This permits the group | 
|  | creator to add additional members, and change the owner to another | 
|  | group if desired. | 
|  |  | 
|  | It is somewhat common to create two groups at the same time, | 
|  | for example `Foo` and `Foo-admin`, where the latter group | 
|  | `Foo-admin` owns both itself and also group `Foo`.  Users who | 
|  | are members of `Foo-admin` can thus control the membership of | 
|  | `Foo`, without actually having the access rights granted to `Foo`. | 
|  | This configuration can help prevent accidental submits when the | 
|  | members of `Foo` have submit rights on a project, and the members of | 
|  | `Foo-admin` typically do not need to have such rights. | 
|  |  | 
|  |  | 
|  | [[ldap_groups]] | 
|  | == LDAP Groups | 
|  |  | 
|  | LDAP groups are Account Groups that are maintained inside of your | 
|  | LDAP instance. If you are using LDAP to manage your groups they will | 
|  | not appear in the Groups list. However you can use them just like | 
|  | regular Account Groups by prefixing your group with "ldap/" in the | 
|  | Access Control for a project. For example "ldap/foo-project" will | 
|  | add the LDAP "foo-project" group to the access list. | 
|  |  | 
|  |  | 
|  | == Project Access Control Lists | 
|  |  | 
|  | A system wide access control list affecting all projects is stored in | 
|  | project "`All-Projects`".  This inheritance can be configured | 
|  | through link:cmd-set-project-parent.html[gerrit set-project-parent]. | 
|  |  | 
|  | When projects are set as parent projects, the child projects inherit | 
|  | all of the parent's access rights. "`All-Projects`" is treated as a | 
|  | parent of all projects. | 
|  |  | 
|  | Per-project access control lists are also supported. | 
|  |  | 
|  | Users are permitted to use the maximum range granted to any of their | 
|  | groups on a label.  For example, a user is a member of `Foo Leads`, and | 
|  | the following ACLs are granted on a project: | 
|  |  | 
|  | [options="header"] | 
|  | |=================================================== | 
|  | |Group           |Reference Name |Label      |Range | 
|  | |Anonymous Users |refs/heads/*   |Code-Review|-1..+1 | 
|  | |Registered Users|refs/heads/*   |Code-Review|-1..+2 | 
|  | |Foo Leads       |refs/heads/*   |Code-Review|-2..0 | 
|  | |=================================================== | 
|  |  | 
|  | Then the effective range permitted to be used by the user is | 
|  | `-2..+2`, as the user is a member of all three groups (see above | 
|  | about the system groups) and the maximum range is chosen (so the | 
|  | lowest value granted to any group, and the highest value granted | 
|  | to any group). | 
|  |  | 
|  | Reference-level access control is also possible. | 
|  |  | 
|  | Permissions can be set on a single reference name to match one | 
|  | branch (e.g. `refs/heads/master`), or on a reference namespace | 
|  | (e.g. `+refs/heads/*+`) to match any branch starting with that | 
|  | prefix. So a permission with `+refs/heads/*+` will match all of | 
|  | `refs/heads/master`, `refs/heads/experimental`, `refs/heads/release/1.0` etc. | 
|  |  | 
|  | Reference names can also be described with a regular expression | 
|  | by prefixing the reference name with `^`.  For example | 
|  | `^refs/heads/[a-z]{1,8}` matches all lower case branch names | 
|  | between 1 and 8 characters long.  Within a regular expression `.` | 
|  | is a wildcard matching any character, but may be escaped as `\.`. | 
|  | The link:http://www.brics.dk/automaton/[dk.brics.automaton library,role=external,window=_blank] | 
|  | is used for evaluation of regular expression access control | 
|  | rules. See the library documentation for details on this | 
|  | particular regular expression flavor. One quirk is that the | 
|  | shortest possible pattern expansion must be a valid ref name: | 
|  | thus `^refs/heads/.*/name` will fail because `refs/heads//name` | 
|  | is not a valid reference, but `^refs/heads/.+/name` will work. | 
|  |  | 
|  | [[sharded-user-id]] | 
|  | References can have the user name or the sharded account ID of the | 
|  | current user automatically included, creating dynamic access controls | 
|  | that change to match the currently logged in user.  For example to | 
|  | provide a personal sandbox space to all developers, | 
|  | `+refs/heads/sandbox/${username}/*+` allows the user 'joe' to use | 
|  | 'refs/heads/sandbox/joe/foo'. The sharded account ID can be used to | 
|  | give users access to their user branch in the `All-Users` repository, | 
|  | for example `+refs/users/${shardeduserid}+` is resolved to | 
|  | 'refs/users/23/1011123' if the account ID of the current user is | 
|  | `1011123`. | 
|  |  | 
|  | When evaluating a reference-level access right, Gerrit will use | 
|  | the full set of access rights to determine if the user | 
|  | is allowed to perform a given action. For example, if a user is a | 
|  | member of `Foo Leads`, they are reviewing a change destined for | 
|  | the `refs/heads/qa` branch, and the following ACLs are granted | 
|  | on the project: | 
|  |  | 
|  | [options="header"] | 
|  | |=============================================================== | 
|  | |Group            |Reference Name|Label      |Range   |Exclusive | 
|  | |Registered Users |refs/heads/*  |Code-Review| -1..+1 | | 
|  | |Foo Leads        |refs/heads/*  |Code-Review| -2..+2 | | 
|  | |QA Leads         |refs/heads/qa |Code-Review| -2..+2 | | 
|  | |=============================================================== | 
|  |  | 
|  | Then the effective range permitted to be used by the user is | 
|  | `-2..+2`, as the user's membership of `Foo Leads` effectively grant | 
|  | them access to the entire reference space, thanks to the wildcard. | 
|  |  | 
|  | Gerrit also supports exclusive reference-level access control. | 
|  |  | 
|  | It is possible to configure Gerrit to grant an exclusive ref level | 
|  | access control so that only users of a specific group can perform | 
|  | an operation on a project/reference pair. This is done by ticking | 
|  | the exclusive flag when setting the permission for the | 
|  | `refs/heads/qa` branch. | 
|  |  | 
|  | For example, if a user who is a member of `Foo Leads` tries to | 
|  | review a change destined for branch `refs/heads/qa` in a project, | 
|  | and the following ACLs are granted: | 
|  |  | 
|  | [options="header"] | 
|  | |============================================================== | 
|  | |Group           |Reference Name|Label      |Range   |Exclusive | 
|  | |Registered Users|refs/heads/*  |Code-Review| -1..+1 | | 
|  | |Foo Leads       |refs/heads/*  |Code-Review| -2..+2 | | 
|  | |QA Leads        |refs/heads/qa |Code-Review| -2..+2 |X | 
|  | |============================================================== | 
|  |  | 
|  | Then this user will not have `Code-Review` rights on that change, | 
|  | since there is an exclusive access right in place for the | 
|  | `refs/heads/qa` branch. This allows locking down access for a | 
|  | particular branch to a limited set of users, bypassing inherited | 
|  | rights and wildcards. | 
|  |  | 
|  | In order to grant the ability to `Code-Review` to the members of | 
|  | `Foo Leads`, in `refs/heads/qa` then the following access rights | 
|  | would be needed: | 
|  |  | 
|  | [options="header"] | 
|  | |============================================================== | 
|  | |Group           |Reference Name|Category   |Range   |Exclusive | 
|  | |Registered Users|refs/heads/*  |Code-Review| -1..+1 | | 
|  | |Foo Leads       |refs/heads/*  |Code-Review| -2..+2 | | 
|  | |QA Leads        |refs/heads/qa |Code-Review| -2..+2 |X | 
|  | |Foo Leads       |refs/heads/qa |Code-Review| -2..+2 | | 
|  | |============================================================== | 
|  |  | 
|  |  | 
|  | === OpenID Authentication | 
|  |  | 
|  | If the Gerrit instance is configured to use OpenID authentication, | 
|  | an account's effective group membership will be restricted to only | 
|  | the `Anonymous Users` and `Registered Users` groups, unless *all* | 
|  | of its OpenID identities match one or more of the patterns listed | 
|  | in the `auth.trustedOpenID` list from `gerrit.config`. | 
|  |  | 
|  |  | 
|  | === All Projects | 
|  |  | 
|  | Any access right granted to a group within `All-Projects` | 
|  | is automatically inherited by every other project in the same | 
|  | Gerrit instance.  These rights can be seen, but not modified, | 
|  | in any other project's `Access` administration tab. | 
|  |  | 
|  | Only members of the groups with the `Administrate Server` capability | 
|  | may edit the access control list for `All-Projects`. By default this | 
|  | capability is given to the group `Administrators`, but can be given | 
|  | to more groups. | 
|  |  | 
|  | Ownership of this project cannot be delegated to another group. | 
|  | This restriction is by design.  Granting ownership to another | 
|  | group gives nearly the same level of access as membership in | 
|  | `Administrators` does, as group members would be able to alter | 
|  | permissions for every managed project including global capabilities. | 
|  |  | 
|  |  | 
|  | === Per-Project | 
|  |  | 
|  | The per-project ACL is evaluated before the global `All-Projects` ACL, | 
|  | permitting some limited override capability to project owners. This | 
|  | behavior is generally only useful on the `Read` category when | 
|  | granting 'DENY' within a specific project to deny a group access. | 
|  |  | 
|  |  | 
|  | [[references]] | 
|  | == Special and magic references | 
|  |  | 
|  | The reference namespaces used in git are generally two, one for branches and | 
|  | one for tags: | 
|  |  | 
|  | * +refs/heads/*+ | 
|  | * +refs/tags/*+ | 
|  |  | 
|  | However, every reference under +refs/*+ is really available, and in Gerrit this | 
|  | opportunity for giving other refs a special meaning is used.  In Gerrit they | 
|  | are sometimes used as magic/virtual references that give the push to Gerrit a | 
|  | special meaning. | 
|  |  | 
|  |  | 
|  | [[references_special]] | 
|  | === Special references | 
|  |  | 
|  | The special references have content that's either generated by Gerrit or | 
|  | contains important project configuration that Gerrit needs. When making | 
|  | changes to these references, Gerrit will take extra precautions to verify the | 
|  | contents compatibility at upload time. | 
|  |  | 
|  |  | 
|  | ==== refs/changes/* | 
|  |  | 
|  | Under this namespace each uploaded patch set for every change gets a static | 
|  | reference in their git.  The format is convenient but still intended to scale to | 
|  | hundreds of thousands of patch sets.  To access a given patch set you will | 
|  | need the change number and patch set number. | 
|  |  | 
|  | -- | 
|  | 'refs/changes/'<last two digits of change number>/ | 
|  | <change number>/ | 
|  | <patch set number> | 
|  | -- | 
|  |  | 
|  | You can also find these static references linked on the page of each change. | 
|  |  | 
|  |  | 
|  | ==== refs/meta/config | 
|  |  | 
|  | This is where the Gerrit configuration of each project resides.  This | 
|  | branch contains several files of importance: +project.config+, +groups+ and | 
|  | +rules.pl+.  Together they control access and behavior during the change | 
|  | review process. | 
|  |  | 
|  |  | 
|  | ==== refs/meta/dashboards/* | 
|  |  | 
|  | There's a dedicated page where you can read more about | 
|  | link:user-dashboards.html[User Dashboards]. | 
|  |  | 
|  |  | 
|  | ==== refs/notes/review | 
|  |  | 
|  | Autogenerated copy of review notes for all changes in the git.  Each log entry | 
|  | on the refs/notes/review branch also references the patch set on which the | 
|  | review is made.  This functionality is provided by the review-notes plugin. | 
|  |  | 
|  |  | 
|  | [[references_magic]] | 
|  | === Magic references | 
|  |  | 
|  | These are references with added functionality to them compared to a regular | 
|  | git push operation. | 
|  |  | 
|  | [[refs_for]] | 
|  | ==== refs/for/<branch ref> | 
|  |  | 
|  | Most prominent is the `refs/for/<branch ref>` reference which is the reference | 
|  | upon which we build the code review intercept before submitting a commit to | 
|  | the branch it's uploaded to. | 
|  |  | 
|  | Further documentation on how to push can be found on the | 
|  | link:user-upload.html#push_create[Upload changes] page. | 
|  |  | 
|  |  | 
|  | [[access_categories]] | 
|  | == Access Categories | 
|  |  | 
|  | Gerrit has several permission categories that can be granted to groups | 
|  | within projects, enabling functionality for that group's members. | 
|  |  | 
|  |  | 
|  | [[category_abandon]] | 
|  | === Abandon | 
|  |  | 
|  | This category controls whether users are allowed to abandon changes | 
|  | to projects in Gerrit. It can give permission to abandon a specific | 
|  | change to a given ref. | 
|  |  | 
|  | The uploader of a change, anyone granted the <<category_owner,`Owner`>> | 
|  | permission at the ref or project level, and anyone granted the | 
|  | <<capability_administrateServer,`Administrate Server`>> | 
|  | permission can also Abandon changes. | 
|  |  | 
|  | This also grants the permission to restore a change if the user also | 
|  | has link:#category_push[push permission] on the change's destination | 
|  | ref. | 
|  |  | 
|  |  | 
|  | [[category_create]] | 
|  | === Create Reference | 
|  |  | 
|  | The create reference category controls whether it is possible to | 
|  | create new references, branches or tags.  This implies that the | 
|  | reference must not already exist, it's not a destructive permission | 
|  | in that you can't overwrite or remove any previously existing | 
|  | references (and also discard any commits in the process). | 
|  |  | 
|  | It's probably most common to either permit the creation of a single | 
|  | branch in many gits (by granting permission on a parent project), or | 
|  | to grant this permission to a name pattern of branches. | 
|  |  | 
|  | This permission is often given in conjunction with regular push | 
|  | branch permissions, allowing the holder of both to create new branches | 
|  | as well as bypass review for new commits on that branch. | 
|  |  | 
|  | To push lightweight (non-annotated) tags, grant | 
|  | `Create Reference` for reference name `+refs/tags/*+`, as lightweight | 
|  | tags are implemented just like branches in Git. To push a lightweight | 
|  | tag on a new commit (commit not reachable from any branch/tag) grant | 
|  | `Push` permission on `+refs/tags/*+` too. The `Push` permission on | 
|  | `+refs/tags/*+` also allows fast-forwarding of lightweight tags. | 
|  |  | 
|  | For example, to grant the possibility to create new branches under the | 
|  | namespace `foo`, you have to grant this permission on | 
|  | `+refs/heads/foo/*+` for the group that should have it. | 
|  | Finally, if you plan to grant each user a personal namespace in | 
|  | where they are free to create as many branches as they wish, you | 
|  | should grant the create reference permission so it's possible | 
|  | to create new branches. This is done by using the special | 
|  | `${username}` keyword in the reference pattern, e.g. | 
|  | `+refs/heads/sandbox/${username}/*+`. If you do, it's also recommended | 
|  | you grant the users the push force permission to be able to clean up | 
|  | stale branches. | 
|  |  | 
|  | [[category_delete]] | 
|  | === Delete Reference | 
|  |  | 
|  | The delete reference category controls whether it is possible to delete | 
|  | references, branches or tags. It doesn't allow any other update of | 
|  | references. | 
|  |  | 
|  | Deletion of references is also possible if `Push` with the force option | 
|  | is granted, however that includes the permission to fast-forward and | 
|  | force-update references to existing and new commits. Being able to push | 
|  | references for new commits is bad if bypassing of code review must be | 
|  | prevented. | 
|  |  | 
|  |  | 
|  | [[category_forge_author]] | 
|  | === Forge Author | 
|  |  | 
|  | Normally Gerrit requires the author and the committer identity | 
|  | lines in a Git commit object (or tagger line in an annotated tag) to | 
|  | match one of the registered email addresses of the uploading user. | 
|  | This permission allows users to bypass parts of that validation, which | 
|  | may be necessary when mirroring changes from an upstream project. | 
|  |  | 
|  | Permits the use of an unverified author line in commit objects. | 
|  | This can be useful when applying patches received by email from | 
|  | 3rd parties, when cherry-picking changes written by others across | 
|  | branches, or when amending someone else's commit to fix up a minor | 
|  | problem before submitting. | 
|  |  | 
|  | By default this is granted to `Registered Users` in all projects, | 
|  | but a site administrator may disable it if verified authorship | 
|  | is required. | 
|  |  | 
|  |  | 
|  | [[category_forge_committer]] | 
|  | === Forge Committer | 
|  |  | 
|  | Normally Gerrit requires the author and the committer identity | 
|  | lines in a Git commit object (or tagger line in an annotated tag) to | 
|  | match one of the registered email addresses of the uploading user. | 
|  | This permission allows users to bypass parts of that validation, which | 
|  | may be necessary when mirroring changes from an upstream project. | 
|  |  | 
|  | Allows the use of an unverified committer line in commit objects, or an | 
|  | unverified tagger line in annotated tag objects.  Typically this is only | 
|  | required when mirroring commits from an upstream project repository. | 
|  |  | 
|  |  | 
|  | [[category_forge_server]] | 
|  | === Forge Server | 
|  |  | 
|  | Normally Gerrit requires the author and the committer identity | 
|  | lines in a Git commit object (or tagger line in an annotated tag) to | 
|  | match one of the registered email addresses of the uploading user. | 
|  | This permission allows users to bypass parts of that validation, which | 
|  | may be necessary when mirroring changes from an upstream project. | 
|  |  | 
|  | Allows the use of the server's own name and email on the committer | 
|  | line of a new commit object.  This should only be necessary when force | 
|  | pushing a commit history which has been rewritten by 'git filter-branch' | 
|  | and that contains merge commits previously created by this Gerrit Code | 
|  | Review server. | 
|  |  | 
|  |  | 
|  | [[category_owner]] | 
|  | === Owner | 
|  |  | 
|  | The `Owner` category controls which groups can modify the project's | 
|  | configuration.  Users who are members of an owner group can: | 
|  |  | 
|  | * Change the project description | 
|  | * Grant/revoke any access rights, including `Owner` | 
|  |  | 
|  | To get SSH branch access project owners must grant an access right to a group | 
|  | they are a member of, just like for any other user. | 
|  |  | 
|  | Ownership over a particular branch subspace may be delegated by | 
|  | entering a branch pattern.  To delegate control over all branches | 
|  | that begin with `qa/` to the QA group, add `Owner` category | 
|  | for reference `+refs/heads/qa/*+`.  Members of the QA group can | 
|  | further refine access, but only for references that begin with | 
|  | `refs/heads/qa/`. See <<project_owners,project owners>> to find | 
|  | out more about this role. | 
|  |  | 
|  | For the `All-Projects` root project any `Owner` access right on | 
|  | 'refs/*' is ignored since this permission would allow users to edit the | 
|  | global capabilities, which is the same as being able to administrate | 
|  | the Gerrit server (e.g. the user could assign the `Administrate Server` | 
|  | capability to the own account). | 
|  |  | 
|  |  | 
|  | [[category_push]] | 
|  | === Push | 
|  |  | 
|  | This category controls how users are allowed to upload new commits | 
|  | to projects in Gerrit. It can either give permission to push | 
|  | directly into a branch, bypassing any code review process | 
|  | that would otherwise be used. Or it may give permission to upload | 
|  | new changes for code review, this depends on which namespace the | 
|  | permission is granted to. | 
|  |  | 
|  | [[category_push_direct]] | 
|  | ==== Direct Push | 
|  |  | 
|  | Any existing branch can be fast-forwarded to a new commit. | 
|  | Creation of new branches is controlled by the | 
|  | link:access-control.html#category_create['Create Reference'] | 
|  | category.  Deletion of existing branches is rejected.  This is the | 
|  | safest mode as commits cannot be discarded. | 
|  |  | 
|  | * Force option | 
|  | + | 
|  | Implies <<category_delete,Delete Reference>>. Since a force push is | 
|  | effectively a delete immediately followed by a create, but performed | 
|  | atomically on the server and logged, this option also permits forced | 
|  | push updates to branches.  Enabling this option allows existing commits | 
|  | to be discarded from a project history. | 
|  |  | 
|  | The push category is primarily useful for projects that only want to | 
|  | take advantage of Gerrit's access control features and do not need | 
|  | its code review functionality.  Projects that need to require code | 
|  | reviews should not grant this category. | 
|  |  | 
|  |  | 
|  | [[category_push_review]] | 
|  | ==== Upload To Code Review | 
|  |  | 
|  | The `Push` access right granted on the namespace | 
|  | `refs/for/refs/heads/BRANCH` permits the user to upload a non-merge | 
|  | commit to the project's `refs/for/BRANCH` namespace, creating a new | 
|  | change for code review. | 
|  |  | 
|  | A user must be able to clone or fetch the project in order to create | 
|  | a new commit on their local system, so in practice they must also | 
|  | have the `Read` access granted to upload a change. | 
|  |  | 
|  | For an open source, public Gerrit installation, it is common to grant | 
|  | `Push` for `+refs/for/refs/heads/*+` to `Registered Users` in the | 
|  | `All-Projects` ACL.  For more private installations, its common to | 
|  | grant `Push` for `+refs/for/refs/heads/*+` to all users of a project. | 
|  |  | 
|  | * Force option | 
|  | + | 
|  | The force option has no function when granted to a branch in the | 
|  | `+refs/for/refs/heads/*+` namespace. | 
|  |  | 
|  |  | 
|  | [[category_add_patch_set]] | 
|  | === Add Patch Set | 
|  |  | 
|  | This category controls which users are allowed to upload new patch sets to | 
|  | existing changes. Irrespective of this permission, change owners are always | 
|  | allowed to upload new patch sets for their changes. This permission needs to be | 
|  | set on `refs/for/*`. | 
|  |  | 
|  | By default, this permission is granted to `Registered Users` on `refs/for/*`, | 
|  | allowing all registered users to upload a new patch set to any change. Revoking | 
|  | this permission (by granting it to no groups and setting the "Exclusive" flag) | 
|  | will prevent users from uploading a patch set to a change they do not own. | 
|  |  | 
|  |  | 
|  | [[category_push_merge]] | 
|  | === Push Merge Commits | 
|  |  | 
|  | The `Push Merge Commit` access right permits the user to upload merge | 
|  | commits.  It's an add-on to the <<category_push,Push>> access right, and | 
|  | so it won't be sufficient with only `Push Merge Commit` granted for a | 
|  | push to happen.  Some projects wish to restrict merges to being created | 
|  | by Gerrit. By granting `Push` without `Push Merge Commit`, the only | 
|  | merges that enter the system will be those created by Gerrit. | 
|  |  | 
|  | The reference name connected to a `Push Merge Commit` entry must always | 
|  | be prefixed with `refs/for/`, for example `refs/for/refs/heads/BRANCH`. | 
|  | This applies even for an entry that complements a `Push` entry for | 
|  | `refs/heads/BRANCH` that allows direct pushes of non-merge commits, and | 
|  | the intention of the `Push Merge Commit` entry is to allow direct pushes | 
|  | of merge commits. | 
|  |  | 
|  |  | 
|  | [[category_push_annotated]] | 
|  | [[category_create_annotated]] | 
|  | === Create Annotated Tag | 
|  |  | 
|  | This category permits users to push an annotated tag object into the | 
|  | project's repository.  Typically this would be done with a command line | 
|  | such as: | 
|  |  | 
|  | ---- | 
|  | git push ssh://USER@HOST:PORT/PROJECT tag v1.0 | 
|  | ---- | 
|  |  | 
|  | Or: | 
|  |  | 
|  | ---- | 
|  | git push https://HOST/PROJECT tag v1.0 | 
|  | ---- | 
|  |  | 
|  | Tags must be annotated (created with `git tag -a`), should exist in | 
|  | the `refs/tags/` namespace, and should be new. | 
|  |  | 
|  | This category is intended to be used to publish tags when a project | 
|  | reaches a stable release point worth remembering in history. | 
|  |  | 
|  | It allows for a new annotated (unsigned) tag to be created.  The | 
|  | tagger email address must be verified for the current user. | 
|  |  | 
|  | To push tags created by users other than the current user (such | 
|  | as tags mirrored from an upstream project), `Forge Committer Identity` | 
|  | must be also granted in addition to `Create Annotated Tag`. | 
|  |  | 
|  | To push lightweight (non annotated) tags, grant | 
|  | <<category_create,`Create Reference`>> for reference name | 
|  | `+refs/tags/*+`, as lightweight tags are implemented just like | 
|  | branches in Git. | 
|  |  | 
|  | To delete or overwrite an existing tag, grant `Push` with the force | 
|  | option enabled for reference name `+refs/tags/*+`, as deleting a tag | 
|  | requires the same permission as deleting a branch. | 
|  |  | 
|  | To push an annotated tag on a new commit (commit not reachable from any | 
|  | branch/tag) grant `Push` permission on `+refs/tags/*+` too. | 
|  | The `Push` permission on `+refs/tags/*+` does *not* allow updating of annotated | 
|  | tags, not even fast-forwarding of annotated tags. Update of annotated tags | 
|  | is only allowed by granting `Push` with `force` option on `+refs/tags/*+`. | 
|  |  | 
|  |  | 
|  | [[category_push_signed]] | 
|  | [[category_create_signed]] | 
|  | === Create Signed Tag | 
|  |  | 
|  | This category permits users to push a PGP signed tag object into the | 
|  | project's repository.  Typically this would be done with a command | 
|  | line such as: | 
|  |  | 
|  | ---- | 
|  | git push ssh://USER@HOST:PORT/PROJECT tag v1.0 | 
|  | ---- | 
|  |  | 
|  | Or: | 
|  |  | 
|  | ---- | 
|  | git push https://HOST/PROJECT tag v1.0 | 
|  | ---- | 
|  |  | 
|  | Tags must be signed (created with `git tag -s`), should exist in the | 
|  | `refs/tags/` namespace, and should be new. | 
|  |  | 
|  |  | 
|  | [[category_read]] | 
|  | === Read | 
|  |  | 
|  | The `Read` category controls visibility to the project's | 
|  | changes, comments, code diffs, and Git access over SSH or HTTP. | 
|  | A user must have this access granted in order to see a project, its | 
|  | changes, or any of its data. | 
|  |  | 
|  | [[read_special_behaviors]] | 
|  | ==== Special behaviors | 
|  |  | 
|  | This category has multiple special behaviors: | 
|  |  | 
|  | The per-project ACL is evaluated before the global all projects ACL. | 
|  | If the per-project ACL has granted `Read` with 'DENY', and does not | 
|  | otherwise grant `Read` with 'ALLOW', then a `Read` in the all projects | 
|  | ACL is ignored.  This behavior is useful to hide a handful of projects | 
|  | on an otherwise public server. | 
|  |  | 
|  | You cannot grant `Read` on the `refs/tags/` namespace.  Visibility to | 
|  | `refs/tags/` is derived from `Read` grants on refs namespaces other than | 
|  | `refs/tags/`, `refs/changes/`, and `refs/cache-automerge/` by finding | 
|  | tags reachable from those refs.  For example, if a tag `refs/tags/test` | 
|  | points to a commit on the branch `refs/heads/master`, then allowing | 
|  | `Read` access to `refs/heads/master` would also allow access to | 
|  | `refs/tags/test`.  If a tag is reachable from multiple refs, allowing | 
|  | access to any of those refs allows access to the tag. | 
|  |  | 
|  | [[read_typical_usage]] | 
|  | ==== Typical usage | 
|  |  | 
|  | For an open source, public Gerrit installation it is common to grant | 
|  | `Read` to `Anonymous Users` in the `All-Projects` ACL, enabling | 
|  | casual browsing of any project's changes, as well as fetching any | 
|  | project's repository over SSH or HTTP.  New projects can be | 
|  | temporarily hidden from public view by granting `Read` with 'DENY' | 
|  | to `Anonymous Users` and granting `Read` to the project owner's | 
|  | group within the per-project ACL. | 
|  |  | 
|  | For a private Gerrit installation using a trusted HTTP authentication | 
|  | source, granting `Read` to `Registered Users` may be more | 
|  | typical, enabling read access only to those users who have been | 
|  | able to authenticate through the HTTP access controls.  This may | 
|  | be suitable in a corporate deployment if the HTTP access control | 
|  | is already restricted to the correct set of users. | 
|  |  | 
|  |  | 
|  | [[category_rebase]] | 
|  | === Rebase | 
|  |  | 
|  | This category permits users to rebase changes via the web UI by pushing | 
|  | the `Rebase Change` button. | 
|  |  | 
|  | The change owner and submitters can always rebase changes in the web UI | 
|  | (even without having the `Rebase` access right assigned). | 
|  |  | 
|  | Users without this access right who are able to upload new patch sets | 
|  | can still do the rebase locally and upload the rebased commit as a new | 
|  | patch set. | 
|  |  | 
|  | [[category_revert]] | 
|  | === Revert | 
|  |  | 
|  | This category permits users to revert changes via the web UI by pushing | 
|  | the `Revert Change` button. | 
|  |  | 
|  | Users without this access right who are able to upload changes can | 
|  | still do the revert locally and upload the revert commit as a new change. | 
|  |  | 
|  | [[category_remove_reviewer]] | 
|  | === Remove Reviewer | 
|  |  | 
|  | This category permits users to remove other users from the list of | 
|  | reviewers on a change. | 
|  |  | 
|  | Change owners can always remove reviewers who have given a zero or positive | 
|  | score (even without having the `Remove Reviewer` access right assigned). | 
|  |  | 
|  | Project owners and site administrators can always remove any reviewer (even | 
|  | without having the `Remove Reviewer` access right assigned). | 
|  |  | 
|  | Users without this access right can only remove themselves from the | 
|  | reviewer list on a change. | 
|  |  | 
|  |  | 
|  | [[category_review_labels]] | 
|  | === Review Labels | 
|  |  | 
|  | For every configured label `My-Name` in the project, there is a | 
|  | corresponding permission `label-My-Name` with a range corresponding to | 
|  | the defined values. There is also a corresponding `labelAs-My-Name` | 
|  | permission that enables editing another user's label. | 
|  |  | 
|  | Gerrit comes pre-configured with a default 'Code-Review' label that can | 
|  | be granted to groups within projects, enabling functionality for that | 
|  | group's members. link:config-labels.html[Custom labels] may also be | 
|  | defined globally or on a per-project basis. | 
|  |  | 
|  |  | 
|  | [[category_submit]] | 
|  | === Submit | 
|  |  | 
|  | This category permits users to submit changes. | 
|  |  | 
|  | Submitting a change causes it to be merged into the destination | 
|  | branch as soon as possible, making it a permanent part of the | 
|  | project's history. | 
|  |  | 
|  | In order to submit, all labels (such as `Verified` and `Code-Review`, | 
|  | above) must enable submit, and also must not block it.  See above for | 
|  | details on each label. | 
|  |  | 
|  | To link:user-upload.html#auto_merge[immediately submit a change on push] | 
|  | the caller needs to have the Submit permission on `refs/for/<ref>` | 
|  | (e.g. on `refs/for/refs/heads/master`). | 
|  |  | 
|  | Submitting to the `refs/meta/config` branch is only allowed to project | 
|  | owners. Any explicit submit permissions for non-project-owners on this | 
|  | branch are ignored. By submitting to the `refs/meta/config` branch the | 
|  | configuration of the project is changed, which can include changes to | 
|  | the access rights of the project. Allowing this to be done by a | 
|  | non-project-owner would open a security hole enabling editing of access | 
|  | rights, and thus granting of powers beyond submitting to the | 
|  | configuration. | 
|  |  | 
|  | [[category_submit_on_behalf_of]] | 
|  | === Submit (On Behalf Of) | 
|  |  | 
|  | This category permits users who have also been granted the `Submit` | 
|  | permission to submit changes on behalf of another user, by using the | 
|  | `on_behalf_of` field in link:rest-api-changes.html#submit-input[SubmitInput] | 
|  | when link:rest-api-changes.html#submit-change[submitting using the REST API]. | 
|  |  | 
|  | Note that this permission is named `submitAs` in the `project.config` | 
|  | file. | 
|  |  | 
|  | [[category_view_private_changes]] | 
|  | === View Private Changes | 
|  |  | 
|  | This category permits users to view all private changes and all change edit refs. | 
|  |  | 
|  | The change owner and any explicitly added reviewers can always see | 
|  | private changes (even without having the `View Private Changes` access | 
|  | right assigned). | 
|  |  | 
|  | **NOTE**: If link:config-gerrit.html#auth.skipFullRefEvaluationIfAllRefsAreVisible[ | 
|  | auth.skipFullRefEvaluationIfAllRefsAreVisible] is `true` (which is the case by | 
|  | default) privates changes and all change edit refs are also visible to users | 
|  | that have read access on `refs/*`. | 
|  |  | 
|  | [[category_toggle_work_in_progress_state]] | 
|  | === Toggle Work In Progress state | 
|  |  | 
|  | This category controls who is able to flip the Work In Progress bit. | 
|  |  | 
|  | Change owner, server administrators and project owners can always flip | 
|  | the Work In Progress bit of the change (even without having the | 
|  | `Toggle Work In Progress state` access right assigned). | 
|  |  | 
|  | [[category_delete_own_changes]] | 
|  | === Delete Own Changes | 
|  |  | 
|  | This category permits users to delete their own changes if they are not merged | 
|  | yet. This means only own changes that are open or abandoned can be deleted. | 
|  |  | 
|  | [[category_delete_changes]] | 
|  | === Delete Changes | 
|  |  | 
|  | This category permits users to delete other users' changes if they are not merged | 
|  | yet. This means only changes that are open or abandoned can be deleted. | 
|  |  | 
|  | Having this permission implies having the link:#category_delete_own_changes[ | 
|  | Delete Own Changes] permission. | 
|  |  | 
|  | Administrators may always delete changes without having this permission. | 
|  |  | 
|  | [[category_edit_topic_name]] | 
|  | === Edit Topic Name | 
|  |  | 
|  | This category permits users to edit the topic name of a change that | 
|  | is uploaded for review. | 
|  |  | 
|  | The change owner, branch owners, project owners, and site administrators | 
|  | can always edit the topic name (even without having the `Edit Topic Name` | 
|  | access right assigned). | 
|  |  | 
|  | Whether the topic can be edited on closed changes can be controlled | 
|  | by the 'Force Edit' flag. If this flag is not set the topic can only be | 
|  | edited on open changes. | 
|  |  | 
|  |  | 
|  | [[category_edit_hashtags]] | 
|  | === Edit Hashtags | 
|  |  | 
|  | This category permits users to add or remove | 
|  | link:intro-user.html#hashtags[hashtags] on a change that is uploaded for review. | 
|  |  | 
|  | The change owner, branch owners, project owners, and site administrators | 
|  | can always edit or remove hashtags (even without having the `Edit Hashtags` | 
|  | access right assigned). | 
|  |  | 
|  | [[category_edit_assigned_to]] | 
|  | === Edit Assignee | 
|  |  | 
|  | This category permits users to set who is assigned to a change that is | 
|  | uploaded for review. | 
|  |  | 
|  | The change owner, ref owners, and the user currently assigned to a change | 
|  | can always change the assignee. | 
|  |  | 
|  | [[example_roles]] | 
|  | == Examples of typical roles in a project | 
|  |  | 
|  | Below follows a set of typical roles on a server and which access | 
|  | rights these roles typically should be granted. You may see them as | 
|  | general guidelines for a typical way to set up your project on a | 
|  | brand new Gerrit instance. | 
|  |  | 
|  |  | 
|  | [[examples_contributor]] | 
|  | === Contributor | 
|  |  | 
|  | This is the typical user on a public server. They are able to read | 
|  | your project and upload new changes to it. They are able to give | 
|  | feedback on other changes as well, but are unable to block or approve | 
|  | any changes. | 
|  |  | 
|  | Suggested access rights to grant: | 
|  |  | 
|  | * xref:category_read[`Read`] on 'refs/heads/\*' | 
|  | * xref:category_push[`Push`] to 'refs/for/refs/heads/*' | 
|  | * link:config-labels.html#label_Code-Review[`Code-Review`] with range '-1' to '+1' for 'refs/heads/*' | 
|  |  | 
|  | If it's desired to have the possibility to upload temporarily hidden | 
|  | changes there's a specific permission for that.  This enables someone | 
|  | to add specific reviewers for early feedback before making the change | 
|  | publicly visible. | 
|  |  | 
|  |  | 
|  | [[examples_developer]] | 
|  | === Developer | 
|  |  | 
|  | This is the typical core developer on a public server.  They are able | 
|  | to read the project, upload changes to a branch.  They are allowed to | 
|  | push merge commits to merge branches together.  Also, they are allowed | 
|  | to forge author identity, thus handling commits belonging to others | 
|  | than themselves, effectively allowing them to transfer commits | 
|  | between different branches. | 
|  |  | 
|  | They are furthermore able to code review and verify commits, and | 
|  | eventually submit them.  If you have an automated CI system that | 
|  | builds all uploaded patch sets you might want to skip the | 
|  | verification rights for the developer and let the CI system do that | 
|  | exclusively. | 
|  |  | 
|  | Suggested access rights to grant: | 
|  |  | 
|  | * xref:category_read[`Read`] on 'refs/heads/\*' | 
|  | * xref:category_push[`Push`] to 'refs/for/refs/heads/*' | 
|  | * xref:category_push_merge[`Push merge commit`] to 'refs/for/refs/heads/*' | 
|  | * xref:category_forge_author[`Forge Author Identity`] to 'refs/heads/*' | 
|  | * link:config-labels.html#label_Code-Review[`Label: Code-Review`] with range '-2' to '+2' for 'refs/heads/*' | 
|  | * link:config-labels.html#label_Verified[`Label: Verified`] with range '-1' to '+1' for 'refs/heads/*' | 
|  | * xref:category_submit[`Submit`] on 'refs/heads/*' | 
|  |  | 
|  | If the project is small or the developers are seasoned it might make | 
|  | sense to give them the freedom to push commits directly to a branch. | 
|  |  | 
|  | Optional access rights to grant: | 
|  |  | 
|  | * <<category_push,`Push`>> to 'refs/heads/*' | 
|  | * <<category_push_merge,`Push merge commit`>> to 'refs/heads/*' | 
|  |  | 
|  |  | 
|  | [[examples_cisystem]] | 
|  | === CI system | 
|  |  | 
|  | A typical Continuous Integration system should be able to download new changes | 
|  | to build and then leave a verdict somehow. | 
|  |  | 
|  | As an example, the popular | 
|  | link:https://wiki.jenkins-ci.org/display/JENKINS/Gerrit+Trigger[gerrit-trigger plugin,role=external,window=_blank] | 
|  | for Jenkins/Hudson can set labels at: | 
|  |  | 
|  | * The start of a build | 
|  | * A successful build | 
|  | * An unstable build (tests fails) | 
|  | * A failed build | 
|  |  | 
|  | Usually the range chosen for this verdict is the `Verified` label.  Depending on | 
|  | the size of your project and discipline of involved developers you might want | 
|  | to limit access right to the +1 `Verified` label to the CI system only.  That | 
|  | way it's guaranteed that submitted commits always get built and pass tests | 
|  | successfully. | 
|  |  | 
|  | If the build doesn't complete successfully the CI system can set the | 
|  | `Verified` label to -1.  However that means that a failed build will block | 
|  | submit of the change even if someone else sets `Verified` +1.  Depending on the | 
|  | project and how much the CI system can be trusted for accurate results, a | 
|  | blocking label might not be feasible.  A recommended alternative is to set the | 
|  | label `Code-review` to -1 instead, as it isn't a blocking label but still | 
|  | shows a red label in the Gerrit UI.  Optionally, to enable the possibility to | 
|  | deliver different results (build error vs unstable for instance), it's also | 
|  | possible to set `Code-review` +1 as well. | 
|  |  | 
|  | If pushing new changes is granted, it's possible to automate cherry-pick of | 
|  | submitted changes for upload to other branches under certain conditions.  This | 
|  | is probably not the first step of what a project wants to automate however, | 
|  | and so the push right can be found under the optional section. | 
|  |  | 
|  | Suggested access rights to grant, that won't block changes: | 
|  |  | 
|  | * xref:category_read[`Read`] on 'refs/heads/\*' | 
|  | * link:config-labels.html#label_Code-Review[`Label: Code-Review`] with range '-1' to '0' for 'refs/heads/*' | 
|  | * link:config-labels.html#label_Verified[`Label: Verified`] with range '0' to '+1' for 'refs/heads/*' | 
|  |  | 
|  | Optional access rights to grant: | 
|  |  | 
|  | * link:config-labels.html#label_Code-Review[`Label: Code-Review`] with range '-1' to '+1' for 'refs/heads/*' | 
|  | * xref:category_push[`Push`] to 'refs/for/refs/heads/*' | 
|  |  | 
|  |  | 
|  | [[examples_integrator]] | 
|  | === Integrator | 
|  |  | 
|  | Integrators are like developers but with some additional rights granted due | 
|  | to their administrative role in a project.  They can upload or push any commit | 
|  | with any committer email (not just their own) and they can also create new | 
|  | tags and branches. | 
|  |  | 
|  | Suggested access rights to grant: | 
|  |  | 
|  | * <<examples_developer,Developer rights>> | 
|  | * <<category_push,`Push`>> to 'refs/heads/*' | 
|  | * <<category_push_merge,`Push merge commit`>> to 'refs/heads/*' | 
|  | * <<category_forge_committer,`Forge Committer Identity`>> to 'refs/for/refs/heads/*' | 
|  | * <<category_create,`Create Reference`>> to 'refs/heads/*' | 
|  | * <<category_create_annotated,`Create Annotated Tag`>> to 'refs/tags/*' | 
|  |  | 
|  |  | 
|  | [[examples_project-owner]] | 
|  | === Project owner | 
|  |  | 
|  | The project owner is almost like an integrator but with additional destructive | 
|  | power in the form of being able to delete branches.  Optionally these users | 
|  | also have the power to configure access rights in gits assigned to them. | 
|  |  | 
|  | [WARNING] | 
|  | These users should be really knowledgeable about git, for instance knowing why | 
|  | tags never should be removed from a server.  This role is granted potentially | 
|  | destructive access rights and cleaning up after such a mishap could be time | 
|  | consuming! | 
|  |  | 
|  | Suggested access rights to grant: | 
|  |  | 
|  | * <<examples_integrator,Integrator rights>> | 
|  | * <<category_push,`Push`>> with the force option to 'refs/heads/\*' and 'refs/tags/*' | 
|  |  | 
|  | Optional access right to grant: | 
|  |  | 
|  | * <<category_owner,`Owner`>> in the gits they mostly work with. | 
|  |  | 
|  |  | 
|  | [[examples_administrator]] | 
|  | === Administrator | 
|  |  | 
|  | The administrator role is the most powerful role known in the Gerrit universe. | 
|  | This role may grant itself (or others) any access right.  By default the | 
|  | <<administrators,`Administrators` group>> is the group that has this role. | 
|  |  | 
|  | Mandatory access rights: | 
|  |  | 
|  | * <<capability_administrateServer,The `Administrate Server` capability>> | 
|  |  | 
|  | Suggested access rights to grant: | 
|  |  | 
|  | * <<examples_project-owner,`Project owner rights`>> | 
|  | * Any <<global_capabilities,`capabilities`>> needed by the administrator | 
|  |  | 
|  |  | 
|  | == Enforcing site wide access policies | 
|  |  | 
|  | By granting the <<category_owner,`Owner`>> access right on the `+refs/*+` to a | 
|  | group, Gerrit administrators can delegate the responsibility of maintaining | 
|  | access rights for that project to that group. | 
|  |  | 
|  | In a corporate deployment it is often necessary to enforce some access | 
|  | policies. An example could be that no-one can update or delete a tag, not even | 
|  | the project owners. The 'ALLOW' and 'DENY' rules are not enough for this | 
|  | purpose as project owners can grant themselves any access right they wish and, | 
|  | thus, effectively override any inherited access rights from the | 
|  | "`All-Projects`" or some other common parent project. | 
|  |  | 
|  | What is needed is a mechanism to block a permission in a parent project so | 
|  | that even project owners cannot allow a blocked permission in their child | 
|  | project. Still, project owners should retain the possibility to manage all | 
|  | non-blocked rules as they wish. This gives best of both worlds: | 
|  |  | 
|  | * Gerrit administrators can concentrate on enforcing site wide policies | 
|  | and providing a meaningful set of default access permissions | 
|  | * Project owners can manage access rights of their projects without a danger | 
|  | of violating a site wide policy | 
|  |  | 
|  |  | 
|  | [[block]] | 
|  | === 'BLOCK' access rule | 
|  |  | 
|  | The 'BLOCK' rule can be used to take away rights from users. The BLOCK rule | 
|  | works across project inheritance, from the top down, so an administrator can | 
|  | use 'BLOCK' rules to enforce site-wide restrictions. | 
|  |  | 
|  | For example, if a user in the 'Foo Users' group tries to push to | 
|  | 'refs/heads/mater' with the permissions below, that user will be blocked | 
|  |  | 
|  | [options="header"] | 
|  | |========================================================================= | 
|  | |Project      | Inherits From    |Reference Name |Permissions            | | 
|  | |All-Projects | -                |refs/*         |push = block Foo Users | | 
|  | |Foo          | All-Projects     |refs/heads/*   |push = Foo Users       | | 
|  | |========================================================================= | 
|  |  | 
|  | 'BLOCK' rules are evaluated starting from the parent project, and after a 'BLOCK' | 
|  | rule is found to apply, further rules are ignored. Hence, in this example, the | 
|  | permissions on child-project is ignored. | 
|  |  | 
|  | ---- | 
|  | All-Projects: project.config | 
|  | [access "refs/heads/*"] | 
|  | push = block group X | 
|  |  | 
|  | child-project: project.config | 
|  | [access "refs/heads/*"] | 
|  | exclusiveGroupPermissions = push | 
|  | push = group X | 
|  | ---- | 
|  |  | 
|  | In this case push for group 'X' will be blocked, even though the Exclusive | 
|  | flag was set for the child-project. | 
|  |  | 
|  | A 'BLOCK' rule that blocks the 'push' permission blocks any type of push, | 
|  | force or not. A blocking force push rule blocks only force pushes, but | 
|  | allows non-forced pushes if an 'ALLOW' rule would have permitted it. | 
|  |  | 
|  | It is also possible to block label ranges. To block a group 'X' from voting | 
|  | '-2' and '+2', but keep their existing voting permissions for the '-1..+1' | 
|  | range intact we would define: | 
|  |  | 
|  | ---- | 
|  | [access "refs/heads/*"] | 
|  | label-Code-Review = block -2..+2 group X | 
|  | ---- | 
|  |  | 
|  | The interpretation of the 'min..max' range in case of a blocking rule is: block | 
|  | every vote from '-INFINITE..min' and 'max..INFINITE'. For the example above it | 
|  | means that the range '-1..+1' is not affected by this block. | 
|  |  | 
|  | === 'BLOCK' and 'ALLOW' rules in the same access section | 
|  |  | 
|  | When an access section of a project contains a 'BLOCK' and an 'ALLOW' rule for | 
|  | the same permission then this 'ALLOW' rule overrides the 'BLOCK' rule: | 
|  |  | 
|  | ---- | 
|  | [access "refs/heads/*"] | 
|  | push = block group X | 
|  | push = group Y | 
|  | ---- | 
|  |  | 
|  | In this case a user which is a member of the group 'Y' will still be allowed to | 
|  | push to 'refs/heads/*' even if it is a member of the group 'X'. | 
|  |  | 
|  | === 'BLOCK' and 'ALLOW' rules in the same project with the Exclusive flag | 
|  |  | 
|  | When a project contains a 'BLOCK' and 'ALLOW' that uses the Exclusive flag in a | 
|  | more specific reference, the 'ALLOW' rule with the Exclusive flag will override | 
|  | the 'BLOCK' rule: | 
|  |  | 
|  | ---- | 
|  | [access "refs/*"] | 
|  | read = block group X | 
|  |  | 
|  | [access "refs/heads/*"] | 
|  | exclusiveGroupPermissions = read | 
|  | read = group X | 
|  | ---- | 
|  |  | 
|  | In this case a user which is a member of the group 'X' will still be allowed to | 
|  | read 'refs/heads/*'. | 
|  |  | 
|  | [NOTE] | 
|  | An 'ALLOW' rule overrides a 'BLOCK' rule only when both of them are | 
|  | inside the same access section of the same project. An 'ALLOW' rule in a | 
|  | different access section of the same project or in any access section in an | 
|  | inheriting project cannot override a 'BLOCK' rule. | 
|  |  | 
|  |  | 
|  | === Examples | 
|  |  | 
|  | The following examples show some possible use cases for the 'BLOCK' rules. | 
|  |  | 
|  | ==== Make sure no one can update or delete a tag | 
|  |  | 
|  | This requirement is quite common in a corporate deployment where | 
|  | reproducibility of a build must be guaranteed. To achieve that we block 'push' | 
|  | permission for the <<anonymous_users,'Anonymous Users'>> in "`All-Projects`": | 
|  |  | 
|  | ---- | 
|  | [access "refs/tags/*"] | 
|  | push = block group Anonymous Users | 
|  | ---- | 
|  |  | 
|  | By blocking the <<anonymous_users,'Anonymous Users'>> we effectively block | 
|  | everyone as everyone is a member of that group. Note that the permission to | 
|  | create a tag is still necessary. Assuming that only <<category_owner,project | 
|  | owners>> are allowed to create tags, we would extend the example above: | 
|  |  | 
|  | ---- | 
|  | [access "refs/tags/*"] | 
|  | push = block group Anonymous Users | 
|  | create = group Project Owners | 
|  | pushTag = group Project Owners | 
|  | ---- | 
|  |  | 
|  |  | 
|  | ==== Let only a dedicated group vote in a special category | 
|  |  | 
|  | Assume there is a more restrictive process for submitting changes in stable | 
|  | release branches which is manifested as a new voting category | 
|  | 'Release-Process'. Assume we want to make sure that only a 'Release Engineers' | 
|  | group can vote in this category and that even project owners cannot approve | 
|  | this category. We have to block everyone except the 'Release Engineers' to vote | 
|  | in this category and, of course, allow 'Release Engineers' to vote in that | 
|  | category. In the "`All-Projects`" we define the following rules: | 
|  |  | 
|  | ---- | 
|  | [access "refs/heads/stable*"] | 
|  | label-Release-Process = block -1..+1 group Anonymous Users | 
|  | label-Release-Process = -1..+1 group Release Engineers | 
|  | ---- | 
|  |  | 
|  | [[global_capabilities]] | 
|  | == Global Capabilities | 
|  |  | 
|  | The global capabilities control actions that the administrators of | 
|  | the server can perform which usually affect the entire | 
|  | server in some way.  The administrators may delegate these | 
|  | capabilities to trusted groups of users. | 
|  |  | 
|  | Delegation of capabilities allows groups to be granted a subset of | 
|  | administrative capabilities without being given complete | 
|  | administrative control of the server.  This makes it possible to | 
|  | keep fewer users in the administrators group, even while spreading | 
|  | much of the server administration burden out to more users. | 
|  |  | 
|  | Global capabilities are assigned to groups in the access rights settings | 
|  | of the root project ("`All-Projects`"). | 
|  |  | 
|  | Below you find a list of capabilities available: | 
|  |  | 
|  |  | 
|  | [[capability_accessDatabase]] | 
|  | === Access Database | 
|  |  | 
|  | Allow users to view code review metadata refs in repositories. | 
|  |  | 
|  |  | 
|  | [[capability_administrateServer]] | 
|  | === Administrate Server | 
|  |  | 
|  | This is in effect the owner and administrator role of the Gerrit | 
|  | instance. Any members of a group granted this capability will be | 
|  | able to grant any access right to any group. They will also have all | 
|  | capabilities granted to them automatically. | 
|  |  | 
|  | In most installations only those users who have direct filesystem and | 
|  | database access should be granted this capability. | 
|  |  | 
|  | This capability does not imply any other access rights. Users that have | 
|  | this capability do not automatically get code review approval or submit | 
|  | rights in projects. This is a feature designed to permit administrative | 
|  | users to otherwise access Gerrit as any other normal user would, | 
|  | without needing two different accounts. | 
|  |  | 
|  |  | 
|  | [[capability_batchChangesLimit]] | 
|  | === Batch Changes Limit | 
|  |  | 
|  | Allow site administrators to configure the batch changes limit for | 
|  | users to override the system config | 
|  | link:config-gerrit.html#receive.maxBatchChanges['receive.maxBatchChanges']. | 
|  |  | 
|  | Administrators can add a global block to `All-Projects` with group(s) | 
|  | that should have different limits. | 
|  |  | 
|  | When applying a batch changes limit to a user the largest value | 
|  | granted by any of their groups is used. 0 means no limit. | 
|  |  | 
|  |  | 
|  | [[capability_createAccount]] | 
|  | === Create Account | 
|  |  | 
|  | Allow link:cmd-create-account.html[account creation over the ssh prompt]. | 
|  | This capability allows the granted group members to create non-interactive | 
|  | service accounts.  These service accounts are generally used for automation | 
|  | and made to be members of the | 
|  | link:access-control.html#service_users['Service users'] group. | 
|  |  | 
|  |  | 
|  | [[capability_createGroup]] | 
|  | === Create Group | 
|  |  | 
|  | Allow group creation.  Groups are used to grant users access to different | 
|  | actions in projects.  This capability allows the granted group members to | 
|  | either link:cmd-create-group.html[create new groups via ssh] or via the web UI | 
|  | by navigating at the top of the page to BROWSE -> Groups, and then pushing the | 
|  | "CREATE NEW" button. | 
|  |  | 
|  |  | 
|  | [[capability_createProject]] | 
|  | === Create Project | 
|  |  | 
|  | Allow project creation.  This capability allows the granted group to | 
|  | either link:cmd-create-project.html[create new git projects via ssh] | 
|  | or via the web UI. | 
|  |  | 
|  |  | 
|  | [[capability_emailReviewers]] | 
|  | === Email Reviewers | 
|  |  | 
|  | Allow or deny sending email to change reviewers and watchers.  This can be used | 
|  | to deny build bots from emailing reviewers and people who watch the change. | 
|  | Instead, only the authors of the change and those who starred it will be | 
|  | emailed.  The allow rules are evaluated before deny rules, however the default | 
|  | is to allow emailing, if no explicit rule is matched. | 
|  |  | 
|  |  | 
|  | [[capability_flushCaches]] | 
|  | === Flush Caches | 
|  |  | 
|  | Allow the flushing of Gerrit's caches.  This capability allows the granted | 
|  | group to link:cmd-flush-caches.html[flush some or all Gerrit caches via ssh]. | 
|  |  | 
|  | [NOTE] | 
|  | This capability doesn't imply permissions to the show-caches command.  For that | 
|  | you need the <<capability_viewCaches,view caches capability>>. | 
|  |  | 
|  |  | 
|  | [[capability_kill]] | 
|  | === Kill Task | 
|  |  | 
|  | Allow the operation of the link:cmd-kill.html[kill command over ssh].  The | 
|  | kill command ends tasks that currently occupy the Gerrit server, usually | 
|  | a replication task or a user initiated task such as an upload-pack or | 
|  | receive-pack. | 
|  |  | 
|  | [[capability_maintainServer]] | 
|  | === Maintain Server | 
|  |  | 
|  | Allow basic, constrained server maintenance tasks, such as flushing caches and | 
|  | reindexing changes. Does not grant arbitrary database access, read/write, or | 
|  | ACL management permissions, as might the | 
|  | <<capability_administrateServer,administrate server capability>>. | 
|  |  | 
|  | Implies the following capabilities: | 
|  |  | 
|  | * <<capability_flushCaches,Flush Caches>> | 
|  | * <<capability_kill,Kill Task>> | 
|  | * <<capability_runGC,Run Garbage Collection>> | 
|  | * <<capability_viewCaches,View Caches>> | 
|  | * <<capability_viewQueue,View Queue>> | 
|  |  | 
|  | [[capability_modifyAccount]] | 
|  | === Modify Account | 
|  |  | 
|  | Allow to link:cmd-set-account.html[modify accounts over the ssh prompt]. | 
|  | This capability allows the granted group members to modify any user account | 
|  | setting. In addition this capability is required to view secondary emails | 
|  | of other accounts. | 
|  |  | 
|  | [[capability_priority]] | 
|  | === Priority | 
|  |  | 
|  | This capability allows users to use | 
|  | link:config-gerrit.html#sshd.batchThreads[the thread pool reserved] for | 
|  | link:access-control.html#service_users['Service Users']. | 
|  | It's a binary value in that granted users either have access to the thread | 
|  | pool, or they don't. | 
|  |  | 
|  | There are three modes for this capability and they're listed by rising | 
|  | priority: | 
|  |  | 
|  | No capability configured.:: | 
|  | The user isn't a member of a group with any priority capability granted. By | 
|  | default the user is then in the 'INTERACTIVE' thread pool. | 
|  |  | 
|  | 'BATCH':: | 
|  | If there's a thread pool configured for 'Service Users' and a user is | 
|  | granted the priority capability with the 'BATCH' mode selected, the user ends | 
|  | up in the separate batch user thread pool. This is true unless the user is | 
|  | also granted the below 'INTERACTIVE' option. | 
|  |  | 
|  | 'INTERACTIVE':: | 
|  | If a user is granted the priority capability with the 'INTERACTIVE' option, | 
|  | regardless if they also have the 'BATCH' option or not, they are in the | 
|  | 'INTERACTIVE' thread pool. | 
|  |  | 
|  |  | 
|  | [[capability_queryLimit]] | 
|  | === Query Limit | 
|  |  | 
|  | Allow site administrators to configure the query limit for users to | 
|  | be above the default hard-coded value of 500.  Administrators can add | 
|  | a global block to `All-Projects` with group(s) that should have different | 
|  | limits. | 
|  |  | 
|  | When applying a query limit to a user the largest value granted by | 
|  | any of their groups is used. | 
|  |  | 
|  | This limit applies not only to the link:cmd-query.html[`gerrit query`] | 
|  | command, but also to the web UI results pagination size. | 
|  |  | 
|  |  | 
|  | [[capability_readAs]] | 
|  | === Read As | 
|  |  | 
|  | Allow users to impersonate any user to see which refs they can read. | 
|  |  | 
|  |  | 
|  | [[capability_runAs]] | 
|  | === Run As | 
|  |  | 
|  | Allow users to impersonate any other user with the `X-Gerrit-RunAs` | 
|  | HTTP header on REST API calls, or the link:cmd-suexec.html[suexec] | 
|  | SSH command. | 
|  |  | 
|  | When impersonating an administrator the Administrate Server capability | 
|  | is not honored.  This security feature tries to prevent a role with | 
|  | Run As capability from modifying the access controls in All-Projects, | 
|  | however modification may still be possible if the impersonated user | 
|  | has permission to push or submit changes on `refs/meta/config`.  Run | 
|  | As also blocks using most capabilities including Create User, Run | 
|  | Garbage Collection, etc., unless the capability is also explicitly | 
|  | granted to a group the administrator is a member of. | 
|  |  | 
|  | Administrators do not automatically inherit this capability; it must | 
|  | be explicitly granted. | 
|  |  | 
|  |  | 
|  | [[capability_runGC]] | 
|  | === Run Garbage Collection | 
|  |  | 
|  | Allow users to run the Git garbage collection for the repositories of | 
|  | all projects. | 
|  |  | 
|  |  | 
|  | [[capability_streamEvents]] | 
|  | === Stream Events | 
|  |  | 
|  | Allow performing streaming of Gerrit events. This capability | 
|  | allows the granted group to | 
|  | link:cmd-stream-events.html[stream Gerrit events via ssh]. | 
|  |  | 
|  |  | 
|  | [[capability_viewAccess]] | 
|  | === View Access | 
|  |  | 
|  | Allow checking access rights for arbitrary (user, project) pairs, | 
|  | using the link:rest-api-projects.html#check-access[check.access] | 
|  | endpoint | 
|  |  | 
|  | [[capability_viewAllAccounts]] | 
|  | === View All Accounts | 
|  |  | 
|  | Allow viewing all accounts for purposes of auto-completion, regardless | 
|  | of link:config-gerrit.html#accounts.visibility[accounts.visibility] | 
|  | setting. | 
|  |  | 
|  | This capability allows to view all accounts but not all account data. | 
|  | E.g. secondary emails of all accounts can only be viewed with the | 
|  | link:#capability_modifyAccount[Modify Account] capability. | 
|  |  | 
|  |  | 
|  | [[capability_viewCaches]] | 
|  | === View Caches | 
|  |  | 
|  | Allow querying for status of Gerrit's internal caches.  This capability allows | 
|  | the granted group to | 
|  | link:cmd-show-caches.html[look at some or all Gerrit caches via ssh]. | 
|  |  | 
|  |  | 
|  | [[capability_viewConnections]] | 
|  | === View Connections | 
|  |  | 
|  | Allow querying for status of Gerrit's current client connections.  This | 
|  | capability allows the granted group to | 
|  | link:cmd-show-connections.html[look at Gerrit's current connections via ssh]. | 
|  |  | 
|  |  | 
|  | [[capability_viewPlugins]] | 
|  | === View Plugins | 
|  |  | 
|  | Allow viewing the list of installed plugins. | 
|  |  | 
|  |  | 
|  | [[capability_viewQueue]] | 
|  | === View Queue | 
|  |  | 
|  | Allow querying for status of Gerrit's internal task queue.  This capability | 
|  | allows the granted group to | 
|  | link:cmd-show-queue.html[look at the Gerrit task queue via ssh]. | 
|  |  | 
|  |  | 
|  | [[reference]] | 
|  | == Permission evaluation reference | 
|  |  | 
|  | Permission evaluation is expressed in the following concepts: | 
|  |  | 
|  | * PermisssionRule: a single combination of {ALLOW, DENY, BLOCK} and | 
|  | group, and optionally a vote range and an 'exclusive' bit. | 
|  |  | 
|  | * Permission: groups PermissionRule by permission name. All | 
|  | PermissionRules for same access type (eg. "read", "push") are grouped | 
|  | into a Permission implicitly. The exclusive bit lives here. | 
|  |  | 
|  | * AccessSection: ties a list of Permissions to a single ref pattern. | 
|  | Each AccessSection comes from a single project. | 
|  |  | 
|  |  | 
|  |  | 
|  | Here is how these play out in a link:config-project-config.html[project.config] file: | 
|  |  | 
|  | ---- | 
|  | # An AccessSection | 
|  | [access "refs/heads/stable/*"] | 
|  | exclusiveGroupPermissions = create | 
|  |  | 
|  | # Each of the following lines corresponds to a PermissionRule | 
|  | # The next two PermissionRule together form the "read" Permission | 
|  | read = group Administrators | 
|  | read = group Registered Users | 
|  |  | 
|  | # A Permission with a block and block-override | 
|  | create = block group Registered Users | 
|  | create = group Project Owners | 
|  |  | 
|  | # A Permission and PermissionRule for a label | 
|  | label-Code-Review = -2..+2 group Project Owners | 
|  | ---- | 
|  |  | 
|  | === Ref permissions | 
|  |  | 
|  | Access to refs can be blocked, allowed or denied. | 
|  |  | 
|  | ==== BLOCK | 
|  |  | 
|  | For blocking access, all rules marked BLOCK are tested, and if one | 
|  | such rule matches, the user is denied access. | 
|  |  | 
|  | The rules are ordered by inheritance, starting from All-Projects down. | 
|  | Within a project, more specific ref patterns come first. The downward | 
|  | ordering lets administrators enforce access rules across all projects | 
|  | in a site. | 
|  |  | 
|  | BLOCK rules can have exceptions defined on the same project (eg. BLOCK | 
|  | anonymous users, ie. everyone, but make an exception for Admin users), | 
|  | either by: | 
|  |  | 
|  | 1. adding ALLOW PermissionRules in the same Permission. This implies | 
|  | they apply to the same ref pattern. | 
|  |  | 
|  | 2. adding an ALLOW Permission in the same project with a more specific | 
|  | ref pattern, but marked "exclusive". This allows them to apply to | 
|  | different ref patterns. | 
|  |  | 
|  | Such additions not only bypass BLOCK rules, but they will also grant | 
|  | permissions when they are processed in the ALLOW/DENY processing, as | 
|  | described in the next subsection. | 
|  |  | 
|  | ==== ALLOW | 
|  |  | 
|  | For allowing access, all ALLOW/DENY rules that might apply to a ref | 
|  | are tested until one granting access is found, or until either an | 
|  | "exclusive" rule ends the search, or all rules have been tested. | 
|  |  | 
|  | The rules are ordered from specific ref patterns to general patterns, | 
|  | and for equally specific patterns, from originating project up to | 
|  | All-Projects. | 
|  |  | 
|  | This ordering lets project owners apply permissions specific to their | 
|  | project, overwriting the site defaults specified in All-Projects. | 
|  |  | 
|  | ==== DENY | 
|  |  | 
|  | DENY is processed together with ALLOW. | 
|  |  | 
|  | As said, during ALLOW/DENY processing, rules are tried out one by one. | 
|  | For each (permission, ref-pattern, group) only a single rule | 
|  | ALLOW/DENY rule is picked. If that first rule is a DENY rule, any | 
|  | following ALLOW rules for the same (permission, ref-pattern, group) | 
|  | will be ignored, canceling out their effect. | 
|  |  | 
|  | DENY is confusing because it only works on a specific (ref-pattern, | 
|  | group) pair. The parent project can undo the effect of a DENY rule by | 
|  | introducing an extra rule which features a more general ref pattern or | 
|  | a different group. | 
|  |  | 
|  | ==== DENY/ALLOW example | 
|  |  | 
|  | Consider the ref "refs/a" and the following configuration: | 
|  | ---- | 
|  |  | 
|  | child-project: project.config | 
|  | [access "refs/a"] | 
|  | read = deny group A | 
|  |  | 
|  | All-Projects: project.config | 
|  | [access "refs/a"] | 
|  | read = group A      # ALLOW | 
|  | [access "refs/*"] | 
|  | read = group B      # ALLOW | 
|  | ---- | 
|  |  | 
|  | When determining access, first "read = DENY group A" on "refs/a" is | 
|  | encountered. The following rule to consider is "ALLOW read group A" on | 
|  | "refs/a". The latter rule applies to the same (permission, | 
|  | ref-pattern, group) tuple, so it it is ignored. | 
|  |  | 
|  | The DENY rule does not affect the last rule for "refs/*", since that | 
|  | has a different ref pattern and a different group. If group B is a | 
|  | superset of group A, the last rule will still grant group A access to | 
|  | "refs/a". | 
|  |  | 
|  |  | 
|  | ==== Double use of exclusive | 
|  |  | 
|  | An 'exclusive' permission is evaluated both during BLOCK processing | 
|  | and during ALLOW/DENY: when looking BLOCK, 'exclusive' stops the | 
|  | search downward, while the same permission in the ALLOW/DENY | 
|  | processing will stop looking upward for further rule matches | 
|  |  | 
|  | ==== Force permission | 
|  |  | 
|  | The 'force' setting may be set on ALLOW and BLOCK rules. In the case | 
|  | of ALLOW, the 'force' option makes the permission stronger (allowing | 
|  | both forced and unforced actions). For BLOCK, the 'force' option makes | 
|  | it weaker (the BLOCK with 'force' only blocks forced actions). | 
|  |  | 
|  |  | 
|  | === Labels | 
|  |  | 
|  | Labels use the same mechanism, with the following observations: | 
|  |  | 
|  | * The 'force' setting has no effect on label ranges. | 
|  |  | 
|  | * BLOCK specifies the values that a group cannot vote, eg. | 
|  | + | 
|  | ---- | 
|  | label-Code-Review = block -2..+2 group Anonymous Users | 
|  | ---- | 
|  | + | 
|  | prevents all users from voting -2 or +2. | 
|  |  | 
|  | * DENY works for votes too, with the same caveats | 
|  |  | 
|  | * The blocked vote range is the union of the all the blocked vote | 
|  | ranges across projects, so in | 
|  | + | 
|  | ---- | 
|  | All-Projects: project.config | 
|  | label-Code-Review = block -2..+1 group A | 
|  |  | 
|  | Child-Project: project-config | 
|  | label-Code-Review = block -1..+2 group A | 
|  | ---- | 
|  | + | 
|  | members of group A cannot vote at all in the Child-Project. | 
|  |  | 
|  |  | 
|  | * The allowed vote range is the union of vote ranges allowed by all of | 
|  | the ALLOW rules. For example, in | 
|  | + | 
|  | ---- | 
|  | label-Code-Review = -2..+1 group A | 
|  | label-Code-Review = -1..+2 group B | 
|  | ---- | 
|  | + | 
|  | a user that is both in A and B can vote -2..2. | 
|  |  | 
|  |  | 
|  | GERRIT | 
|  | ------ | 
|  | Part of link:index.html[Gerrit Code Review] | 
|  |  | 
|  | SEARCHBOX | 
|  | --------- |