@wix/himalaya-cli 0.1458.0 → 0.1460.0
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.
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export declare const WIX_API = "https://www.wixapis.com";
|
|
1
2
|
/** The narrow Wix consumer endpoints allowed to receive credentials for SSE. */
|
|
2
3
|
export declare function isAllowedConsumerStreamTarget(raw: string): boolean;
|
|
3
4
|
/** Classify an absolute-URL rejection: an off-gateway Wix account host is a
|
package/dist/cli.mjs
CHANGED
|
@@ -1059,8 +1059,8 @@ function toBase64(bytes2) {
|
|
|
1059
1059
|
function utf8Decode(bytes2) {
|
|
1060
1060
|
return new TextDecoder("utf-8").decode(bytes2);
|
|
1061
1061
|
}
|
|
1062
|
-
function fromBase64Url(
|
|
1063
|
-
const std =
|
|
1062
|
+
function fromBase64Url(b64url4) {
|
|
1063
|
+
const std = b64url4.replace(/-/g, "+").replace(/_/g, "/");
|
|
1064
1064
|
return fromBase64(std + "=".repeat((4 - std.length % 4) % 4));
|
|
1065
1065
|
}
|
|
1066
1066
|
function toBase64Url(bytes2) {
|
|
@@ -160096,6 +160096,127 @@ var init_pinned_read = __esm({
|
|
|
160096
160096
|
}
|
|
160097
160097
|
});
|
|
160098
160098
|
|
|
160099
|
+
// ../../core/serve-runtime/src/member-exchange.ts
|
|
160100
|
+
function internalHost(host) {
|
|
160101
|
+
const h2 = host.toLowerCase().replace(/^\[|\]$/g, "");
|
|
160102
|
+
return h2 === "localhost" || h2.endsWith(".localhost") || h2.endsWith(".local") || h2.endsWith(".internal") || !h2.includes(".") || /^[0-9.]+$/.test(h2) || h2.includes(":");
|
|
160103
|
+
}
|
|
160104
|
+
function hopAllowed(url, firstHost) {
|
|
160105
|
+
if (url.protocol !== "https:" || url.port !== "" && url.port !== "443" || url.username || url.password) return false;
|
|
160106
|
+
const host = url.hostname.toLowerCase();
|
|
160107
|
+
if (internalHost(host)) return false;
|
|
160108
|
+
return host === firstHost || host === "wix.com" || host.endsWith(".wix.com") || host.endsWith(".wixsite.com") || host === "wixapis.com" || host.endsWith(".wixapis.com");
|
|
160109
|
+
}
|
|
160110
|
+
async function exchangeMemberSession(input, fetchImpl = fetch, random = randomBytes6, now = Date.now, redirectUri = REGISTERED_REDIRECT_URI) {
|
|
160111
|
+
const { clientId, sessionToken } = input;
|
|
160112
|
+
if (typeof sessionToken !== "string" || !sessionToken || sessionToken.length > MAX_SESSION_TOKEN_LENGTH) {
|
|
160113
|
+
return { ok: false, code: "bad_request" };
|
|
160114
|
+
}
|
|
160115
|
+
const call = async (url2, init) => {
|
|
160116
|
+
try {
|
|
160117
|
+
return await fetchImpl(url2, { ...init, redirect: "manual", signal: AbortSignal.timeout(STEP_TIMEOUT_MS) });
|
|
160118
|
+
} catch {
|
|
160119
|
+
return null;
|
|
160120
|
+
}
|
|
160121
|
+
};
|
|
160122
|
+
const json8 = async (res) => {
|
|
160123
|
+
try {
|
|
160124
|
+
const v2 = await res.json();
|
|
160125
|
+
return v2 && typeof v2 === "object" ? v2 : {};
|
|
160126
|
+
} catch {
|
|
160127
|
+
return {};
|
|
160128
|
+
}
|
|
160129
|
+
};
|
|
160130
|
+
let visitor;
|
|
160131
|
+
try {
|
|
160132
|
+
visitor = await mintAnonymousVisitor(clientId, (u2, i2) => call(String(u2), i2 ?? {}).then((r2) => {
|
|
160133
|
+
if (!r2) throw new Error("unreachable");
|
|
160134
|
+
return r2;
|
|
160135
|
+
}));
|
|
160136
|
+
} catch (e2) {
|
|
160137
|
+
return { ok: false, code: e2?.message === "unreachable" ? "unreachable" : "visitor_token_failed" };
|
|
160138
|
+
}
|
|
160139
|
+
const verifier = b64url2(random(32));
|
|
160140
|
+
const challenge = b64url2(sha256(verifier));
|
|
160141
|
+
const state = b64url2(random(8));
|
|
160142
|
+
const rsRes = await call(`${WIX_API}/_api/redirects-api/v1/redirect-session`, {
|
|
160143
|
+
method: "POST",
|
|
160144
|
+
headers: { "Content-Type": "application/json", Authorization: `Bearer ${visitor}` },
|
|
160145
|
+
body: JSON.stringify({ auth: { authRequest: {
|
|
160146
|
+
clientId,
|
|
160147
|
+
responseType: "code",
|
|
160148
|
+
responseMode: "fragment",
|
|
160149
|
+
redirectUri,
|
|
160150
|
+
scope: "offline_access",
|
|
160151
|
+
state,
|
|
160152
|
+
nonce: state,
|
|
160153
|
+
codeChallenge: challenge,
|
|
160154
|
+
codeChallengeMethod: "S256",
|
|
160155
|
+
sessionToken
|
|
160156
|
+
}, prompt: "none" } })
|
|
160157
|
+
});
|
|
160158
|
+
if (!rsRes) return { ok: false, code: "unreachable" };
|
|
160159
|
+
const rs2 = await json8(rsRes);
|
|
160160
|
+
const fullUrl = rs2.redirectSession?.fullUrl;
|
|
160161
|
+
if (!rsRes.ok || typeof fullUrl !== "string") return { ok: false, code: "redirect_session_failed", status: rsRes.status };
|
|
160162
|
+
let url;
|
|
160163
|
+
try {
|
|
160164
|
+
url = new URL(fullUrl);
|
|
160165
|
+
} catch {
|
|
160166
|
+
return { ok: false, code: "redirect_session_failed", status: rsRes.status };
|
|
160167
|
+
}
|
|
160168
|
+
const firstHost = url.hostname.toLowerCase();
|
|
160169
|
+
let code;
|
|
160170
|
+
let lastStatus;
|
|
160171
|
+
for (let hop = 0; hop < MAX_HOPS; hop++) {
|
|
160172
|
+
if (!hopAllowed(url, firstHost)) return { ok: false, code: "authorize_host_refused" };
|
|
160173
|
+
const res = await call(url.toString(), { method: "GET", redirect: "manual", headers: { "User-Agent": "Mozilla/5.0" } });
|
|
160174
|
+
if (!res) return { ok: false, code: "unreachable" };
|
|
160175
|
+
lastStatus = res.status;
|
|
160176
|
+
const location = res.headers.get("location");
|
|
160177
|
+
if (!location) return { ok: false, code: res.status >= 400 ? "authorize_refused" : "authorize_no_code", status: res.status };
|
|
160178
|
+
if (location.startsWith(redirectUri)) {
|
|
160179
|
+
const params = new URLSearchParams(location.slice(redirectUri.length).replace(/^[?#]/, ""));
|
|
160180
|
+
if (params.get("state") !== state) return { ok: false, code: "authorize_state_mismatch" };
|
|
160181
|
+
code = params.get("code") ?? void 0;
|
|
160182
|
+
break;
|
|
160183
|
+
}
|
|
160184
|
+
try {
|
|
160185
|
+
url = new URL(location, url);
|
|
160186
|
+
} catch {
|
|
160187
|
+
return { ok: false, code: "authorize_no_code", status: res.status };
|
|
160188
|
+
}
|
|
160189
|
+
}
|
|
160190
|
+
if (!code) return { ok: false, code: "authorize_no_code", ...lastStatus !== void 0 ? { status: lastStatus } : {} };
|
|
160191
|
+
const tokRes = await call(`${WIX_API}/oauth2/token`, {
|
|
160192
|
+
method: "POST",
|
|
160193
|
+
headers: { "Content-Type": "application/json" },
|
|
160194
|
+
body: JSON.stringify({ clientId, grantType: "authorization_code", code, codeVerifier: verifier, redirectUri })
|
|
160195
|
+
});
|
|
160196
|
+
if (!tokRes) return { ok: false, code: "unreachable" };
|
|
160197
|
+
const tok = await json8(tokRes);
|
|
160198
|
+
if (!tokRes.ok || typeof tok.access_token !== "string" || !tok.access_token) return { ok: false, code: "token_exchange_failed", status: tokRes.status };
|
|
160199
|
+
const expiresIn = typeof tok.expires_in === "number" ? tok.expires_in : Number(tok.expires_in);
|
|
160200
|
+
return { ok: true, accessToken: tok.access_token, expiresAt: now() + (Number.isFinite(expiresIn) && expiresIn > 0 ? expiresIn : 3600) * 1e3 };
|
|
160201
|
+
}
|
|
160202
|
+
var REGISTERED_REDIRECT_URI, MAX_HOPS, STEP_TIMEOUT_MS, MAX_SESSION_TOKEN_LENGTH, b64url2, randomBytes6;
|
|
160203
|
+
var init_member_exchange = __esm({
|
|
160204
|
+
"../../core/serve-runtime/src/member-exchange.ts"() {
|
|
160205
|
+
init_sha256();
|
|
160206
|
+
init_wix_bridge();
|
|
160207
|
+
REGISTERED_REDIRECT_URI = "himalaya-appsmith://oauth/callback";
|
|
160208
|
+
MAX_HOPS = 8;
|
|
160209
|
+
STEP_TIMEOUT_MS = 8e3;
|
|
160210
|
+
MAX_SESSION_TOKEN_LENGTH = 4096;
|
|
160211
|
+
b64url2 = (bytes2) => {
|
|
160212
|
+
let s2 = "";
|
|
160213
|
+
for (const b2 of bytes2) s2 += String.fromCharCode(b2);
|
|
160214
|
+
return btoa(s2).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
160215
|
+
};
|
|
160216
|
+
randomBytes6 = (n2) => globalThis.crypto.getRandomValues(new Uint8Array(n2));
|
|
160217
|
+
}
|
|
160218
|
+
});
|
|
160219
|
+
|
|
160099
160220
|
// ../../core/serve-runtime/package-share.ts
|
|
160100
160221
|
function parseStored(bytes2, id) {
|
|
160101
160222
|
if (!bytes2) return null;
|
|
@@ -160930,6 +161051,40 @@ ${releaseId}`;
|
|
|
160930
161051
|
}
|
|
160931
161052
|
return new Response(upstream.body, { status: upstream.status, headers: responseHeaders });
|
|
160932
161053
|
}
|
|
161054
|
+
if (request.method === "POST" && path2 === "/v1/__webwix/member-exchange") {
|
|
161055
|
+
const noStore = { "cache-control": "no-store" };
|
|
161056
|
+
if (opts.webwixBridge === false) return json5(503, { error: "webwix_bridge_disabled" }, noStore);
|
|
161057
|
+
if (!opts.previewTokenSecret) return json5(503, { error: "preview_token_unavailable" }, noStore);
|
|
161058
|
+
const exchangeApp = resolveApp(request, url);
|
|
161059
|
+
if (!exchangeApp) return json5(400, { error: "app_required" }, noStore);
|
|
161060
|
+
const exchangePin = resolvePin(request, url);
|
|
161061
|
+
if (!exchangePin || !resolvePreviewToken(request, url)) return json5(403, { error: "draft_preview_required" }, noStore);
|
|
161062
|
+
const exchangeCfg = await appConfigFor(request, url, exchangeApp);
|
|
161063
|
+
if (!exchangeCfg.ok) return exchangeCfg.response;
|
|
161064
|
+
let ringPinned = false;
|
|
161065
|
+
if (opts.ringReleases) {
|
|
161066
|
+
try {
|
|
161067
|
+
ringPinned = new Set(await opts.ringReleases(exchangeApp)).has(exchangePin);
|
|
161068
|
+
} catch {
|
|
161069
|
+
return json5(503, { error: "ring_lookup_unavailable" }, noStore);
|
|
161070
|
+
}
|
|
161071
|
+
}
|
|
161072
|
+
if ((await manifest(exchangeApp))?.releaseId === exchangePin || ringPinned) {
|
|
161073
|
+
return json5(403, { error: "draft_preview_required" }, noStore);
|
|
161074
|
+
}
|
|
161075
|
+
const exchangeClient = wixClientIdOf(utf8Decode(exchangeCfg.bytes));
|
|
161076
|
+
if ("error" in exchangeClient) return json5(501, { error: `member_exchange_${exchangeClient.error}` }, noStore);
|
|
161077
|
+
let exchangeBody;
|
|
161078
|
+
try {
|
|
161079
|
+
exchangeBody = await request.json();
|
|
161080
|
+
} catch {
|
|
161081
|
+
return json5(400, { error: "bad_request" }, noStore);
|
|
161082
|
+
}
|
|
161083
|
+
if (!exchangeBody || typeof exchangeBody !== "object") return json5(400, { error: "bad_request" }, noStore);
|
|
161084
|
+
const exchanged = await exchangeMemberSession({ clientId: exchangeClient.clientId, sessionToken: exchangeBody.sessionToken }, webwixFetch);
|
|
161085
|
+
if (exchanged.ok) return json5(200, { accessToken: exchanged.accessToken, expiresAt: exchanged.expiresAt }, noStore);
|
|
161086
|
+
return json5(exchanged.code === "bad_request" ? 400 : 502, { error: exchanged.code, ...exchanged.status !== void 0 ? { status: exchanged.status } : {} }, noStore);
|
|
161087
|
+
}
|
|
160933
161088
|
if (request.method === "POST" && path2 === "/v1/__webwix/call") {
|
|
160934
161089
|
const served = { rung: "none" };
|
|
160935
161090
|
let status = 500;
|
|
@@ -161546,6 +161701,7 @@ var init_server2 = __esm({
|
|
|
161546
161701
|
init_base64();
|
|
161547
161702
|
init_contract();
|
|
161548
161703
|
init_pinned_read();
|
|
161704
|
+
init_member_exchange();
|
|
161549
161705
|
init_package_share();
|
|
161550
161706
|
init_wix_bridge();
|
|
161551
161707
|
init_account_rung();
|
|
@@ -162598,14 +162754,14 @@ var init_embedded_bundles = __esm({
|
|
|
162598
162754
|
// ../store-release/register-bundle.ts
|
|
162599
162755
|
import { readFileSync as readFileSync88 } from "node:fs";
|
|
162600
162756
|
import { createPrivateKey as createPrivateKey4, sign as sign2 } from "node:crypto";
|
|
162601
|
-
function
|
|
162757
|
+
function b64url3(b2) {
|
|
162602
162758
|
return Buffer.from(b2).toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
162603
162759
|
}
|
|
162604
162760
|
function ascJwt(keyId, issuerId, p8, now) {
|
|
162605
|
-
const header =
|
|
162606
|
-
const payload =
|
|
162761
|
+
const header = b64url3(JSON.stringify({ alg: "ES256", kid: keyId, typ: "JWT" }));
|
|
162762
|
+
const payload = b64url3(JSON.stringify({ iss: issuerId, iat: now, exp: now + 1200, aud: "appstoreconnect-v1" }));
|
|
162607
162763
|
const key3 = createPrivateKey4(p8);
|
|
162608
|
-
const sig =
|
|
162764
|
+
const sig = b64url3(sign2("sha256", Buffer.from(`${header}.${payload}`), { key: key3, dsaEncoding: "ieee-p1363" }));
|
|
162609
162765
|
return `${header}.${payload}.${sig}`;
|
|
162610
162766
|
}
|
|
162611
162767
|
function bundleIdBody(identifier, name, platform = "IOS") {
|
|
@@ -167782,7 +167938,7 @@ var init_connector_token = __esm({
|
|
|
167782
167938
|
});
|
|
167783
167939
|
|
|
167784
167940
|
// ../../core/functions-secrets/src/vault.ts
|
|
167785
|
-
import { createCipheriv, createDecipheriv as createDecipheriv2, randomBytes as
|
|
167941
|
+
import { createCipheriv, createDecipheriv as createDecipheriv2, randomBytes as randomBytes7 } from "node:crypto";
|
|
167786
167942
|
import { mkdir, readFile as readFile2, rename, writeFile as writeFile2 } from "node:fs/promises";
|
|
167787
167943
|
import { dirname as dirname44 } from "node:path";
|
|
167788
167944
|
function createJsonSecretStore(filePath) {
|
|
@@ -167840,7 +167996,7 @@ function createSecretVault(options) {
|
|
|
167840
167996
|
environment: input.environment,
|
|
167841
167997
|
name: input.name,
|
|
167842
167998
|
version: input.version,
|
|
167843
|
-
iv:
|
|
167999
|
+
iv: randomBytes7(12).toString("base64url"),
|
|
167844
168000
|
ciphertext: "",
|
|
167845
168001
|
authTag: ""
|
|
167846
168002
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wix/himalaya-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1460.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "himi — the Himalaya authoring CLI. Build a Tier-5 content package on your own machine, push it to the production serve as a draft, preview it on web + Himi Player, and read worker logs back — the remote dev loop. Wraps @himalaya/serve-cli for transport.",
|
|
6
6
|
"keywords": [
|
|
@@ -71,5 +71,5 @@
|
|
|
71
71
|
"artifactId": "himalaya-cli"
|
|
72
72
|
}
|
|
73
73
|
},
|
|
74
|
-
"falconPackageHash": "
|
|
74
|
+
"falconPackageHash": "671905888b8bae86b934860d075660df2589c4d9791b110e75cc5b8b"
|
|
75
75
|
}
|