WordPress iOS app 老用戶的bug

Written by

in

其實Wordpress 的iOS app 我用得不多,但偶爾會用一下,有時候想到什麼先寫下來,整理了再發出來,但是最近iOS app 更新後我發現登錄不上。

經過我和AI 對source code 的分析,最終定位到問題所在,去github 提了個issue,很快就被合併提交,既然他們動作這麼快,為什麼之前都沒人提?

因為這是一個老用戶才會卡到的bug, 新用戶不存在,我直接修改了database 來匹配新版的app。

以下為AI 整理:


問題

WordPress iOS app (26.8) 登入自架站 時,瀏覽器 2FA 認證成功、產生 Application Password 也成功,但最後顯示「Site details cannot be loaded」。

根本原因

WordPress iOS app 新的 Rust-based HTTP client (wordpress-rs 0.1.0) 在 wp_api/src/users.rs 裡,把 extra_capabilities 宣告成:

pub extra_capabilities: Option<HashMap<String, bool>>,

值必須是 boolean。但 2011 年建立的老 admin 帳號,資料庫 wp_usermeta.wp_capabilities 裡存的是:

array('administrator' => '1')  // string

Rust serde deserializer 遇到 string "1" 無法轉成 bool,整個 User 物件 parse 失敗 → iOS app 回報「Site details cannot be loaded」。

新註冊的使用者沒問題,因為 WordPress 核心 set_role() 寫入的是 true(boolean)。

解法

直接改資料庫:

update_user_meta(1, 'wp_capabilities', array('administrator' => true));

Debug 過程的收穫

  1. 證實不是 server 設定問題:Nginx、CloudFront、REST API、Application Password 全部正常
  2. 排除了 Two Factor / WP-WebAuthn / Jetpack 404 等假設
  3. PHP-FPM 的 php_admin_value[error_log] 會強制覆蓋 WP_DEBUG_LOG,導致 WordPress debug log 無法運作
  4. systemd PrivateTmp 會讓 /tmp 變成 service 專屬,外部看不到
  5. Android app 能過但 iOS 不行 是因為 iOS 改用 wordpress-rs,Android 還在用舊 client(type 較寬鬆)
  6. 當 server 端所有回應看起來都正常,而錯誤發生在 client 端時,直接看 client 的原始碼是最直接的 debug 方式(最後一步靠 clone wordpress-rs 找出答案)

建議

這是 wordpress-rs 的 bug,應該寬容處理 "1"true。可以到 https://github.com/Automattic/wordpress-rs/issues 報告,幫其他老站使用者。

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *