PluginProbe
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin / 1.1.2
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin v1.1.2
1.1.10 1.1.9 1.1.8 1.1.7 1.1.6 1.1.5 1.1.4 1.1.3 1.1.2 1.1.1 1.1.0 1.0.1 1.0.0 0.9.8 0.9.7 0.9.6 0.9.4 0.9.5 0.9.3 0.9.2 0.9.1 0.9.0 0.8.9 0.8.8 0.8.7 All 34 releases
desktop-mode / includes / agents / privacy.php

privacy.php in OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin 1.1.2, at includes/agents/privacy.php

176 lines 5.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * OpenStation — Agents: Personal Data Export + Erasure hooks.
4 *
5 * Agents carry user-attributable data on their synthetic `wp_users`
6 * row (display name, login, role) and in the definition meta
7 * (description, instructions, abilities, triggers, model, rate limit,
8 * invocation log). One exporter + one eraser, both keyed off the
9 * target email: if it matches an agent's synthetic address, the whole
10 * agent is returned / removed. Human users who created agents are NOT
11 * considered owners for export/erasure purposes — agents are
12 * admin-managed assets that survive a human-user erasure.
13 *
14 * @package OpenStation
15 */
16
17 defined( 'ABSPATH' ) || exit;
18
19 /**
20 * Register the personal-data exporter under the `os-agents`
21 * group.
22 *
23 * @param array $exporters Existing exporter registry.
24 * @return array
25 */
26 function openstation_agents_register_personal_data_exporter( $exporters ) {
27 $exporters['os-agents'] = array(
28 'exporter_friendly_name' => __( 'OpenStation agents', 'desktop-mode' ),
29 'callback' => 'openstation_agents_personal_data_exporter',
30 );
31 return $exporters;
32 }
33 add_filter( 'wp_privacy_personal_data_exporters', 'openstation_agents_register_personal_data_exporter' );
34
35 /**
36 * Exporter callback.
37 *
38 * @param string $email_address Target user's email.
39 * @param int $page 1-indexed page (always done=true).
40 * @return array
41 */
42 function openstation_agents_personal_data_exporter( $email_address, $page = 1 ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed
43 $user = get_user_by( 'email', $email_address );
44 if ( ! $user || ! openstation_agent_is_agent( $user ) ) {
45 return array(
46 'data' => array(),
47 'done' => true,
48 );
49 }
50
51 $role = is_array( $user->roles ) && ! empty( $user->roles )
52 ? (string) reset( $user->roles )
53 : '';
54
55 $rows = array(
56 array(
57 'name' => __( 'Agent display name', 'desktop-mode' ),
58 'value' => (string) $user->display_name,
59 ),
60 array(
61 'name' => __( 'Agent user_login', 'desktop-mode' ),
62 'value' => (string) $user->user_login,
63 ),
64 array(
65 'name' => __( 'Role', 'desktop-mode' ),
66 'value' => $role,
67 ),
68 array(
69 'name' => __( 'Description', 'desktop-mode' ),
70 'value' => openstation_agent_get_description( (int) $user->ID ),
71 ),
72 array(
73 'name' => __( 'Instructions (system prompt)', 'desktop-mode' ),
74 'value' => openstation_agent_get_instructions( (int) $user->ID ),
75 ),
76 );
77
78 $abilities = openstation_agent_get_abilities( (int) $user->ID );
79 if ( ! empty( $abilities ) ) {
80 $rows[] = array(
81 'name' => __( 'Enabled abilities', 'desktop-mode' ),
82 'value' => implode( ', ', $abilities ),
83 );
84 }
85
86 $triggers = openstation_agent_get_triggers( (int) $user->ID );
87 if ( ! empty( $triggers ) ) {
88 $rows[] = array(
89 'name' => __( 'Triggers (JSON)', 'desktop-mode' ),
90 'value' => wp_json_encode( $triggers ),
91 );
92 }
93
94 $model = openstation_agent_get_model( (int) $user->ID );
95 if ( '' !== $model ) {
96 $rows[] = array(
97 'name' => __( 'Model override', 'desktop-mode' ),
98 'value' => $model,
99 );
100 }
101
102 $rate_limit = openstation_agent_get_rate_limit( (int) $user->ID );
103 if ( $rate_limit > 0 ) {
104 $rows[] = array(
105 'name' => __( 'Rate limit (per hour)', 'desktop-mode' ),
106 'value' => (string) $rate_limit,
107 );
108 }
109
110 return array(
111 'data' => array(
112 array(
113 'group_id' => 'os-agents',
114 'group_label' => __( 'OpenStation agents', 'desktop-mode' ),
115 'item_id' => 'agent-' . (int) $user->ID,
116 'data' => $rows,
117 ),
118 ),
119 'done' => true,
120 );
121 }
122
123 /**
124 * Register the personal-data eraser under the `os-agents`
125 * group.
126 *
127 * @param array $erasers Existing eraser registry.
128 * @return array
129 */
130 function openstation_agents_register_personal_data_eraser( $erasers ) {
131 $erasers['os-agents'] = array(
132 'eraser_friendly_name' => __( 'OpenStation agents', 'desktop-mode' ),
133 'callback' => 'openstation_agents_personal_data_eraser',
134 );
135 return $erasers;
136 }
137 add_filter( 'wp_privacy_personal_data_erasers', 'openstation_agents_register_personal_data_eraser' );
138
139 /**
140 * Eraser callback. When the target email belongs to an agent, fully
141 * delete it (the user row deletion removes every definition meta row).
142 * Non-agent emails are a no-op.
143 *
144 * @param string $email_address Target user's email.
145 * @param int $page 1-indexed page (always done=true).
146 * @return array
147 */
148 function openstation_agents_personal_data_eraser( $email_address, $page = 1 ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed
149 $user = get_user_by( 'email', $email_address );
150 if ( ! $user || ! openstation_agent_is_agent( $user ) ) {
151 return array(
152 'items_removed' => false,
153 'items_retained' => false,
154 'messages' => array(),
155 'done' => true,
156 );
157 }
158
159 $result = openstation_agent_delete( (int) $user->ID );
160 if ( is_wp_error( $result ) ) {
161 return array(
162 'items_removed' => false,
163 'items_retained' => true,
164 'messages' => array( $result->get_error_message() ),
165 'done' => true,
166 );
167 }
168
169 return array(
170 'items_removed' => true,
171 'items_retained' => false,
172 'messages' => array(),
173 'done' => true,
174 );
175 }
176