:linkattrs:
= Gerrit Code Review - User Privacy

== Purpose

This page documents how Gerrit handles user data.

|===
| Note: Gerrit has extensive support for link:config-plugins.html[plugins]
  which extend Gerrits functionality, and these plugins could access, export, or
  maniuplate user data. This document only focuses on the behavior of Gerrit
  core and its link:dev-core-plugins.html[core plugins].
|===

== Types of User Data

Gerrit stores account data required for collaborating on source code changes.
This data is described by
link:config-accounts.html#account-data-in-user-branch[Account Data in User
Branch] and includes link:config-accounts.html#external-ids[External IDs],
link:config-accounts.html#preferences[User Preferences],
link:config-accounts.html#project-watches[Project Watches] and personally
identifiable information, including  name and email address. The email
address is required to associate Git commits with a Gerrit user account. All
data except passwords is made accessible to other users who you are visible to,
as detailed below.

== User Visibility

Gerrit has a concept of link:config-gerrit.html#accounts[account visibility]
which determines what users a given user can see. This visibility configuration
applies in account search, reviewer suggestion, and when accessing data through
the link:rest-api-accounts.html#account-endpoints[Account REST endpoints]. If
you can see a user, you have read access to most of the
link:rest-api-accounts.html#account-info[AccountInfo] for that user, including
name and email address. Additional information, including secondary emails, is
included in AccountInfo if the caller has “Modify Account” permissions.

Additionally, all users on a change (author, cc’d, reviewer) can see each other,
irrespective of the  account visibility settings. For example: Say you are a
reviewer on a change where user Foo is also a reviewer. Even if by account
visibility you could not search for Foo, you'd still see their avatar, name,
and email now because you can see the change; this information is required to
collaborate on a code review. If Foo wasn't on that change, you could not add
them because reviewer suggestions would not find them due to the account
visibility settings.

By default, account visibility on a Gerrit instance is set to `ALL` which allows
all users to be visible to other users, even anonymous (i.e. unauthenticated)
users. Depending on your installation type, you may want to change this:

* For completely company-internal Gerrit installations (no external users), the
`ALL` default may make sense.

* If you work with multiple vendors who have
access to their own independent sets of repos, `VISIBLE_GROUP` may be more
appropriate as you wouldn’t want vendor A to see accounts from vendor B.

* For public installations, e.g. for open source projects, you may want to
change this setting or add a notice for users when they create an account e.g.
“Most of what you submit on this site, including your email address and name,
will be visible to others who use this service. You may prefer to use an email
account specifically for this purpose.” One way to do this is using
link:config-gerrit.html[`auth.registerPageUrl`] in `gerrit.config`.

== ACLs and User Visibility

User suggestions for changes, when adding a reviewer or cc-ing someone, always
respect ACLs for that change: only users who can see the change are suggested.
The suggested users are an intersection of who you can see and who can see the
change.

Consider the following situation:

* `READ` permission for Registered Users on the host
* User visibility is set to `VISIBILE_GROUP`, so only users of the same domain can
  see each other
* a@foo.com creates change 123

This would mean:

* a@foo.com cannot add b@bar.com to the change because these users cannot see
  each other due to the user visibility setting.
* b@bar.com can find change 123
  because they have READ permission and could add themselves to the change.
* a@foo.com would then be able to see b@bar.com’s name, avatar, and email on
  change 123

The only caveat to the above are Private Changes, which are only visible to the
owner and reviewers; reviewers can only see the change once they are added to
the change (if ACLs allow them to be added in the first place), not before.

## Right to be Forgotten Limitations

As a source control system, Gerrit has limited abilities to remove personally
identifiable information. Notably, Gerrit cannot:

* Remove a user's e-mail from all existing commits
* Remove a user's username

There is also a known
link:https://bugs.chromium.org/p/gerrit/issues/detail?id=14185[bug] where a
user's username is stored in metadata for link:user-attention-set.html[Attention
Set].


## Open Source Software Limitations

Gerrit is open-source software licensed under the Apache 2.0 license.  Unless
required by applicable law or agreed to in writing, software distributed under
the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
OF ANY KIND, either express or implied. See the License for the specific
language governing permissions and limitations under the License.