@aiquants/auth-react-router 0.9.1 → 0.12.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.
- package/dist/admin.d.mts +223 -23
- package/dist/admin.d.ts +223 -23
- package/dist/admin.js +1 -1
- package/dist/admin.js.map +1 -1
- package/dist/admin.mjs +1 -1
- package/dist/admin.mjs.map +1 -1
- package/dist/server.d.mts +8 -2
- package/dist/server.d.ts +8 -2
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/server.mjs +1 -1
- package/dist/server.mjs.map +1 -1
- package/package.json +3 -3
- package/src/admin/format.ts +33 -0
- package/src/admin/labels.ts +377 -83
- package/src/admin/server.ts +187 -21
- package/src/admin/ui.tsx +68 -8
- package/src/admin/views.tsx +608 -110
- package/src/server/google-strategy.ts +1 -1
- package/src/server/ports.ts +8 -2
package/dist/admin.d.mts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as react_router from 'react-router';
|
|
2
|
+
import { AuthUser, AuthGroup, AuthGroupMember, AuthAllowlistEntry, AuthDirectoryMembershipMode, AuthDirectoryStatus } from '@aiquants/auth-core';
|
|
2
3
|
import React__default from 'react';
|
|
3
4
|
|
|
4
5
|
/**
|
|
@@ -12,60 +13,123 @@ import React__default from 'react';
|
|
|
12
13
|
*/
|
|
13
14
|
type UserAdminLabels = {
|
|
14
15
|
title: string;
|
|
16
|
+
/**
|
|
17
|
+
* BCP 47 locale used to format dates. 日付整形に使う BCP 47 ロケール。
|
|
18
|
+
*
|
|
19
|
+
* 実行環境任せにするとサーバーとブラウザで別の文字列になり、水和が壊れる。
|
|
20
|
+
*/
|
|
21
|
+
locale: string;
|
|
22
|
+
/** IANA time zone used to format dates. 日付整形に使う IANA タイムゾーン。 */
|
|
23
|
+
timeZone: string;
|
|
24
|
+
/**
|
|
25
|
+
* Strings shared by more than one view. 複数のビューが共有する文言。
|
|
26
|
+
*
|
|
27
|
+
* ビューごとに同じ語を持たせると、ある画面の「削除」だけを言い換えることが **できなく
|
|
28
|
+
* なる** (実装がどのビューのキーを読んでいるかは呼び出し側から見えない)。共有する語は
|
|
29
|
+
* ここ 1 か所に置く。
|
|
30
|
+
*/
|
|
31
|
+
common: {
|
|
32
|
+
add: string;
|
|
33
|
+
create: string;
|
|
34
|
+
edit: string;
|
|
35
|
+
delete: string;
|
|
36
|
+
save: string;
|
|
37
|
+
cancel: string;
|
|
38
|
+
actions: string;
|
|
39
|
+
status: string;
|
|
40
|
+
id: string;
|
|
41
|
+
/** 変更不能な供給元 (環境変数など) 由来の行に出す表示。 */
|
|
42
|
+
readOnly: string;
|
|
43
|
+
/** 上流所有のグループに出す編集不可の表示。 */
|
|
44
|
+
managedUpstream: string;
|
|
45
|
+
/** `#{id}` の表示。記号の位置は言語で変わる。 */
|
|
46
|
+
idTemplate: string;
|
|
47
|
+
/** 値が無いことの表示 (説明欄など)。 */
|
|
48
|
+
none: string;
|
|
49
|
+
};
|
|
50
|
+
/** アクションが拒否・失敗したときの文言。 */
|
|
51
|
+
errors: {
|
|
52
|
+
/**
|
|
53
|
+
* Shown when the actor lacks permission for the attempted operation.
|
|
54
|
+
* 操作の権限が無いときに出す文言。
|
|
55
|
+
*
|
|
56
|
+
* ガードの例外メッセージをそのまま返してはならない。テナント ID・アプリキー・
|
|
57
|
+
* 拒否理由といった内部の語彙が、権限を持たない相手にそのまま渡る。
|
|
58
|
+
*/
|
|
59
|
+
forbidden: string;
|
|
60
|
+
};
|
|
15
61
|
/** シェル (タブ枠) の見出し。 */
|
|
16
62
|
heading: string;
|
|
63
|
+
/** シェルが描く自己権限バッジの文言。 */
|
|
64
|
+
permissions: {
|
|
65
|
+
label: string;
|
|
66
|
+
canWrite: string;
|
|
67
|
+
canRead: string;
|
|
68
|
+
none: string;
|
|
69
|
+
/** 未結線・取得失敗・付与ゼロのいずれも「不明」であり、許可ではない。 */
|
|
70
|
+
unknown: string;
|
|
71
|
+
};
|
|
17
72
|
tabs: {
|
|
18
73
|
users: string;
|
|
19
74
|
groups: string;
|
|
20
75
|
groupMembers: string;
|
|
21
76
|
allowlist: string;
|
|
77
|
+
directory: string;
|
|
22
78
|
};
|
|
23
79
|
usersView: {
|
|
24
80
|
title: string;
|
|
25
81
|
searchPlaceholder: string;
|
|
82
|
+
/** 検索欄の読み上げ名。プレースホルダは入力すると消えるため名前にならない。 */
|
|
83
|
+
searchLabel: string;
|
|
26
84
|
addUser: string;
|
|
27
85
|
editUser: string;
|
|
28
|
-
id: string;
|
|
29
86
|
displayName: string;
|
|
30
87
|
email: string;
|
|
31
|
-
status: string;
|
|
32
88
|
active: string;
|
|
33
89
|
inactive: string;
|
|
34
|
-
actions: string;
|
|
35
|
-
edit: string;
|
|
36
90
|
activate: string;
|
|
37
91
|
deactivate: string;
|
|
92
|
+
/** 行ごとの読み上げ名。`{user}` を利用者名へ置換する。 */
|
|
93
|
+
editUserAria: string;
|
|
94
|
+
activateAria: string;
|
|
95
|
+
deactivateAria: string;
|
|
96
|
+
/** 無効化はサインインを止める。確認を取る。 */
|
|
97
|
+
confirmDeactivate: string;
|
|
38
98
|
empty: string;
|
|
39
|
-
save: string;
|
|
40
|
-
cancel: string;
|
|
41
99
|
};
|
|
42
100
|
groupsView: {
|
|
101
|
+
/** 検索語に一致しないときの説明。空状態と混ぜると「消えた」と誤読される。 */
|
|
102
|
+
emptyFiltered: string;
|
|
43
103
|
title: string;
|
|
44
104
|
searchPlaceholder: string;
|
|
105
|
+
searchLabel: string;
|
|
45
106
|
addGroup: string;
|
|
46
107
|
editGroup: string;
|
|
47
|
-
id: string;
|
|
48
108
|
groupKey: string;
|
|
49
109
|
name: string;
|
|
50
110
|
description: string;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
actions: string;
|
|
54
|
-
edit: string;
|
|
55
|
-
delete: string;
|
|
111
|
+
/** 所属人数。`{count}` を人数へ置換する。 */
|
|
112
|
+
memberCountTemplate: string;
|
|
56
113
|
confirmDelete: string;
|
|
57
114
|
noDescription: string;
|
|
58
115
|
groupKeyPlaceholder: string;
|
|
59
116
|
namePlaceholder: string;
|
|
60
117
|
empty: string;
|
|
61
|
-
save: string;
|
|
62
|
-
cancel: string;
|
|
63
118
|
};
|
|
64
119
|
groupMembersView: {
|
|
120
|
+
title: string;
|
|
65
121
|
selectGroup: string;
|
|
66
122
|
selectPrompt: string;
|
|
67
123
|
actionAdd: string;
|
|
68
124
|
actionRemove: string;
|
|
125
|
+
/** 行ごとの読み上げ名。`{user}` を利用者名へ置換する。 */
|
|
126
|
+
actionAddAria: string;
|
|
127
|
+
actionRemoveAria: string;
|
|
128
|
+
/** 上流所有グループで編集を出さない理由。押せない理由を書かないと故障に見える。 */
|
|
129
|
+
upstreamNotice: string;
|
|
130
|
+
/** 見出し。`{group}` をグループ名へ置換する。語順が言語で変わるため位置指定にする。 */
|
|
131
|
+
membersOfTemplate: string;
|
|
132
|
+
groupKeyLabel: string;
|
|
69
133
|
};
|
|
70
134
|
allowlistView: {
|
|
71
135
|
title: string;
|
|
@@ -77,14 +141,85 @@ type UserAdminLabels = {
|
|
|
77
141
|
/** 一覧のバッジ表示 (短縮形)。 */
|
|
78
142
|
emailTypeShort: string;
|
|
79
143
|
domainTypeShort: string;
|
|
144
|
+
/** グループ単位の許可。上流ディレクトリの所属で判定される。 */
|
|
145
|
+
groupTypeShort: string;
|
|
146
|
+
/** 対象列の見出し。パターンとグループが混在するため「パターン」ではない。 */
|
|
147
|
+
target: string;
|
|
80
148
|
description: string;
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
149
|
+
/** 配備全体が所有する行 (環境変数由来) の所有者表示。 */
|
|
150
|
+
deploymentOwner: string;
|
|
151
|
+
/** 許可の取り消しはサインインを止める。確認を取る。 */
|
|
152
|
+
confirmDelete: string;
|
|
153
|
+
/** 行ごとの読み上げ名。`{target}` を対象へ置換する。 */
|
|
154
|
+
deleteAria: string;
|
|
85
155
|
empty: string;
|
|
86
|
-
|
|
87
|
-
|
|
156
|
+
};
|
|
157
|
+
directoryView: {
|
|
158
|
+
title: string;
|
|
159
|
+
/** 出所列。ローカル管理か、どの上流かを示す。 */
|
|
160
|
+
source: string;
|
|
161
|
+
localSource: string;
|
|
162
|
+
membershipMode: string;
|
|
163
|
+
directMode: string;
|
|
164
|
+
transitiveMode: string;
|
|
165
|
+
lastSynced: string;
|
|
166
|
+
neverSynced: string;
|
|
167
|
+
/** 上流に居るがローカルユーザーへ解決できていない人数。`{count}` を人数へ置換する。 */
|
|
168
|
+
unresolvedTemplate: string;
|
|
169
|
+
syncPaused: string;
|
|
170
|
+
syncEnabled: string;
|
|
171
|
+
syncNow: string;
|
|
172
|
+
syncQueued: string;
|
|
173
|
+
/** 同期が滞っていることの警告。停止はセキュリティ事象である。 */
|
|
174
|
+
staleWarning: string;
|
|
175
|
+
disabledWarning: string;
|
|
176
|
+
/** 停止件数。`{paused}` / `{total}` を件数へ置換する。 */
|
|
177
|
+
pausedTemplate: string;
|
|
178
|
+
/** 失敗したグループの列挙。`{groups}` を名前の並びへ置換する。 */
|
|
179
|
+
erroredTemplate: string;
|
|
180
|
+
/** 失敗理由付きの 1 件。`{group}` / `{reason}`。 */
|
|
181
|
+
erroredItemTemplate: string;
|
|
182
|
+
/** 列挙の区切り。言語で変わる。 */
|
|
183
|
+
listSeparator: string;
|
|
184
|
+
/** 滞留警告に添える最終成功時刻。`{at}`。 */
|
|
185
|
+
oldestSyncedTemplate: string;
|
|
186
|
+
/** 未処理の同期要求。`{count}`。 */
|
|
187
|
+
pendingTemplate: string;
|
|
188
|
+
/** 連携先が 1 つも残っていないときの説明。 */
|
|
189
|
+
nothingToLink: string;
|
|
190
|
+
/** 未結線の配備で操作を出さない理由。 */
|
|
191
|
+
notWiredNotice: string;
|
|
192
|
+
/** 行ごとの読み上げ名。`{group}` をグループ名へ置換する。 */
|
|
193
|
+
syncNowAria: string;
|
|
194
|
+
pauseAria: string;
|
|
195
|
+
resumeAria: string;
|
|
196
|
+
allowGroupAria: string;
|
|
197
|
+
disallowGroupAria: string;
|
|
198
|
+
unlinkAria: string;
|
|
199
|
+
/** グループ単位のサインイン許可を外す確認。 */
|
|
200
|
+
confirmDisallow: string;
|
|
201
|
+
link: string;
|
|
202
|
+
unlink: string;
|
|
203
|
+
externalKey: string;
|
|
204
|
+
empty: string;
|
|
205
|
+
/** 直近の同期が失敗したグループの見出し。件数だけでは何が起きたか判らない。 */
|
|
206
|
+
erroredWarning: string;
|
|
207
|
+
/** 同期有効なリンクのうち最も古い成功時刻。滞留の実際の深さを示す。 */
|
|
208
|
+
oldestSyncedAt: string;
|
|
209
|
+
/** 連携するグループを選ぶ欄。 */
|
|
210
|
+
selectGroup: string;
|
|
211
|
+
/** 上流グループのアドレス入力。 */
|
|
212
|
+
externalKeyPlaceholder: string;
|
|
213
|
+
/** 連携解除の確認。台帳と許可設定が消える。 */
|
|
214
|
+
confirmUnlink: string;
|
|
215
|
+
/** 同期の一時停止・再開。 */
|
|
216
|
+
pause: string;
|
|
217
|
+
resume: string;
|
|
218
|
+
/** 許可グループに加える / 外す。 */
|
|
219
|
+
allowGroup: string;
|
|
220
|
+
disallowGroup: string;
|
|
221
|
+
/** グループ名と鍵の併記。`{name}` / `{key}`。 */
|
|
222
|
+
groupOptionTemplate: string;
|
|
88
223
|
};
|
|
89
224
|
};
|
|
90
225
|
/**
|
|
@@ -100,12 +235,18 @@ declare const jaUserAdminLabels: UserAdminLabels;
|
|
|
100
235
|
/** セクション単位の部分上書き。 */
|
|
101
236
|
type PartialUserAdminLabels = {
|
|
102
237
|
title?: string;
|
|
238
|
+
locale?: string;
|
|
239
|
+
timeZone?: string;
|
|
240
|
+
common?: Partial<UserAdminLabels["common"]>;
|
|
241
|
+
errors?: Partial<UserAdminLabels["errors"]>;
|
|
103
242
|
heading?: string;
|
|
243
|
+
permissions?: Partial<UserAdminLabels["permissions"]>;
|
|
104
244
|
tabs?: Partial<UserAdminLabels["tabs"]>;
|
|
105
245
|
usersView?: Partial<UserAdminLabels["usersView"]>;
|
|
106
246
|
groupsView?: Partial<UserAdminLabels["groupsView"]>;
|
|
107
247
|
groupMembersView?: Partial<UserAdminLabels["groupMembersView"]>;
|
|
108
248
|
allowlistView?: Partial<UserAdminLabels["allowlistView"]>;
|
|
249
|
+
directoryView?: Partial<UserAdminLabels["directoryView"]>;
|
|
109
250
|
};
|
|
110
251
|
/**
|
|
111
252
|
* Shallow per-section merge over the English defaults.
|
|
@@ -149,6 +290,40 @@ type UserAdminStore = {
|
|
|
149
290
|
description?: string;
|
|
150
291
|
}) => Promise<AuthAllowlistEntry>;
|
|
151
292
|
removeAllowlistEntry: (id: number) => Promise<void>;
|
|
293
|
+
/**
|
|
294
|
+
* Allows every member of an externally-sourced group to sign in.
|
|
295
|
+
* 外部供給グループのメンバー全員にサインインを許可する処理。
|
|
296
|
+
*
|
|
297
|
+
* 判定は上流メンバー台帳を読むため、ローカル管理のグループを渡しても誰にも何も与えない。
|
|
298
|
+
* ストアはそれを拒否すること (無言の no-op を作らない)。
|
|
299
|
+
*/
|
|
300
|
+
addAllowlistGroup: (groupId: number, description?: string) => Promise<void>;
|
|
301
|
+
removeAllowlistGroup: (id: number) => Promise<void>;
|
|
302
|
+
/**
|
|
303
|
+
* Links a local group to a group in the upstream directory.
|
|
304
|
+
* ローカルグループを上流ディレクトリのグループへ結び付ける処理。
|
|
305
|
+
*
|
|
306
|
+
* リンク後、そのグループの名称と所属は上流が所有する。ロール割当はローカルのままである。
|
|
307
|
+
*/
|
|
308
|
+
linkDirectoryGroup: (groupId: number, data: {
|
|
309
|
+
provider: string;
|
|
310
|
+
externalKey: string;
|
|
311
|
+
membershipMode: AuthDirectoryMembershipMode;
|
|
312
|
+
}) => Promise<void>;
|
|
313
|
+
/** Stops following the upstream, keeping the memberships already projected. 連携の解除。 */
|
|
314
|
+
unlinkDirectoryGroup: (groupId: number) => Promise<void>;
|
|
315
|
+
/** Pauses or resumes synchronization for one group. 1 グループの同期を停止・再開する処理。 */
|
|
316
|
+
setDirectorySyncEnabled: (groupId: number, isSyncEnabled: boolean) => Promise<void>;
|
|
317
|
+
/**
|
|
318
|
+
* Queues a synchronization request. 同期要求をキューへ積む処理。
|
|
319
|
+
*
|
|
320
|
+
* 上流へ到達できるのは同期ジョブだけなので、web からは要求を残すことしかできない。
|
|
321
|
+
*
|
|
322
|
+
* @param groupId `null` requests every linked group of the tenant. `null` はテナント全件。
|
|
323
|
+
*/
|
|
324
|
+
requestDirectorySync: (groupId: number | null) => Promise<void>;
|
|
325
|
+
/** Health of the synchronization, for the header warning. 同期の健全性 (警告表示用)。 */
|
|
326
|
+
getDirectoryStatus: () => Promise<AuthDirectoryStatus>;
|
|
152
327
|
};
|
|
153
328
|
/**
|
|
154
329
|
* Creates an in-memory UserAdminStore initialized with optional seed data.
|
|
@@ -194,6 +369,17 @@ type UserAdminGuards = {
|
|
|
194
369
|
action: UserAdminAccess;
|
|
195
370
|
intent: string;
|
|
196
371
|
}) => Promise<void> | void;
|
|
372
|
+
/**
|
|
373
|
+
* Observes a denial that was converted into an in-page error. 画面内エラーへ変換した拒否の観測点。
|
|
374
|
+
*
|
|
375
|
+
* 拒否を画面内に返すと、既定のエラー経路が拾っていたログが消える。管理面への総当たりが
|
|
376
|
+
* 200 番台の列に紛れて見えなくなるため、宿主が記録できる口を開けておく。
|
|
377
|
+
*/
|
|
378
|
+
onDenied?: (context: {
|
|
379
|
+
intent: string;
|
|
380
|
+
actions: readonly UserAdminAccess[];
|
|
381
|
+
error: unknown;
|
|
382
|
+
}) => void;
|
|
197
383
|
};
|
|
198
384
|
/**
|
|
199
385
|
* Neutral per-resource permission summary the admin shell renders in its header badge.
|
|
@@ -247,10 +433,14 @@ declare function createUserAdminApp(config: UserAdminAppConfig): {
|
|
|
247
433
|
groups: AuthGroup[];
|
|
248
434
|
groupMembers: AuthGroupMember[];
|
|
249
435
|
allowlist: AuthAllowlistEntry[];
|
|
436
|
+
directoryStatus: AuthDirectoryStatus;
|
|
250
437
|
myPermissions: Record<string, UserAdminPermission | undefined> | null;
|
|
251
438
|
labels: UserAdminLabels;
|
|
252
439
|
}>;
|
|
253
|
-
action: ({ request }: RouteArgs) => Promise<{
|
|
440
|
+
action: ({ request }: RouteArgs) => Promise<react_router.UNSAFE_DataWithResponseInit<{
|
|
441
|
+
ok: boolean;
|
|
442
|
+
error: string;
|
|
443
|
+
}> | {
|
|
254
444
|
ok: boolean;
|
|
255
445
|
error?: undefined;
|
|
256
446
|
} | {
|
|
@@ -278,6 +468,7 @@ type UserAdminLoaderData = {
|
|
|
278
468
|
groups: AuthGroup[];
|
|
279
469
|
groupMembers: AuthGroupMember[];
|
|
280
470
|
allowlist: AuthAllowlistEntry[];
|
|
471
|
+
directoryStatus: AuthDirectoryStatus;
|
|
281
472
|
labels?: UserAdminLabels;
|
|
282
473
|
};
|
|
283
474
|
declare function UsersView(): React__default.JSX.Element;
|
|
@@ -296,6 +487,15 @@ declare function GroupMembersView(): React__default.JSX.Element;
|
|
|
296
487
|
* アクセス許可リスト (Allowlist) 管理ビュー。
|
|
297
488
|
*/
|
|
298
489
|
declare function AllowlistView(): React__default.JSX.Element;
|
|
490
|
+
/**
|
|
491
|
+
* View for the upstream directory: what is linked, how fresh it is, and the controls that change it.
|
|
492
|
+
* 上流ディレクトリのビュー。何が連携され、どれだけ新しく、それを変える操作を提供する。
|
|
493
|
+
*
|
|
494
|
+
* このタブが無いと、連携の作成・解除・一時停止・即時同期・グループ単位のサインイン許可という
|
|
495
|
+
* 5 つの操作にどこからも到達できない。実装されているのに押せる場所が無い状態は、実装が無いのと
|
|
496
|
+
* 変わらないうえ、「許可を消せるが作れない」という片肺の運用を強いる。
|
|
497
|
+
*/
|
|
498
|
+
declare function DirectoryView(): React__default.JSX.Element;
|
|
299
499
|
type AuthUserAdminAppViewProps = UserAdminShellProps;
|
|
300
500
|
/**
|
|
301
501
|
* Top-level application view component for the user administration UI (`/users/*`).
|
|
@@ -303,4 +503,4 @@ type AuthUserAdminAppViewProps = UserAdminShellProps;
|
|
|
303
503
|
*/
|
|
304
504
|
declare function AuthUserAdminAppView({ renderHeader }?: AuthUserAdminAppViewProps): React__default.JSX.Element;
|
|
305
505
|
|
|
306
|
-
export { AllowlistView, AuthUserAdminAppView, type AuthUserAdminAppViewProps, GroupMembersView, GroupsView, type PartialUserAdminLabels, type UserAdminAccess, type UserAdminAppConfig, type UserAdminGuards, type UserAdminLabels, type UserAdminLoaderData, type UserAdminPermission, UserAdminShell, type UserAdminShellProps, type UserAdminStore, UsersView, createInMemoryUserAdminStore, createUserAdminApp, defaultUserAdminLabels, jaUserAdminLabels, resolveUserAdminLabels };
|
|
506
|
+
export { AllowlistView, AuthUserAdminAppView, type AuthUserAdminAppViewProps, DirectoryView, GroupMembersView, GroupsView, type PartialUserAdminLabels, type UserAdminAccess, type UserAdminAppConfig, type UserAdminGuards, type UserAdminLabels, type UserAdminLoaderData, type UserAdminPermission, UserAdminShell, type UserAdminShellProps, type UserAdminStore, UsersView, createInMemoryUserAdminStore, createUserAdminApp, defaultUserAdminLabels, jaUserAdminLabels, resolveUserAdminLabels };
|