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