Descriptoin:

註冊完成gerrit 帳號後,在預設的情況下必須透過 email 來驗證帳號,否則無法進行其他動作。
但若 server 本身並無 mail server 的功能,即無法發送接收信件,或是其他因素無法使用email,即無法驗證帳號。
 

Solution:

可修改 gerrit 使用的 database, 由於 database 存放所有 gerrit 使用的資料,不僅可以修改驗證還可以修改使用者權限等等。
但此方法必須具有登入並 root server 的權限才可。
 
Step 1.
登入 gerrit server 並停止 gerrit 服務。

sudo sh /your_gerrit_shell_path/gerrit.sh stop

 
Step 2.
利用 gerrit.war 執行 gsql 指令,以登入 sql。

java -jar gerrit.war gsql

如果出現以下error,必須注意先移動到相關 review_site 資料夾再執行 gerrit.war,

fatal: not a Gerrit site: '/xxx'
fatal: Perhaps you need to run init first?

以我為例,我的gerrit.war 是位於 review_site 的上一層資料夾,所以必須先移動到 review_site,再執行 gerrit.war

cd /xxx/review_site
sudo java -jar ../gerrit.war gsql

成功的話應該可以登入到 sql 中,接著準備修改相關資料

➜  review_site  sudo java -jar ../gerrit-2.1.8.war gsql
Welcome to Gerrit Code Review 2.1.8
(MySQL 5.5.38-0ubuntu0.12.04.1)
Type '\h' for help.  Type '\r' to clear the buffer.
gerrit>

Step 3.
由於資料表相當多,這邊只介紹如何手動加入驗證 email, 以及修改使用者權限,有興趣的話可以修改其它數值玩玩看。
手動加入驗證 email 必須修改 account_external_ids 資料表
使用 show databases; 查詢所有資料庫,使用 show tables;  查詢某資料庫中所有資料表。使用 use databasename; 選擇資料庫。

gerrit> show databases;
 Database
 ------------------
 information_schema
 reviewdb
(2 rows; 27 ms)
gerrit> use reviewdb;
UPDATE 0; 1 ms
gerrit> show tables;
 Tables_in_reviewdb
 ----------------------------
 account_agreements
 account_diff_preferences
 account_external_ids
 account_group_agreements
 account_group_id
 account_group_includes
 account_group_includes_audit
 account_group_members
 account_group_members_audit
 account_group_names
 account_groups
 account_id
 account_patch_reviews
 account_project_watches
 account_ssh_keys
 accounts
 approval_categories
 approval_category_values
 change_id
 change_message_id
 change_messages
 changes
 contributor_agreement_id
 contributor_agreements
 patch_comments
 patch_set_ancestors
 patch_set_approvals
 patch_sets
 projects
 ref_rights
 schema_version
 starred_changes
 system_config
 tracking_ids
(34 rows; 24 ms)
gerrit>

從上圖中可以看到 account_external_ids 資料表是位於 reviewdb 資料庫。

修改使用者驗證信箱

接著看看 account _external_ids 資料表的內容,我們的目標為修改 testuser,讓其驗證信箱為驗證完成狀態。

gerrit> select * from account_external_ids;
 account_id | email_address    | password | external_id
 -----------+------------------+----------+-----------------
 2          | NULL             | NULL     | gerrit:testuser
 1          | NULL             | NULL     | gerrit:xxx
 2          | NULL             | NULL     | username:testuser
 1          | NULL             | NULL     | username:xxx
(4 rows; 2 ms)

我們的目標就是修改 testuser 的 email_address , 讓它不可為NULL。
使用以下指令修改欄位值

gerrit> update account_external_ids set email_address='example@example' where account_id=2;
UPDATE 2; 5 ms

修改完成後再查看account_external_ids table

gerrit> select * from account_external_ids;
 account_id | email_address    | password | external_id
 -----------+------------------+----------+-----------------
 2          | example@example  | NULL     | gerrit:testuser
 1          | NULL             | NULL     | gerrit:xxx
 2          | example@example  | NULL     | username:testuser
 1          | NULL             | NULL     | username:xxx
(4 rows; 2 ms)

離開sql , 重啟 gerrit 看到修改後的結果。

gerrit> \q
Bye
sudo /etc/init.d/apache2 restart
sudo sh /your_gerrit_shell_path/gerrit.sh run

 

修改使用者權限為 admin

首先確認使用者的 account_id, 下表還有一些內容因為用不到所以忽略,只要找到 user_name 和所對應的 account_id 即可,可以發現 testuser 的 account_id 為 2。

gerrit> select * from accounts;
full_name      | account_id
---------------------------
| testuser     | 2
(2 rows; 2 ms)(2 rows; 2 ms)

查詢 admin 對應的 group_id,可以確認 admin 所屬的 group_id 為 1。

gerrit> select * from account_groups;
 name                  | owner_group_id | description                           | group_type | external_name | visible_to_all | email_only_authors | group_id
 ----------------------+----------------+-------------------------------------------+------------+---------------+----------------+--------------------+------
 Administrators        | 1              | Gerrit Site Administrators            | INTERNAL   | NULL          | N              | N                  | 1
 Anonymous Users       | 1              | Any user, signed-in or not            | SYSTEM     | NULL          | N              | N                  | 2
 Registered Users      | 1              | Any signed-in user                    | SYSTEM     | NULL          | N              | N                  | 3
(6 rows; 3 ms)

查詢 account_id 所屬的 group_id

gerrit> select * from account_group_members;
 account_id | group_id
 -----------+---------
 1          | 1
 2          | NULL

可以看到 account_id 為 2 的部份,其所屬的 group_id 為 NULL,所以只要把 NULL 修改為 1 ,就能讓 testuser 權限變更為 admin。
使用 update 來更改數值

gerrit> update account_group_members set group_id=1 where account_id=2;
UPDATE 1; 30 ms

重新檢查一次 account_group_members , 已經完成修改。

gerrit> select * from account_group_members;
 account_id | group_id
 -----------+---------
 1          | 1
 2          | 1
(2 rows; 1 ms)

離開 sql , 重啟 gerrit,進入 gerrit 頁面就可看到成果。

gerrit> \q
Bye
sudo /etc/init.d/apache2 restart
sudo sh /your_gerrit_shell_path/gerrit.sh run