fix(audit,sso): audit 表補 group_name/action 欄 + 註冊 Audit_Logger + known_login_ips(A11/A12/A14)
- wpdo_audit CREATE 補 group_name varchar(50) 與 action varchar(20): TMDO_Audit_Logger::write_row() 一直在寫這兩個 key,表卻沒有該欄位。 SCHEMA_VERSION 2.0.0 → 2.1.0 觸發既有站台 dbDelta ALTER;主檔與兩個 test bootstrap 的 TMDO_DB_VERSION 同步(BackCompatTest 守門要求一致)。 - TMDO_Core::run() 註冊 TMDO_Audit_Logger::init():先前完全沒掛, wpdo_after_write / wpdo_after_delete 的稽核監聽器形同不存在。 - register_sso_group() 補 known_login_ips(A v3.4.4):2meet-spoke-sso 的 TMSO_Login_Notify 以 set_entity 寫此欄,未註冊時降級落 wp_usermeta。 對應測試改為 test_sso_group_has_eight_fields。 unit 379 / integration 398 GREEN Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TbG1keQQ7XBa7qMQY16KCY
This commit is contained in:
@@ -25,7 +25,7 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|||||||
|
|
||||||
// ── Constants ──────────────────────────────────────────────────────────────
|
// ── Constants ──────────────────────────────────────────────────────────────
|
||||||
define( 'TMDO_VERSION', '0.1.0' );
|
define( 'TMDO_VERSION', '0.1.0' );
|
||||||
define( 'TMDO_DB_VERSION', '2.0.0' );
|
define( 'TMDO_DB_VERSION', '2.1.0' );
|
||||||
define( 'TMDO_PATH', plugin_dir_path( __FILE__ ) );
|
define( 'TMDO_PATH', plugin_dir_path( __FILE__ ) );
|
||||||
define( 'TMDO_URL', plugin_dir_url( __FILE__ ) );
|
define( 'TMDO_URL', plugin_dir_url( __FILE__ ) );
|
||||||
define( 'TMDO_FILE', __FILE__ );
|
define( 'TMDO_FILE', __FILE__ );
|
||||||
|
|||||||
@@ -134,6 +134,11 @@ class TMDO_Core {
|
|||||||
// v2.0.0: boot the unified Hook Bus when explicitly enabled.
|
// v2.0.0: boot the unified Hook Bus when explicitly enabled.
|
||||||
TMDO_Hook_Bus_Bridge::maybe_init_hook_bus();
|
TMDO_Hook_Bus_Bridge::maybe_init_hook_bus();
|
||||||
|
|
||||||
|
// Register audit log listeners for wpdo_after_write / wpdo_after_delete.
|
||||||
|
if ( class_exists( 'TMDO_Audit_Logger' ) ) {
|
||||||
|
TMDO_Audit_Logger::init();
|
||||||
|
}
|
||||||
|
|
||||||
// v2.0.0: fire the Custom Table Registry hook so partner plugins can register.
|
// v2.0.0: fire the Custom Table Registry hook so partner plugins can register.
|
||||||
TMDO_Custom_Table_Registry::instance()->fire_registration();
|
TMDO_Custom_Table_Registry::instance()->fire_registration();
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ class TMDO_Installer {
|
|||||||
* wpdo_audit / wpdo_shadow_diffs / wpdo_site_metrics / wpdo_uni_options
|
* wpdo_audit / wpdo_shadow_diffs / wpdo_site_metrics / wpdo_uni_options
|
||||||
* tables installed via install_v2_tables() during V2 upgrade.
|
* tables installed via install_v2_tables() during V2 upgrade.
|
||||||
*/
|
*/
|
||||||
private const SCHEMA_VERSION = '2.0.0';
|
private const SCHEMA_VERSION = '2.1.0';
|
||||||
|
|
||||||
// ── Public API ────────────────────────────────────────────────────────
|
// ── Public API ────────────────────────────────────────────────────────
|
||||||
|
|
||||||
@@ -289,7 +289,9 @@ class TMDO_Installer {
|
|||||||
user_id bigint(20) unsigned NOT NULL DEFAULT 0,
|
user_id bigint(20) unsigned NOT NULL DEFAULT 0,
|
||||||
entity_type varchar(20) NOT NULL DEFAULT '',
|
entity_type varchar(20) NOT NULL DEFAULT '',
|
||||||
entity_id bigint(20) unsigned NOT NULL DEFAULT 0,
|
entity_id bigint(20) unsigned NOT NULL DEFAULT 0,
|
||||||
|
group_name varchar(50) NOT NULL DEFAULT '',
|
||||||
meta_key varchar(255) NOT NULL DEFAULT '',
|
meta_key varchar(255) NOT NULL DEFAULT '',
|
||||||
|
action varchar(20) NOT NULL DEFAULT '',
|
||||||
op varchar(20) NOT NULL DEFAULT '',
|
op varchar(20) NOT NULL DEFAULT '',
|
||||||
value_before longtext,
|
value_before longtext,
|
||||||
value_after longtext,
|
value_after longtext,
|
||||||
|
|||||||
@@ -266,6 +266,11 @@ final class TMDO_Member_Fields {
|
|||||||
'default' => 0,
|
'default' => 0,
|
||||||
'label' => 'SSO login count',
|
'label' => 'SSO login count',
|
||||||
),
|
),
|
||||||
|
array(
|
||||||
|
'key' => 'known_login_ips',
|
||||||
|
'type' => 'textarea',
|
||||||
|
'label' => 'Recent login IPs JSON array (new-device notification) — replaces _tmso_known_ips usermeta',
|
||||||
|
),
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -18,7 +18,7 @@ define( 'TMDO_PATH', dirname( __DIR__ ) . '/' );
|
|||||||
define( 'TMDO_URL', 'http://localhost/wp-content/plugins/2meet-data-optimizer/' );
|
define( 'TMDO_URL', 'http://localhost/wp-content/plugins/2meet-data-optimizer/' );
|
||||||
define( 'TMDO_FILE', dirname( __DIR__ ) . '/2meet-data-optimizer.php' );
|
define( 'TMDO_FILE', dirname( __DIR__ ) . '/2meet-data-optimizer.php' );
|
||||||
define( 'TMDO_VERSION', '0.1.0' );
|
define( 'TMDO_VERSION', '0.1.0' );
|
||||||
define( 'TMDO_DB_VERSION', '2.0.0' );
|
define( 'TMDO_DB_VERSION', '2.1.0' );
|
||||||
define( 'TMDO_IS_SQLITE', false );
|
define( 'TMDO_IS_SQLITE', false );
|
||||||
define( 'TMDO_IS_MYSQL', true );
|
define( 'TMDO_IS_MYSQL', true );
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ if ( false === $_plugin_header || ! preg_match( '/Version:\s*([0-9A-Za-z.\-+]+)/
|
|||||||
define( 'TMDO_VERSION', $_ver[1] );
|
define( 'TMDO_VERSION', $_ver[1] );
|
||||||
unset( $_plugin_header, $_ver );
|
unset( $_plugin_header, $_ver );
|
||||||
|
|
||||||
define( 'TMDO_DB_VERSION', '2.0.0' );
|
define( 'TMDO_DB_VERSION', '2.1.0' );
|
||||||
define( 'TMDO_IS_SQLITE', false );
|
define( 'TMDO_IS_SQLITE', false );
|
||||||
define( 'TMDO_IS_MYSQL', true );
|
define( 'TMDO_IS_MYSQL', true );
|
||||||
if ( ! defined( 'TMDO_TABLE_PREFIX' ) ) { define( 'TMDO_TABLE_PREFIX', 'wpdo_' ); }
|
if ( ! defined( 'TMDO_TABLE_PREFIX' ) ) { define( 'TMDO_TABLE_PREFIX', 'wpdo_' ); }
|
||||||
|
|||||||
@@ -144,10 +144,12 @@ class MemberFieldsRegistrationTest extends TestCase {
|
|||||||
|
|
||||||
// ── sso group ────────────────────────────────────────────────────────────
|
// ── sso group ────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
public function test_sso_group_has_seven_fields(): void {
|
public function test_sso_group_has_eight_fields(): void {
|
||||||
WPDO_Member_Fields::register_entity_fields();
|
WPDO_Member_Fields::register_entity_fields();
|
||||||
$fields = WPDO_Entity_Registry::get_group_fields( 'user', 'sso' );
|
$fields = WPDO_Entity_Registry::get_group_fields( 'user', 'sso' );
|
||||||
$this->assertCount( 7, $fields );
|
// v3.4.4: known_login_ips registered (was leaking to wp_usermeta via set_entity).
|
||||||
|
$this->assertCount( 8, $fields );
|
||||||
|
$this->assertNotNull( $this->find_field( $fields, 'known_login_ips' ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
public function test_hub_global_user_id_is_searchable(): void {
|
public function test_hub_global_user_id_is_searchable(): void {
|
||||||
|
|||||||
Reference in New Issue
Block a user