appium-mcp 1.92.13 → 1.92.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/README.md +6 -2
- package/dist/persistence.d.ts.map +1 -1
- package/dist/persistence.js +17 -4
- package/dist/persistence.js.map +1 -1
- package/dist/tools/gestures/schema.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -26
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/session/attach-session.js +5 -4
- package/dist/tools/session/attach-session.js.map +1 -1
- package/dist/tools/session/create-session.d.ts +2 -11
- package/dist/tools/session/create-session.d.ts.map +1 -1
- package/dist/tools/session/create-session.js +7 -20
- package/dist/tools/session/create-session.js.map +1 -1
- package/dist/tools/tool-response.d.ts.map +1 -1
- package/dist/tools/tool-response.js +12 -4
- package/dist/tools/tool-response.js.map +1 -1
- package/dist/utils/sensitive.d.ts +7 -0
- package/dist/utils/sensitive.d.ts.map +1 -1
- package/dist/utils/sensitive.js +37 -0
- package/dist/utils/sensitive.js.map +1 -1
- package/dist/utils/url.d.ts +7 -0
- package/dist/utils/url.d.ts.map +1 -1
- package/dist/utils/url.js +23 -0
- package/dist/utils/url.js.map +1 -1
- package/package.json +9 -1
- package/server.json +2 -2
- package/src/persistence.ts +18 -4
- package/src/tools/index.ts +3 -27
- package/src/tools/session/attach-session.ts +5 -4
- package/src/tools/session/create-session.ts +7 -21
- package/src/tools/tool-response.ts +14 -4
- package/src/utils/sensitive.ts +42 -0
- package/src/utils/url.ts +26 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
## [1.92.14](https://github.com/appium/appium-mcp/compare/v1.92.13...v1.92.14) (2026-09-04)
|
|
2
|
+
|
|
3
|
+
### Bug Fixes
|
|
4
|
+
|
|
5
|
+
* update security related fixes ([#520](https://github.com/appium/appium-mcp/issues/520)) ([f372404](https://github.com/appium/appium-mcp/commit/f372404df20ab5cd99dd0f1eb56b6937f8fb69c8))
|
|
6
|
+
|
|
1
7
|
## [1.92.13](https://github.com/appium/appium-mcp/compare/v1.92.12...v1.92.13) (2026-09-03)
|
|
2
8
|
|
|
3
9
|
### Bug Fixes
|
package/README.md
CHANGED
|
@@ -465,7 +465,11 @@ Only allow trusted users and trusted workflow configuration to control `remoteSe
|
|
|
465
465
|
* Keep remote server URLs in trusted MCP or CI configuration where possible.
|
|
466
466
|
* Use `REMOTE_SERVER_URL_ALLOW_REGEX` to restrict the permitted Appium server URLs when the execution environment requires an explicit destination policy.
|
|
467
467
|
|
|
468
|
-
When `REMOTE_SERVER_URL_ALLOW_REGEX` is not set, MCP Appium accepts any syntactically valid HTTP or HTTPS destination. The variable is a regular-expression check against the complete `remoteServerUrl` value.
|
|
468
|
+
When `REMOTE_SERVER_URL_ALLOW_REGEX` is not set, MCP Appium accepts any syntactically valid HTTP or HTTPS destination. Remote server URLs must not contain a query string or fragment. The variable is a regular-expression check against the complete `remoteServerUrl` value and can only narrow the HTTP(S) destinations accepted by the built-in validation.
|
|
469
|
+
|
|
470
|
+
Capability discovery for attached sessions does not follow HTTP redirects. This keeps a permitted endpoint from redirecting the initial metadata request to a destination outside the configured URL policy.
|
|
471
|
+
|
|
472
|
+
If a remote URL contains credentials, MCP Appium redacts its userinfo from logs and error responses. Opt-in persisted-session files may still contain credentials and sensitive capabilities because they are needed for reattachment; those files are created with owner-only (`0600`) permissions, and permissions on existing regular session files are repaired when read. Use a dedicated persistence directory owned by the MCP process.
|
|
469
473
|
|
|
470
474
|
For example, to permit only a specific Appium server:
|
|
471
475
|
|
|
@@ -622,7 +626,7 @@ The remote server URL in `appium_session_management` (action=create or action=at
|
|
|
622
626
|
When `remoteServerUrl` is omitted, `action=create` starts an embedded local UiAutomator2 or XCUITest driver for `platform=android` or `platform=ios`. `platform=general` requires `remoteServerUrl`. When `remoteServerUrl` is present, `action=create` calls WebDriver `newSession` on the remote server, and `action=attach` connects MCP Appium to an existing remote session without owning its lifecycle.
|
|
623
627
|
If `REMOTE_SERVER_URL_ALLOW_REGEX` is set, the URL must match the provided regex pattern for security reasons.
|
|
624
628
|
This allows you to restrict which remote servers can be used with your MCP Appium instance, preventing unauthorized connections.
|
|
625
|
-
|
|
629
|
+
Without an allow regex, any syntactically valid HTTP(S) URL without a query string or fragment is accepted.
|
|
626
630
|
|
|
627
631
|
### Context Management
|
|
628
632
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../src/persistence.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../src/persistence.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAC,mBAAmB,EAAE,gBAAgB,EAAC,MAAM,oBAAoB,CAAC;AAK9E;;;;;;;;;;GAUG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,mBAAmB,CAAC;IAClC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,gBAAgB,CAAC;CAC7B;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAEjD;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,IAAI,OAAO,CAErD;AAED;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAmD5E;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BlF;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAc7E"}
|
package/dist/persistence.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { createHash } from 'node:crypto';
|
|
1
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
2
|
+
import { chmod, lstat, writeFile } from 'node:fs/promises';
|
|
2
3
|
import path from 'node:path';
|
|
3
4
|
import { fs } from '@appium/support';
|
|
4
5
|
import log from './logger.js';
|
|
5
6
|
import { resolveAppiumMcpSessionsDir } from './utils/paths.js';
|
|
7
|
+
const PRIVATE_FILE_MODE = 0o600;
|
|
6
8
|
/**
|
|
7
9
|
* Return the directory where persisted sessions live, or `null` when the
|
|
8
10
|
* feature is disabled.
|
|
@@ -50,13 +52,19 @@ export async function readAllPersistedSessions() {
|
|
|
50
52
|
for (const name of jsonFiles) {
|
|
51
53
|
const filePath = path.join(dir, name);
|
|
52
54
|
try {
|
|
55
|
+
const fileStats = await lstat(filePath);
|
|
56
|
+
if (!fileStats.isFile()) {
|
|
57
|
+
log.warn(`Skipping persisted session file ${name}: not a regular file`);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
await chmod(filePath, PRIVATE_FILE_MODE);
|
|
53
61
|
const raw = await fs.readFile(filePath, 'utf8');
|
|
54
62
|
const entry = JSON.parse(raw);
|
|
55
63
|
const canonicalPath = sessionFilePath(entry.sessionId, dir);
|
|
56
64
|
const canonicalName = path.basename(canonicalPath);
|
|
57
65
|
if (name !== canonicalName) {
|
|
58
66
|
try {
|
|
59
|
-
await
|
|
67
|
+
await writeFile(canonicalPath, raw, { encoding: 'utf8', flag: 'wx', mode: PRIVATE_FILE_MODE });
|
|
60
68
|
}
|
|
61
69
|
catch (err) {
|
|
62
70
|
if (err.code === 'EEXIST') {
|
|
@@ -90,12 +98,17 @@ export async function writePersistedSession(entry) {
|
|
|
90
98
|
return;
|
|
91
99
|
}
|
|
92
100
|
const target = sessionFilePath(entry.sessionId, dir);
|
|
93
|
-
const tmp = `${target}.${process.pid}.tmp`;
|
|
101
|
+
const tmp = `${target}.${process.pid}.${randomBytes(8).toString('hex')}.tmp`;
|
|
94
102
|
try {
|
|
95
103
|
await fs.mkdir(dir, { recursive: true });
|
|
96
104
|
await migrateLegacySessionFile(entry.sessionId, dir);
|
|
97
|
-
await
|
|
105
|
+
await writeFile(tmp, JSON.stringify(entry, null, 2), {
|
|
106
|
+
encoding: 'utf8',
|
|
107
|
+
flag: 'wx',
|
|
108
|
+
mode: PRIVATE_FILE_MODE,
|
|
109
|
+
});
|
|
98
110
|
await fs.rename(tmp, target);
|
|
111
|
+
await chmod(target, PRIVATE_FILE_MODE);
|
|
99
112
|
}
|
|
100
113
|
catch (err) {
|
|
101
114
|
log.warn(`Failed to persist session ${entry.sessionId}: ${err.message}`);
|
package/dist/persistence.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../src/persistence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../src/persistence.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,10 +8,10 @@ export type ScrollDistancePreset = (typeof SCROLL_DISTANCE_PRESETS)[number];
|
|
|
8
8
|
export declare const LOCATOR_STRATEGIES: readonly ["accessibility id", "id", "-ios predicate string", "-ios class chain", "-android uiautomator", "xpath", "name", "class name", "css selector"];
|
|
9
9
|
export declare const gestureSchema: z.ZodObject<{
|
|
10
10
|
action: z.ZodEnum<{
|
|
11
|
-
scroll: "scroll";
|
|
12
11
|
tap: "tap";
|
|
13
12
|
double_tap: "double_tap";
|
|
14
13
|
long_press: "long_press";
|
|
14
|
+
scroll: "scroll";
|
|
15
15
|
swipe: "swipe";
|
|
16
16
|
pinch_zoom: "pinch_zoom";
|
|
17
17
|
scroll_to_element: "scroll_to_element";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAgB,OAAO,EAAC,MAAM,SAAS,CAAC;AAwCpD,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAgB,OAAO,EAAC,MAAM,SAAS,CAAC;AAwCpD,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAuG3D"}
|
package/dist/tools/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import log from '../logger.js';
|
|
2
|
-
import {
|
|
2
|
+
import { redactForLogging, redactUrlCredentials } from '../utils/sensitive.js';
|
|
3
3
|
import ai from './ai/ai.js';
|
|
4
4
|
import { isAIEnabled, assertAIConfig } from './ai/config.js';
|
|
5
5
|
import app from './app-management/app.js';
|
|
@@ -42,34 +42,11 @@ export default function registerTools(server) {
|
|
|
42
42
|
if (typeof originalExecute !== 'function') {
|
|
43
43
|
return originalAddTool(toolDef);
|
|
44
44
|
}
|
|
45
|
-
const redactArgs = (obj) => {
|
|
46
|
-
if (obj === undefined || obj === null) {
|
|
47
|
-
return obj;
|
|
48
|
-
}
|
|
49
|
-
try {
|
|
50
|
-
return JSON.parse(JSON.stringify(obj, (key, value) => {
|
|
51
|
-
if (key && isSensitiveKey(key)) {
|
|
52
|
-
return '[REDACTED]';
|
|
53
|
-
}
|
|
54
|
-
// Avoid logging extremely large buffers/strings
|
|
55
|
-
if (value && typeof value === 'string' && value.length > 2000) {
|
|
56
|
-
return `[string:${value.length}]`;
|
|
57
|
-
}
|
|
58
|
-
if (value && typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) {
|
|
59
|
-
return `[buffer:${value.length}]`;
|
|
60
|
-
}
|
|
61
|
-
return value;
|
|
62
|
-
}));
|
|
63
|
-
}
|
|
64
|
-
catch {
|
|
65
|
-
return '[Unserializable args]';
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
45
|
return originalAddTool({
|
|
69
46
|
...toolDef,
|
|
70
47
|
execute: async (args, context) => {
|
|
71
48
|
const start = Date.now();
|
|
72
|
-
log.info(`[TOOL START] ${toolName}`,
|
|
49
|
+
log.info(`[TOOL START] ${toolName}`, redactForLogging(args));
|
|
73
50
|
try {
|
|
74
51
|
const result = await originalExecute(args, context);
|
|
75
52
|
const durationMs = Date.now() - start;
|
|
@@ -90,7 +67,7 @@ export default function registerTools(server) {
|
|
|
90
67
|
isError: true,
|
|
91
68
|
}));
|
|
92
69
|
const msg = err instanceof Error ? err.stack || err.message : String(err);
|
|
93
|
-
log.error(`[TOOL ERROR] ${toolName} (${durationMs}ms): ${msg}`);
|
|
70
|
+
log.error(`[TOOL ERROR] ${toolName} (${durationMs}ms): ${redactUrlCredentials(msg)}`);
|
|
94
71
|
throw err;
|
|
95
72
|
}
|
|
96
73
|
},
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAgBA,OAAO,GAAG,MAAM,cAAc,CAAC;AAC/B,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { readAllPersistedSessions } from '../../persistence.js';
|
|
2
2
|
import { detachSession, getSessionOwnership, listSessions, setSession, } from '../../session-store.js';
|
|
3
|
-
import {
|
|
3
|
+
import { redactUrlCredentials } from '../../utils/sensitive.js';
|
|
4
|
+
import { attachToRemoteSession, getPortFromUrl, validateRemoteServerUrl } from '../../utils/url.js';
|
|
4
5
|
import { errorResult, textResult, toolErrorMessage } from '../tool-response.js';
|
|
5
|
-
import { validateRemoteServerUrl } from './create-session.js';
|
|
6
6
|
/**
|
|
7
7
|
* Normalize capability payloads returned by Appium/WebdriverIO into a flat
|
|
8
8
|
* capability record.
|
|
@@ -59,7 +59,7 @@ export async function attachSessionAction(args) {
|
|
|
59
59
|
fetchCapabilitiesFromServer(args.remoteServerUrl, args.sessionId),
|
|
60
60
|
]);
|
|
61
61
|
if (sessionCapabilities === undefined && deprecatedSessionCapabilities === undefined) {
|
|
62
|
-
return errorResult(`Failed to fetch capabilities for session ${args.sessionId} from ${args.remoteServerUrl}. ` +
|
|
62
|
+
return errorResult(`Failed to fetch capabilities for session ${args.sessionId} from ${redactUrlCredentials(args.remoteServerUrl)}. ` +
|
|
63
63
|
`The server may be unreachable or the session may no longer exist.`);
|
|
64
64
|
}
|
|
65
65
|
const sources = [sessionCapabilities, deprecatedSessionCapabilities, args.capabilities];
|
|
@@ -119,7 +119,7 @@ async function fetchCapabilitiesFromServer(remoteServerUrl, sessionId, endpoint)
|
|
|
119
119
|
const url = new URL(remoteServerUrl);
|
|
120
120
|
const port = getPortFromUrl(url);
|
|
121
121
|
const basePath = url.pathname.replace(/\/$/, '');
|
|
122
|
-
const path = `${basePath}/session/${sessionId}${endpoint ? '/' + endpoint : ''}`;
|
|
122
|
+
const path = `${basePath}/session/${encodeURIComponent(sessionId)}${endpoint ? '/' + endpoint : ''}`;
|
|
123
123
|
const requestUrl = `${url.protocol}//${url.hostname}:${port}${path}`;
|
|
124
124
|
const headers = {
|
|
125
125
|
'Content-Type': 'application/json',
|
|
@@ -130,6 +130,7 @@ async function fetchCapabilitiesFromServer(remoteServerUrl, sessionId, endpoint)
|
|
|
130
130
|
}
|
|
131
131
|
const response = await fetch(requestUrl, {
|
|
132
132
|
headers,
|
|
133
|
+
redirect: 'error',
|
|
133
134
|
signal: AbortSignal.timeout(5000),
|
|
134
135
|
});
|
|
135
136
|
if (!response.ok) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attach-session.js","sourceRoot":"","sources":["../../../src/tools/session/attach-session.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,wBAAwB,EAAC,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,UAAU,GAGX,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"attach-session.js","sourceRoot":"","sources":["../../../src/tools/session/attach-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ContentResult } from 'fastmcp';
|
|
2
|
-
import { getPortFromUrl } from '../../utils/url.js';
|
|
2
|
+
import { getPortFromUrl, validateRemoteServerUrl } from '../../utils/url.js';
|
|
3
3
|
/**
|
|
4
4
|
* What driver should the appium-mcp session management tool create and manage.
|
|
5
5
|
* 'ios' and 'android' create sessions with the embedded Appium drivers inside this MCP server.
|
|
@@ -51,15 +51,6 @@ export declare function buildIOSCapabilities(configCaps: Record<string, any>, cu
|
|
|
51
51
|
* For local sessions, ensure create platform matches a prior select_device choice.
|
|
52
52
|
*/
|
|
53
53
|
export declare function validateLocalCreatePlatformMatch(platform: (typeof DRIVER_MODE_PLATFORMS)[number], remoteServerUrl?: string): ContentResult | undefined;
|
|
54
|
-
/**
|
|
55
|
-
* Validate the provided remote server URL.
|
|
56
|
-
*
|
|
57
|
-
* @param remoteServerUrl - The URL of the remote Appium server to validate.
|
|
58
|
-
* @param regexRule - Optional regular expression string to further validate the URL format.
|
|
59
|
-
* If the regexRule is provided, the URL must match the regex pattern to be considered valid.
|
|
60
|
-
* @throws {Error} If the URL is invalid.
|
|
61
|
-
*/
|
|
62
|
-
export declare function validateRemoteServerUrl(remoteServerUrl: string, regexRule?: string): void;
|
|
63
54
|
/**
|
|
64
55
|
* Create a new mobile session with Android or iOS device.
|
|
65
56
|
*
|
|
@@ -87,5 +78,5 @@ export declare function createSessionAction(args: {
|
|
|
87
78
|
capabilities?: Record<string, any>;
|
|
88
79
|
remoteServerUrl?: string;
|
|
89
80
|
}): Promise<ContentResult>;
|
|
90
|
-
export { getPortFromUrl };
|
|
81
|
+
export { getPortFromUrl, validateRemoteServerUrl };
|
|
91
82
|
//# sourceMappingURL=create-session.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-session.d.ts","sourceRoot":"","sources":["../../../src/tools/session/create-session.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"create-session.d.ts","sourceRoot":"","sources":["../../../src/tools/session/create-session.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,SAAS,CAAC;AAS3C,OAAO,EAAC,cAAc,EAAE,uBAAuB,EAAC,MAAM,oBAAoB,CAAC;AAK3E;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,wCAAyC,CAAC;AAG5E,UAAU,YAAY;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB,EAAE,MAAM,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AASD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,YAAY,GAAG,YAAY,CAQhF;AAgBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,yBAAyB,CAC7C,QAAQ,EAAE,SAAS,GAAG,KAAK,EAC3B,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC;IAAC,YAAY,EAAE,YAAY,CAAC;IAAC,cAAc,EAAE,MAAM,EAAE,CAAA;CAAC,CAAC,CA2BjE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC/B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,EAC3C,cAAc,EAAE,OAAO,GACtB,YAAY,CAsCd;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAAC,UAAU,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBvG;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC/B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,EAC3C,cAAc,EAAE,OAAO,GACtB,OAAO,CAAC,YAAY,CAAC,CA2DvB;AAED;;GAEG;AACH,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,EAChD,eAAe,CAAC,EAAE,MAAM,GACvB,aAAa,GAAG,SAAS,CAa3B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,QAAQ,EAAE,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC;IACjD,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GAAG,OAAO,CAAC,aAAa,CAAC,CA8GzB;AAmFD,OAAO,EAAC,cAAc,EAAE,uBAAuB,EAAC,CAAC"}
|
|
@@ -8,7 +8,8 @@ import log from '../../logger.js';
|
|
|
8
8
|
import { setSession, listSessions } from '../../session-store.js';
|
|
9
9
|
import { createUIResource, createSessionDashboardUI, addUIResourceToResponse } from '../../ui/mcp-ui-utils.js';
|
|
10
10
|
import { findFreePort, releaseReservedPorts } from '../../utils/ports.js';
|
|
11
|
-
import {
|
|
11
|
+
import { redactForLogging, redactUrlCredentials } from '../../utils/sensitive.js';
|
|
12
|
+
import { getPortFromUrl, validateRemoteServerUrl } from '../../utils/url.js';
|
|
12
13
|
import { withQuietWebDriverLogging } from '../../utils/webdriver-client-options.js';
|
|
13
14
|
import { errorResult, textResult, toolErrorMessage } from '../tool-response.js';
|
|
14
15
|
import { clearSelectedDevice, getSelectedLocalDevice } from './select-device.js';
|
|
@@ -201,20 +202,6 @@ export function validateLocalCreatePlatformMatch(platform, remoteServerUrl) {
|
|
|
201
202
|
}
|
|
202
203
|
return undefined;
|
|
203
204
|
}
|
|
204
|
-
/**
|
|
205
|
-
* Validate the provided remote server URL.
|
|
206
|
-
*
|
|
207
|
-
* @param remoteServerUrl - The URL of the remote Appium server to validate.
|
|
208
|
-
* @param regexRule - Optional regular expression string to further validate the URL format.
|
|
209
|
-
* If the regexRule is provided, the URL must match the regex pattern to be considered valid.
|
|
210
|
-
* @throws {Error} If the URL is invalid.
|
|
211
|
-
*/
|
|
212
|
-
export function validateRemoteServerUrl(remoteServerUrl, regexRule) {
|
|
213
|
-
const regexPattern = regexRule ? new RegExp(regexRule) : /^https?:\/\/.+$/;
|
|
214
|
-
if (!regexPattern.test(remoteServerUrl)) {
|
|
215
|
-
throw new Error(`Invalid remoteServerUrl: ${remoteServerUrl}.`);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
205
|
/**
|
|
219
206
|
* Create a new mobile session with Android or iOS device.
|
|
220
207
|
*
|
|
@@ -258,14 +245,14 @@ export async function createSessionAction(args) {
|
|
|
258
245
|
...customCapabilities,
|
|
259
246
|
};
|
|
260
247
|
}
|
|
261
|
-
log.info(`Creating new ${platform.toUpperCase()} session with capabilities:`, JSON.stringify(finalCapabilities, null, 2));
|
|
248
|
+
log.info(`Creating new ${platform.toUpperCase()} session with capabilities:`, JSON.stringify(redactForLogging(finalCapabilities), null, 2));
|
|
262
249
|
let sessionId;
|
|
263
250
|
if (remoteServerUrl) {
|
|
264
251
|
try {
|
|
265
252
|
validateRemoteServerUrl(remoteServerUrl, process.env.REMOTE_SERVER_URL_ALLOW_REGEX);
|
|
266
253
|
}
|
|
267
254
|
catch (err) {
|
|
268
|
-
return errorResult(`Invalid remoteServerUrl "${remoteServerUrl}". ${toolErrorMessage(err)} Pass a valid http(s) URL, or omit remoteServerUrl to use the local embedded driver.`);
|
|
255
|
+
return errorResult(`Invalid remoteServerUrl "${redactUrlCredentials(remoteServerUrl)}". ${toolErrorMessage(err)} Pass a valid http(s) URL without a query or fragment, or omit remoteServerUrl to use the local embedded driver.`);
|
|
269
256
|
}
|
|
270
257
|
const remoteUrl = new URL(remoteServerUrl);
|
|
271
258
|
const protocol = remoteUrl.protocol.replace(':', '');
|
|
@@ -318,7 +305,7 @@ export async function createSessionAction(args) {
|
|
|
318
305
|
})));
|
|
319
306
|
}
|
|
320
307
|
catch (error) {
|
|
321
|
-
log.error('Error creating session:', error);
|
|
308
|
+
log.error('Error creating session:', toolErrorMessage(error));
|
|
322
309
|
return errorResult(buildCreateSessionFailureMessage(error, {
|
|
323
310
|
platform: args.platform,
|
|
324
311
|
remoteServerUrl: args.remoteServerUrl,
|
|
@@ -330,7 +317,7 @@ function buildCreateSessionFailureMessage(error, ctx) {
|
|
|
330
317
|
const detail = toolErrorMessage(error);
|
|
331
318
|
const base = `Failed to create session. ${detail}`;
|
|
332
319
|
if (ctx.remoteServerUrl) {
|
|
333
|
-
return `${base} remoteServerUrl="${ctx.remoteServerUrl}".`;
|
|
320
|
+
return `${base} remoteServerUrl="${redactUrlCredentials(ctx.remoteServerUrl)}".`;
|
|
334
321
|
}
|
|
335
322
|
if (/select_device/i.test(detail)) {
|
|
336
323
|
return base;
|
|
@@ -390,5 +377,5 @@ async function createDriverSession(driver, capabilities) {
|
|
|
390
377
|
return Array.isArray(result) ? result[0] : result;
|
|
391
378
|
}
|
|
392
379
|
// Re-export for backward compatibility with consumers that imported from this module.
|
|
393
|
-
export { getPortFromUrl };
|
|
380
|
+
export { getPortFromUrl, validateRemoteServerUrl };
|
|
394
381
|
//# sourceMappingURL=create-session.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-session.js","sourceRoot":"","sources":["../../../src/tools/session/create-session.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"create-session.js","sourceRoot":"","sources":["../../../src/tools/session/create-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-response.d.ts","sourceRoot":"","sources":["../../src/tools/tool-response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,SAAS,CAAC;AAK3C,OAAO,EAAwB,KAAK,cAAc,EAA2B,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-response.d.ts","sourceRoot":"","sources":["../../src/tools/tool-response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,SAAS,CAAC;AAK3C,OAAO,EAAwB,KAAK,cAAc,EAA2B,MAAM,qBAAqB,CAAC;AAMzG,MAAM,MAAM,aAAa,GAAG;IAAC,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAC,GAAG;IAAC,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAC,CAAC;AAEpG;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAErD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAUrE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAEtD;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CAI/F;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAEvD;AAED,gGAAgG;AAChG,wBAAgB,4BAA4B,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAGvE;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,aAAa,CAE7E;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAgB9E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CAEhG"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import log from '../logger.js';
|
|
2
2
|
import { readAllPersistedSessions, removePersistedSession } from '../persistence.js';
|
|
3
3
|
import { getDriver, setSession } from '../session-store.js';
|
|
4
|
-
import {
|
|
4
|
+
import { redactUrlCredentials } from '../utils/sensitive.js';
|
|
5
|
+
import { attachToRemoteSession, validateRemoteServerUrl } from '../utils/url.js';
|
|
5
6
|
const W3C_ELEMENT_ID = 'element-6066-11e4-a52e-4f735466cecf';
|
|
6
7
|
/**
|
|
7
8
|
* Normalizes unknown errors into a message string for tool responses.
|
|
8
9
|
*/
|
|
9
10
|
export function toolErrorMessage(err) {
|
|
10
|
-
return err instanceof Error ? err.message : String(err);
|
|
11
|
+
return redactUrlCredentials(err instanceof Error ? err.message : String(err));
|
|
11
12
|
}
|
|
12
13
|
/**
|
|
13
14
|
* Reads the WebDriver element id from a findElement/activeElement payload,
|
|
@@ -95,6 +96,13 @@ async function rehydrateAttachedSession(sessionId) {
|
|
|
95
96
|
}
|
|
96
97
|
const candidates = persisted.filter((p) => p.sessionId === sessionId);
|
|
97
98
|
for (const entry of candidates) {
|
|
99
|
+
try {
|
|
100
|
+
validateRemoteServerUrl(entry.remoteServerUrl, process.env.REMOTE_SERVER_URL_ALLOW_REGEX);
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
log.warn(`Persisted session ${entry.sessionId} has a disallowed remoteServerUrl (${toolErrorMessage(err)}); skipping.`);
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
98
106
|
try {
|
|
99
107
|
const client = await attachToRemoteSession({
|
|
100
108
|
remoteServerUrl: entry.remoteServerUrl,
|
|
@@ -107,7 +115,7 @@ async function rehydrateAttachedSession(sessionId) {
|
|
|
107
115
|
await client.getTimeouts();
|
|
108
116
|
}
|
|
109
117
|
catch (verifyErr) {
|
|
110
|
-
log.warn(`Persisted session ${entry.sessionId} failed liveness check (${verifyErr
|
|
118
|
+
log.warn(`Persisted session ${entry.sessionId} failed liveness check (${toolErrorMessage(verifyErr)}); pruning.`);
|
|
111
119
|
await removePersistedSession(entry.sessionId);
|
|
112
120
|
continue;
|
|
113
121
|
}
|
|
@@ -126,7 +134,7 @@ async function rehydrateAttachedSession(sessionId) {
|
|
|
126
134
|
return { sessionId: entry.sessionId };
|
|
127
135
|
}
|
|
128
136
|
catch (err) {
|
|
129
|
-
log.warn(`Persisted session ${entry.sessionId} no longer attachable (${err
|
|
137
|
+
log.warn(`Persisted session ${entry.sessionId} no longer attachable (${toolErrorMessage(err)}); pruning.`);
|
|
130
138
|
await removePersistedSession(entry.sessionId);
|
|
131
139
|
}
|
|
132
140
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-response.js","sourceRoot":"","sources":["../../src/tools/tool-response.ts"],"names":[],"mappings":"AAGA,OAAO,GAAG,MAAM,cAAc,CAAC;AAC/B,OAAO,EAAC,wBAAwB,EAAE,sBAAsB,EAAC,MAAM,mBAAmB,CAAC;AACnF,OAAO,EAAC,SAAS,EAAE,UAAU,EAAgD,MAAM,qBAAqB,CAAC;AACzG,OAAO,EAAC,qBAAqB,EAAC,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-response.js","sourceRoot":"","sources":["../../src/tools/tool-response.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,4 +5,11 @@
|
|
|
5
5
|
* @returns True if the key is considered sensitive, false otherwise.
|
|
6
6
|
*/
|
|
7
7
|
export declare function isSensitiveKey(key: string): boolean;
|
|
8
|
+
/** Removes username/password URL userinfo from text intended for logs or errors. */
|
|
9
|
+
export declare function redactUrlCredentials(value: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Produces a JSON-safe copy for logs, redacting sensitive keys, URL userinfo,
|
|
12
|
+
* and values large enough to make logs unsafe or impractical.
|
|
13
|
+
*/
|
|
14
|
+
export declare function redactForLogging(value: unknown): unknown;
|
|
8
15
|
//# sourceMappingURL=sensitive.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sensitive.d.ts","sourceRoot":"","sources":["../../src/utils/sensitive.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sensitive.d.ts","sourceRoot":"","sources":["../../src/utils/sensitive.ts"],"names":[],"mappings":"AAmBA;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAGnD;AAED,oFAAoF;AACpF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CA0BxD"}
|
package/dist/utils/sensitive.js
CHANGED
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
const SENSITIVE_KEY_PARTS = [
|
|
2
|
+
'access_key',
|
|
2
3
|
'api_key',
|
|
3
4
|
'apikey',
|
|
4
5
|
'authorization',
|
|
5
6
|
'client_secret',
|
|
6
7
|
'clientsecret',
|
|
7
8
|
'credential',
|
|
9
|
+
'passphrase',
|
|
8
10
|
'password',
|
|
11
|
+
'private_key',
|
|
9
12
|
'remote_server_url',
|
|
10
13
|
'remoteserverurl',
|
|
11
14
|
'secret',
|
|
12
15
|
'token',
|
|
13
16
|
];
|
|
17
|
+
const URL_USERINFO_PATTERN = /\b([a-z][a-z0-9+.-]*:\/\/)([^\s/@]+)@/gi;
|
|
14
18
|
/**
|
|
15
19
|
* Determines if a given key is considered sensitive based on whether it includes any of the defined sensitive key parts.
|
|
16
20
|
* The check is case-insensitive and ignores non-alphanumeric characters, so keys like "API-Key", "client secret", or "remote_server_url" would all be correctly identified as sensitive.
|
|
@@ -21,6 +25,39 @@ export function isSensitiveKey(key) {
|
|
|
21
25
|
const normalized = normalizeKey(key);
|
|
22
26
|
return SENSITIVE_KEY_PARTS.some((part) => normalized.includes(normalizeKey(part)));
|
|
23
27
|
}
|
|
28
|
+
/** Removes username/password URL userinfo from text intended for logs or errors. */
|
|
29
|
+
export function redactUrlCredentials(value) {
|
|
30
|
+
return value.replace(URL_USERINFO_PATTERN, '$1[REDACTED]@');
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Produces a JSON-safe copy for logs, redacting sensitive keys, URL userinfo,
|
|
34
|
+
* and values large enough to make logs unsafe or impractical.
|
|
35
|
+
*/
|
|
36
|
+
export function redactForLogging(value) {
|
|
37
|
+
if (value === undefined || value === null) {
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
return JSON.parse(JSON.stringify(value, (key, nestedValue) => {
|
|
42
|
+
if (key && isSensitiveKey(key)) {
|
|
43
|
+
return '[REDACTED]';
|
|
44
|
+
}
|
|
45
|
+
if (typeof nestedValue === 'string') {
|
|
46
|
+
if (nestedValue.length > 2000) {
|
|
47
|
+
return `[string:${nestedValue.length}]`;
|
|
48
|
+
}
|
|
49
|
+
return redactUrlCredentials(nestedValue);
|
|
50
|
+
}
|
|
51
|
+
if (typeof Buffer !== 'undefined' && Buffer.isBuffer(nestedValue)) {
|
|
52
|
+
return `[buffer:${nestedValue.length}]`;
|
|
53
|
+
}
|
|
54
|
+
return nestedValue;
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return '[Unserializable value]';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
24
61
|
function normalizeKey(key) {
|
|
25
62
|
return key.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
|
|
26
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sensitive.js","sourceRoot":"","sources":["../../src/utils/sensitive.ts"],"names":[],"mappings":"AAAA,MAAM,mBAAmB,GAAG;IAC1B,SAAS;IACT,QAAQ;IACR,eAAe;IACf,eAAe;IACf,cAAc;IACd,YAAY;IACZ,UAAU;IACV,mBAAmB;IACnB,iBAAiB;IACjB,QAAQ;IACR,OAAO;CACR,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACxD,CAAC"}
|
|
1
|
+
{"version":3,"file":"sensitive.js","sourceRoot":"","sources":["../../src/utils/sensitive.ts"],"names":[],"mappings":"AAAA,MAAM,mBAAmB,GAAG;IAC1B,YAAY;IACZ,SAAS;IACT,QAAQ;IACR,eAAe;IACf,eAAe;IACf,cAAc;IACd,YAAY;IACZ,YAAY;IACZ,UAAU;IACV,aAAa;IACb,mBAAmB;IACnB,iBAAiB;IACjB,QAAQ;IACR,OAAO;CACR,CAAC;AAEF,MAAM,oBAAoB,GAAG,yCAAyC,CAAC;AAEvE;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACrF,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAO,KAAK,CAAC,OAAO,CAAC,oBAAoB,EAAE,eAAe,CAAC,CAAC;AAC9D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CACf,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,WAAW,EAAE,EAAE;YACzC,IAAI,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,OAAO,YAAY,CAAC;YACtB,CAAC;YACD,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;gBACpC,IAAI,WAAW,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;oBAC9B,OAAO,WAAW,WAAW,CAAC,MAAM,GAAG,CAAC;gBAC1C,CAAC;gBACD,OAAO,oBAAoB,CAAC,WAAW,CAAC,CAAC;YAC3C,CAAC;YACD,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBAClE,OAAO,WAAY,WAAsB,CAAC,MAAM,GAAG,CAAC;YACtD,CAAC;YACD,OAAO,WAAW,CAAC;QACrB,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,wBAAwB,CAAC;IAClC,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACxD,CAAC"}
|
package/dist/utils/url.d.ts
CHANGED
|
@@ -10,6 +10,13 @@ export interface RemoteAttachOptions {
|
|
|
10
10
|
* Defaults to 443 for https and 80 for http when no explicit port is set.
|
|
11
11
|
*/
|
|
12
12
|
export declare function getPortFromUrl(url: URL): number;
|
|
13
|
+
/**
|
|
14
|
+
* Validate a remote Appium server URL and an optional deployment allowlist.
|
|
15
|
+
*
|
|
16
|
+
* The allowlist can only narrow the built-in HTTP(S)-only policy. Queries and
|
|
17
|
+
* fragments are rejected because WebDriver requests use the URL as a base path.
|
|
18
|
+
*/
|
|
19
|
+
export declare function validateRemoteServerUrl(remoteServerUrl: string, regexRule?: string): void;
|
|
13
20
|
/**
|
|
14
21
|
* Attach to an existing remote Appium session given its server URL and id.
|
|
15
22
|
*
|
package/dist/utils/url.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/utils/url.ts"],"names":[],"mappings":"AAAA,OAAkB,EAAC,KAAK,MAAM,EAAC,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/utils/url.ts"],"names":[],"mappings":"AAAA,OAAkB,EAAC,KAAK,MAAM,EAAC,MAAM,WAAW,CAAC;AAKjD,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAE/C;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,eAAe,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAiBzF;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBzF"}
|
package/dist/utils/url.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import WebDriver from 'webdriver';
|
|
2
|
+
import { redactUrlCredentials } from './sensitive.js';
|
|
2
3
|
import { withQuietWebDriverLogging } from './webdriver-client-options.js';
|
|
3
4
|
/**
|
|
4
5
|
* Resolve the port to use for a given URL.
|
|
@@ -8,6 +9,28 @@ import { withQuietWebDriverLogging } from './webdriver-client-options.js';
|
|
|
8
9
|
export function getPortFromUrl(url) {
|
|
9
10
|
return Number(url.port) || (url.protocol === 'https:' ? 443 : 80);
|
|
10
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* Validate a remote Appium server URL and an optional deployment allowlist.
|
|
14
|
+
*
|
|
15
|
+
* The allowlist can only narrow the built-in HTTP(S)-only policy. Queries and
|
|
16
|
+
* fragments are rejected because WebDriver requests use the URL as a base path.
|
|
17
|
+
*/
|
|
18
|
+
export function validateRemoteServerUrl(remoteServerUrl, regexRule) {
|
|
19
|
+
const invalidUrl = () => new Error(`Invalid remoteServerUrl: ${redactUrlCredentials(remoteServerUrl)}.`);
|
|
20
|
+
let parsed;
|
|
21
|
+
try {
|
|
22
|
+
parsed = new URL(remoteServerUrl);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
throw invalidUrl();
|
|
26
|
+
}
|
|
27
|
+
if (!['http:', 'https:'].includes(parsed.protocol) || !parsed.hostname || parsed.search || parsed.hash) {
|
|
28
|
+
throw invalidUrl();
|
|
29
|
+
}
|
|
30
|
+
if (regexRule && !new RegExp(regexRule).test(remoteServerUrl)) {
|
|
31
|
+
throw invalidUrl();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
11
34
|
/**
|
|
12
35
|
* Attach to an existing remote Appium session given its server URL and id.
|
|
13
36
|
*
|
package/dist/utils/url.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/utils/url.ts"],"names":[],"mappings":"AAAA,OAAO,SAAwB,MAAM,WAAW,CAAC;AAEjD,OAAO,EAAC,yBAAyB,EAAC,MAAM,+BAA+B,CAAC;AAQxE;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,GAAQ;IACrC,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACpE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAA4B;IACtE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACzE,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxE,OAAO,SAAS,CAAC,eAAe,CAC9B,yBAAyB,CAAC;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,QAAQ;QACR,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,IAAI;QACJ,IAAI,EAAE,GAAG,CAAC,QAAQ;QAClB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,EAAC,IAAI,EAAE,GAAG,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACpC,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/utils/url.ts"],"names":[],"mappings":"AAAA,OAAO,SAAwB,MAAM,WAAW,CAAC;AAEjD,OAAO,EAAC,oBAAoB,EAAC,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAC,yBAAyB,EAAC,MAAM,+BAA+B,CAAC;AAQxE;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,GAAQ;IACrC,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACpE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,eAAuB,EAAE,SAAkB;IACjF,MAAM,UAAU,GAAG,GAAU,EAAE,CAAC,IAAI,KAAK,CAAC,4BAA4B,oBAAoB,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IAEhH,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,UAAU,EAAE,CAAC;IACrB,CAAC;IAED,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QACvG,MAAM,UAAU,EAAE,CAAC;IACrB,CAAC;IAED,IAAI,SAAS,IAAI,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;QAC9D,MAAM,UAAU,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAA4B;IACtE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACzE,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxE,OAAO,SAAS,CAAC,eAAe,CAC9B,yBAAyB,CAAC;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,QAAQ;QACR,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,IAAI;QACJ,IAAI,EAAE,GAAG,CAAC,QAAQ;QAClB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,EAAC,IAAI,EAAE,GAAG,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACpC,CAAC,CACH,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "appium-mcp",
|
|
3
|
-
"version": "1.92.
|
|
3
|
+
"version": "1.92.14",
|
|
4
4
|
"description": "Intelligent MCP server providing AI assistants with powerful tools and resources for Appium mobile automation",
|
|
5
5
|
"bugs": {
|
|
6
6
|
"url": "https://github.com/appium/appium-mcp/issues"
|
|
@@ -116,6 +116,14 @@
|
|
|
116
116
|
"@opentelemetry/sdk-node": "^0.221.0",
|
|
117
117
|
"applesign": "^5.0.0"
|
|
118
118
|
},
|
|
119
|
+
"overrides": {
|
|
120
|
+
"@puppeteer/browsers": "^3.2.1",
|
|
121
|
+
"applesign": {
|
|
122
|
+
"mocha": "^12.0.0",
|
|
123
|
+
"uuid": "^11.1.1"
|
|
124
|
+
},
|
|
125
|
+
"deepmerge-ts": "^8.0.2"
|
|
126
|
+
},
|
|
119
127
|
"lint-staged": {
|
|
120
128
|
"src/**/*.ts": [
|
|
121
129
|
"eslint src --fix",
|
package/server.json
CHANGED
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
"name": "io.github.appium/appium-mcp",
|
|
4
4
|
"title": "MCP Appium - Mobile Development and Automation Server",
|
|
5
5
|
"description": "MCP server for Appium mobile automation on iOS and Android devices with test creation tools.",
|
|
6
|
-
"version": "1.92.
|
|
6
|
+
"version": "1.92.14",
|
|
7
7
|
"packages": [
|
|
8
8
|
{
|
|
9
9
|
"registryType": "npm",
|
|
10
10
|
"identifier": "appium-mcp",
|
|
11
|
-
"version": "1.92.
|
|
11
|
+
"version": "1.92.14",
|
|
12
12
|
"transport": {
|
|
13
13
|
"type": "stdio"
|
|
14
14
|
}
|
package/src/persistence.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {createHash} from 'node:crypto';
|
|
1
|
+
import {createHash, randomBytes} from 'node:crypto';
|
|
2
|
+
import {chmod, lstat, writeFile} from 'node:fs/promises';
|
|
2
3
|
import path from 'node:path';
|
|
3
4
|
|
|
4
5
|
import {fs} from '@appium/support';
|
|
@@ -7,6 +8,8 @@ import log from './logger.js';
|
|
|
7
8
|
import type {SessionCapabilities, SessionOwnership} from './session-store.js';
|
|
8
9
|
import {resolveAppiumMcpSessionsDir} from './utils/paths.js';
|
|
9
10
|
|
|
11
|
+
const PRIVATE_FILE_MODE = 0o600;
|
|
12
|
+
|
|
10
13
|
/**
|
|
11
14
|
* On-disk representation of a remote Appium session.
|
|
12
15
|
*
|
|
@@ -76,13 +79,19 @@ export async function readAllPersistedSessions(): Promise<PersistedSession[]> {
|
|
|
76
79
|
for (const name of jsonFiles) {
|
|
77
80
|
const filePath = path.join(dir, name);
|
|
78
81
|
try {
|
|
82
|
+
const fileStats = await lstat(filePath);
|
|
83
|
+
if (!fileStats.isFile()) {
|
|
84
|
+
log.warn(`Skipping persisted session file ${name}: not a regular file`);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
await chmod(filePath, PRIVATE_FILE_MODE);
|
|
79
88
|
const raw = await fs.readFile(filePath, 'utf8');
|
|
80
89
|
const entry = JSON.parse(raw) as PersistedSession;
|
|
81
90
|
const canonicalPath = sessionFilePath(entry.sessionId, dir);
|
|
82
91
|
const canonicalName = path.basename(canonicalPath);
|
|
83
92
|
if (name !== canonicalName) {
|
|
84
93
|
try {
|
|
85
|
-
await
|
|
94
|
+
await writeFile(canonicalPath, raw, {encoding: 'utf8', flag: 'wx', mode: PRIVATE_FILE_MODE});
|
|
86
95
|
} catch (err) {
|
|
87
96
|
if ((err as NodeJS.ErrnoException).code === 'EEXIST') {
|
|
88
97
|
await removeDuplicateSessionFile(filePath, name, entry.sessionId);
|
|
@@ -117,12 +126,17 @@ export async function writePersistedSession(entry: PersistedSession): Promise<vo
|
|
|
117
126
|
return;
|
|
118
127
|
}
|
|
119
128
|
const target = sessionFilePath(entry.sessionId, dir);
|
|
120
|
-
const tmp = `${target}.${process.pid}.tmp`;
|
|
129
|
+
const tmp = `${target}.${process.pid}.${randomBytes(8).toString('hex')}.tmp`;
|
|
121
130
|
try {
|
|
122
131
|
await fs.mkdir(dir, {recursive: true});
|
|
123
132
|
await migrateLegacySessionFile(entry.sessionId, dir);
|
|
124
|
-
await
|
|
133
|
+
await writeFile(tmp, JSON.stringify(entry, null, 2), {
|
|
134
|
+
encoding: 'utf8',
|
|
135
|
+
flag: 'wx',
|
|
136
|
+
mode: PRIVATE_FILE_MODE,
|
|
137
|
+
});
|
|
125
138
|
await fs.rename(tmp, target);
|
|
139
|
+
await chmod(target, PRIVATE_FILE_MODE);
|
|
126
140
|
} catch (err) {
|
|
127
141
|
log.warn(`Failed to persist session ${entry.sessionId}: ${(err as Error).message}`);
|
|
128
142
|
// Best-effort cleanup of the tmp file. Ignore if it does not exist.
|
package/src/tools/index.ts
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
import type {ContentResult, FastMCP} from 'fastmcp';
|
|
16
16
|
|
|
17
17
|
import log from '../logger.js';
|
|
18
|
-
import {
|
|
18
|
+
import {redactForLogging, redactUrlCredentials} from '../utils/sensitive.js';
|
|
19
19
|
import ai from './ai/ai.js';
|
|
20
20
|
import {isAIEnabled, assertAIConfig} from './ai/config.js';
|
|
21
21
|
import app from './app-management/app.js';
|
|
@@ -61,35 +61,11 @@ export default function registerTools(server: FastMCP): void {
|
|
|
61
61
|
if (typeof originalExecute !== 'function') {
|
|
62
62
|
return originalAddTool(toolDef);
|
|
63
63
|
}
|
|
64
|
-
const redactArgs = (obj: unknown): unknown => {
|
|
65
|
-
if (obj === undefined || obj === null) {
|
|
66
|
-
return obj;
|
|
67
|
-
}
|
|
68
|
-
try {
|
|
69
|
-
return JSON.parse(
|
|
70
|
-
JSON.stringify(obj, (key, value) => {
|
|
71
|
-
if (key && isSensitiveKey(key)) {
|
|
72
|
-
return '[REDACTED]';
|
|
73
|
-
}
|
|
74
|
-
// Avoid logging extremely large buffers/strings
|
|
75
|
-
if (value && typeof value === 'string' && value.length > 2000) {
|
|
76
|
-
return `[string:${value.length}]`;
|
|
77
|
-
}
|
|
78
|
-
if (value && typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) {
|
|
79
|
-
return `[buffer:${(value as Buffer).length}]`;
|
|
80
|
-
}
|
|
81
|
-
return value;
|
|
82
|
-
}),
|
|
83
|
-
);
|
|
84
|
-
} catch {
|
|
85
|
-
return '[Unserializable args]';
|
|
86
|
-
}
|
|
87
|
-
};
|
|
88
64
|
return originalAddTool({
|
|
89
65
|
...toolDef,
|
|
90
66
|
execute: async (args, context) => {
|
|
91
67
|
const start = Date.now();
|
|
92
|
-
log.info(`[TOOL START] ${toolName}`,
|
|
68
|
+
log.info(`[TOOL START] ${toolName}`, redactForLogging(args));
|
|
93
69
|
try {
|
|
94
70
|
const result = await originalExecute(args, context);
|
|
95
71
|
const durationMs = Date.now() - start;
|
|
@@ -113,7 +89,7 @@ export default function registerTools(server: FastMCP): void {
|
|
|
113
89
|
}),
|
|
114
90
|
);
|
|
115
91
|
const msg = err instanceof Error ? err.stack || err.message : String(err);
|
|
116
|
-
log.error(`[TOOL ERROR] ${toolName} (${durationMs}ms): ${msg}`);
|
|
92
|
+
log.error(`[TOOL ERROR] ${toolName} (${durationMs}ms): ${redactUrlCredentials(msg)}`);
|
|
117
93
|
throw err;
|
|
118
94
|
}
|
|
119
95
|
},
|
|
@@ -9,9 +9,9 @@ import {
|
|
|
9
9
|
type SessionCapabilities,
|
|
10
10
|
type SessionOwnership,
|
|
11
11
|
} from '../../session-store.js';
|
|
12
|
-
import {
|
|
12
|
+
import {redactUrlCredentials} from '../../utils/sensitive.js';
|
|
13
|
+
import {attachToRemoteSession, getPortFromUrl, validateRemoteServerUrl} from '../../utils/url.js';
|
|
13
14
|
import {errorResult, textResult, toolErrorMessage} from '../tool-response.js';
|
|
14
|
-
import {validateRemoteServerUrl} from './create-session.js';
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* Normalize capability payloads returned by Appium/WebdriverIO into a flat
|
|
@@ -84,7 +84,7 @@ export async function attachSessionAction(args: {
|
|
|
84
84
|
|
|
85
85
|
if (sessionCapabilities === undefined && deprecatedSessionCapabilities === undefined) {
|
|
86
86
|
return errorResult(
|
|
87
|
-
`Failed to fetch capabilities for session ${args.sessionId} from ${args.remoteServerUrl}. ` +
|
|
87
|
+
`Failed to fetch capabilities for session ${args.sessionId} from ${redactUrlCredentials(args.remoteServerUrl)}. ` +
|
|
88
88
|
`The server may be unreachable or the session may no longer exist.`,
|
|
89
89
|
);
|
|
90
90
|
}
|
|
@@ -160,7 +160,7 @@ async function fetchCapabilitiesFromServer(
|
|
|
160
160
|
const url = new URL(remoteServerUrl);
|
|
161
161
|
const port = getPortFromUrl(url);
|
|
162
162
|
const basePath = url.pathname.replace(/\/$/, '');
|
|
163
|
-
const path = `${basePath}/session/${sessionId}${endpoint ? '/' + endpoint : ''}`;
|
|
163
|
+
const path = `${basePath}/session/${encodeURIComponent(sessionId)}${endpoint ? '/' + endpoint : ''}`;
|
|
164
164
|
const requestUrl = `${url.protocol}//${url.hostname}:${port}${path}`;
|
|
165
165
|
|
|
166
166
|
const headers: Record<string, string> = {
|
|
@@ -175,6 +175,7 @@ async function fetchCapabilitiesFromServer(
|
|
|
175
175
|
|
|
176
176
|
const response = await fetch(requestUrl, {
|
|
177
177
|
headers,
|
|
178
|
+
redirect: 'error',
|
|
178
179
|
signal: AbortSignal.timeout(5000),
|
|
179
180
|
});
|
|
180
181
|
if (!response.ok) {
|
|
@@ -11,7 +11,8 @@ import log from '../../logger.js';
|
|
|
11
11
|
import {setSession, listSessions} from '../../session-store.js';
|
|
12
12
|
import {createUIResource, createSessionDashboardUI, addUIResourceToResponse} from '../../ui/mcp-ui-utils.js';
|
|
13
13
|
import {findFreePort, releaseReservedPorts} from '../../utils/ports.js';
|
|
14
|
-
import {
|
|
14
|
+
import {redactForLogging, redactUrlCredentials} from '../../utils/sensitive.js';
|
|
15
|
+
import {getPortFromUrl, validateRemoteServerUrl} from '../../utils/url.js';
|
|
15
16
|
import {withQuietWebDriverLogging} from '../../utils/webdriver-client-options.js';
|
|
16
17
|
import {errorResult, textResult, toolErrorMessage} from '../tool-response.js';
|
|
17
18
|
import {clearSelectedDevice, getSelectedLocalDevice} from './select-device.js';
|
|
@@ -270,21 +271,6 @@ export function validateLocalCreatePlatformMatch(
|
|
|
270
271
|
return undefined;
|
|
271
272
|
}
|
|
272
273
|
|
|
273
|
-
/**
|
|
274
|
-
* Validate the provided remote server URL.
|
|
275
|
-
*
|
|
276
|
-
* @param remoteServerUrl - The URL of the remote Appium server to validate.
|
|
277
|
-
* @param regexRule - Optional regular expression string to further validate the URL format.
|
|
278
|
-
* If the regexRule is provided, the URL must match the regex pattern to be considered valid.
|
|
279
|
-
* @throws {Error} If the URL is invalid.
|
|
280
|
-
*/
|
|
281
|
-
export function validateRemoteServerUrl(remoteServerUrl: string, regexRule?: string): void {
|
|
282
|
-
const regexPattern = regexRule ? new RegExp(regexRule) : /^https?:\/\/.+$/;
|
|
283
|
-
if (!regexPattern.test(remoteServerUrl)) {
|
|
284
|
-
throw new Error(`Invalid remoteServerUrl: ${remoteServerUrl}.`);
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
|
|
288
274
|
/**
|
|
289
275
|
* Create a new mobile session with Android or iOS device.
|
|
290
276
|
*
|
|
@@ -336,7 +322,7 @@ export async function createSessionAction(args: {
|
|
|
336
322
|
|
|
337
323
|
log.info(
|
|
338
324
|
`Creating new ${platform.toUpperCase()} session with capabilities:`,
|
|
339
|
-
JSON.stringify(finalCapabilities, null, 2),
|
|
325
|
+
JSON.stringify(redactForLogging(finalCapabilities), null, 2),
|
|
340
326
|
);
|
|
341
327
|
let sessionId;
|
|
342
328
|
if (remoteServerUrl) {
|
|
@@ -344,7 +330,7 @@ export async function createSessionAction(args: {
|
|
|
344
330
|
validateRemoteServerUrl(remoteServerUrl, process.env.REMOTE_SERVER_URL_ALLOW_REGEX);
|
|
345
331
|
} catch (err: unknown) {
|
|
346
332
|
return errorResult(
|
|
347
|
-
`Invalid remoteServerUrl "${remoteServerUrl}". ${toolErrorMessage(err)} Pass a valid http(s) URL, or omit remoteServerUrl to use the local embedded driver.`,
|
|
333
|
+
`Invalid remoteServerUrl "${redactUrlCredentials(remoteServerUrl)}". ${toolErrorMessage(err)} Pass a valid http(s) URL without a query or fragment, or omit remoteServerUrl to use the local embedded driver.`,
|
|
348
334
|
);
|
|
349
335
|
}
|
|
350
336
|
|
|
@@ -412,7 +398,7 @@ export async function createSessionAction(args: {
|
|
|
412
398
|
),
|
|
413
399
|
);
|
|
414
400
|
} catch (error: unknown) {
|
|
415
|
-
log.error('Error creating session:', error);
|
|
401
|
+
log.error('Error creating session:', toolErrorMessage(error));
|
|
416
402
|
return errorResult(
|
|
417
403
|
buildCreateSessionFailureMessage(error, {
|
|
418
404
|
platform: args.platform,
|
|
@@ -435,7 +421,7 @@ function buildCreateSessionFailureMessage(
|
|
|
435
421
|
const base = `Failed to create session. ${detail}`;
|
|
436
422
|
|
|
437
423
|
if (ctx.remoteServerUrl) {
|
|
438
|
-
return `${base} remoteServerUrl="${ctx.remoteServerUrl}".`;
|
|
424
|
+
return `${base} remoteServerUrl="${redactUrlCredentials(ctx.remoteServerUrl)}".`;
|
|
439
425
|
}
|
|
440
426
|
|
|
441
427
|
if (/select_device/i.test(detail)) {
|
|
@@ -504,4 +490,4 @@ async function createDriverSession(driver: any, capabilities: Capabilities): Pro
|
|
|
504
490
|
}
|
|
505
491
|
|
|
506
492
|
// Re-export for backward compatibility with consumers that imported from this module.
|
|
507
|
-
export {getPortFromUrl};
|
|
493
|
+
export {getPortFromUrl, validateRemoteServerUrl};
|
|
@@ -4,7 +4,8 @@ import {type Client} from 'webdriver';
|
|
|
4
4
|
import log from '../logger.js';
|
|
5
5
|
import {readAllPersistedSessions, removePersistedSession} from '../persistence.js';
|
|
6
6
|
import {getDriver, setSession, type DriverInstance, type SessionCapabilities} from '../session-store.js';
|
|
7
|
-
import {
|
|
7
|
+
import {redactUrlCredentials} from '../utils/sensitive.js';
|
|
8
|
+
import {attachToRemoteSession, validateRemoteServerUrl} from '../utils/url.js';
|
|
8
9
|
|
|
9
10
|
const W3C_ELEMENT_ID = 'element-6066-11e4-a52e-4f735466cecf';
|
|
10
11
|
|
|
@@ -14,7 +15,7 @@ export type DriverOrError = {ok: true; driver: DriverInstance} | {ok: false; res
|
|
|
14
15
|
* Normalizes unknown errors into a message string for tool responses.
|
|
15
16
|
*/
|
|
16
17
|
export function toolErrorMessage(err: unknown): string {
|
|
17
|
-
return err instanceof Error ? err.message : String(err);
|
|
18
|
+
return redactUrlCredentials(err instanceof Error ? err.message : String(err));
|
|
18
19
|
}
|
|
19
20
|
|
|
20
21
|
/**
|
|
@@ -111,6 +112,15 @@ async function rehydrateAttachedSession(sessionId: string): Promise<{sessionId:
|
|
|
111
112
|
}
|
|
112
113
|
const candidates = persisted.filter((p) => p.sessionId === sessionId);
|
|
113
114
|
for (const entry of candidates) {
|
|
115
|
+
try {
|
|
116
|
+
validateRemoteServerUrl(entry.remoteServerUrl, process.env.REMOTE_SERVER_URL_ALLOW_REGEX);
|
|
117
|
+
} catch (err) {
|
|
118
|
+
log.warn(
|
|
119
|
+
`Persisted session ${entry.sessionId} has a disallowed remoteServerUrl (${toolErrorMessage(err)}); skipping.`,
|
|
120
|
+
);
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
|
|
114
124
|
try {
|
|
115
125
|
const client = await attachToRemoteSession({
|
|
116
126
|
remoteServerUrl: entry.remoteServerUrl,
|
|
@@ -123,7 +133,7 @@ async function rehydrateAttachedSession(sessionId: string): Promise<{sessionId:
|
|
|
123
133
|
await (client as Client).getTimeouts();
|
|
124
134
|
} catch (verifyErr) {
|
|
125
135
|
log.warn(
|
|
126
|
-
`Persisted session ${entry.sessionId} failed liveness check (${(verifyErr
|
|
136
|
+
`Persisted session ${entry.sessionId} failed liveness check (${toolErrorMessage(verifyErr)}); pruning.`,
|
|
127
137
|
);
|
|
128
138
|
await removePersistedSession(entry.sessionId);
|
|
129
139
|
continue;
|
|
@@ -142,7 +152,7 @@ async function rehydrateAttachedSession(sessionId: string): Promise<{sessionId:
|
|
|
142
152
|
log.info(`Rehydrated attached session ${entry.sessionId} from persisted store.`);
|
|
143
153
|
return {sessionId: entry.sessionId};
|
|
144
154
|
} catch (err) {
|
|
145
|
-
log.warn(`Persisted session ${entry.sessionId} no longer attachable (${(err
|
|
155
|
+
log.warn(`Persisted session ${entry.sessionId} no longer attachable (${toolErrorMessage(err)}); pruning.`);
|
|
146
156
|
await removePersistedSession(entry.sessionId);
|
|
147
157
|
}
|
|
148
158
|
}
|
package/src/utils/sensitive.ts
CHANGED
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
const SENSITIVE_KEY_PARTS = [
|
|
2
|
+
'access_key',
|
|
2
3
|
'api_key',
|
|
3
4
|
'apikey',
|
|
4
5
|
'authorization',
|
|
5
6
|
'client_secret',
|
|
6
7
|
'clientsecret',
|
|
7
8
|
'credential',
|
|
9
|
+
'passphrase',
|
|
8
10
|
'password',
|
|
11
|
+
'private_key',
|
|
9
12
|
'remote_server_url',
|
|
10
13
|
'remoteserverurl',
|
|
11
14
|
'secret',
|
|
12
15
|
'token',
|
|
13
16
|
];
|
|
14
17
|
|
|
18
|
+
const URL_USERINFO_PATTERN = /\b([a-z][a-z0-9+.-]*:\/\/)([^\s/@]+)@/gi;
|
|
19
|
+
|
|
15
20
|
/**
|
|
16
21
|
* Determines if a given key is considered sensitive based on whether it includes any of the defined sensitive key parts.
|
|
17
22
|
* The check is case-insensitive and ignores non-alphanumeric characters, so keys like "API-Key", "client secret", or "remote_server_url" would all be correctly identified as sensitive.
|
|
@@ -23,6 +28,43 @@ export function isSensitiveKey(key: string): boolean {
|
|
|
23
28
|
return SENSITIVE_KEY_PARTS.some((part) => normalized.includes(normalizeKey(part)));
|
|
24
29
|
}
|
|
25
30
|
|
|
31
|
+
/** Removes username/password URL userinfo from text intended for logs or errors. */
|
|
32
|
+
export function redactUrlCredentials(value: string): string {
|
|
33
|
+
return value.replace(URL_USERINFO_PATTERN, '$1[REDACTED]@');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Produces a JSON-safe copy for logs, redacting sensitive keys, URL userinfo,
|
|
38
|
+
* and values large enough to make logs unsafe or impractical.
|
|
39
|
+
*/
|
|
40
|
+
export function redactForLogging(value: unknown): unknown {
|
|
41
|
+
if (value === undefined || value === null) {
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
return JSON.parse(
|
|
47
|
+
JSON.stringify(value, (key, nestedValue) => {
|
|
48
|
+
if (key && isSensitiveKey(key)) {
|
|
49
|
+
return '[REDACTED]';
|
|
50
|
+
}
|
|
51
|
+
if (typeof nestedValue === 'string') {
|
|
52
|
+
if (nestedValue.length > 2000) {
|
|
53
|
+
return `[string:${nestedValue.length}]`;
|
|
54
|
+
}
|
|
55
|
+
return redactUrlCredentials(nestedValue);
|
|
56
|
+
}
|
|
57
|
+
if (typeof Buffer !== 'undefined' && Buffer.isBuffer(nestedValue)) {
|
|
58
|
+
return `[buffer:${(nestedValue as Buffer).length}]`;
|
|
59
|
+
}
|
|
60
|
+
return nestedValue;
|
|
61
|
+
}),
|
|
62
|
+
);
|
|
63
|
+
} catch {
|
|
64
|
+
return '[Unserializable value]';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
26
68
|
function normalizeKey(key: string): string {
|
|
27
69
|
return key.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();
|
|
28
70
|
}
|
package/src/utils/url.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import WebDriver, {type Client} from 'webdriver';
|
|
2
2
|
|
|
3
|
+
import {redactUrlCredentials} from './sensitive.js';
|
|
3
4
|
import {withQuietWebDriverLogging} from './webdriver-client-options.js';
|
|
4
5
|
|
|
5
6
|
export interface RemoteAttachOptions {
|
|
@@ -17,6 +18,31 @@ export function getPortFromUrl(url: URL): number {
|
|
|
17
18
|
return Number(url.port) || (url.protocol === 'https:' ? 443 : 80);
|
|
18
19
|
}
|
|
19
20
|
|
|
21
|
+
/**
|
|
22
|
+
* Validate a remote Appium server URL and an optional deployment allowlist.
|
|
23
|
+
*
|
|
24
|
+
* The allowlist can only narrow the built-in HTTP(S)-only policy. Queries and
|
|
25
|
+
* fragments are rejected because WebDriver requests use the URL as a base path.
|
|
26
|
+
*/
|
|
27
|
+
export function validateRemoteServerUrl(remoteServerUrl: string, regexRule?: string): void {
|
|
28
|
+
const invalidUrl = (): Error => new Error(`Invalid remoteServerUrl: ${redactUrlCredentials(remoteServerUrl)}.`);
|
|
29
|
+
|
|
30
|
+
let parsed: URL;
|
|
31
|
+
try {
|
|
32
|
+
parsed = new URL(remoteServerUrl);
|
|
33
|
+
} catch {
|
|
34
|
+
throw invalidUrl();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (!['http:', 'https:'].includes(parsed.protocol) || !parsed.hostname || parsed.search || parsed.hash) {
|
|
38
|
+
throw invalidUrl();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (regexRule && !new RegExp(regexRule).test(remoteServerUrl)) {
|
|
42
|
+
throw invalidUrl();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
20
46
|
/**
|
|
21
47
|
* Attach to an existing remote Appium session given its server URL and id.
|
|
22
48
|
*
|