chukyo-sdk 0.1.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/LICENSE +21 -0
- package/README.md +227 -0
- package/dist/cjs/albo/client.js +133 -0
- package/dist/cjs/albo/index.js +55 -0
- package/dist/cjs/albo/parser/albo.js +110 -0
- package/dist/cjs/albo/types/albo.js +351 -0
- package/dist/cjs/albo/types/alboCalendar.js +51 -0
- package/dist/cjs/albo/types/alboCommon.js +55 -0
- package/dist/cjs/albo/types/alboInformation.js +136 -0
- package/dist/cjs/albo/types/alboMenu.js +92 -0
- package/dist/cjs/albo/types/alboQuestionnaire.js +229 -0
- package/dist/cjs/albo/types/alboSharedItem.js +137 -0
- package/dist/cjs/albo/types/alboSystem.js +103 -0
- package/dist/cjs/albo/types/alboUniversalForm.js +51 -0
- package/dist/cjs/common/dom.js +137 -0
- package/dist/cjs/common/utils.js +29 -0
- package/dist/cjs/constants.js +127 -0
- package/dist/cjs/core/request.js +39 -0
- package/dist/cjs/cubics/client.js +49 -0
- package/dist/cjs/cubics/index.js +22 -0
- package/dist/cjs/cubics/parser/cubics.js +103 -0
- package/dist/cjs/cubics/types/cubics.js +90 -0
- package/dist/cjs/errors.js +55 -0
- package/dist/cjs/index.js +50 -0
- package/dist/cjs/manabo/client.js +135 -0
- package/dist/cjs/manabo/index.js +44 -0
- package/dist/cjs/manabo/parser/manaboClass.js +386 -0
- package/dist/cjs/manabo/parser/manaboEntry.js +38 -0
- package/dist/cjs/manabo/parser/manaboMail.js +153 -0
- package/dist/cjs/manabo/parser/manaboNews.js +26 -0
- package/dist/cjs/manabo/parser/manaboTimetable.js +93 -0
- package/dist/cjs/manabo/types/manaboClass.js +223 -0
- package/dist/cjs/manabo/types/manaboEntry.js +43 -0
- package/dist/cjs/manabo/types/manaboMail.js +117 -0
- package/dist/cjs/manabo/types/manaboNews.js +20 -0
- package/dist/cjs/manabo/types/manaboTimetable.js +79 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/shib/builder.js +239 -0
- package/dist/cjs/shib/index.js +32 -0
- package/dist/cjs/shib/parser/shibLogin.js +138 -0
- package/dist/cjs/shib/parser/shibUser.js +51 -0
- package/dist/cjs/shib/types/common.js +2 -0
- package/dist/cjs/shib/types/shibLogin.js +92 -0
- package/dist/cjs/shib/types/shibUser.js +44 -0
- package/dist/cjs/transports/fetch.js +84 -0
- package/dist/cjs/types.js +9 -0
- package/dist/esm/albo/client.d.ts +80 -0
- package/dist/esm/albo/client.d.ts.map +1 -0
- package/dist/esm/albo/client.js +129 -0
- package/dist/esm/albo/index.d.ts +12 -0
- package/dist/esm/albo/index.d.ts.map +1 -0
- package/dist/esm/albo/index.js +11 -0
- package/dist/esm/albo/parser/albo.d.ts +69 -0
- package/dist/esm/albo/parser/albo.d.ts.map +1 -0
- package/dist/esm/albo/parser/albo.js +84 -0
- package/dist/esm/albo/types/albo.d.ts +460 -0
- package/dist/esm/albo/types/albo.d.ts.map +1 -0
- package/dist/esm/albo/types/albo.js +348 -0
- package/dist/esm/albo/types/alboCalendar.d.ts +58 -0
- package/dist/esm/albo/types/alboCalendar.d.ts.map +1 -0
- package/dist/esm/albo/types/alboCalendar.js +48 -0
- package/dist/esm/albo/types/alboCommon.d.ts +52 -0
- package/dist/esm/albo/types/alboCommon.d.ts.map +1 -0
- package/dist/esm/albo/types/alboCommon.js +51 -0
- package/dist/esm/albo/types/alboInformation.d.ts +214 -0
- package/dist/esm/albo/types/alboInformation.d.ts.map +1 -0
- package/dist/esm/albo/types/alboInformation.js +133 -0
- package/dist/esm/albo/types/alboMenu.d.ts +114 -0
- package/dist/esm/albo/types/alboMenu.d.ts.map +1 -0
- package/dist/esm/albo/types/alboMenu.js +89 -0
- package/dist/esm/albo/types/alboQuestionnaire.d.ts +442 -0
- package/dist/esm/albo/types/alboQuestionnaire.d.ts.map +1 -0
- package/dist/esm/albo/types/alboQuestionnaire.js +226 -0
- package/dist/esm/albo/types/alboSharedItem.d.ts +205 -0
- package/dist/esm/albo/types/alboSharedItem.d.ts.map +1 -0
- package/dist/esm/albo/types/alboSharedItem.js +134 -0
- package/dist/esm/albo/types/alboSystem.d.ts +129 -0
- package/dist/esm/albo/types/alboSystem.d.ts.map +1 -0
- package/dist/esm/albo/types/alboSystem.js +100 -0
- package/dist/esm/albo/types/alboUniversalForm.d.ts +63 -0
- package/dist/esm/albo/types/alboUniversalForm.d.ts.map +1 -0
- package/dist/esm/albo/types/alboUniversalForm.js +48 -0
- package/dist/esm/common/dom.d.ts +35 -0
- package/dist/esm/common/dom.d.ts.map +1 -0
- package/dist/esm/common/dom.js +120 -0
- package/dist/esm/common/utils.d.ts +15 -0
- package/dist/esm/common/utils.d.ts.map +1 -0
- package/dist/esm/common/utils.js +22 -0
- package/dist/esm/constants.d.ts +113 -0
- package/dist/esm/constants.d.ts.map +1 -0
- package/dist/esm/constants.js +124 -0
- package/dist/esm/core/request.d.ts +29 -0
- package/dist/esm/core/request.d.ts.map +1 -0
- package/dist/esm/core/request.js +33 -0
- package/dist/esm/cubics/client.d.ts +13 -0
- package/dist/esm/cubics/client.d.ts.map +1 -0
- package/dist/esm/cubics/client.js +45 -0
- package/dist/esm/cubics/index.d.ts +4 -0
- package/dist/esm/cubics/index.d.ts.map +1 -0
- package/dist/esm/cubics/index.js +3 -0
- package/dist/esm/cubics/parser/cubics.d.ts +8 -0
- package/dist/esm/cubics/parser/cubics.d.ts.map +1 -0
- package/dist/esm/cubics/parser/cubics.js +99 -0
- package/dist/esm/cubics/types/cubics.d.ts +94 -0
- package/dist/esm/cubics/types/cubics.d.ts.map +1 -0
- package/dist/esm/cubics/types/cubics.js +87 -0
- package/dist/esm/errors.d.ts +46 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +46 -0
- package/dist/esm/index.d.ts +19 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +25 -0
- package/dist/esm/manabo/client.d.ts +75 -0
- package/dist/esm/manabo/client.d.ts.map +1 -0
- package/dist/esm/manabo/client.js +131 -0
- package/dist/esm/manabo/index.d.ts +12 -0
- package/dist/esm/manabo/index.d.ts.map +1 -0
- package/dist/esm/manabo/index.js +11 -0
- package/dist/esm/manabo/parser/manaboClass.d.ts +9 -0
- package/dist/esm/manabo/parser/manaboClass.d.ts.map +1 -0
- package/dist/esm/manabo/parser/manaboClass.js +377 -0
- package/dist/esm/manabo/parser/manaboEntry.d.ts +8 -0
- package/dist/esm/manabo/parser/manaboEntry.d.ts.map +1 -0
- package/dist/esm/manabo/parser/manaboEntry.js +33 -0
- package/dist/esm/manabo/parser/manaboMail.d.ts +8 -0
- package/dist/esm/manabo/parser/manaboMail.d.ts.map +1 -0
- package/dist/esm/manabo/parser/manaboMail.js +145 -0
- package/dist/esm/manabo/parser/manaboNews.d.ts +7 -0
- package/dist/esm/manabo/parser/manaboNews.d.ts.map +1 -0
- package/dist/esm/manabo/parser/manaboNews.js +22 -0
- package/dist/esm/manabo/parser/manaboTimetable.d.ts +4 -0
- package/dist/esm/manabo/parser/manaboTimetable.d.ts.map +1 -0
- package/dist/esm/manabo/parser/manaboTimetable.js +89 -0
- package/dist/esm/manabo/types/manaboClass.d.ts +294 -0
- package/dist/esm/manabo/types/manaboClass.d.ts.map +1 -0
- package/dist/esm/manabo/types/manaboClass.js +220 -0
- package/dist/esm/manabo/types/manaboEntry.d.ts +24 -0
- package/dist/esm/manabo/types/manaboEntry.d.ts.map +1 -0
- package/dist/esm/manabo/types/manaboEntry.js +40 -0
- package/dist/esm/manabo/types/manaboMail.d.ts +103 -0
- package/dist/esm/manabo/types/manaboMail.d.ts.map +1 -0
- package/dist/esm/manabo/types/manaboMail.js +114 -0
- package/dist/esm/manabo/types/manaboNews.d.ts +15 -0
- package/dist/esm/manabo/types/manaboNews.d.ts.map +1 -0
- package/dist/esm/manabo/types/manaboNews.js +17 -0
- package/dist/esm/manabo/types/manaboTimetable.d.ts +88 -0
- package/dist/esm/manabo/types/manaboTimetable.d.ts.map +1 -0
- package/dist/esm/manabo/types/manaboTimetable.js +76 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/shib/builder.d.ts +154 -0
- package/dist/esm/shib/builder.d.ts.map +1 -0
- package/dist/esm/shib/builder.js +212 -0
- package/dist/esm/shib/index.d.ts +15 -0
- package/dist/esm/shib/index.d.ts.map +1 -0
- package/dist/esm/shib/index.js +14 -0
- package/dist/esm/shib/parser/shibLogin.d.ts +47 -0
- package/dist/esm/shib/parser/shibLogin.d.ts.map +1 -0
- package/dist/esm/shib/parser/shibLogin.js +127 -0
- package/dist/esm/shib/parser/shibUser.d.ts +11 -0
- package/dist/esm/shib/parser/shibUser.d.ts.map +1 -0
- package/dist/esm/shib/parser/shibUser.js +46 -0
- package/dist/esm/shib/types/common.d.ts +20 -0
- package/dist/esm/shib/types/common.d.ts.map +1 -0
- package/dist/esm/shib/types/common.js +1 -0
- package/dist/esm/shib/types/shibLogin.d.ts +62 -0
- package/dist/esm/shib/types/shibLogin.d.ts.map +1 -0
- package/dist/esm/shib/types/shibLogin.js +89 -0
- package/dist/esm/shib/types/shibUser.d.ts +36 -0
- package/dist/esm/shib/types/shibUser.d.ts.map +1 -0
- package/dist/esm/shib/types/shibUser.js +41 -0
- package/dist/esm/transports/fetch.d.ts +36 -0
- package/dist/esm/transports/fetch.d.ts.map +1 -0
- package/dist/esm/transports/fetch.js +80 -0
- package/dist/esm/types.d.ts +71 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +8 -0
- package/package.json +72 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ManaboMailMemberSchema = exports.ManaboMailSendSchema = exports.ManaboMailViewSchema = exports.ManaboSentMailSchema = exports.ManaboSentMailItemSchema = exports.ManaboReceivedMailSchema = exports.ManaboReceivedMailItemSchema = exports.ManaboMailListPageSchema = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
// manabo(MaNaBo)のメール関連ページ(受信/送信一覧・閲覧・作成・宛先候補)のスキーマ群。
|
|
6
|
+
/** 一覧ページのページネーションリンク 1 個 */
|
|
7
|
+
exports.ManaboMailListPageSchema = zod_1.z.object({
|
|
8
|
+
/** リンク表示(ページ番号や "»" など) @example "2" */
|
|
9
|
+
label: zod_1.z.string().meta({ description: "リンク表示(ページ番号や \"»\" など)", example: "2" }),
|
|
10
|
+
/** 遷移先ページ番号 @example "2" */
|
|
11
|
+
page: zod_1.z.string().meta({ description: "遷移先ページ番号", example: "2" }),
|
|
12
|
+
/** 現在表示中のページか @example false */
|
|
13
|
+
active: zod_1.z.boolean().meta({ description: "現在表示中のページか", example: false }),
|
|
14
|
+
});
|
|
15
|
+
/** 受信メール一覧の 1 行 */
|
|
16
|
+
exports.ManaboReceivedMailItemSchema = zod_1.z.object({
|
|
17
|
+
/** メール ID(チェックボックスの value) @example "10001" */
|
|
18
|
+
id: zod_1.z.string().meta({ description: "メール ID(チェックボックスの value)", example: "10001" }),
|
|
19
|
+
/** 件名 @example "レポート提出について" */
|
|
20
|
+
title: zod_1.z.string().meta({ description: "件名", example: "レポート提出について" }),
|
|
21
|
+
/** 状態アイコンの alt(既読/未読等。無ければ null) @example "未読" */
|
|
22
|
+
statusIconAlt: zod_1.z.string().nullable().meta({ description: "状態アイコンの alt(既読/未読等)", example: "未読" }),
|
|
23
|
+
/** 状態アイコンの src(mail_read.png=既読 / mail.png=未読 等) @example "/common/images/icons/mail.png" */
|
|
24
|
+
statusIconSrc: zod_1.z.string().nullable().meta({ description: "状態アイコンの src", example: "/common/images/icons/mail.png" }),
|
|
25
|
+
/** 本文を開くリンク(多くは "#"。実体は id で開く。無ければ null) @example "#" */
|
|
26
|
+
mailLink: zod_1.z.string().nullable().meta({ description: "本文を開くリンク", example: "#" }),
|
|
27
|
+
/** 送信者名(無ければ null) @example "中京 一郎" */
|
|
28
|
+
senderName: zod_1.z.string().nullable().meta({ description: "送信者名", example: "中京 一郎" }),
|
|
29
|
+
/** 送信者アイコン画像 URL(無ければ null) @example "/common/images/icons/user.png" */
|
|
30
|
+
senderImage: zod_1.z.string().nullable().meta({ description: "送信者アイコン画像 URL", example: "/common/images/icons/user.png" }),
|
|
31
|
+
/** 受信日時(例: "2025年6月20日(金) 19:27") @example "2025年6月20日(金) 19:27" */
|
|
32
|
+
receivedAt: zod_1.z.string().meta({ description: "受信日時", example: "2025年6月20日(金) 19:27" }),
|
|
33
|
+
});
|
|
34
|
+
/** 受信メール一覧ページ全体 */
|
|
35
|
+
exports.ManaboReceivedMailSchema = zod_1.z.object({
|
|
36
|
+
/** 件数概要(例: "139件中 1 〜 30件"。無ければ null) @example "139件中 1 〜 30件" */
|
|
37
|
+
summary: zod_1.z.string().nullable().meta({ description: "件数概要", example: "139件中 1 〜 30件" }),
|
|
38
|
+
/** ページネーション */
|
|
39
|
+
pages: zod_1.z.array(exports.ManaboMailListPageSchema).meta({ description: "ページネーション" }),
|
|
40
|
+
/** 受信メール行 */
|
|
41
|
+
mails: zod_1.z.array(exports.ManaboReceivedMailItemSchema).meta({ description: "受信メール行" }),
|
|
42
|
+
});
|
|
43
|
+
/** 送信メール一覧の 1 行 */
|
|
44
|
+
exports.ManaboSentMailItemSchema = zod_1.z.object({
|
|
45
|
+
/** メール ID(チェックボックスの value) @example "20001" */
|
|
46
|
+
id: zod_1.z.string().meta({ description: "メール ID(チェックボックスの value)", example: "20001" }),
|
|
47
|
+
/** 件名 @example "質問の返信です" */
|
|
48
|
+
title: zod_1.z.string().meta({ description: "件名", example: "質問の返信です" }),
|
|
49
|
+
/** 状態アイコンの alt(無ければ null) @example "既読" */
|
|
50
|
+
statusIconAlt: zod_1.z.string().nullable().meta({ description: "状態アイコンの alt", example: "既読" }),
|
|
51
|
+
/** 状態アイコンの src @example "/common/images/icons/mail_read.png" */
|
|
52
|
+
statusIconSrc: zod_1.z.string().nullable().meta({ description: "状態アイコンの src", example: "/common/images/icons/mail_read.png" }),
|
|
53
|
+
/** 本文を開くリンク(多くは "#"。無ければ null) @example "#" */
|
|
54
|
+
mailLink: zod_1.z.string().nullable().meta({ description: "本文を開くリンク", example: "#" }),
|
|
55
|
+
/** 宛先名(無ければ null) @example "田中太郎" */
|
|
56
|
+
recipientName: zod_1.z.string().nullable().meta({ description: "宛先名", example: "田中太郎" }),
|
|
57
|
+
/** 宛先アイコン画像 URL(無ければ null) @example "/common/images/icons/user.png" */
|
|
58
|
+
recipientImage: zod_1.z.string().nullable().meta({ description: "宛先アイコン画像 URL", example: "/common/images/icons/user.png" }),
|
|
59
|
+
/** 送信日時 @example "2025年6月20日(金) 19:27" */
|
|
60
|
+
sentAt: zod_1.z.string().meta({ description: "送信日時", example: "2025年6月20日(金) 19:27" }),
|
|
61
|
+
/** 未読人数(宛先のうち未読の数) @example 0 */
|
|
62
|
+
unreadCount: zod_1.z.number().meta({ description: "未読人数(宛先のうち未読の数)", example: 0 }),
|
|
63
|
+
});
|
|
64
|
+
/** 送信メール一覧ページ全体 */
|
|
65
|
+
exports.ManaboSentMailSchema = zod_1.z.object({
|
|
66
|
+
/** 件数概要(例: "8件中 1 〜 8件"。無ければ null) @example "8件中 1 〜 8件" */
|
|
67
|
+
summary: zod_1.z.string().nullable().meta({ description: "件数概要", example: "8件中 1 〜 8件" }),
|
|
68
|
+
/** 送信メール行 */
|
|
69
|
+
mails: zod_1.z.array(exports.ManaboSentMailItemSchema).meta({ description: "送信メール行" }),
|
|
70
|
+
});
|
|
71
|
+
/** メール本文閲覧モーダル */
|
|
72
|
+
exports.ManaboMailViewSchema = zod_1.z.object({
|
|
73
|
+
/** 件名 @example "レポート提出について" */
|
|
74
|
+
title: zod_1.z.string().meta({ description: "件名", example: "レポート提出について" }),
|
|
75
|
+
/** 返信先メール ID(返信ボタンの reply_mail_id。無ければ null) @example "10001" */
|
|
76
|
+
replyMailId: zod_1.z.string().nullable().meta({ description: "返信先メール ID", example: "10001" }),
|
|
77
|
+
/** 送信者のメンバー ID(返信ボタンの from_member_id。無ければ null) @example "T000000" */
|
|
78
|
+
fromMemberId: zod_1.z.string().nullable().meta({ description: "送信者のメンバー ID", example: "T000000" }),
|
|
79
|
+
/** 「次へ」で開くメール ID(無ければ null) @example "10002" */
|
|
80
|
+
nextMailId: zod_1.z.string().nullable().meta({ description: "「次へ」で開くメール ID", example: "10002" }),
|
|
81
|
+
/** 送信者名 @example "中京 一郎" */
|
|
82
|
+
senderName: zod_1.z.string().meta({ description: "送信者名", example: "中京 一郎" }),
|
|
83
|
+
/** 送信者アイコン画像 URL(無ければ null) @example "/common/images/icons/user.png" */
|
|
84
|
+
senderImage: zod_1.z.string().nullable().meta({ description: "送信者アイコン画像 URL", example: "/common/images/icons/user.png" }),
|
|
85
|
+
/** 送信日時 @example "2025年6月20日(金) 19:27" */
|
|
86
|
+
sentAt: zod_1.z.string().meta({ description: "送信日時", example: "2025年6月20日(金) 19:27" }),
|
|
87
|
+
/** 本文(HTML) @example "<p>提出をお願いします。</p>" */
|
|
88
|
+
bodyHtml: zod_1.z.string().meta({ description: "本文(HTML)", example: "<p>提出をお願いします。</p>" }),
|
|
89
|
+
});
|
|
90
|
+
/** メール作成モーダル(送信フォーム) */
|
|
91
|
+
exports.ManaboMailSendSchema = zod_1.z.object({
|
|
92
|
+
/** モーダルのタイトル(例: "メール作成") @example "メール作成" */
|
|
93
|
+
modalTitle: zod_1.z.string().meta({ description: "モーダルのタイトル", example: "メール作成" }),
|
|
94
|
+
form: zod_1.z.object({
|
|
95
|
+
/** フォームの action 値 @example "mail_send" */
|
|
96
|
+
action: zod_1.z.string().meta({ description: "フォームの action 値", example: "mail_send" }),
|
|
97
|
+
/** 返信元メール ID(新規作成時は空。無ければ null) @example null */
|
|
98
|
+
replyMailId: zod_1.z.string().nullable().meta({ description: "返信元メール ID", example: null }),
|
|
99
|
+
/** 署名(無ければ null) @example "中京 一郎" */
|
|
100
|
+
signature: zod_1.z.string().nullable().meta({ description: "署名", example: "中京 一郎" }),
|
|
101
|
+
/** CSRF トークン @example "00000000000000000000000000000000" */
|
|
102
|
+
csrfToken: zod_1.z.string().meta({ description: "CSRF トークン", example: "00000000000000000000000000000000" }),
|
|
103
|
+
}).meta({ description: "送信フォームの内容" }),
|
|
104
|
+
/** 送信ボタンのラベル(例: "送信") @example "送信" */
|
|
105
|
+
submitLabel: zod_1.z.string().meta({ description: "送信ボタンのラベル", example: "送信" }),
|
|
106
|
+
});
|
|
107
|
+
/** メール宛先の候補メンバー一覧 */
|
|
108
|
+
exports.ManaboMailMemberSchema = zod_1.z.object({
|
|
109
|
+
members: zod_1.z.array(zod_1.z.object({
|
|
110
|
+
/** メンバー ID @example "T000000" */
|
|
111
|
+
memberId: zod_1.z.string().meta({ description: "メンバー ID", example: "T000000" }),
|
|
112
|
+
/** メンバー名 @example "田中太郎" */
|
|
113
|
+
name: zod_1.z.string().meta({ description: "メンバー名", example: "田中太郎" }),
|
|
114
|
+
/** アイコン画像 URL(無ければ null) @example "/common/images/icons/user.png" */
|
|
115
|
+
image: zod_1.z.string().nullable().meta({ description: "アイコン画像 URL", example: "/common/images/icons/user.png" }),
|
|
116
|
+
})).meta({ description: "宛先候補メンバー一覧" }),
|
|
117
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ManaboNewsSchema = exports.ManaboNewsItemSchema = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
// manabo のシステムお知らせ(トップの「お知らせ」テーブル)スキーマ。
|
|
6
|
+
/** お知らせ 1 行(リンクを含む項目) */
|
|
7
|
+
exports.ManaboNewsItemSchema = zod_1.z.object({
|
|
8
|
+
/** 行のテキスト(リンク文言を含む 1 件分の内容) @example "システムメンテナンスのお知らせ" */
|
|
9
|
+
text: zod_1.z.string().meta({ description: "行のテキスト", example: "システムメンテナンスのお知らせ" }),
|
|
10
|
+
});
|
|
11
|
+
/** システムお知らせ一覧 */
|
|
12
|
+
exports.ManaboNewsSchema = zod_1.z.object({
|
|
13
|
+
/** 案内メッセージ(項目がある場合は null) @example "現在システムからのお知らせはありません" */
|
|
14
|
+
message: zod_1.z
|
|
15
|
+
.string()
|
|
16
|
+
.nullable()
|
|
17
|
+
.meta({ description: "案内メッセージ(項目がある場合は null)", example: "現在システムからのお知らせはありません" }),
|
|
18
|
+
/** お知らせ項目(リンクを持つ行)。無ければ空配列 */
|
|
19
|
+
items: zod_1.z.array(exports.ManaboNewsItemSchema).meta({ description: "お知らせ項目" }),
|
|
20
|
+
});
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ManaboTimetableSchema = exports.ManaboTimetableViewModeSchema = exports.ManaboTimetableTermSchema = exports.ManaboTimetablePeriodSchema = exports.ManaboTimetableOtherClassSchema = exports.ManaboTimetableSlotSchema = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
// manabo の時間割ページ(週グリッド + 「上記以外のクラス」テーブル)スキーマ。
|
|
6
|
+
/** 時間割グリッドの 1 コマ(曜日×時限)。空きコマは className/teacher/href が null */
|
|
7
|
+
exports.ManaboTimetableSlotSchema = zod_1.z.object({
|
|
8
|
+
/** この列の曜日(空きコマでも列の曜日は入る) @example "月" */
|
|
9
|
+
day: zod_1.z.string().meta({ description: "曜日", example: "月" }),
|
|
10
|
+
/** 授業名(空きコマは null) @example "情報リテラシー" */
|
|
11
|
+
className: zod_1.z.string().nullable().meta({ description: "授業名", example: "情報リテラシー" }),
|
|
12
|
+
/** 担当教員(空きコマは null) @example "中京 一郎" */
|
|
13
|
+
teacher: zod_1.z.string().nullable().meta({ description: "担当教員", example: "中京 一郎" }),
|
|
14
|
+
/** クラスページへのリンク @example "/class/85146/" */
|
|
15
|
+
href: zod_1.z.string().nullable().meta({ description: "クラスページへのリンク", example: "/class/85146/" }),
|
|
16
|
+
/** 未読/新着コンテンツの「NEW」バッジが付いているか @example false */
|
|
17
|
+
isNew: zod_1.z.boolean().meta({ description: "「NEW」バッジが付いているか", example: false }),
|
|
18
|
+
/** 「NEW」バッジのリンク先(無ければ null) @example null */
|
|
19
|
+
newContentHref: zod_1.z.string().nullable().meta({ description: "「NEW」バッジのリンク先", example: null }),
|
|
20
|
+
});
|
|
21
|
+
/** 「上記以外のクラス(A,B,C限含む)」テーブルの各行 */
|
|
22
|
+
exports.ManaboTimetableOtherClassSchema = zod_1.z.object({
|
|
23
|
+
/** 授業名 @example "キャリアデザイン" */
|
|
24
|
+
className: zod_1.z.string().meta({ description: "授業名", example: "キャリアデザイン" }),
|
|
25
|
+
/** クラスページへのリンク @example "/class/90001/" */
|
|
26
|
+
href: zod_1.z.string().nullable().meta({ description: "クラスページへのリンク", example: "/class/90001/" }),
|
|
27
|
+
/** 曜日/時限(掲載が無い場合は null) @example "集中" */
|
|
28
|
+
dayPeriod: zod_1.z.string().nullable().meta({ description: "曜日/時限", example: "集中" }),
|
|
29
|
+
/** 教員名(掲載が無い場合は null) @example "中京 花子" */
|
|
30
|
+
teacher: zod_1.z.string().nullable().meta({ description: "教員名", example: "中京 花子" }),
|
|
31
|
+
/** 教室(掲載が無い場合は null) @example "0号館5F" */
|
|
32
|
+
classroom: zod_1.z.string().nullable().meta({ description: "教室", example: "0号館5F" }),
|
|
33
|
+
/** 「NEW」バッジが付いているか @example false */
|
|
34
|
+
isNew: zod_1.z.boolean().meta({ description: "「NEW」バッジが付いているか", example: false }),
|
|
35
|
+
/** 「NEW」バッジのリンク先(無ければ null) @example null */
|
|
36
|
+
newContentHref: zod_1.z.string().nullable().meta({ description: "「NEW」バッジのリンク先", example: null }),
|
|
37
|
+
});
|
|
38
|
+
/** 1 時限分の行(時限ラベルと曜日順のスロット) */
|
|
39
|
+
exports.ManaboTimetablePeriodSchema = zod_1.z.object({
|
|
40
|
+
/** 時限ラベル @example "1" */
|
|
41
|
+
period: zod_1.z.string().meta({ description: "時限ラベル", example: "1" }),
|
|
42
|
+
/** 曜日順のスロット(days と同じ並び) */
|
|
43
|
+
slots: zod_1.z.array(exports.ManaboTimetableSlotSchema).meta({ description: "曜日順のスロット" }),
|
|
44
|
+
});
|
|
45
|
+
/** 学期切り替えタブ(過去分含む) */
|
|
46
|
+
exports.ManaboTimetableTermSchema = zod_1.z.object({
|
|
47
|
+
/** 時間割アーカイブ ID @example "12345" */
|
|
48
|
+
archiveId: zod_1.z.string().meta({ description: "時間割アーカイブ ID", example: "12345" }),
|
|
49
|
+
/** 表示ラベル @example "2025 春学期" */
|
|
50
|
+
label: zod_1.z.string().meta({ description: "表示ラベル", example: "2025 春学期" }),
|
|
51
|
+
/** 現在選択中か @example true */
|
|
52
|
+
active: zod_1.z.boolean().meta({ description: "現在選択中か", example: true }),
|
|
53
|
+
});
|
|
54
|
+
/** 表示モード切り替え(時間割/一覧) */
|
|
55
|
+
exports.ManaboTimetableViewModeSchema = zod_1.z.object({
|
|
56
|
+
/** 時間割アーカイブ ID @example "12345" */
|
|
57
|
+
archiveId: zod_1.z.string().meta({ description: "時間割アーカイブ ID", example: "12345" }),
|
|
58
|
+
/** 表示モード(既定表示は null) @example "list" */
|
|
59
|
+
mode: zod_1.z.string().nullable().meta({ description: "表示モード", example: "list" }),
|
|
60
|
+
/** 表示ラベル @example "一覧" */
|
|
61
|
+
label: zod_1.z.string().meta({ description: "表示ラベル", example: "一覧" }),
|
|
62
|
+
/** 現在選択中か @example false */
|
|
63
|
+
active: zod_1.z.boolean().meta({ description: "現在選択中か", example: false }),
|
|
64
|
+
});
|
|
65
|
+
/** 時間割ページ全体 */
|
|
66
|
+
exports.ManaboTimetableSchema = zod_1.z.object({
|
|
67
|
+
/** ページ見出し(現在の学期名) @example "2025 春学期" */
|
|
68
|
+
title: zod_1.z.string().meta({ description: "ページ見出し(現在の学期名)", example: "2025 春学期" }),
|
|
69
|
+
/** 学期切り替えタブ一覧 */
|
|
70
|
+
terms: zod_1.z.array(exports.ManaboTimetableTermSchema).meta({ description: "学期切り替えタブ一覧" }),
|
|
71
|
+
/** 表示モード切り替え一覧 */
|
|
72
|
+
viewModes: zod_1.z.array(exports.ManaboTimetableViewModeSchema).meta({ description: "表示モード切り替え一覧" }),
|
|
73
|
+
/** 曜日ヘッダ @example ["月","火","水","木","金","土"] */
|
|
74
|
+
days: zod_1.z.array(zod_1.z.string()).meta({ description: "曜日ヘッダ", example: ["月", "火", "水", "木", "金", "土"] }),
|
|
75
|
+
/** 時限ごとの行 */
|
|
76
|
+
periods: zod_1.z.array(exports.ManaboTimetablePeriodSchema).meta({ description: "時限ごとの行" }),
|
|
77
|
+
/** 「上記以外のクラス」テーブル(無い場合は空配列) */
|
|
78
|
+
otherClasses: zod_1.z.array(exports.ManaboTimetableOtherClassSchema).meta({ description: "上記以外のクラス" }),
|
|
79
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildInputTemporaryOtpRequest = exports.buildInputOtpForPCCheckRequest = exports.buildDisplayInstallAppliLinkCheckRequest = exports.buildInputTemporaryOtpCheckRequest = exports.buildInputMailAddresCheckRequest = exports.buildSelectAuthTypeCheckRequest = exports.buildFido2DeviceDelEndRequest = exports.buildFido2DeviceDeleteSelectRequest = exports.buildFido2DeviceListRequest = exports.buildFido2DeviceAddEndRequest = exports.buildUserWebauthnRequest = exports.buildUserWebauthnStartRegistrationRequest = exports.buildFido2DeviceAddRequest = exports.buildLogoutRequest = exports.buildTimeZoneLangEndRequest = exports.buildMenuSelectRequest = exports.buildSamlAcsRequest = exports.buildWebauthnRequest = exports.buildWebauthnStartAuthenticationRequest = exports.buildPasskeyLoginRequest = exports.buildOtpLoginRequest = exports.buildPasswordLoginRequest = exports.buildCheckTypeRequest = exports.buildLoginEntryRequest = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Shibboleth 認証フローの各ステップの「リクエスト記述子」を組み立てるビルダ群。
|
|
6
|
+
*
|
|
7
|
+
* すべて純関数で、{@link ShibRequest}(method / url / headers / body)を返すだけ。
|
|
8
|
+
* 実際の送信・Cookie 管理・リダイレクト追従・パスキー暗号処理は呼び出し側が行う。
|
|
9
|
+
* WebAuthn の finish 系はボディの暗号処理を伴うため、呼び出し側が構築したボディを
|
|
10
|
+
* そのままラップする({@link buildWebauthnRequest} / {@link buildUserWebauthnRequest})。
|
|
11
|
+
*/
|
|
12
|
+
const constants_1 = require("../constants");
|
|
13
|
+
const utils_1 = require("../common/utils");
|
|
14
|
+
const FORM_CONTENT_TYPE = "application/x-www-form-urlencoded";
|
|
15
|
+
const JSON_CONTENT_TYPE = "application/json";
|
|
16
|
+
const formHeaders = (withOrigin) => ({
|
|
17
|
+
"Content-Type": FORM_CONTENT_TYPE,
|
|
18
|
+
...(withOrigin ? { Origin: constants_1.SHIB_URLS.origin } : {}),
|
|
19
|
+
});
|
|
20
|
+
const jsonHeaders = () => ({
|
|
21
|
+
"Content-Type": JSON_CONTENT_TYPE,
|
|
22
|
+
Origin: constants_1.SHIB_URLS.origin,
|
|
23
|
+
});
|
|
24
|
+
/** form-urlencoded な POST リクエスト記述子を組み立てる。 */
|
|
25
|
+
const formRequest = (url, params, withOrigin = true) => ({
|
|
26
|
+
method: "POST",
|
|
27
|
+
url,
|
|
28
|
+
headers: formHeaders(withOrigin),
|
|
29
|
+
body: (0, utils_1.formEncode)(params),
|
|
30
|
+
});
|
|
31
|
+
/** JSON な POST リクエスト記述子を組み立てる。 */
|
|
32
|
+
const jsonRequest = (url, body) => ({
|
|
33
|
+
method: "POST",
|
|
34
|
+
url,
|
|
35
|
+
headers: jsonHeaders(),
|
|
36
|
+
body: JSON.stringify(body),
|
|
37
|
+
});
|
|
38
|
+
const boolStr = (value) => (value ? "true" : "false");
|
|
39
|
+
// ============================================
|
|
40
|
+
// ログインフロー
|
|
41
|
+
// ============================================
|
|
42
|
+
/**
|
|
43
|
+
* ログイン起点への GET。`enterUrl`(サービスの SP ログイン URL、または
|
|
44
|
+
* {@link SHIB_URLS.clspSamlLogin})から 302 連鎖で loginuserpass ページへ到達する。
|
|
45
|
+
* リダイレクト追従は呼び出し側が行う。
|
|
46
|
+
*/
|
|
47
|
+
const buildLoginEntryRequest = (enterUrl) => ({
|
|
48
|
+
method: "GET",
|
|
49
|
+
url: enterUrl,
|
|
50
|
+
headers: {},
|
|
51
|
+
});
|
|
52
|
+
exports.buildLoginEntryRequest = buildLoginEntryRequest;
|
|
53
|
+
/** `checktype.php`:利用可能な認証方式を問い合わせる。 */
|
|
54
|
+
const buildCheckTypeRequest = (input) => jsonRequest(constants_1.SHIB_URLS.checktype, {
|
|
55
|
+
AuthState: input.authState,
|
|
56
|
+
params: { username: input.username, UserAgent: input.userAgent },
|
|
57
|
+
});
|
|
58
|
+
exports.buildCheckTypeRequest = buildCheckTypeRequest;
|
|
59
|
+
/** `loginuserpass.php`:パスワード認証(authtype=0)。 */
|
|
60
|
+
const buildPasswordLoginRequest = (input) => formRequest(constants_1.SHIB_URLS.cloudlinkLoginForm, {
|
|
61
|
+
authtype: "0",
|
|
62
|
+
login_exec: "1",
|
|
63
|
+
username: input.username,
|
|
64
|
+
password: input.password,
|
|
65
|
+
AuthState: input.authState,
|
|
66
|
+
});
|
|
67
|
+
exports.buildPasswordLoginRequest = buildPasswordLoginRequest;
|
|
68
|
+
/** `loginuserpass.php`:OTP 認証(authtype=2)。`resend=1` で再送。 */
|
|
69
|
+
const buildOtpLoginRequest = (input) => formRequest(constants_1.SHIB_URLS.cloudlinkLoginForm, {
|
|
70
|
+
authtype: "2",
|
|
71
|
+
resend: input.resend ? "1" : "0",
|
|
72
|
+
login_exec: "1",
|
|
73
|
+
username: input.username,
|
|
74
|
+
password: input.otp,
|
|
75
|
+
AuthState: input.authState,
|
|
76
|
+
});
|
|
77
|
+
exports.buildOtpLoginRequest = buildOtpLoginRequest;
|
|
78
|
+
/** `loginuserpass.php`:パスキー認証(authtype=3)。 */
|
|
79
|
+
const buildPasskeyLoginRequest = (input) => formRequest(constants_1.SHIB_URLS.cloudlinkLoginForm, {
|
|
80
|
+
authtype: "3",
|
|
81
|
+
login_exec: "1",
|
|
82
|
+
username: input.username,
|
|
83
|
+
password: input.password,
|
|
84
|
+
AuthState: input.authState,
|
|
85
|
+
credentialid: input.credentialId,
|
|
86
|
+
});
|
|
87
|
+
exports.buildPasskeyLoginRequest = buildPasskeyLoginRequest;
|
|
88
|
+
/**
|
|
89
|
+
* ログインフロー用 `webauthn.php`(start-authentication)のボディを組み立てる。
|
|
90
|
+
* challenge 取得用。finish-authentication は署名を伴うため {@link buildWebauthnRequest} を使う。
|
|
91
|
+
*/
|
|
92
|
+
const buildWebauthnStartAuthenticationRequest = (input) => jsonRequest(constants_1.SHIB_URLS.webauthn, {
|
|
93
|
+
method: "start-authentication",
|
|
94
|
+
sessioninfo: { AuthState: input.authState },
|
|
95
|
+
params: { username: input.username, browserInfo: input.browserInfo },
|
|
96
|
+
});
|
|
97
|
+
exports.buildWebauthnStartAuthenticationRequest = buildWebauthnStartAuthenticationRequest;
|
|
98
|
+
/**
|
|
99
|
+
* ログインフロー用 `webauthn.php` に任意のボディを送る(finish-authentication 等)。
|
|
100
|
+
* ボディ(アサーション署名を含む)は呼び出し側が構築する。SDK は署名しない。
|
|
101
|
+
*/
|
|
102
|
+
const buildWebauthnRequest = (body) => jsonRequest(constants_1.SHIB_URLS.webauthn, body);
|
|
103
|
+
exports.buildWebauthnRequest = buildWebauthnRequest;
|
|
104
|
+
/** `clsp/saml/acs`:SAML 自動 POST。応答は 303 連鎖でサービス Cookie を確立する(追従は呼び出し側)。 */
|
|
105
|
+
const buildSamlAcsRequest = (input) => formRequest(input.action, { SAMLResponse: input.samlResponse, RelayState: input.relayState }, false);
|
|
106
|
+
exports.buildSamlAcsRequest = buildSamlAcsRequest;
|
|
107
|
+
// ============================================
|
|
108
|
+
// ACE User ポータル:共通
|
|
109
|
+
// ============================================
|
|
110
|
+
/** `User/MenuSelect`:メニュー選択(type 例: "U25-001" デバイス管理 / "U23-001" OTP)。 */
|
|
111
|
+
const buildMenuSelectRequest = (input) => formRequest(constants_1.SHIB_URLS.userMenuSelect, {
|
|
112
|
+
ACEUSER_CSRFTOKEN: input.csrfToken,
|
|
113
|
+
type: input.type,
|
|
114
|
+
});
|
|
115
|
+
exports.buildMenuSelectRequest = buildMenuSelectRequest;
|
|
116
|
+
/** `User/TimeZoneLangEnd`:タイムゾーン・言語設定。 */
|
|
117
|
+
const buildTimeZoneLangEndRequest = (input) => formRequest(constants_1.SHIB_URLS.userTimeZoneLangEnd, {
|
|
118
|
+
ACEUSER_CSRFTOKEN: input.csrfToken,
|
|
119
|
+
userTimeZone: input.userTimeZone,
|
|
120
|
+
userLanguage: input.userLanguage,
|
|
121
|
+
procchk: input.procchk ?? "",
|
|
122
|
+
});
|
|
123
|
+
exports.buildTimeZoneLangEndRequest = buildTimeZoneLangEndRequest;
|
|
124
|
+
/** `User/Logout`:ログアウト(応答は SLO 連鎖の起点。追従は呼び出し側)。 */
|
|
125
|
+
const buildLogoutRequest = (input) => formRequest(constants_1.SHIB_URLS.userLogout, { ACEUSER_CSRFTOKEN: input.csrfToken });
|
|
126
|
+
exports.buildLogoutRequest = buildLogoutRequest;
|
|
127
|
+
// ============================================
|
|
128
|
+
// ACE User ポータル:パスキー登録・管理
|
|
129
|
+
// ============================================
|
|
130
|
+
/** `User/Fido2DeviceAdd`:認証器追加ページ(procchk を 2 回送る実挙動を再現)。 */
|
|
131
|
+
const buildFido2DeviceAddRequest = (input) => ({
|
|
132
|
+
method: "POST",
|
|
133
|
+
url: constants_1.SHIB_URLS.userFido2DeviceAdd,
|
|
134
|
+
headers: formHeaders(true),
|
|
135
|
+
// 生 HAR のキー順(CSRF, procchk, procchk, username)と空値を忠実に再現する。
|
|
136
|
+
body: (0, utils_1.formEncodeArray)([
|
|
137
|
+
["ACEUSER_CSRFTOKEN", input.csrfToken],
|
|
138
|
+
["procchk", ""],
|
|
139
|
+
["procchk", ""],
|
|
140
|
+
["username", input.username],
|
|
141
|
+
]),
|
|
142
|
+
});
|
|
143
|
+
exports.buildFido2DeviceAddRequest = buildFido2DeviceAddRequest;
|
|
144
|
+
/** `User/webauthn`(start-registration):登録チャレンジ取得用ボディを組み立てる。 */
|
|
145
|
+
const buildUserWebauthnStartRegistrationRequest = (input) => jsonRequest(constants_1.SHIB_URLS.userWebauthn, {
|
|
146
|
+
method: "start-registration",
|
|
147
|
+
sessioninfo: {},
|
|
148
|
+
params: { username: input.username, displayName: input.displayName, browserInfo: input.browserInfo },
|
|
149
|
+
});
|
|
150
|
+
exports.buildUserWebauthnStartRegistrationRequest = buildUserWebauthnStartRegistrationRequest;
|
|
151
|
+
/**
|
|
152
|
+
* `User/webauthn` に任意のボディを送る(finish-registration 等)。
|
|
153
|
+
* attestation を含むボディは呼び出し側が構築する。SDK は鍵生成・署名をしない。
|
|
154
|
+
*/
|
|
155
|
+
const buildUserWebauthnRequest = (body) => jsonRequest(constants_1.SHIB_URLS.userWebauthn, body);
|
|
156
|
+
exports.buildUserWebauthnRequest = buildUserWebauthnRequest;
|
|
157
|
+
/** `User/Fido2DeviceAddEnd`:認証器追加の完了。 */
|
|
158
|
+
const buildFido2DeviceAddEndRequest = (input) => formRequest(constants_1.SHIB_URLS.userFido2DeviceAddEnd, {
|
|
159
|
+
ACEUSER_CSRFTOKEN: input.csrfToken,
|
|
160
|
+
username: input.username,
|
|
161
|
+
errorMessage: input.errorMessage ?? "",
|
|
162
|
+
displayName: input.displayName,
|
|
163
|
+
procchk: input.procchk ?? "",
|
|
164
|
+
});
|
|
165
|
+
exports.buildFido2DeviceAddEndRequest = buildFido2DeviceAddEndRequest;
|
|
166
|
+
/** `User/Fido2DeviceList`:登録済み認証器の一覧を取得する。 */
|
|
167
|
+
const buildFido2DeviceListRequest = (input) => formRequest(constants_1.SHIB_URLS.userFido2DeviceList, { ACEUSER_CSRFTOKEN: input.csrfToken });
|
|
168
|
+
exports.buildFido2DeviceListRequest = buildFido2DeviceListRequest;
|
|
169
|
+
/**
|
|
170
|
+
* `User/Fido2DeviceList`(funcSelect=del):削除対象を選択して確認ページへ進む。
|
|
171
|
+
* 応答の確認ページから procchk を取り出し、{@link buildFido2DeviceDelEndRequest} に渡す。
|
|
172
|
+
*/
|
|
173
|
+
const buildFido2DeviceDeleteSelectRequest = (input) => formRequest(constants_1.SHIB_URLS.userFido2DeviceList, {
|
|
174
|
+
ACEUSER_CSRFTOKEN: input.csrfToken,
|
|
175
|
+
funcSelect: "del",
|
|
176
|
+
viewListSelect: "on",
|
|
177
|
+
selectedId: String(input.index),
|
|
178
|
+
selectedNmId: input.credentialId,
|
|
179
|
+
selectedIndexesId: String(input.index),
|
|
180
|
+
selectedIndexesNmId: input.credentialId,
|
|
181
|
+
lastSortedColumn: "-1,null",
|
|
182
|
+
allCheckFlg: "false",
|
|
183
|
+
resultCounts: String(input.resultCounts ?? 1),
|
|
184
|
+
buttonName: "del",
|
|
185
|
+
isBack: "N",
|
|
186
|
+
indexNums: "",
|
|
187
|
+
});
|
|
188
|
+
exports.buildFido2DeviceDeleteSelectRequest = buildFido2DeviceDeleteSelectRequest;
|
|
189
|
+
/** `User/Fido2DeviceDelEnd`:認証器削除の完了。 */
|
|
190
|
+
const buildFido2DeviceDelEndRequest = (input) => formRequest(constants_1.SHIB_URLS.userFido2DeviceDelEnd, {
|
|
191
|
+
ACEUSER_CSRFTOKEN: input.csrfToken,
|
|
192
|
+
checkedNames: input.checkedNames,
|
|
193
|
+
checkedKeys: input.checkedKeys,
|
|
194
|
+
procchk: input.procchk,
|
|
195
|
+
});
|
|
196
|
+
exports.buildFido2DeviceDelEndRequest = buildFido2DeviceDelEndRequest;
|
|
197
|
+
// ============================================
|
|
198
|
+
// ACE User ポータル:OTP 登録
|
|
199
|
+
// ============================================
|
|
200
|
+
/** `User/SelectAuthTypeCheck`:認証方式選択(例: selectAuthType="smartApp")。 */
|
|
201
|
+
const buildSelectAuthTypeCheckRequest = (input) => formRequest(constants_1.SHIB_URLS.userSelectAuthTypeCheck, {
|
|
202
|
+
ACEUSER_CSRFTOKEN: input.csrfToken,
|
|
203
|
+
selectAuthType: input.selectAuthType,
|
|
204
|
+
procchk: input.procchk ?? "",
|
|
205
|
+
isOnOff: input.isOnOff ?? "on",
|
|
206
|
+
isMailFlg: boolStr(input.isMailFlg ?? false),
|
|
207
|
+
});
|
|
208
|
+
exports.buildSelectAuthTypeCheckRequest = buildSelectAuthTypeCheckRequest;
|
|
209
|
+
/** `User/InputMailAddresCheck`:OTP 用メールアドレス入力チェック。 */
|
|
210
|
+
const buildInputMailAddresCheckRequest = (input) => formRequest(constants_1.SHIB_URLS.userInputMailAddresCheck, {
|
|
211
|
+
ACEUSER_CSRFTOKEN: input.csrfToken,
|
|
212
|
+
mailFlg: boolStr(input.mailFlg ?? false),
|
|
213
|
+
mailaddress: input.mailaddress,
|
|
214
|
+
});
|
|
215
|
+
exports.buildInputMailAddresCheckRequest = buildInputMailAddresCheckRequest;
|
|
216
|
+
/** `User/InputTemporaryOtpCheck`:仮 OTP 入力チェック。 */
|
|
217
|
+
const buildInputTemporaryOtpCheckRequest = (input) => formRequest(constants_1.SHIB_URLS.userInputTemporaryOtpCheck, {
|
|
218
|
+
ACEUSER_CSRFTOKEN: input.csrfToken,
|
|
219
|
+
agentType: input.agentType ?? "-1",
|
|
220
|
+
mailFlg: boolStr(input.mailFlg ?? false),
|
|
221
|
+
appnumber: input.appnumber,
|
|
222
|
+
});
|
|
223
|
+
exports.buildInputTemporaryOtpCheckRequest = buildInputTemporaryOtpCheckRequest;
|
|
224
|
+
/** `User/DisplayInstallAppliLinkCheck`:アプリインストール導線表示チェック。 */
|
|
225
|
+
const buildDisplayInstallAppliLinkCheckRequest = (input) => formRequest(constants_1.SHIB_URLS.userDisplayInstallAppliLinkCheck, { ACEUSER_CSRFTOKEN: input.csrfToken });
|
|
226
|
+
exports.buildDisplayInstallAppliLinkCheckRequest = buildDisplayInstallAppliLinkCheckRequest;
|
|
227
|
+
/** `User/InputOtpForPCCheck`:PC 用 OTP 入力チェック。 */
|
|
228
|
+
const buildInputOtpForPCCheckRequest = (input) => formRequest(constants_1.SHIB_URLS.userInputOtpForPCCheck, {
|
|
229
|
+
ACEUSER_CSRFTOKEN: input.csrfToken,
|
|
230
|
+
appnumber: input.appnumber,
|
|
231
|
+
});
|
|
232
|
+
exports.buildInputOtpForPCCheckRequest = buildInputOtpForPCCheckRequest;
|
|
233
|
+
/** `User/InputTemporaryOtp`:仮 OTP 入力。 */
|
|
234
|
+
const buildInputTemporaryOtpRequest = (input) => formRequest(constants_1.SHIB_URLS.userInputTemporaryOtp, {
|
|
235
|
+
ACEUSER_CSRFTOKEN: input.csrfToken,
|
|
236
|
+
mailFlg: boolStr(input.mailFlg ?? true),
|
|
237
|
+
mailaddress: input.mailaddress ?? "",
|
|
238
|
+
});
|
|
239
|
+
exports.buildInputTemporaryOtpRequest = buildInputTemporaryOtpRequest;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.SHIB_URLS = void 0;
|
|
18
|
+
/**
|
|
19
|
+
* shib(Shibboleth 認証フロー)モジュール。
|
|
20
|
+
*
|
|
21
|
+
* この SDK は認証を「実行」しない。各ステップのリクエスト記述子を組み立てるビルダと、
|
|
22
|
+
* レスポンスから必要情報を取り出すパーサだけを提供する。HTTP 実行・Cookie 管理・
|
|
23
|
+
* リダイレクト追従・パスキー暗号処理は呼び出し側(例: umebo)の責務。
|
|
24
|
+
*/
|
|
25
|
+
__exportStar(require("./builder"), exports);
|
|
26
|
+
__exportStar(require("./parser/shibLogin"), exports);
|
|
27
|
+
__exportStar(require("./parser/shibUser"), exports);
|
|
28
|
+
__exportStar(require("./types/common"), exports);
|
|
29
|
+
__exportStar(require("./types/shibLogin"), exports);
|
|
30
|
+
__exportStar(require("./types/shibUser"), exports);
|
|
31
|
+
var constants_1 = require("../constants");
|
|
32
|
+
Object.defineProperty(exports, "SHIB_URLS", { enumerable: true, get: function () { return constants_1.SHIB_URLS; } });
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseShibWebauthnRegistration = exports.parseShibWebauthnAuthentication = exports.parseShibLoginResult = exports.parseShibCheckType = exports.extractRedirectLocation = exports.resolveAuthState = exports.extractAuthStateFromHtml = exports.extractAuthStateFromUrl = void 0;
|
|
4
|
+
const dom_1 = require("../../common/dom");
|
|
5
|
+
const shibLogin_1 = require("../types/shibLogin");
|
|
6
|
+
const isRecord = (value) => typeof value === "object" && value !== null;
|
|
7
|
+
/**
|
|
8
|
+
* 認証エラー(ID/PW・OTP 誤り等)を示すメッセージ要素のセレクタ。
|
|
9
|
+
*
|
|
10
|
+
* ページは英語・日本語どちらでも描画されうるため、表示テキストではなく
|
|
11
|
+
* 言語非依存な CSS クラス(`c-message _error`)で判定する。実キャプチャ上、
|
|
12
|
+
* この要素は「認証失敗の POST 応答」でのみ出現し、初期ログインページや
|
|
13
|
+
* SAML 成功応答には現れない(誤検出しない)ことを確認済み。
|
|
14
|
+
*/
|
|
15
|
+
const AUTH_ERROR_SELECTOR = ".c-message._error";
|
|
16
|
+
// ============================================
|
|
17
|
+
// フロー制御ヘルパ(レスポンス由来。ZodSafeParseResult ではなく素の値を返す)
|
|
18
|
+
// ============================================
|
|
19
|
+
/** URL の `AuthState` クエリを取り出す。 */
|
|
20
|
+
const extractAuthStateFromUrl = (url) => {
|
|
21
|
+
try {
|
|
22
|
+
return new URL(url).searchParams.get("AuthState");
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
exports.extractAuthStateFromUrl = extractAuthStateFromUrl;
|
|
29
|
+
/** HTML の hidden input から `AuthState` を取り出す。 */
|
|
30
|
+
const extractAuthStateFromHtml = (html) => {
|
|
31
|
+
const input = (0, dom_1.queryOne)('input[name="AuthState"]', (0, dom_1.loadDocument)(html));
|
|
32
|
+
return (0, dom_1.getAttribute)(input, "value");
|
|
33
|
+
};
|
|
34
|
+
exports.extractAuthStateFromHtml = extractAuthStateFromHtml;
|
|
35
|
+
/**
|
|
36
|
+
* loginuserpass ページの `AuthState` を解決する(URL クエリ優先、無ければ HTML hidden)。
|
|
37
|
+
* ログインの各 POST に必須の識別子。
|
|
38
|
+
*/
|
|
39
|
+
const resolveAuthState = (finalUrl, html) => (0, exports.extractAuthStateFromUrl)(finalUrl) ?? (0, exports.extractAuthStateFromHtml)(html);
|
|
40
|
+
exports.resolveAuthState = resolveAuthState;
|
|
41
|
+
/**
|
|
42
|
+
* 3xx 応答の遷移先(Location)を返す。SDK の Transport はヘッダのキーを小文字化する。
|
|
43
|
+
* リダイレクト追従自体は呼び出し側が行う。
|
|
44
|
+
*/
|
|
45
|
+
const extractRedirectLocation = (response) => response.headers["location"] ?? null;
|
|
46
|
+
exports.extractRedirectLocation = extractRedirectLocation;
|
|
47
|
+
// ============================================
|
|
48
|
+
// パーサ
|
|
49
|
+
// ============================================
|
|
50
|
+
/** `checktype.php` の JSON 応答をパースする。 */
|
|
51
|
+
const parseShibCheckType = (input) => {
|
|
52
|
+
let data;
|
|
53
|
+
try {
|
|
54
|
+
data = JSON.parse(input);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
data = null;
|
|
58
|
+
}
|
|
59
|
+
const authType = isRecord(data) && Array.isArray(data["authType"])
|
|
60
|
+
? data["authType"].filter((v) => typeof v === "string")
|
|
61
|
+
: [];
|
|
62
|
+
const sessioninfo = isRecord(data) ? data["sessioninfo"] : undefined;
|
|
63
|
+
const authState = isRecord(sessioninfo) && typeof sessioninfo["AuthState"] === "string" ? sessioninfo["AuthState"] : null;
|
|
64
|
+
return shibLogin_1.ShibCheckTypeSchema.safeParse({ authType, authState });
|
|
65
|
+
};
|
|
66
|
+
exports.parseShibCheckType = parseShibCheckType;
|
|
67
|
+
/**
|
|
68
|
+
* `loginuserpass.php` のログイン結果をパースする。
|
|
69
|
+
*
|
|
70
|
+
* 表示テキスト(英語 "confirmation code" / 日本語 "確認コード" 等)に依存せず、
|
|
71
|
+
* 言語非依存な構造で判定する:
|
|
72
|
+
* 1. SAMLResponse hidden がある → 認証成立(SAML 自動 POST フォーム)
|
|
73
|
+
* 2. エラーメッセージ要素({@link AUTH_ERROR_SELECTOR})がある → 認証失敗
|
|
74
|
+
* 3. どちらも無い → 次の要素(OTP)が必要(`otpRequired`)
|
|
75
|
+
*
|
|
76
|
+
* ※ ページテンプレートは OTP セクションの markup("確認コード" / "resend" 等)を
|
|
77
|
+
* 常に内包するため、テキスト一致では password 画面と OTP 画面を判別できない。
|
|
78
|
+
* 到達段階の判別は上記の構造シグナルで行う。
|
|
79
|
+
*/
|
|
80
|
+
const parseShibLoginResult = (html) => {
|
|
81
|
+
const document = (0, dom_1.loadDocument)(html);
|
|
82
|
+
const samlInput = (0, dom_1.queryOne)('input[name="SAMLResponse"]', document);
|
|
83
|
+
if (samlInput) {
|
|
84
|
+
const form = (0, dom_1.queryOne)("form", document);
|
|
85
|
+
const relayInput = (0, dom_1.queryOne)('input[name="RelayState"]', document);
|
|
86
|
+
return shibLogin_1.ShibLoginResultSchema.safeParse({
|
|
87
|
+
kind: "samlForm",
|
|
88
|
+
action: (0, dom_1.getAttribute)(form, "action") ?? "",
|
|
89
|
+
samlResponse: (0, dom_1.getAttribute)(samlInput, "value") ?? "",
|
|
90
|
+
relayState: (0, dom_1.getAttribute)(relayInput, "value") ?? "",
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
if ((0, dom_1.queryOne)(AUTH_ERROR_SELECTOR, document)) {
|
|
94
|
+
return shibLogin_1.ShibLoginResultSchema.safeParse({ kind: "error" });
|
|
95
|
+
}
|
|
96
|
+
return shibLogin_1.ShibLoginResultSchema.safeParse({ kind: "otpRequired" });
|
|
97
|
+
};
|
|
98
|
+
exports.parseShibLoginResult = parseShibLoginResult;
|
|
99
|
+
/**
|
|
100
|
+
* ログインフロー用 `webauthn.php`(start/finish-authentication)の応答をパースする。
|
|
101
|
+
* `revoked`(HTTP 4xx か status≠0)はパスキー無効化を示す構造として返す(throw しない)。
|
|
102
|
+
*/
|
|
103
|
+
const parseShibWebauthnAuthentication = (response) => {
|
|
104
|
+
const httpRevoked = response.status >= 400 && response.status < 500;
|
|
105
|
+
let data;
|
|
106
|
+
try {
|
|
107
|
+
data = JSON.parse(response.body);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
data = null;
|
|
111
|
+
}
|
|
112
|
+
const status = isRecord(data) && typeof data["status"] === "number" ? data["status"] : null;
|
|
113
|
+
const params = isRecord(data) ? data["params"] : undefined;
|
|
114
|
+
const challenge = isRecord(params) && typeof params["challenge"] === "string" ? params["challenge"] : null;
|
|
115
|
+
const revoked = httpRevoked || (status !== null && status !== 0);
|
|
116
|
+
const ok = response.status === 200 && status === 0;
|
|
117
|
+
return shibLogin_1.ShibWebauthnAuthSchema.safeParse({ ok, revoked, status, challenge });
|
|
118
|
+
};
|
|
119
|
+
exports.parseShibWebauthnAuthentication = parseShibWebauthnAuthentication;
|
|
120
|
+
/** `User/webauthn`(start-registration)の応答をパースする。 */
|
|
121
|
+
const parseShibWebauthnRegistration = (input) => {
|
|
122
|
+
let data;
|
|
123
|
+
try {
|
|
124
|
+
data = JSON.parse(input);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
data = null;
|
|
128
|
+
}
|
|
129
|
+
const params = isRecord(data) ? data["params"] : undefined;
|
|
130
|
+
return shibLogin_1.ShibWebauthnRegistrationSchema.safeParse({
|
|
131
|
+
status: isRecord(data) ? data["status"] : undefined,
|
|
132
|
+
challenge: isRecord(params) ? params["challenge"] : undefined,
|
|
133
|
+
user: isRecord(params) ? params["user"] : undefined,
|
|
134
|
+
rp: isRecord(params) ? params["rp"] : undefined,
|
|
135
|
+
pubKeyCredParams: isRecord(params) ? params["pubKeyCredParams"] : undefined,
|
|
136
|
+
});
|
|
137
|
+
};
|
|
138
|
+
exports.parseShibWebauthnRegistration = parseShibWebauthnRegistration;
|