:linkattrs:
= Gerrit Code Review - ExternalId case insensitivity

Gerrit usernames are case insensitive by default: e.g. `johndoe` and `JohnDoe`
represent the same account. However, for installations older than v3.5.x,
the usernames were case sensitive, e.g. `johndoe` and `JohnDoe` can both exist
as separate accounts. This could lead to issues when migrating an account
from LDAP to an internal account, if
xref:config-gerrit.txt#ldap.localUsernameToLowerCase[ldap.localUsernameToLowerCase]
was set. Such usernames can also be rather confusing for users, if they try to
identify authors of comments or changes.

When Gerrit handles case insensitive usernames (external IDs using the
`gerrit:` or `username:` scheme), their external IDs SHA-1 is always computed
using the lowercase external ID, hence there cannot be any account differing
only in the capitalization of their usernames.

Gerrit installations older than v3.5.x that are switching to the case-insensitive
username need to migrate all their existing accounts SHA-1s.

[[migration]]
== Migration

Migrating external ID notes can take several minutes for large sites(for example
migration ++~++45000 accounts can take up to five minutes), so administrators
choose whether to do the migration offline or online, depending on their
available resources and tolerance for downtime.

NOTE: Migration is required only on Gerrit primary instances.

[[offline-migration]]
=== Offline

To run the offline migration execute following steps:

* Stop all Gerrit primary instances
* Set the `auth.userNameCaseInsensitive` to false

----
[auth]
  userNameCaseInsensitive = false
----

* Run:
[verse]
--
_java_ -jar gerrit.war _ChangeExternalIdCaseSensitivity_
  -d <SITE_PATH>
  [--batch]
--

See: link:pgm-ChangeExternalIdCaseSensitivity.html[]

* During the migration `auth.userNameCaseInsensitive` will be set to true
on a node which is executing the migration. When the migration is finished,
on all other primary nodes set `auth.userNameCaseInsensitive` to true
* Start all Gerrit primary instances

[[online-migration]]
=== Online

To start the online migration, set the `auth.userNameCaseInsensitive` and
`auth.userNameCaseInsensitiveMigrationMode` options in `gerrit.config` and
restart Gerrit:
----
[auth]
  userNameCaseInsensitive = true
  userNameCaseInsensitiveMigrationMode = true
----
* Trigger online migration:
----
$ ssh -p <port> <host> gerrit migrate-externalids-to-insensitive
----

See: link:cmd-migrate-externalids-to-insensitive.html[]

[online-ha-migration]
== Online migration for high-availability setup

To start the online migration with a setup containing multiple primary
instances execute following steps:

* On all Gerrit primary instances set `auth.userNameCaseInsensitive` and
`auth.userNameCaseInsensitiveMigrationMode` and perform a rolling restart
----
[auth]
  userNameCaseInsensitive = true
  userNameCaseInsensitiveMigrationMode = true
----
* Trigger online migration:
----
$ ssh -p <port> <host> gerrit migrate-externalids-to-insensitive
----

See: link:cmd-migrate-externalids-to-insensitive.html[]

* When the migration is finished, on all other primary nodes set
`auth.userNameCaseInsensitiveMigrationMode` to false and perform a
rolling restart
----
[auth]
  userNameCaseInsensitive = true
  userNameCaseInsensitiveMigrationMode = false
----

== External ID case insensitivity rollback

The offline migration tool allows to calculate external ID notes named with the SHA-1
from the case sensitive external ID.

To rollback external ID notes migration execute following steps:

* Stop all Gerrit primary instances
* Set the `auth.userNameCaseInsensitive` to true
----
[auth]
  userNameCaseInsensitive = true
----

* Run:
[verse]
--
_java_ -jar gerrit.war _ChangeExternalIdCaseSensitivity_
  -d <SITE_PATH>
  [--batch]
--

See: link:pgm-ChangeExternalIdCaseSensitivity.html[]

* During the migration `auth.userNameCaseInsensitive` will be set to false
on a node which is executing the migration. When the migration is finished,
on all other primary nodes set `auth.userNameCaseInsensitive` to false
* Start all Gerrit primary instances
