oasis_test_v2 2.2.116 → 2.2.117
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/dist/index.js +167 -99
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -20789,6 +20789,9 @@ ${input.link}` : `${head}
|
|
|
20789
20789
|
function feishuPendingApprovalNotice(modules) {
|
|
20790
20790
|
return `${moduleNames(modules)}\u542B\u9700\u98DE\u4E66\u7BA1\u7406\u5458\u5BA1\u6279\u7684\u6743\u9650\uFF0C\u5DF2\u63D0\u4EA4\u5BA1\u6279\u3002\u6279\u51C6\u540E\u4F1A\u5728\u98DE\u4E66\u79C1\u4FE1\u901A\u77E5\u4F60\uFF0C\u70B9\u4E00\u4E0B\u5373\u53EF\u8865\u4E0A\u8FD9\u90E8\u5206\u6743\u9650\uFF1B\u5DF2\u6709\u7684\u98DE\u4E66\u80FD\u529B\u4E0D\u53D7\u5F71\u54CD\u3002`;
|
|
20791
20791
|
}
|
|
20792
|
+
function feishuPendingApprovalKeptNotice(modules) {
|
|
20793
|
+
return `${moduleNames(modules)}\u542B\u9700\u98DE\u4E66\u7BA1\u7406\u5458\u5BA1\u6279\u7684\u6743\u9650\uFF0C\u5DF2\u63D0\u4EA4\u5BA1\u6279\u3002\u98DE\u4E66\u8FD9\u4E00\u8F6E\u7ED9\u7684\u6388\u6743\u4E0D\u5305\u542B\u4F60\u73B0\u6709\u6388\u6743\u7684\u5168\u90E8\u6743\u9650\uFF0C\u4E3A\u4E0D\u5F71\u54CD\u5DF2\u6709\u7684\u98DE\u4E66\u80FD\u529B\uFF0C\u539F\u6388\u6743\u4FDD\u6301\u4E0D\u53D8\u3001\u8FD9\u4E00\u8F6E\u7684\u6388\u6743\u6CA1\u6709\u4FDD\u5B58\u3002\u6279\u51C6\u540E\u4F1A\u5728\u98DE\u4E66\u79C1\u4FE1\u901A\u77E5\u4F60\uFF0C\u70B9\u4E00\u4E0B\u5373\u53EF\u4E00\u5E76\u8865\u4E0A\u3002`;
|
|
20794
|
+
}
|
|
20792
20795
|
function feishuApprovalUnconfirmedNotice(modules, expired) {
|
|
20793
20796
|
return `${expired ? "\u6388\u6743\u9875\u5DF2\u8D85\u65F6\uFF0C" : ""}\u98DE\u4E66\u8FD9\u4E00\u8F6E\u6CA1\u6709\u7ED9\u51FA\u6388\u6743\uFF0COasis \u65E0\u6CD5\u786E\u8BA4\u4F60\u662F\u5426\u5728\u6388\u6743\u9875\u5BF9${moduleNames(modules)}\u7684\u6743\u9650\u70B9\u4E86\u300C\u7533\u8BF7\u300D\u3002\u5982\u679C\u70B9\u4E86\uFF0C\u8BF7\u9009\u300C\u6211\u70B9\u4E86\u7533\u8BF7\u300D\uFF0C\u6279\u51C6\u540E\u4F1A\u5728\u98DE\u4E66\u79C1\u4FE1\u901A\u77E5\u4F60\u8865\u6388\u6743\uFF1B\u6CA1\u70B9\uFF08\u6216\u70B9\u7684\u662F\u62D2\u7EDD\uFF09\u7684\u8BDD\u91CD\u65B0\u53D1\u8D77\u6388\u6743\u5373\u53EF\u3002\u5DF2\u6709\u7684\u98DE\u4E66\u80FD\u529B\u4E0D\u53D7\u5F71\u54CD\u3002`;
|
|
20794
20797
|
}
|
|
@@ -24751,6 +24754,74 @@ var init_src3 = __esm({
|
|
|
24751
24754
|
}
|
|
24752
24755
|
});
|
|
24753
24756
|
|
|
24757
|
+
// ../server/src/feishu-pending-approval.ts
|
|
24758
|
+
async function recordFeishuPendingApproval(input) {
|
|
24759
|
+
const pendingScopes = input.pendingScopes ?? await pendingApprovalScopes(input);
|
|
24760
|
+
if (pendingScopes.length === 0) {
|
|
24761
|
+
if (input.granted) {
|
|
24762
|
+
await withConnectorCredentialLock("feishu", input.actorId, () => clearFeishuPendingApproval(input.store, input.actorId));
|
|
24763
|
+
}
|
|
24764
|
+
return null;
|
|
24765
|
+
}
|
|
24766
|
+
const record10 = {
|
|
24767
|
+
at: new Date(input.now).toISOString(),
|
|
24768
|
+
appId: input.appId,
|
|
24769
|
+
...input.applicant ? { applicant: input.applicant } : {},
|
|
24770
|
+
modules: input.selection.modules,
|
|
24771
|
+
sendAsUser: input.selection.sendAsUser,
|
|
24772
|
+
sendAsUserRequested: input.sendAsUserRequested,
|
|
24773
|
+
pendingScopes
|
|
24774
|
+
};
|
|
24775
|
+
await withConnectorCredentialLock("feishu", input.actorId, () => writeFeishuPendingApproval(input.store, input.actorId, record10));
|
|
24776
|
+
const modules = feishuPendingApprovalModules(record10);
|
|
24777
|
+
return { modules, scopes: pendingScopes, notice: input.keptExisting ? feishuPendingApprovalKeptNotice(modules) : feishuPendingApprovalNotice(modules) };
|
|
24778
|
+
}
|
|
24779
|
+
function feishuStillPendingScopes(input) {
|
|
24780
|
+
return pendingApprovalScopes(input);
|
|
24781
|
+
}
|
|
24782
|
+
async function pendingApprovalScopes(input) {
|
|
24783
|
+
const requested = scopesForSelection(input.selection, input.sendAsUserRequested);
|
|
24784
|
+
let appScopes = null;
|
|
24785
|
+
try {
|
|
24786
|
+
appScopes = await (input.fetchScopes ?? fetchFeishuAppScopes)(input.appId, input.appSecret);
|
|
24787
|
+
} catch (e) {
|
|
24788
|
+
(input.warn ?? ((m2) => console.warn(`[feishu-oauth] ${m2}`)))(`\u5E94\u7528\u6743\u9650\u5217\u8868\u67E5\u8BE2\u5931\u8D25\uFF0C\u5F85\u5BA1\u6279\u6309\u514D\u5BA1\u96C6\u5408\u4F30\u7B97: ${String(e)}`);
|
|
24789
|
+
}
|
|
24790
|
+
return feishuPendingApprovalScopes({ requested, granted: input.granted, appScopes });
|
|
24791
|
+
}
|
|
24792
|
+
async function assessFeishuApprovalUnconfirmed(input) {
|
|
24793
|
+
const scopes = await pendingApprovalScopes(input);
|
|
24794
|
+
if (scopes.length === 0) return null;
|
|
24795
|
+
const modules = feishuPendingApprovalModules({ modules: input.selection.modules, pendingScopes: scopes });
|
|
24796
|
+
return { modules, scopes, notice: feishuApprovalUnconfirmedNotice(modules, input.expired) };
|
|
24797
|
+
}
|
|
24798
|
+
async function feishuExistingGrantAtRisk(input) {
|
|
24799
|
+
const { store, actorId } = input;
|
|
24800
|
+
const read3 = (key2) => store.revealVariable(key2, actorId).catch(() => null);
|
|
24801
|
+
if (await read3(FEISHU_USER_AUTH_INVALID_VAR)) return { keep: false };
|
|
24802
|
+
if (await store.revealResolvedVariable("FEISHU_APP_ID", actorId).catch(() => null) !== input.appId) return { keep: false };
|
|
24803
|
+
const alive2 = (token2, expiresAt2) => !!token2 && (!expiresAt2 || !Number.isFinite(Number(expiresAt2)) || Number(expiresAt2) > input.now);
|
|
24804
|
+
const usable = alive2(await read3("FEISHU_REFRESH_TOKEN"), await read3("FEISHU_REFRESH_TOKEN_EXPIRES_AT")) || !!await read3("FEISHU_USER_TOKEN_EXPIRES_AT") && alive2(await read3("FEISHU_USER_ACCESS_TOKEN"), await read3("FEISHU_USER_TOKEN_EXPIRES_AT"));
|
|
24805
|
+
if (!usable) return { keep: false };
|
|
24806
|
+
let oldGranted = null;
|
|
24807
|
+
try {
|
|
24808
|
+
const rec2 = JSON.parse(await read3(FEISHU_AUTH_SELECTION_VAR) ?? "null");
|
|
24809
|
+
if (Array.isArray(rec2?.grantedScopes)) oldGranted = rec2.grantedScopes.filter((s2) => typeof s2 === "string");
|
|
24810
|
+
} catch {
|
|
24811
|
+
}
|
|
24812
|
+
if (!input.newGranted) return { keep: true, missing: null };
|
|
24813
|
+
if (!oldGranted) return { keep: true, missing: null };
|
|
24814
|
+
const granted = new Set(input.newGranted);
|
|
24815
|
+
const missing = oldGranted.filter((s2) => s2 !== "offline_access" && !granted.has(s2));
|
|
24816
|
+
return missing.length > 0 ? { keep: true, missing } : { keep: false };
|
|
24817
|
+
}
|
|
24818
|
+
var init_feishu_pending_approval = __esm({
|
|
24819
|
+
"../server/src/feishu-pending-approval.ts"() {
|
|
24820
|
+
"use strict";
|
|
24821
|
+
init_src3();
|
|
24822
|
+
}
|
|
24823
|
+
});
|
|
24824
|
+
|
|
24754
24825
|
// ../server/src/feishu-reauth.ts
|
|
24755
24826
|
async function supplementSelection(store, actorId) {
|
|
24756
24827
|
const pending = await readFeishuPendingApproval(store, actorId);
|
|
@@ -24787,7 +24858,7 @@ function createFeishuReauth(deps) {
|
|
|
24787
24858
|
const appSecret = await store.revealResolvedVariable("FEISHU_APP_SECRET", actorId);
|
|
24788
24859
|
return appId && appSecret ? { appId, appSecret } : null;
|
|
24789
24860
|
};
|
|
24790
|
-
const settle = async (claims, store, data, sel, sendAsUserRequested) => {
|
|
24861
|
+
const settle = async (claims, store, data, sel, sendAsUserRequested, appId) => {
|
|
24791
24862
|
const who = await (deps.identity ?? fetchFeishuUserIdentity)(String(data["access_token"] ?? ""));
|
|
24792
24863
|
if (!who.openId) {
|
|
24793
24864
|
return { state: "error", message: "\u6388\u6743\u5B8C\u6210\u4E86\uFF0C\u4F46\u6CA1\u80FD\u5411\u98DE\u4E66\u786E\u8BA4\u6388\u6743\u4EBA\u662F\u8C01\uFF0C\u672C\u6B21\u6388\u6743\u672A\u4FDD\u5B58\u3002\u8BF7\u7A0D\u540E\u91CD\u65B0\u70B9\u94FE\u63A5\u518D\u8BD5\u3002" };
|
|
@@ -24801,59 +24872,61 @@ function createFeishuReauth(deps) {
|
|
|
24801
24872
|
}
|
|
24802
24873
|
const supplement = await withConnectorCredentialLock("feishu", claims.actorId, async () => {
|
|
24803
24874
|
const pending2 = claims.purpose === "supplement" ? await readFeishuPendingApproval(store, claims.actorId) : null;
|
|
24804
|
-
await persistFeishuUserAuthorization(store, claims.actorId, data, now(), {
|
|
24805
|
-
openId: who.openId,
|
|
24806
|
-
...who.name ? { userName: who.name } : {},
|
|
24807
|
-
...pending2?.applicant ? { authorizedBy: pending2.applicant } : {}
|
|
24808
|
-
});
|
|
24809
24875
|
const record10 = feishuAuthSelectionRecord(sel, sendAsUserRequested, data);
|
|
24810
|
-
|
|
24811
|
-
|
|
24812
|
-
|
|
24813
|
-
|
|
24814
|
-
|
|
24815
|
-
|
|
24816
|
-
|
|
24817
|
-
|
|
24818
|
-
|
|
24819
|
-
|
|
24820
|
-
|
|
24821
|
-
|
|
24822
|
-
|
|
24823
|
-
|
|
24824
|
-
|
|
24825
|
-
const
|
|
24826
|
-
|
|
24827
|
-
|
|
24828
|
-
|
|
24829
|
-
|
|
24830
|
-
|
|
24831
|
-
|
|
24832
|
-
|
|
24833
|
-
|
|
24834
|
-
|
|
24876
|
+
let outcome = null;
|
|
24877
|
+
let still = [];
|
|
24878
|
+
if (claims.purpose === "supplement") {
|
|
24879
|
+
if (!record10.grantedScopes) {
|
|
24880
|
+
outcome = "unknown";
|
|
24881
|
+
} else if (!pending2) {
|
|
24882
|
+
const granted = new Set(record10.grantedScopes);
|
|
24883
|
+
const wanted = scopesForSelection(sel, sendAsUserRequested).filter((x2) => x2 !== "offline_access");
|
|
24884
|
+
outcome = wanted.every((x2) => granted.has(x2)) ? "complete" : "short";
|
|
24885
|
+
} else {
|
|
24886
|
+
const granted = new Set(record10.grantedScopes);
|
|
24887
|
+
still = pending2.pendingScopes.filter((x2) => !granted.has(x2));
|
|
24888
|
+
outcome = still.length === 0 ? "complete" : "partial";
|
|
24889
|
+
}
|
|
24890
|
+
}
|
|
24891
|
+
const kept = outcome !== null && outcome !== "complete" && (await feishuExistingGrantAtRisk({
|
|
24892
|
+
store,
|
|
24893
|
+
actorId: claims.actorId,
|
|
24894
|
+
appId,
|
|
24895
|
+
...record10.grantedScopes ? { newGranted: record10.grantedScopes } : {},
|
|
24896
|
+
now: now()
|
|
24897
|
+
})).keep;
|
|
24898
|
+
if (!kept) {
|
|
24899
|
+
await persistFeishuUserAuthorization(store, claims.actorId, data, now(), {
|
|
24900
|
+
openId: who.openId,
|
|
24901
|
+
...who.name ? { userName: who.name } : {},
|
|
24902
|
+
...pending2?.applicant ? { authorizedBy: pending2.applicant } : {}
|
|
24903
|
+
});
|
|
24904
|
+
await store.putVariable({
|
|
24905
|
+
key: FEISHU_AUTH_SELECTION_VAR,
|
|
24906
|
+
value: JSON.stringify(record10),
|
|
24907
|
+
...claims.actorId ? { scope: "personal", actorId: claims.actorId } : { scope: "global" },
|
|
24908
|
+
connectorId: "feishu",
|
|
24909
|
+
encrypted: false
|
|
24910
|
+
});
|
|
24911
|
+
}
|
|
24912
|
+
if (outcome === "complete" && pending2) await clearFeishuPendingApproval(store, claims.actorId);
|
|
24913
|
+
if (outcome === "partial" && pending2) {
|
|
24914
|
+
const next = { ...pending2, pendingScopes: still };
|
|
24915
|
+
delete next.approvedAt;
|
|
24916
|
+
delete next.notice;
|
|
24917
|
+
await writeFeishuPendingApproval(store, claims.actorId, next);
|
|
24918
|
+
}
|
|
24919
|
+
return outcome === null ? null : { outcome, kept };
|
|
24835
24920
|
});
|
|
24836
24921
|
const userName = who.name ? { userName: who.name } : {};
|
|
24837
|
-
if (supplement
|
|
24838
|
-
|
|
24839
|
-
|
|
24840
|
-
|
|
24841
|
-
|
|
24842
|
-
|
|
24843
|
-
|
|
24844
|
-
|
|
24845
|
-
return {
|
|
24846
|
-
state: "incomplete",
|
|
24847
|
-
...userName,
|
|
24848
|
-
message: "\u6388\u6743\u5DF2\u4FDD\u5B58\uFF0C\u4F46\u98DE\u4E66\u8FD9\u6B21\u6CA1\u6709\u7ED9\u9F50\u6240\u7533\u8BF7\u7684\u6743\u9650\u3002\u53EF\u5728 Oasis \u8FDE\u63A5\u5668\u8BE6\u60C5\u67E5\u770B\u5DF2\u5F00\u901A\u7684\u529F\u80FD\uFF0C\u9700\u8981\u65F6\u91CD\u65B0\u8FDE\u63A5\u98DE\u4E66\u3002"
|
|
24849
|
-
};
|
|
24850
|
-
}
|
|
24851
|
-
if (supplement === "unknown") {
|
|
24852
|
-
return {
|
|
24853
|
-
state: "incomplete",
|
|
24854
|
-
...userName,
|
|
24855
|
-
message: "\u6388\u6743\u5DF2\u4FDD\u5B58\uFF0C\u4F46\u98DE\u4E66\u6CA1\u6709\u56DE\u62A5\u8FD9\u6B21\u6388\u4E88\u4E86\u54EA\u4E9B\u6743\u9650\uFF0C\u65E0\u6CD5\u786E\u8BA4\u7BA1\u7406\u5458\u6279\u51C6\u7684\u6743\u9650\u662F\u5426\u5DF2\u8865\u4E0A\u3002\u53EF\u5728 Oasis \u8FDE\u63A5\u5668\u8BE6\u60C5\u67E5\u770B\uFF1B\u4ECD\u663E\u793A\u5F85\u8865\u6388\u6743\u7684\u8BDD\uFF0C\u518D\u70B9\u4E00\u6B21\u94FE\u63A5\u5373\u53EF\u3002"
|
|
24856
|
-
};
|
|
24922
|
+
if (supplement && supplement.outcome !== "complete") {
|
|
24923
|
+
const saved = supplement.kept ? "\u4E3A\u4E0D\u5F71\u54CD\u5DF2\u6709\u7684\u98DE\u4E66\u80FD\u529B\uFF0C\u539F\u6388\u6743\u4FDD\u6301\u4E0D\u53D8\u3001\u8FD9\u6B21\u6388\u6743\u6CA1\u6709\u4FDD\u5B58\uFF08\u98DE\u4E66\u8FD9\u6B21\u7ED9\u7684\u6388\u6743\u4E0D\u5305\u542B\u4F60\u73B0\u6709\u6388\u6743\u7684\u5168\u90E8\u6743\u9650\uFF09\u3002" : "\u6388\u6743\u5DF2\u4FDD\u5B58\u3002";
|
|
24924
|
+
const message = {
|
|
24925
|
+
partial: `\u98DE\u4E66\u8FD9\u6B21\u6CA1\u6709\u7ED9\u9F50\u7BA1\u7406\u5458\u6279\u51C6\u7684\u6743\u9650\uFF0C\u8FD8\u5DEE\u7684\u90E8\u5206\u7EE7\u7EED\u7B49\u5F85\u5BA1\u6279\uFF0C\u6279\u51C6\u540E\u4F1A\u518D\u79C1\u4FE1\u901A\u77E5\u4F60\u3002${saved}`,
|
|
24926
|
+
short: `\u98DE\u4E66\u8FD9\u6B21\u6CA1\u6709\u7ED9\u9F50\u6240\u7533\u8BF7\u7684\u6743\u9650\u3002${saved}\u53EF\u5728 Oasis \u8FDE\u63A5\u5668\u8BE6\u60C5\u67E5\u770B\u5DF2\u5F00\u901A\u7684\u529F\u80FD\uFF0C\u9700\u8981\u65F6\u91CD\u65B0\u8FDE\u63A5\u98DE\u4E66\u3002`,
|
|
24927
|
+
unknown: `\u98DE\u4E66\u6CA1\u6709\u56DE\u62A5\u8FD9\u6B21\u6388\u4E88\u4E86\u54EA\u4E9B\u6743\u9650\uFF0C\u65E0\u6CD5\u786E\u8BA4\u7BA1\u7406\u5458\u6279\u51C6\u7684\u6743\u9650\u662F\u5426\u5DF2\u8865\u4E0A\u3002${saved}\u53EF\u5728 Oasis \u8FDE\u63A5\u5668\u8BE6\u60C5\u67E5\u770B\uFF1B\u4ECD\u663E\u793A\u5F85\u8865\u6388\u6743\u7684\u8BDD\uFF0C\u518D\u70B9\u4E00\u6B21\u94FE\u63A5\u5373\u53EF\u3002`
|
|
24928
|
+
}[supplement.outcome];
|
|
24929
|
+
return { state: "incomplete", ...userName, message };
|
|
24857
24930
|
}
|
|
24858
24931
|
await deps.onRestored?.(claims, { openId: who.openId, ...userName }).catch((e) => warn(`onRestored: ${String(e)}`));
|
|
24859
24932
|
return { state: "restored", ...who.name ? { userName: who.name } : {} };
|
|
@@ -24864,7 +24937,7 @@ function createFeishuReauth(deps) {
|
|
|
24864
24937
|
try {
|
|
24865
24938
|
const r = await (deps.poll ?? pollFeishuDeviceToken)({ appId: ctx.appId, appSecret: ctx.appSecret, deviceCode });
|
|
24866
24939
|
if (r.status === "pending") continue;
|
|
24867
|
-
entry.result = await settle(entry.claims, ctx.store, r.data, ctx.sel, ctx.sendAsUser);
|
|
24940
|
+
entry.result = await settle(entry.claims, ctx.store, r.data, ctx.sel, ctx.sendAsUser, ctx.appId);
|
|
24868
24941
|
return;
|
|
24869
24942
|
} catch (e) {
|
|
24870
24943
|
entry.result = { state: "error", message: `\u98DE\u4E66\u6CA1\u6709\u5B8C\u6210\u6388\u6743\uFF1A${String(e?.message ?? e).slice(0, 200)}\u3002\u53EF\u4EE5\u91CD\u65B0\u70B9\u94FE\u63A5\u518D\u8BD5\u3002` };
|
|
@@ -24959,6 +25032,7 @@ var init_feishu_reauth = __esm({
|
|
|
24959
25032
|
"../server/src/feishu-reauth.ts"() {
|
|
24960
25033
|
"use strict";
|
|
24961
25034
|
init_src3();
|
|
25035
|
+
init_feishu_pending_approval();
|
|
24962
25036
|
DEFAULT_DEVICE_CODE_TTL_SEC = 240;
|
|
24963
25037
|
DEFAULT_POLL_INTERVAL_SEC = 5;
|
|
24964
25038
|
escapeHtml = (s2) => s2.replace(/[&<>"']/g, (c) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" })[c]);
|
|
@@ -212364,51 +212438,6 @@ var init_feishu_module_access = __esm({
|
|
|
212364
212438
|
}
|
|
212365
212439
|
});
|
|
212366
212440
|
|
|
212367
|
-
// ../server/src/feishu-pending-approval.ts
|
|
212368
|
-
async function recordFeishuPendingApproval(input) {
|
|
212369
|
-
const pendingScopes = await pendingApprovalScopes(input);
|
|
212370
|
-
if (pendingScopes.length === 0) {
|
|
212371
|
-
if (input.granted) {
|
|
212372
|
-
await withConnectorCredentialLock("feishu", input.actorId, () => clearFeishuPendingApproval(input.store, input.actorId));
|
|
212373
|
-
}
|
|
212374
|
-
return null;
|
|
212375
|
-
}
|
|
212376
|
-
const record10 = {
|
|
212377
|
-
at: new Date(input.now).toISOString(),
|
|
212378
|
-
appId: input.appId,
|
|
212379
|
-
...input.applicant ? { applicant: input.applicant } : {},
|
|
212380
|
-
modules: input.selection.modules,
|
|
212381
|
-
sendAsUser: input.selection.sendAsUser,
|
|
212382
|
-
sendAsUserRequested: input.sendAsUserRequested,
|
|
212383
|
-
pendingScopes
|
|
212384
|
-
};
|
|
212385
|
-
await withConnectorCredentialLock("feishu", input.actorId, () => writeFeishuPendingApproval(input.store, input.actorId, record10));
|
|
212386
|
-
const modules = feishuPendingApprovalModules(record10);
|
|
212387
|
-
return { modules, scopes: pendingScopes, notice: feishuPendingApprovalNotice(modules) };
|
|
212388
|
-
}
|
|
212389
|
-
async function pendingApprovalScopes(input) {
|
|
212390
|
-
const requested = scopesForSelection(input.selection, input.sendAsUserRequested);
|
|
212391
|
-
let appScopes = null;
|
|
212392
|
-
try {
|
|
212393
|
-
appScopes = await (input.fetchScopes ?? fetchFeishuAppScopes)(input.appId, input.appSecret);
|
|
212394
|
-
} catch (e) {
|
|
212395
|
-
(input.warn ?? ((m2) => console.warn(`[feishu-oauth] ${m2}`)))(`\u5E94\u7528\u6743\u9650\u5217\u8868\u67E5\u8BE2\u5931\u8D25\uFF0C\u5F85\u5BA1\u6279\u6309\u514D\u5BA1\u96C6\u5408\u4F30\u7B97: ${String(e)}`);
|
|
212396
|
-
}
|
|
212397
|
-
return feishuPendingApprovalScopes({ requested, granted: input.granted, appScopes });
|
|
212398
|
-
}
|
|
212399
|
-
async function assessFeishuApprovalUnconfirmed(input) {
|
|
212400
|
-
const scopes = await pendingApprovalScopes(input);
|
|
212401
|
-
if (scopes.length === 0) return null;
|
|
212402
|
-
const modules = feishuPendingApprovalModules({ modules: input.selection.modules, pendingScopes: scopes });
|
|
212403
|
-
return { modules, scopes, notice: feishuApprovalUnconfirmedNotice(modules, input.expired) };
|
|
212404
|
-
}
|
|
212405
|
-
var init_feishu_pending_approval = __esm({
|
|
212406
|
-
"../server/src/feishu-pending-approval.ts"() {
|
|
212407
|
-
"use strict";
|
|
212408
|
-
init_src3();
|
|
212409
|
-
}
|
|
212410
|
-
});
|
|
212411
|
-
|
|
212412
212441
|
// ../server/src/github-app-inventory.ts
|
|
212413
212442
|
async function collectOasisGithubApps(svc) {
|
|
212414
212443
|
const rows = (await svc.listVariables()).filter((r) => r.scope === "global" || r.scope === "personal");
|
|
@@ -218811,6 +218840,44 @@ ${composed}`;
|
|
|
218811
218840
|
const data = polled.data;
|
|
218812
218841
|
let pendingApproval = null;
|
|
218813
218842
|
const svc = await connectorActorsService();
|
|
218843
|
+
const grantedNow = feishuAuthSelectionRecord(startedSelection.selection, startedSelection.sendAsUserRequested, data).grantedScopes;
|
|
218844
|
+
let stillPending;
|
|
218845
|
+
if (svc) {
|
|
218846
|
+
stillPending = await feishuStillPendingScopes({
|
|
218847
|
+
appId,
|
|
218848
|
+
appSecret,
|
|
218849
|
+
selection: startedSelection.selection,
|
|
218850
|
+
sendAsUserRequested: startedSelection.sendAsUserRequested,
|
|
218851
|
+
...grantedNow ? { granted: grantedNow } : {}
|
|
218852
|
+
});
|
|
218853
|
+
const risk = stillPending.length > 0 ? await feishuExistingGrantAtRisk({ store: svc, actorId, appId, ...grantedNow ? { newGranted: grantedNow } : {}, now: Date.now() }) : { keep: false };
|
|
218854
|
+
if (risk.keep) {
|
|
218855
|
+
console.error(`[feishu-oauth] \u65B0 token \u672A\u8BC1\u5B9E\u5305\u542B\u5DF2\u6709\u6388\u6743\uFF08\u7F3A ${risk.missing?.join(" ") ?? "\u672A\u56DE\u62A5 scope"}\uFF09\uFF0C\u4FDD\u7559\u539F\u6388\u6743\u3001\u4E0D\u843D\u65B0 token`);
|
|
218856
|
+
const kept = grantedNow ? await recordFeishuPendingApproval({
|
|
218857
|
+
store: svc,
|
|
218858
|
+
actorId,
|
|
218859
|
+
appId,
|
|
218860
|
+
appSecret,
|
|
218861
|
+
selection: startedSelection.selection,
|
|
218862
|
+
sendAsUserRequested: startedSelection.sendAsUserRequested,
|
|
218863
|
+
...isHumanActorId(actor) ? { applicant: actor } : {},
|
|
218864
|
+
granted: grantedNow,
|
|
218865
|
+
pendingScopes: stillPending,
|
|
218866
|
+
keptExisting: true,
|
|
218867
|
+
now: Date.now()
|
|
218868
|
+
}).catch((e) => {
|
|
218869
|
+
console.error(`[feishu-oauth] \u5F85\u5BA1\u6279\u8BB0\u5F55\u5199\u5165\u5931\u8D25: ${String(e)}`);
|
|
218870
|
+
return null;
|
|
218871
|
+
}) : null;
|
|
218872
|
+
res.writeHead(200, { "content-type": "application/json" }).end(JSON.stringify(kept ? { ok: false, final: true, keptExisting: true, pendingApproval: { modules: kept.modules, scopes: kept.scopes }, notice: kept.notice } : {
|
|
218873
|
+
ok: false,
|
|
218874
|
+
final: true,
|
|
218875
|
+
keptExisting: true,
|
|
218876
|
+
error: grantedNow ? "\u98DE\u4E66\u8FD9\u4E00\u8F6E\u7ED9\u7684\u6388\u6743\u4E0D\u5305\u542B\u4F60\u73B0\u6709\u6388\u6743\u7684\u5168\u90E8\u6743\u9650\uFF0C\u4E3A\u4E0D\u5F71\u54CD\u5DF2\u6709\u7684\u98DE\u4E66\u80FD\u529B\uFF0C\u539F\u6388\u6743\u4FDD\u6301\u4E0D\u53D8\u3001\u8FD9\u4E00\u8F6E\u7684\u6388\u6743\u6CA1\u6709\u4FDD\u5B58\u3002" : "\u98DE\u4E66\u6CA1\u6709\u56DE\u62A5\u8FD9\u4E00\u8F6E\u6388\u4E88\u4E86\u54EA\u4E9B\u6743\u9650\uFF0C\u65E0\u6CD5\u786E\u8BA4\u662F\u5426\u5305\u542B\u4F60\u73B0\u6709\u6388\u6743\u7684\u5168\u90E8\u6743\u9650\u3002\u4E3A\u4E0D\u5F71\u54CD\u5DF2\u6709\u7684\u98DE\u4E66\u80FD\u529B\uFF0C\u539F\u6388\u6743\u4FDD\u6301\u4E0D\u53D8\u3001\u8FD9\u4E00\u8F6E\u7684\u6388\u6743\u6CA1\u6709\u4FDD\u5B58\u3002"
|
|
218877
|
+
}));
|
|
218878
|
+
return;
|
|
218879
|
+
}
|
|
218880
|
+
}
|
|
218814
218881
|
if (svc) {
|
|
218815
218882
|
if (actorId) {
|
|
218816
218883
|
await svc.putVariable({ key: "FEISHU_APP_ID", value: appId, scope: "personal", actorId, connectorId: "feishu", encrypted: true });
|
|
@@ -218845,6 +218912,7 @@ ${composed}`;
|
|
|
218845
218912
|
sendAsUserRequested: startedSelection.sendAsUserRequested,
|
|
218846
218913
|
...isHumanActorId(actor) ? { applicant: actor } : {},
|
|
218847
218914
|
granted: record10.grantedScopes,
|
|
218915
|
+
...stillPending ? { pendingScopes: stillPending } : {},
|
|
218848
218916
|
now: Date.now()
|
|
218849
218917
|
});
|
|
218850
218918
|
} catch (e) {
|
|
@@ -301535,7 +301603,7 @@ async function waitForCommandAuthorization(base, headers, draftId, fallback) {
|
|
|
301535
301603
|
}
|
|
301536
301604
|
}
|
|
301537
301605
|
}
|
|
301538
|
-
var CLI_VERSION = "2.2.
|
|
301606
|
+
var CLI_VERSION = "2.2.117" ? "2.2.117" : "dev";
|
|
301539
301607
|
function apiHeaders(token2, company) {
|
|
301540
301608
|
const headers = {
|
|
301541
301609
|
authorization: `Bearer ${token2}`,
|
|
@@ -305706,7 +305774,7 @@ function shimScript() {
|
|
|
305706
305774
|
}
|
|
305707
305775
|
|
|
305708
305776
|
// src/index.ts
|
|
305709
|
-
var PKG_VERSION = true ? "2.2.
|
|
305777
|
+
var PKG_VERSION = true ? "2.2.117" : "dev";
|
|
305710
305778
|
var LOCAL_BIN = localBin();
|
|
305711
305779
|
var NPM_PREFIX = npmPrefix();
|
|
305712
305780
|
var INSTANCE = DEFAULT_INSTANCE;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oasis_test_v2",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.117",
|
|
4
4
|
"description": "Oasis node daemon + CLI — background daemon, auto-start, full server CLI",
|
|
5
5
|
"bin": {
|
|
6
6
|
"oasis": "./dist/index.js"
|
|
@@ -26,6 +26,6 @@
|
|
|
26
26
|
"node": ">=20"
|
|
27
27
|
},
|
|
28
28
|
"oasisRelease": {
|
|
29
|
-
"sourceHead": "
|
|
29
|
+
"sourceHead": "5abfe31a5f1f2ad0ffa56221ddd536173a1c8f62"
|
|
30
30
|
}
|
|
31
31
|
}
|