PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 2.8.7
AI Engine – The Chatbot, AI Framework & MCP for WordPress v2.8.7
3.5.7 3.5.6 3.5.5 3.5.4 3.5.3 3.5.2 3.5.1 3.5.0 3.4.9 3.4.8 3.4.7 0.2.1 1.6.91 0.2.2 1.6.92 0.2.3 1.6.93 0.2.4 1.6.94 0.2.5 1.6.95 0.2.6 1.6.96 0.2.7 1.6.97 0.2.8 1.6.98 0.2.9 1.6.99 0.3.0 1.7.0 0.3.1 1.7.1 0.3.2 1.7.2 0.3.3 1.7.3 0.3.4 1.7.4 0.3.5 1.7.5 0.3.6 1.7.6 0.4.0 1.7.7 0.4.1 1.7.8 0.4.2 1.7.9 0.4.3 1.8.0 0.4.4 1.8.1 0.4.5 1.8.2 0.4.6 1.8.3 0.4.7 1.8.4 0.4.8 1.8.5 0.4.9 1.8.6 0.5.0 1.8.7 0.5.1 1.8.8 0.5.2 1.8.9 0.5.3 1.9.0 0.5.4 1.9.1 0.5.5 1.9.2 0.5.6 1.9.3 0.5.7 1.9.4 0.5.8 1.9.5 0.5.9 1.9.6 0.6.0 1.9.7 0.6.1 1.9.8 0.6.2 1.9.81 0.6.3 1.9.82 0.6.4 1.9.83 0.6.5 1.9.84 0.6.6 1.9.85 0.6.7 1.9.86 0.6.8 1.9.87 0.6.9 1.9.88 0.7.0 1.9.89 0.7.1 1.9.90 0.7.2 1.9.91 0.7.3 1.9.92 0.7.4 1.9.93 0.7.5 1.9.94 0.7.6 1.9.95 0.7.7 1.9.96 0.7.8 1.9.97 0.7.9 1.9.98 0.8.0 1.9.99 0.8.1 2.0.0 0.8.2 2.0.1 0.8.3 2.0.2 0.8.4 2.0.3 0.8.5 2.0.4 0.8.6 2.0.5 0.8.7 2.0.6 0.8.8 2.0.7 0.8.9 2.0.8 0.9.0 2.0.9 0.9.2 2.1.0 0.9.3 2.1.1 0.9.4 2.1.2 0.9.5 2.1.3 0.9.6 2.1.4 0.9.7 2.1.5 0.9.8 2.1.6 0.9.81 2.1.7 0.9.82 2.1.8 0.9.83 2.1.9 0.9.84 2.2.0 0.9.85 2.2.1 0.9.86 2.2.2 0.9.87 2.2.3 0.9.88 2.2.4 0.9.89 2.2.5 0.9.9 2.2.51 0.9.91 2.2.52 0.9.92 2.2.53 0.9.93 2.2.54 0.9.94 2.2.56 0.9.95 2.2.57 0.9.96 2.2.6 0.9.97 2.2.60 0.9.98 2.2.61 0.9.99 2.2.62 1.0.0 2.2.63 1.0.01 2.2.70 1.0.1 2.2.80 1.0.2 2.2.81 1.0.3 2.2.90 1.0.4 2.2.91 1.0.5 2.2.92 1.0.6 2.2.93 1.0.7 2.2.94 1.0.8 2.2.95 1.0.9 2.3.0 1.1.0 2.3.1 1.1.1 2.3.2 1.1.2 2.3.3 1.1.3 2.3.4 1.1.4 2.3.5 1.1.5 2.3.6 1.1.6 2.3.7 1.1.7 2.3.8 1.1.8 2.3.9 1.1.9 2.4.0 1.2.0 2.4.1 1.2.1 2.4.2 1.2.2 2.4.3 1.2.21 2.4.4 1.2.3 2.4.5 1.2.30 2.4.6 1.3.0 2.4.7 1.3.1 2.4.8 1.3.2 2.4.9 1.3.3 2.5.0 1.3.31 2.5.1 1.3.32 2.5.2 1.3.33 2.5.3 1.3.34 2.5.4 1.3.35 2.5.5 1.3.36 2.5.6 1.3.37 2.5.7 1.3.38 2.5.8 1.3.39 2.5.9 1.3.40 2.6.0 1.3.41 2.6.1 1.3.42 2.6.2 1.3.43 2.6.3 1.3.44 2.6.5 1.3.45 2.6.6 1.3.46 2.6.7 1.3.47 2.6.8 1.3.48 2.6.9 1.3.49 2.7.0 1.3.50 2.7.1 1.3.51 2.7.2 1.3.52 2.7.3 1.3.53 2.7.4 1.3.54 2.7.5 1.3.56 2.7.6 1.3.57 2.7.7 1.3.58 2.7.8 1.3.59 2.7.9 1.3.60 2.8.0 1.3.61 2.8.1 1.3.62 2.8.2 1.3.63 2.8.3 1.3.64 2.8.4 1.3.65 2.8.5 1.3.66 2.8.6 1.3.67 2.8.7 1.3.68 2.8.8 1.3.69 2.8.9 1.3.70 2.9.0 1.3.71 2.9.1 1.3.72 2.9.2 1.3.73 2.9.3 1.3.74 2.9.4 1.3.75 2.9.5 1.3.76 2.9.6 1.3.77 2.9.7 1.3.78 2.9.8 1.3.79 2.9.9 1.3.80 3.0.0 1.3.81 3.0.1 1.3.82 3.0.2 1.3.83 3.0.3 1.3.84 3.0.4 1.3.85 3.0.5 1.3.86 3.0.6 1.3.87 3.0.7 1.3.88 3.0.8 1.3.89 3.0.9 1.3.90 3.1.0 1.3.91 3.1.1 1.3.92 3.1.2 1.3.93 3.1.3 1.3.94 3.1.4 1.3.95 3.1.5 1.3.96 3.1.6 1.3.97 3.1.7 1.3.98 3.1.8 1.3.99 3.1.9 1.4.0 3.2.0 1.4.1 3.2.1 1.4.2 3.2.2 1.4.3 3.2.3 1.4.4 3.2.4 1.4.5 3.2.5 1.4.6 3.2.6 1.4.7 3.2.7 1.4.8 3.2.8 1.4.9 3.2.9 1.5.0 3.3.0 1.5.1 3.3.1 1.5.2 3.3.2 1.5.3 3.3.3 1.5.4 3.3.4 1.5.5 3.3.5 1.5.6 3.3.6 1.5.7 3.3.7 1.5.8 3.3.8 1.5.9 3.3.9 1.6.0 3.4.0 1.6.1 3.4.1 1.6.2 3.4.2 1.6.3 3.4.3 1.6.5 3.4.4 1.6.51 3.4.5 1.6.52 3.4.6 1.6.53 1.6.54 1.6.55 1.6.56 1.6.57 1.6.58 1.6.59 1.6.60 1.6.61 1.6.62 1.6.63 1.6.64 1.6.65 1.6.66 1.6.67 1.6.68 trunk 1.6.69 0.0.1 1.6.70 0.0.2 1.6.71 0.0.3 1.6.72 0.0.4 1.6.73 0.0.5 1.6.74 0.0.6 1.6.75 0.0.7 1.6.76 0.0.8 1.6.77 0.0.9 1.6.78 0.1.0 1.6.79 0.1.1 1.6.81 0.1.2 1.6.82 0.1.3 1.6.83 0.1.4 1.6.84 0.1.5 1.6.85 0.1.6 1.6.86 0.1.7 1.6.87 0.1.8 1.6.88 0.1.9 1.6.89 0.2.0 1.6.90
ai-engine / classes / services / session.php
ai-engine / classes / services Last commit date
image.php 11 months ago message-builder.php 11 months ago model-environment.php 11 months ago response-id-manager.php 11 months ago session.php 11 months ago usage-stats.php 11 months ago
session.php
164 lines
1 <?php
2
3 class Meow_MWAI_Services_Session {
4 private $core;
5 private $nonce = null;
6
7 public function __construct( $core ) {
8 $this->core = $core;
9 }
10
11 public function can_start_session() {
12 return apply_filters( 'mwai_allow_session', true );
13 }
14
15 public function get_nonce( $force = false ) {
16 // NONCE GENERATION LOGIC:
17 // - For logged-out users (unless forced): Return null - they must use /start_session endpoint
18 // - For logged-in users: Create user-specific nonce tied to their WP session
19 // - With $force=true: Always create nonce (used by /start_session endpoint)
20 //
21 // This ensures logged-in users get a nonce matching their auth context on page load,
22 // preventing rest_cookie_invalid_nonce errors when cookies are present.
23 if ( !$force && !is_user_logged_in() ) {
24 return null;
25 }
26 if ( isset( $this->nonce ) ) {
27 return $this->nonce;
28 }
29 $this->nonce = wp_create_nonce( 'wp_rest' );
30 return $this->nonce;
31 }
32
33 // ChatID
34 public function fix_chat_id( $query, $params ) {
35 if ( isset( $query->chatId ) && $query->chatId !== 'N/A' ) {
36 return $query->chatId;
37 }
38 $chatId = isset( $params['chatId'] ) ? $params['chatId'] : $query->session;
39 if ( $chatId === 'N/A' ) {
40 $chatId = $this->core->get_random_id( 8 );
41 }
42 $query->set_chat_id( $chatId );
43 return $chatId;
44 }
45
46 public function get_session_id() {
47 // Check if we have the session cookie
48 if ( isset( $_COOKIE['mwai_session_id'] ) ) {
49 return $_COOKIE['mwai_session_id'];
50 }
51
52 // If no cookie exists and we can set one, create it now (lazy initialization)
53 if ( !headers_sent() && !wp_doing_cron() ) {
54 $sessionId = uniqid();
55 @setcookie( 'mwai_session_id', $sessionId, [
56 'expires' => 0,
57 'path' => '/',
58 'secure' => is_ssl(),
59 'httponly' => true,
60 ] );
61 return $sessionId;
62 }
63
64 // For cron jobs or when headers are sent, return a temporary session ID
65 return wp_doing_cron() ? "wp-cron" : "N/A";
66 }
67
68 public function get_ip_address() {
69 $ip_keys = [ 'HTTP_CF_CONNECTING_IP', 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR',
70 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_X_REAL_IP', 'HTTP_FORWARDED_FOR',
71 'HTTP_FORWARDED', 'REMOTE_ADDR' ];
72 foreach ( $ip_keys as $key ) {
73 if ( array_key_exists( $key, $_SERVER ) === true ) {
74 $ips = explode( ',', $_SERVER[$key] );
75 foreach ( $ips as $ip ) {
76 $ip = trim( $ip );
77 if ( $this->validate_ip( $ip ) ) {
78 return $ip;
79 }
80 }
81 }
82 }
83 return isset( $_SERVER['REMOTE_ADDR'] ) ? $_SERVER['REMOTE_ADDR'] : '127.0.0.1';
84 }
85
86 public function get_user_data() {
87 $user = wp_get_current_user();
88 if ( empty( $user ) || empty( $user->ID ) ) {
89 return null;
90 }
91
92 // Return both the new format (for frontend) and placeholder format (for do_placeholders)
93 $userData = [
94 'ID' => $user->ID,
95 'name' => $user->display_name,
96 'email' => $user->user_email,
97 'avatar' => get_avatar_url( $user->ID ),
98 'type' => 'logged-in',
99 // Add placeholder keys for do_placeholders function
100 'FIRST_NAME' => get_user_meta( $user->ID, 'first_name', true ),
101 'LAST_NAME' => get_user_meta( $user->ID, 'last_name', true ),
102 'USER_LOGIN' => isset( $user->data ) && isset( $user->data->user_login ) ?
103 $user->data->user_login : null,
104 'DISPLAY_NAME' => isset( $user->data ) && isset( $user->data->display_name ) ?
105 $user->data->display_name : null,
106 'AVATAR_URL' => get_avatar_url( $user->ID ),
107 ];
108
109 return $userData;
110 }
111
112 public function get_user_id() {
113 // This function has to be re-thinked for all other API endpoints
114 $userId = null;
115 // If there is a current session, we probably know the current user
116 if ( is_user_logged_in() ) {
117 $userId = get_current_user_id();
118 }
119 else if ( isset( $_COOKIE['mwai_user_id'] ) ) {
120 $userId = $_COOKIE['mwai_user_id'];
121 }
122 else {
123 // Don't try to start session if we're in a cron job or headers have been sent
124 if ( $this->can_start_session() && !wp_doing_cron() && !headers_sent() ) {
125 session_start();
126 if ( !isset( $_SESSION['mwai_user_id'] ) ) {
127 $_SESSION['mwai_user_id'] = $this->generate_user_id();
128 }
129 $userId = $_SESSION['mwai_user_id'];
130 // Set cookie if possible
131 if ( !headers_sent() ) {
132 setcookie( 'mwai_user_id', $userId, time() + ( 86400 * 30 ), '/' );
133 }
134 }
135 else {
136 // For cron jobs or when headers are sent, generate a temporary user ID
137 $userId = $this->generate_user_id();
138 }
139 }
140 return $userId;
141 }
142
143 public function get_admin_user() {
144 $users = get_users( [ 'role' => 'administrator' ] );
145 if ( !empty( $users ) ) {
146 return $users[0];
147 }
148 return null;
149 }
150
151 // Private helper methods
152 private function validate_ip( $ip ) {
153 if ( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) === false ) {
154 return false;
155 }
156 return true;
157 }
158
159 private function generate_user_id() {
160 $id = uniqid( 'mwai_', true );
161 return $id;
162 }
163 }
164