|  | 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. | 
|  |  | 
|  |  | 
|  | System Groups | 
|  | ------------- | 
|  |  | 
|  | Gerrit comes with 4 system groups, with special access privileges | 
|  | and membership management.  The identity of these groups is set | 
|  | in the `system_config` table within the database, so the groups | 
|  | can be renamed after installation if desired. | 
|  |  | 
|  |  | 
|  | [[administrators]] | 
|  | Administrators | 
|  | ~~~~~~~~~~~~~~ | 
|  |  | 
|  | This is the Gerrit "root" identity. | 
|  |  | 
|  | Users in the 'Administrators' group can perform any action under | 
|  | the Admin menu, to any group or project, without further validation | 
|  | or any other access controls.  In most installations only those | 
|  | users who have direct filesystem and database access would be | 
|  | placed into this group. | 
|  |  | 
|  | Membership in the 'Administrators' group does not imply any other | 
|  | access rights.  Administrators 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. | 
|  |  | 
|  |  | 
|  | [[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. | 
|  |  | 
|  |  | 
|  | [[non-interactive_users]] | 
|  | Non-Interactive Users | 
|  | ~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | This is an internal user group, 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 non-interactive users from the ones made by the interactive | 
|  | users. This ensures that the interactive users can keep working when | 
|  | resources are tight. | 
|  |  | 
|  |  | 
|  | [[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. | 
|  |  | 
|  |  | 
|  | [[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. | 
|  |  | 
|  |  | 
|  | 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]. | 
|  |  | 
|  | 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 | 
|  | `refs/heads/master` and `refs/heads/experimental`, 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] | 
|  | is used for evaluation of regular expression access control | 
|  | rules. See the library documentation for details on this | 
|  | particular regular expression flavor. | 
|  |  | 
|  | References can have the current user name 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}/*` allowing | 
|  | the user 'joe' to use 'refs/heads/sandbox/joe/foo'. | 
|  |  | 
|  | 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. | 
|  |  | 
|  | [verse] | 
|  | '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 is residing.  This | 
|  | branch contains several files of importance: +project.config+, +groups+ and | 
|  | +rules.pl+.  Torgether 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/<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. | 
|  |  | 
|  |  | 
|  | refs/publish/* | 
|  | ^^^^^^^^^^^^^^ | 
|  |  | 
|  | `refs/publish/*` is an alternative name to `refs/for/*` when pushing new changes | 
|  | and patch sets. | 
|  |  | 
|  |  | 
|  | refs/drafts/* | 
|  | ^^^^^^^^^^^^^ | 
|  |  | 
|  | Push to `refs/drafts/*` creates a change like push to `refs/for/*`, except the | 
|  | resulting change remains hidden from public review.  You then have the option | 
|  | of adding individual reviewers before making the change public to all.  The | 
|  | change page will have a 'Publish' button which allows you to convert individual | 
|  | draft patch sets of a change into public patch sets for review. | 
|  |  | 
|  |  | 
|  | [[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. | 
|  |  | 
|  | 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. | 
|  |  | 
|  | 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_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 | 
|  | * Create/delete a branch through the web UI (not SSH) | 
|  | * Grant/revoke any access rights, including `Owner` | 
|  |  | 
|  | Note that project owners implicitly have branch creation or deletion | 
|  | through the web UI, but not through SSH.  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. | 
|  |  | 
|  |  | 
|  | [[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 | 
|  | + | 
|  | Allows an existing branch to be deleted. 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 `Read` and `Push` for `refs/for/refs/heads/*` | 
|  | to `Registered Users` in the `All-Projects` ACL.  For more | 
|  | private installations, its common to simply grant `Read` and | 
|  | `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_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]] | 
|  | Push 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 `Push 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. | 
|  |  | 
|  |  | 
|  | [[category_push_signed]] | 
|  | Push 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. | 
|  |  | 
|  | This category has a special behavior, where 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. | 
|  |  | 
|  | 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_remove_reviewer]] | 
|  | Remove Reviewer | 
|  | ~~~~~~~~~~~~~~~ | 
|  |  | 
|  | This category permits users to remove other users from the list of | 
|  | reviewers on a change. | 
|  |  | 
|  | The change owner, project owner and site administrator can always | 
|  | remove reviewers (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 push the `Submit Patch Set n` button | 
|  | on the web UI. | 
|  |  | 
|  | 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`). | 
|  |  | 
|  |  | 
|  | [[category_view_drafts]] | 
|  | View Drafts | 
|  | ~~~~~~~~~~~ | 
|  |  | 
|  | This category permits users to view draft changes uploaded by other | 
|  | users. | 
|  |  | 
|  | The change owner and any explicitly added reviewers can always see | 
|  | draft changes (even without having the `View Drafts` access right | 
|  | assigned). | 
|  |  | 
|  |  | 
|  | [[category_publish_drafts]] | 
|  | Publish Drafts | 
|  | ~~~~~~~~~~~~~~ | 
|  |  | 
|  | This category permits users to publish draft changes uploaded by other | 
|  | users. | 
|  |  | 
|  | The change owner can always publish draft changes (even without having | 
|  | the `Publish Drafts` access right assigned). | 
|  |  | 
|  |  | 
|  | [[category_delete_drafts]] | 
|  | Delete Drafts | 
|  | ~~~~~~~~~~~~~ | 
|  |  | 
|  | This category permits users to delete draft changes uploaded by other | 
|  | users. | 
|  |  | 
|  | The change owner can always delete draft changes (even without having | 
|  | the `Delete Drafts` access right assigned). | 
|  |  | 
|  |  | 
|  | [[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). | 
|  |  | 
|  |  | 
|  | 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/\*' and 'refs/tags/*' | 
|  | * 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/*' | 
|  |  | 
|  |  | 
|  | [[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/\*' and 'refs/tags/*' | 
|  | * 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`] | 
|  |  | 
|  | 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] | 
|  | 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/\*' and 'refs/tags/*' | 
|  | * 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_push_annotated,`Push 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, and it already has | 
|  | all capabilities granted as well.  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>> | 
|  |  | 
|  |  | 
|  | 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 blocks a permission globally. An inherited 'BLOCK' rule cannot | 
|  | be overridden in the inheriting project. Any 'ALLOW' rule, from a different | 
|  | access section or from an inheriting project, which conflicts with an | 
|  | inherited 'BLOCK' rule will not be honored.  Searching for 'BLOCK' rules, in | 
|  | the chain of parent projects, ignores the Exclusive flag that is normally | 
|  | applied to access sections. | 
|  |  | 
|  | 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'. | 
|  |  | 
|  | 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 access the database using the `gsql` command. | 
|  |  | 
|  |  | 
|  | [[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. | 
|  |  | 
|  |  | 
|  | [[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#non-interactive_users['Non-Interactive 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. | 
|  |  | 
|  |  | 
|  | [[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_generateHttpPassword]] | 
|  | Generate HTTP Password | 
|  | ~~~~~~~~~~~~~~~~~~~~~~ | 
|  |  | 
|  | Allow the user to generate HTTP passwords for other users.  Typically this would | 
|  | be assigned to a non-interactive users group. | 
|  |  | 
|  |  | 
|  | [[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_priority]] | 
|  | Priority | 
|  | ~~~~~~~~ | 
|  |  | 
|  | This capability allows users to use | 
|  | link:config-gerrit.html#sshd.batchThreads[the thread pool reserved] for | 
|  | link:access-control.html#non-interactive_users['Non-Interactive 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 'Non-Interactive 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_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_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_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]. | 
|  |  | 
|  |  | 
|  | GERRIT | 
|  | ------ | 
|  | Part of link:index.html[Gerrit Code Review] |