PluginProbe
wpForo Forum / 3.1.6
wpForo Forum v3.1.6
3.1.6 3.1.5 3.1.4 3.1.2 3.1.1 3.1.0 3.0.9 3.0.8 3.0.7 trunk 1.0.0 1.0.1 1.0.2 1.1.0 1.1.1 1.1.2 1.2.0 1.3.0 1.3.1 1.4.0 1.4.1 1.4.10 1.4.11 1.4.12 1.4.13 All 138 releases
← All changes | classes/AIContentModeration.php +28 -11 3.0.73.1.6 View file →
@@ -1671,9 +1671,9 @@
1671 1671 'user_info' => $user_info,
1672 1672 'forum' => $context['forum'] ?? null,
1673 1673 'board_id' => $this->board_id,
1674 1674 'settings' => $this->settings,
1675 - 'timestamp' => current_time( 'mysql' ),
1675 + 'timestamp' => current_time( 'mysql', true ), // UTC for timezone conversion
1676 1676 ];
1677 1677 }
1678 1678
1679 1679 /**
@@ -1722,14 +1722,23 @@
1722 1722 // Get display name
1723 1723 $user = get_userdata( $userid );
1724 1724 $display_name = $user ? $user->display_name : 'User';
1725 1725
1726 + // Get user's group IDs for permission checks (primary + secondary)
1727 + $user_groupids = [];
1728 + if ( ! empty( $member['groupid'] ) ) {
1729 + $user_groupids[] = (int) $member['groupid'];
1730 + }
1731 + if ( ! empty( $member['secondary_groupids'] ) ) {
1732 + $user_groupids = array_merge( $user_groupids, array_map( 'intval', (array) $member['secondary_groupids'] ) );
1733 + }
1734 +
1726 1735 return [
1727 1736 'is_guest' => false,
1728 1737 'is_new' => $post_count < $new_user_threshold,
1729 1738 'is_trusted' => $trust_level >= 3, // Trusted Member level
1730 - 'is_moderator' => WPF()->usergroup->can( 'em' ), // Edit members permission
1731 - 'is_admin' => WPF()->usergroup->can( 'ms' ), // Manage settings permission
1739 + 'is_moderator' => ! empty( $user_groupids ) && WPF()->usergroup->can( 'em', $user_groupids ), // Edit members permission
1740 + 'is_admin' => ! empty( $user_groupids ) && WPF()->usergroup->can( 'ms', $user_groupids ), // Manage settings permission
1732 1741 'post_count' => $post_count,
1733 1742 'trust_level' => $trust_level,
1734 1743 'points' => $points,
1735 1744 'status' => $member['status'] ?? 'active',
@@ -2849,16 +2858,24 @@
2849 2858 if ( ! $userid ) {
2850 2859 return false;
2851 2860 }
2852 2861
2853 - // Admins are always exempt
2854 - if ( WPF()->usergroup->can( 'ms' ) ) { // Manage settings = admin
2855 - return true;
2862 + // Get user's group IDs (primary + secondary)
2863 + $member = WPF()->member->get_member( $userid );
2864 + $user_groupids = [];
2865 + if ( ! empty( $member['groupid'] ) ) {
2866 + $user_groupids[] = (int) $member['groupid'];
2856 2867 }
2868 + if ( ! empty( $member['secondary_groupids'] ) ) {
2869 + $user_groupids = array_merge( $user_groupids, array_map( 'intval', (array) $member['secondary_groupids'] ) );
2870 + }
2857 2871
2858 - // Check if moderators are exempt (configurable)
2859 - $moderators_exempt = apply_filters( 'wpforo_ai_moderation_moderators_exempt', true );
2860 - if ( $moderators_exempt && WPF()->usergroup->can( 'em' ) ) { // Edit members = moderator
2872 + if ( empty( $user_groupids ) ) {
2873 + return false;
2874 + }
2875 +
2876 + // Admins and moderators are exempt (em permission covers both)
2877 + if ( WPF()->usergroup->can( 'em', $user_groupids ) ) {
2861 2878 return true;
2862 2879 }
2863 2880
2864 2881 return false;
@@ -2938,9 +2955,9 @@
2938 2955 'context_used' => 0,
2939 2956 'indexed_topics_count' => 0,
2940 2957 'detection_time_ms' => 0,
2941 2958 'content_preview' => null,
2942 - 'created' => current_time( 'mysql' ),
2959 + 'created' => current_time( 'mysql', true ), // UTC for timezone conversion
2943 2960 ];
2944 2961
2945 2962 $data = wp_parse_args( $data, $defaults );
2946 2963
@@ -3233,9 +3250,9 @@
3233 3250 $result = $wpdb->update(
3234 3251 WPF()->tables->ai_moderation,
3235 3252 [
3236 3253 'reviewed_by' => $reviewer_id,
3237 - 'reviewed_at' => current_time( 'mysql' ),
3254 + 'reviewed_at' => current_time( 'mysql', true ), // UTC for timezone conversion
3238 3255 'review_action' => $action,
3239 3256 'review_notes' => $notes,
3240 3257 ],
3241 3258 [ 'id' => $id ],