Sharon Katz
7d26e7e475
Add adobe_plugins osquery extension table (#45208)
Closes #45206
## Summary
- Adds a new `adobe_plugins` osquery extension table to fleetd (macOS +
Windows)
- Parses CEP (`CSXS/manifest.xml`) and UXP (`manifest.json`) manifests
for rich metadata
- Falls back to filesystem info for native plug-ins where no manifest
exists
- Supports a `scan_level` WHERE constraint: `standard` (default) or
`deep`
## Table schema
| Column | Type | Description |
| --- | --- | --- |
| `path` | TEXT | Full path to the plugin directory or file |
| `name` | TEXT | Plugin display name (from manifest or directory name)
|
| `version` | TEXT | Plugin version (from manifest) |
| `vendor` | TEXT | Plugin author/publisher (from manifest) |
| `bundle_id` | TEXT | Plugin bundle identifier (from manifest) |
| `host_application` | TEXT | Target app(s): Photoshop, Illustrator,
Premiere Pro, etc. |
| `extension_type` | TEXT | `CEP`, `UXP`, or `native` |
| `user` | TEXT | Username for user-scoped installs; empty for
system-wide |
| `platform` | TEXT | `darwin` or `windows` |
| `scan_level` | TEXT | WHERE constraint only — `standard` (default) or
`deep` |
## How I tested it
> **Note:** Manual testing was done by installing two real open-source
CEP extensions (downloaded from GitHub) on a macOS host without a full
Adobe CC installation. This validates the table logic, manifest parsing,
and osquery integration end-to-end against real-world manifest formats.
**QA should test against machines with full Adobe Creative Cloud
installations** (Photoshop, Premiere, Illustrator, etc.) to verify the
scan paths match what Adobe actually ships, and to exercise `scan_level
= 'deep'` with real native plug-in directories. Expect a few more dev
cycles after QA feedback.
### 1. Unit tests — 22 passing
```
$ go test ./orbit/pkg/table/adobe_plugins/... -v
--- PASS: TestParseCEPPlugin/valid_manifest
--- PASS: TestParseCEPPlugin/missing_manifest_falls_back_to_dir_name
--- PASS: TestParseCEPPlugin/malformed_manifest_falls_back_to_dir_name
--- PASS: TestParseUXPPlugin/valid_manifest
--- PASS: TestParseUXPPlugin/missing_manifest_falls_back_to_dir_name
--- PASS: TestParseUXPPlugin/manifest_with_id_but_no_name_uses_id
--- PASS: TestParseNativePlugin/* (5 subtests)
--- PASS: TestResolveHostApps/* (7 subtests)
--- PASS: TestScanEntry/* (2 subtests)
PASS
```
### 2. Cross-platform compilation
```
$ go build ./orbit/pkg/table/adobe_plugins/... # macOS ✅
$ GOOS=windows go build ./orbit/pkg/table/adobe_plugins/... # Windows ✅
$ GOOS=linux go build ./orbit/pkg/table/adobe_plugins/... # Linux stub ✅
$ go build ./orbit/cmd/fleetd_tables/ # Full fleetd binary ✅
$ go vet ./orbit/pkg/table/adobe_plugins/... # Clean ✅
```
### 3. Manual end-to-end testing on macOS (osquery 5.23.0)
#### Setup
Built the fleetd extension binary, then installed two **real open-source
CEP extensions** from GitHub into the user-scoped scan path
(`~/Library/Application Support/Adobe/CEP/extensions/`):
1. **[adobe-discord-rpc](https://github.com/Kuredew/adobe-discord-rpc)**
— a real CEP extension targeting 11 Adobe apps. Has no `<Author>`
element (tests missing-vendor edge case). Complex manifest with many
host app codes.
2. **[cep-template](https://github.com/khanyuinc/cep-template)** — a CEP
starter template targeting After Effects only. Minimal manifest.
```bash
# Build extension
go build -o build/fleetd-tables-test ./orbit/cmd/fleetd_tables/
# Install real extensions
CEP_DIR="$HOME/Library/Application Support/Adobe/CEP/extensions"
mkdir -p "$CEP_DIR/adobe-discord-rpc/CSXS"
# downloaded CSXS/manifest.xml from GitHub into the directory
mkdir -p "$CEP_DIR/cep-template/CSXS"
# downloaded CSXS/manifest.xml from GitHub into the directory
```
#### Running the query
```bash
OSQUERYD="/opt/orbit/bin/osqueryd/macos-app/stable/osquery.app/Contents/MacOS/osqueryd"
$OSQUERYD -S --allow_unsafe --extensions_timeout=10 \
--extensions_require=com.fleetdm.fleetd_tables.osquery_extension.v1 \
--extension build/fleetd-tables-test \
--json "SELECT * FROM adobe_plugins;"
```
#### Actual output (verbatim)
```json
[
{
"bundle_id": "com.kureichi.discordrpc",
"extension_type": "CEP",
"host_application": "After Effects, Photoshop, Premiere Pro, InCopy, Audition, Dreamweaver, Animate, InDesign, Illustrator, Prelude",
"name": "adobe-discord-rpc",
"path": "/Users/sharonkatz/Library/Application Support/Adobe/CEP/extensions/adobe-discord-rpc",
"platform": "darwin",
"scan_level": "",
"user": "sharonkatz",
"vendor": "",
"version": "3.1.1"
},
{
"bundle_id": "com.yourcompany",
"extension_type": "CEP",
"host_application": "After Effects",
"name": "cep-template",
"path": "/Users/sharonkatz/Library/Application Support/Adobe/CEP/extensions/cep-template",
"platform": "darwin",
"scan_level": "",
"user": "sharonkatz",
"vendor": "",
"version": "1.0"
}
]
```
#### osqueryi table output
```
+-------------------+---------+-------------------------+----------------------------------------------------------------------------------------------------------------+----------------+------------+
| name | version | bundle_id | host_application | extension_type | user |
+-------------------+---------+-------------------------+----------------------------------------------------------------------------------------------------------------+----------------+------------+
| adobe-discord-rpc | 3.1.1 | com.kureichi.discordrpc | After Effects, Photoshop, Premiere Pro, InCopy, Audition, Dreamweaver, Animate, InDesign, Illustrator, Prelude | CEP | sharonkatz |
| cep-template | 1.0 | com.yourcompany | After Effects | CEP | sharonkatz |
+-------------------+---------+-------------------------+----------------------------------------------------------------------------------------------------------------+----------------+------------+
```
#### What this verified
| Scenario | Result |
| --- | --- |
| Real CEP manifest with 11 host apps | ✅ All codes resolved (AEFT→After
Effects, PHSP/PHXS→Photoshop, PPRO→Premiere Pro, etc.) |
| Missing `<Author>` element | ✅ `vendor` is empty string, no crash |
| Minimal CEP manifest (single host) | ✅ `host_application=After
Effects`, version/bundle_id correct |
| User-scoped detection | ✅ `user=sharonkatz` populated |
| Schema registration | ✅ `.schema adobe_plugins` shows all 10 columns |
| No Adobe installed + no plugins | ✅ 0 rows, no error |
| Deep scan with no app bundles | ✅ 0 extra rows, no error |
### Windows
Not tested yet — Windows paths are implemented and cross-compile, but
need manual verification on a Windows host with Adobe CC.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
## Release Notes
* **New Features**
* Added Adobe plugins osquery table for macOS and Windows platforms
* Discovers and catalogs Adobe CEP, UXP, and native plugins
* Extracts plugin metadata including version, vendor, host applications,
and installation paths
* Supports configurable scan depth for comprehensive plugin discovery
<!-- review_stack_entry_start -->
[](https://app.coderabbit.ai/change-stack/fleetdm/fleet/pull/45208)
<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-05-14 14:46:48 -04:00
..
2024-10-07 11:05:17 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2026-05-14 14:46:48 -04:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2025-03-21 18:41:44 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2026-03-06 08:07:20 -08:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-06-03 10:40:23 -04:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-06-04 11:27:15 -04:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2025-07-24 18:30:55 -04:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-11-12 12:06:12 -06:00
2024-05-27 18:18:56 -05:00
2025-07-16 09:00:29 -05:00
2024-04-29 11:12:03 -05:00
2025-06-11 15:04:15 -03:00
2025-05-27 10:55:38 -07:00
2026-02-10 13:57:13 -03:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-06-03 21:17:14 -04:00
2024-06-03 17:05:48 -04:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2025-12-02 17:24:15 -06:00
2024-09-03 12:24:24 -05:00
2025-05-22 16:15:26 -04:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2025-04-01 18:54:22 -03:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2025-05-06 15:28:07 -05:00
2026-03-17 12:59:17 -03:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-04-29 11:12:03 -05:00
2024-06-11 11:44:07 -04:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2026-01-20 13:23:22 -03:00
2024-04-25 11:41:51 -04:00
2025-11-12 09:33:18 -08:00
2025-11-12 09:33:18 -08:00
2024-05-27 18:18:56 -05:00
2024-04-29 11:12:03 -05:00
2024-05-28 12:59:35 -04:00
2024-05-27 18:18:56 -05:00
2025-07-16 09:00:29 -05:00
2024-11-20 16:46:07 -06:00
2024-05-27 18:18:56 -05:00
2024-06-11 11:02:50 -04:00
2025-09-19 10:26:23 -04:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2026-03-16 13:27:00 -05:00
2024-05-28 12:59:35 -04:00
2024-11-15 14:25:32 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-04-29 11:12:03 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2025-01-30 12:42:04 -05:00
2024-09-10 14:30:30 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2025-06-04 13:54:34 -06:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2026-02-27 11:49:41 -08:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2025-05-22 16:15:26 -04:00
2024-05-28 12:59:35 -04:00
2026-03-20 10:08:19 -04:00
2024-05-28 12:59:35 -04:00
2024-05-31 15:42:06 -05:00
2026-03-30 10:23:37 -03:00
2026-03-30 10:23:37 -03:00
2025-06-25 09:51:43 -04:00
2025-04-30 17:44:14 -04:00
2026-02-23 14:25:27 -06:00
2024-05-27 18:18:56 -05:00
2026-01-26 15:58:01 -06:00
2024-05-28 12:59:35 -04:00
2024-05-27 18:18:56 -05:00
2024-05-28 12:59:35 -04:00
2024-05-28 12:59:35 -04:00
2024-05-27 18:18:56 -05:00
2026-04-27 14:52:27 -03:00
2024-05-27 18:18:56 -05:00
2024-12-13 21:34:24 -03:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2025-01-17 11:52:21 -03:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-06-11 11:13:23 -04:00
2024-06-11 11:56:22 -04:00
2024-05-27 18:18:56 -05:00
2024-04-29 11:12:03 -05:00
2024-04-29 11:12:03 -05:00
2024-04-29 11:12:03 -05:00
2024-04-29 11:12:03 -05:00
2024-05-31 15:42:06 -05:00
2024-06-13 19:29:37 -04:00
2024-05-27 18:18:56 -05:00
2024-06-12 15:03:16 -04:00
2024-06-11 11:30:43 -04:00
2024-05-27 18:18:56 -05:00
2024-04-29 11:12:03 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-10-22 12:41:33 -05:00
2024-05-27 18:18:56 -05:00
2024-06-13 20:50:07 -04:00
2024-05-28 12:59:35 -04:00
2024-05-28 12:59:35 -04:00
2024-05-28 12:59:35 -04:00
2025-09-24 17:32:54 -05:00
2024-05-27 18:18:56 -05:00
2024-06-12 21:11:38 -04:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2025-09-17 12:48:58 -04:00
2025-11-11 09:30:14 -05:00
2025-11-11 09:30:14 -05:00
2025-12-22 09:33:40 -05:00
2024-06-13 23:01:05 -04:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-06-14 17:34:02 -04:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-04-29 11:12:03 -05:00
2024-05-28 12:59:35 -04:00
2024-05-28 12:59:35 -04:00
2024-06-13 19:46:41 -04:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-04-29 11:12:03 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-06-04 11:26:52 -04:00
2025-02-03 10:22:50 -05:00
2024-05-27 18:18:56 -05:00
2025-10-10 15:56:49 -04:00
2024-05-27 18:18:56 -05:00
2024-06-20 11:53:15 -05:00
2024-05-31 15:42:06 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-31 15:42:06 -05:00
2024-05-27 18:18:56 -05:00
2024-04-29 11:12:03 -05:00
2024-05-27 18:18:56 -05:00
2025-12-10 12:11:47 -07:00
2026-02-20 09:04:54 +00:00
2024-05-31 15:42:06 -05:00
2024-05-27 18:18:56 -05:00
2026-02-04 17:40:34 -06:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-12-12 15:31:32 -06:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-06-20 10:18:39 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2024-05-27 18:18:56 -05:00
2026-02-09 14:54:21 -05:00
2025-12-10 12:11:47 -07:00
2024-05-27 18:18:56 -05:00