@crowi/api 2.0.0-alpha.0 → 2.0.0-alpha.2
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/hono/handlers/access-token.d.ts +55 -55
- package/dist/hono/handlers/activation.d.ts +27 -27
- package/dist/hono/handlers/admin/app.d.ts +26 -26
- package/dist/hono/handlers/admin/auth.d.ts +24 -24
- package/dist/hono/handlers/admin/mail.d.ts +30 -30
- package/dist/hono/handlers/admin/plugins.d.ts +112 -112
- package/dist/hono/handlers/admin/search.d.ts +21 -21
- package/dist/hono/handlers/admin/security.d.ts +24 -24
- package/dist/hono/handlers/admin/storage.d.ts +19 -19
- package/dist/hono/handlers/admin/users.d.ts +399 -281
- package/dist/hono/handlers/admin/users.js +28 -0
- package/dist/hono/handlers/admin/users.js.map +1 -1
- package/dist/hono/handlers/adminCrypto.d.ts +32 -32
- package/dist/hono/handlers/app.d.ts +12 -8
- package/dist/hono/handlers/app.js +42 -1
- package/dist/hono/handlers/app.js.map +1 -1
- package/dist/hono/handlers/attachment-stream.js +23 -0
- package/dist/hono/handlers/attachment-stream.js.map +1 -1
- package/dist/hono/handlers/attachment.d.ts +180 -180
- package/dist/hono/handlers/autocomplete.d.ts +45 -45
- package/dist/hono/handlers/backlink.d.ts +33 -33
- package/dist/hono/handlers/bookmark.d.ts +95 -95
- package/dist/hono/handlers/comment.d.ts +55 -55
- package/dist/hono/handlers/draft.d.ts +27 -27
- package/dist/hono/handlers/draft.js +10 -0
- package/dist/hono/handlers/draft.js.map +1 -1
- package/dist/hono/handlers/emailChange.d.ts +25 -25
- package/dist/hono/handlers/installer.d.ts +16 -16
- package/dist/hono/handlers/inviteAccept.d.ts +37 -37
- package/dist/hono/handlers/me.d.ts +92 -92
- package/dist/hono/handlers/notification.d.ts +94 -94
- package/dist/hono/handlers/oauth.d.ts +58 -58
- package/dist/hono/handlers/page-collab.d.ts +20 -20
- package/dist/hono/handlers/page-preview.d.ts +7 -7
- package/dist/hono/handlers/page.d.ts +575 -324
- package/dist/hono/handlers/page.js +123 -6
- package/dist/hono/handlers/page.js.map +1 -1
- package/dist/hono/handlers/passwordReset.d.ts +37 -37
- package/dist/hono/handlers/presence.d.ts +44 -44
- package/dist/hono/handlers/revision.d.ts +99 -99
- package/dist/hono/handlers/search.d.ts +64 -64
- package/dist/hono/handlers/tokenAuth.d.ts +80 -80
- package/dist/hono/handlers/user.d.ts +102 -102
- package/dist/hono/handlers/user.js +15 -5
- package/dist/hono/handlers/user.js.map +1 -1
- package/dist/hono/index.d.ts +94 -94
- package/dist/mcp/result.d.ts +52 -11
- package/dist/mcp/result.js +66 -1
- package/dist/mcp/result.js.map +1 -1
- package/dist/mcp/tools/page.js +30 -5
- package/dist/mcp/tools/page.js.map +1 -1
- package/dist/mcp/tools/search.d.ts +12 -0
- package/dist/mcp/tools/search.js +21 -5
- package/dist/mcp/tools/search.js.map +1 -1
- package/dist/migration/helpers.d.ts +13 -0
- package/dist/migration/helpers.js +29 -0
- package/dist/migration/helpers.js.map +1 -0
- package/dist/migration/migrations/files-url-to-attachments.d.ts +35 -0
- package/dist/migration/migrations/files-url-to-attachments.js +291 -0
- package/dist/migration/migrations/files-url-to-attachments.js.map +1 -0
- package/dist/migration/migrations/index.js +6 -0
- package/dist/migration/migrations/index.js.map +1 -1
- package/dist/migration/migrations/published-current-revision.d.ts +47 -0
- package/dist/migration/migrations/published-current-revision.js +90 -0
- package/dist/migration/migrations/published-current-revision.js.map +1 -0
- package/dist/migration/migrations/relocate-reserved-api-paths.d.ts +3 -0
- package/dist/migration/migrations/relocate-reserved-api-paths.js +135 -0
- package/dist/migration/migrations/relocate-reserved-api-paths.js.map +1 -0
- package/dist/migration/migrations/wikilink-format.d.ts +0 -11
- package/dist/migration/migrations/wikilink-format.js +5 -156
- package/dist/migration/migrations/wikilink-format.js.map +1 -1
- package/dist/migration/migrations/wikilink-html-recover.d.ts +116 -0
- package/dist/migration/migrations/wikilink-html-recover.js +314 -0
- package/dist/migration/migrations/wikilink-html-recover.js.map +1 -0
- package/dist/models/page.d.ts +3 -0
- package/dist/models/page.js +40 -2
- package/dist/models/page.js.map +1 -1
- package/dist/models/user.d.ts +1 -0
- package/dist/models/user.js +40 -21
- package/dist/models/user.js.map +1 -1
- package/dist/renderer/core/headings.d.ts +12 -1
- package/dist/renderer/core/headings.js +48 -8
- package/dist/renderer/core/headings.js.map +1 -1
- package/dist/renderer/pipeline.d.ts +6 -0
- package/dist/renderer/pipeline.js.map +1 -1
- package/dist/util/page-response.js +19 -2
- package/dist/util/page-response.js.map +1 -1
- package/dist/util/replace-url.d.ts +85 -0
- package/dist/util/replace-url.js +251 -0
- package/dist/util/replace-url.js.map +1 -0
- package/package.json +13 -5
- package/public/images/file-not-found.png +0 -0
- package/views/mail/activation.mjml +9 -0
- package/views/mail/activation.text +13 -0
- package/views/mail/adminApprovalPending.mjml +7 -0
- package/views/mail/adminApprovalPending.text +11 -0
- package/views/mail/emailChange.mjml +9 -0
- package/views/mail/emailChange.text +13 -0
- package/views/mail/invite.mjml +9 -0
- package/views/mail/invite.text +13 -0
- package/views/mail/layout.mjml +38 -0
- package/views/mail/passwordChanged.mjml +4 -0
- package/views/mail/passwordChanged.text +9 -0
- package/views/mail/passwordReset.mjml +9 -0
- package/views/mail/passwordReset.text +13 -0
- package/views/mail/test.mjml +2 -0
- package/views/mail/test.text +7 -0
- package/dist/common/functions/path2name.d.ts +0 -1
- package/dist/common/functions/path2name.js +0 -22
- package/dist/common/functions/path2name.js.map +0 -1
- package/dist/common/functions/renderIcon.d.ts +0 -1
- package/dist/common/functions/renderIcon.js +0 -9
- package/dist/common/functions/renderIcon.js.map +0 -1
- package/dist/controllers/admin.d.ts +0 -3
- package/dist/controllers/admin.js +0 -474
- package/dist/controllers/admin.js.map +0 -1
- package/dist/controllers/attachment.d.ts +0 -4
- package/dist/controllers/attachment.js +0 -200
- package/dist/controllers/attachment.js.map +0 -1
- package/dist/controllers/backlink.d.ts +0 -3
- package/dist/controllers/backlink.js +0 -42
- package/dist/controllers/backlink.js.map +0 -1
- package/dist/controllers/bookmark.d.ts +0 -3
- package/dist/controllers/bookmark.js +0 -100
- package/dist/controllers/bookmark.js.map +0 -1
- package/dist/controllers/comment.d.ts +0 -3
- package/dist/controllers/comment.js +0 -111
- package/dist/controllers/comment.js.map +0 -1
- package/dist/controllers/index.d.ts +0 -25
- package/dist/controllers/index.js +0 -44
- package/dist/controllers/index.js.map +0 -1
- package/dist/controllers/installer.d.ts +0 -3
- package/dist/controllers/installer.js +0 -48
- package/dist/controllers/installer.js.map +0 -1
- package/dist/controllers/login.d.ts +0 -4
- package/dist/controllers/login.js +0 -438
- package/dist/controllers/login.js.map +0 -1
- package/dist/controllers/logout.d.ts +0 -5
- package/dist/controllers/logout.js +0 -11
- package/dist/controllers/logout.js.map +0 -1
- package/dist/controllers/me.d.ts +0 -4
- package/dist/controllers/me.js +0 -369
- package/dist/controllers/me.js.map +0 -1
- package/dist/controllers/notification.d.ts +0 -3
- package/dist/controllers/notification.js +0 -88
- package/dist/controllers/notification.js.map +0 -1
- package/dist/controllers/page.d.ts +0 -3
- package/dist/controllers/page.js +0 -881
- package/dist/controllers/page.js.map +0 -1
- package/dist/controllers/revision.d.ts +0 -3
- package/dist/controllers/revision.js +0 -91
- package/dist/controllers/revision.js.map +0 -1
- package/dist/controllers/search.d.ts +0 -3
- package/dist/controllers/search.js +0 -93
- package/dist/controllers/search.js.map +0 -1
- package/dist/controllers/share.d.ts +0 -3
- package/dist/controllers/share.js +0 -207
- package/dist/controllers/share.js.map +0 -1
- package/dist/controllers/shareAccess.d.ts +0 -3
- package/dist/controllers/shareAccess.js +0 -28
- package/dist/controllers/shareAccess.js.map +0 -1
- package/dist/controllers/slack.d.ts +0 -3
- package/dist/controllers/slack.js +0 -87
- package/dist/controllers/slack.js.map +0 -1
- package/dist/controllers/tokenAuth.d.ts +0 -10
- package/dist/controllers/tokenAuth.js +0 -292
- package/dist/controllers/tokenAuth.js.map +0 -1
- package/dist/controllers/user.d.ts +0 -3
- package/dist/controllers/user.js +0 -67
- package/dist/controllers/user.js.map +0 -1
- package/dist/controllers/version.d.ts +0 -4
- package/dist/controllers/version.js +0 -19
- package/dist/controllers/version.js.map +0 -1
- package/dist/crowi/express-init.d.ts +0 -4
- package/dist/crowi/express-init.js +0 -101
- package/dist/crowi/express-init.js.map +0 -1
- package/dist/form/admin/app.d.ts +0 -2
- package/dist/form/admin/app.js +0 -9
- package/dist/form/admin/app.js.map +0 -1
- package/dist/form/admin/auth.d.ts +0 -2
- package/dist/form/admin/auth.js +0 -9
- package/dist/form/admin/auth.js.map +0 -1
- package/dist/form/admin/aws.d.ts +0 -2
- package/dist/form/admin/aws.js +0 -13
- package/dist/form/admin/aws.js.map +0 -1
- package/dist/form/admin/github.d.ts +0 -2
- package/dist/form/admin/github.js +0 -15
- package/dist/form/admin/github.js.map +0 -1
- package/dist/form/admin/google.d.ts +0 -2
- package/dist/form/admin/google.js +0 -13
- package/dist/form/admin/google.js.map +0 -1
- package/dist/form/admin/mail.d.ts +0 -2
- package/dist/form/admin/mail.js +0 -13
- package/dist/form/admin/mail.js.map +0 -1
- package/dist/form/admin/sec.d.ts +0 -2
- package/dist/form/admin/sec.js +0 -10
- package/dist/form/admin/sec.js.map +0 -1
- package/dist/form/admin/slackSetting.d.ts +0 -2
- package/dist/form/admin/slackSetting.js +0 -13
- package/dist/form/admin/slackSetting.js.map +0 -1
- package/dist/form/admin/userEdit.d.ts +0 -2
- package/dist/form/admin/userEdit.js +0 -9
- package/dist/form/admin/userEdit.js.map +0 -1
- package/dist/form/admin/userInvite.d.ts +0 -2
- package/dist/form/admin/userInvite.js +0 -9
- package/dist/form/admin/userInvite.js.map +0 -1
- package/dist/form/comment.d.ts +0 -2
- package/dist/form/comment.js +0 -9
- package/dist/form/comment.js.map +0 -1
- package/dist/form/index.d.ts +0 -25
- package/dist/form/index.js +0 -48
- package/dist/form/index.js.map +0 -1
- package/dist/form/invited.d.ts +0 -2
- package/dist/form/invited.js +0 -13
- package/dist/form/invited.js.map +0 -1
- package/dist/form/login.d.ts +0 -2
- package/dist/form/login.js +0 -11
- package/dist/form/login.js.map +0 -1
- package/dist/form/me/apiToken.d.ts +0 -2
- package/dist/form/me/apiToken.js +0 -9
- package/dist/form/me/apiToken.js.map +0 -1
- package/dist/form/me/password.d.ts +0 -2
- package/dist/form/me/password.js +0 -11
- package/dist/form/me/password.js.map +0 -1
- package/dist/form/me/user.d.ts +0 -2
- package/dist/form/me/user.js +0 -9
- package/dist/form/me/user.js.map +0 -1
- package/dist/form/register.d.ts +0 -2
- package/dist/form/register.js +0 -13
- package/dist/form/register.js.map +0 -1
- package/dist/form/revision.d.ts +0 -2
- package/dist/form/revision.js +0 -13
- package/dist/form/revision.js.map +0 -1
- package/dist/hono/handlers/admin/share.d.ts +0 -106
- package/dist/hono/handlers/admin/share.js +0 -55
- package/dist/hono/handlers/admin/share.js.map +0 -1
- package/dist/middlewares/accessTokenParser.d.ts +0 -4
- package/dist/middlewares/accessTokenParser.js +0 -29
- package/dist/middlewares/accessTokenParser.js.map +0 -1
- package/dist/middlewares/adminRequired.d.ts +0 -10
- package/dist/middlewares/adminRequired.js +0 -35
- package/dist/middlewares/adminRequired.js.map +0 -1
- package/dist/middlewares/applicationInstalled.d.ts +0 -3
- package/dist/middlewares/applicationInstalled.js +0 -20
- package/dist/middlewares/applicationInstalled.js.map +0 -1
- package/dist/middlewares/applicationNotInstalled.d.ts +0 -3
- package/dist/middlewares/applicationNotInstalled.js +0 -13
- package/dist/middlewares/applicationNotInstalled.js.map +0 -1
- package/dist/middlewares/basicAuth.d.ts +0 -4
- package/dist/middlewares/basicAuth.js +0 -23
- package/dist/middlewares/basicAuth.js.map +0 -1
- package/dist/middlewares/csrfVerify.d.ts +0 -4
- package/dist/middlewares/csrfVerify.js +0 -24
- package/dist/middlewares/csrfVerify.js.map +0 -1
- package/dist/middlewares/encodeSpace.d.ts +0 -3
- package/dist/middlewares/encodeSpace.js +0 -14
- package/dist/middlewares/encodeSpace.js.map +0 -1
- package/dist/middlewares/fileAccessRightOrLoginRequired.d.ts +0 -4
- package/dist/middlewares/fileAccessRightOrLoginRequired.js +0 -29
- package/dist/middlewares/fileAccessRightOrLoginRequired.js.map +0 -1
- package/dist/middlewares/index.d.ts +0 -16
- package/dist/middlewares/index.js +0 -30
- package/dist/middlewares/index.js.map +0 -1
- package/dist/middlewares/jwtAdminRequired.d.ts +0 -8
- package/dist/middlewares/jwtAdminRequired.js +0 -35
- package/dist/middlewares/jwtAdminRequired.js.map +0 -1
- package/dist/middlewares/jwtAuth.d.ts +0 -4
- package/dist/middlewares/jwtAuth.js +0 -104
- package/dist/middlewares/jwtAuth.js.map +0 -1
- package/dist/middlewares/loginChecker.d.ts +0 -4
- package/dist/middlewares/loginChecker.js +0 -32
- package/dist/middlewares/loginChecker.js.map +0 -1
- package/dist/middlewares/loginRequired.d.ts +0 -4
- package/dist/middlewares/loginRequired.js +0 -88
- package/dist/middlewares/loginRequired.js.map +0 -1
- package/dist/routes/admin.d.ts +0 -4
- package/dist/routes/admin.js +0 -17
- package/dist/routes/admin.js.map +0 -1
- package/dist/routes/api/admin.d.ts +0 -4
- package/dist/routes/api/admin.js +0 -37
- package/dist/routes/api/admin.js.map +0 -1
- package/dist/routes/api/attachment.d.ts +0 -4
- package/dist/routes/api/attachment.js +0 -19
- package/dist/routes/api/attachment.js.map +0 -1
- package/dist/routes/api/bookmark.d.ts +0 -4
- package/dist/routes/api/bookmark.js +0 -15
- package/dist/routes/api/bookmark.js.map +0 -1
- package/dist/routes/api/comment.d.ts +0 -4
- package/dist/routes/api/comment.js +0 -14
- package/dist/routes/api/comment.js.map +0 -1
- package/dist/routes/api/index.d.ts +0 -4
- package/dist/routes/api/index.js +0 -36
- package/dist/routes/api/index.js.map +0 -1
- package/dist/routes/api/like.d.ts +0 -4
- package/dist/routes/api/like.js +0 -13
- package/dist/routes/api/like.js.map +0 -1
- package/dist/routes/api/notification.d.ts +0 -4
- package/dist/routes/api/notification.js +0 -15
- package/dist/routes/api/notification.js.map +0 -1
- package/dist/routes/api/page.d.ts +0 -4
- package/dist/routes/api/page.js +0 -24
- package/dist/routes/api/page.js.map +0 -1
- package/dist/routes/api/revision.d.ts +0 -4
- package/dist/routes/api/revision.js +0 -14
- package/dist/routes/api/revision.js.map +0 -1
- package/dist/routes/api/share.d.ts +0 -4
- package/dist/routes/api/share.js +0 -16
- package/dist/routes/api/share.js.map +0 -1
- package/dist/routes/api/version.d.ts +0 -4
- package/dist/routes/api/version.js +0 -10
- package/dist/routes/api/version.js.map +0 -1
- package/dist/routes/index.d.ts +0 -4
- package/dist/routes/index.js +0 -71
- package/dist/routes/index.js.map +0 -1
- package/dist/routes/login.d.ts +0 -4
- package/dist/routes/login.js +0 -18
- package/dist/routes/login.js.map +0 -1
- package/dist/routes/me.d.ts +0 -4
- package/dist/routes/me.js +0 -24
- package/dist/routes/me.js.map +0 -1
- package/dist/routes/ts-rest/admin/app.d.ts +0 -4
- package/dist/routes/ts-rest/admin/app.js +0 -67
- package/dist/routes/ts-rest/admin/app.js.map +0 -1
- package/dist/routes/ts-rest/admin/auth.d.ts +0 -4
- package/dist/routes/ts-rest/admin/auth.js +0 -95
- package/dist/routes/ts-rest/admin/auth.js.map +0 -1
- package/dist/routes/ts-rest/admin/index.d.ts +0 -10
- package/dist/routes/ts-rest/admin/index.js +0 -35
- package/dist/routes/ts-rest/admin/index.js.map +0 -1
- package/dist/routes/ts-rest/admin/mail.d.ts +0 -4
- package/dist/routes/ts-rest/admin/mail.js +0 -156
- package/dist/routes/ts-rest/admin/mail.js.map +0 -1
- package/dist/routes/ts-rest/admin/plugins.d.ts +0 -4
- package/dist/routes/ts-rest/admin/plugins.js +0 -317
- package/dist/routes/ts-rest/admin/plugins.js.map +0 -1
- package/dist/routes/ts-rest/admin/search.d.ts +0 -4
- package/dist/routes/ts-rest/admin/search.js +0 -67
- package/dist/routes/ts-rest/admin/search.js.map +0 -1
- package/dist/routes/ts-rest/admin/security.d.ts +0 -4
- package/dist/routes/ts-rest/admin/security.js +0 -114
- package/dist/routes/ts-rest/admin/security.js.map +0 -1
- package/dist/routes/ts-rest/admin/share.d.ts +0 -4
- package/dist/routes/ts-rest/admin/share.js +0 -69
- package/dist/routes/ts-rest/admin/share.js.map +0 -1
- package/dist/routes/ts-rest/admin/storage.d.ts +0 -4
- package/dist/routes/ts-rest/admin/storage.js +0 -59
- package/dist/routes/ts-rest/admin/storage.js.map +0 -1
- package/dist/routes/ts-rest/admin/users.d.ts +0 -4
- package/dist/routes/ts-rest/admin/users.js +0 -215
- package/dist/routes/ts-rest/admin/users.js.map +0 -1
- package/dist/routes/ts-rest/adminCrypto.d.ts +0 -4
- package/dist/routes/ts-rest/adminCrypto.js +0 -111
- package/dist/routes/ts-rest/adminCrypto.js.map +0 -1
- package/dist/routes/ts-rest/app.d.ts +0 -4
- package/dist/routes/ts-rest/app.js +0 -23
- package/dist/routes/ts-rest/app.js.map +0 -1
- package/dist/routes/ts-rest/attachment.d.ts +0 -4
- package/dist/routes/ts-rest/attachment.js +0 -830
- package/dist/routes/ts-rest/attachment.js.map +0 -1
- package/dist/routes/ts-rest/auth.d.ts +0 -4
- package/dist/routes/ts-rest/auth.js +0 -70
- package/dist/routes/ts-rest/auth.js.map +0 -1
- package/dist/routes/ts-rest/autocomplete.d.ts +0 -30
- package/dist/routes/ts-rest/autocomplete.js +0 -189
- package/dist/routes/ts-rest/autocomplete.js.map +0 -1
- package/dist/routes/ts-rest/backlink.d.ts +0 -4
- package/dist/routes/ts-rest/backlink.js +0 -106
- package/dist/routes/ts-rest/backlink.js.map +0 -1
- package/dist/routes/ts-rest/bookmark.d.ts +0 -4
- package/dist/routes/ts-rest/bookmark.js +0 -189
- package/dist/routes/ts-rest/bookmark.js.map +0 -1
- package/dist/routes/ts-rest/comment.d.ts +0 -4
- package/dist/routes/ts-rest/comment.js +0 -217
- package/dist/routes/ts-rest/comment.js.map +0 -1
- package/dist/routes/ts-rest/draft.d.ts +0 -22
- package/dist/routes/ts-rest/draft.js +0 -200
- package/dist/routes/ts-rest/draft.js.map +0 -1
- package/dist/routes/ts-rest/index.d.ts +0 -4
- package/dist/routes/ts-rest/index.js +0 -103
- package/dist/routes/ts-rest/index.js.map +0 -1
- package/dist/routes/ts-rest/installer.d.ts +0 -4
- package/dist/routes/ts-rest/installer.js +0 -77
- package/dist/routes/ts-rest/installer.js.map +0 -1
- package/dist/routes/ts-rest/me.d.ts +0 -4
- package/dist/routes/ts-rest/me.js +0 -410
- package/dist/routes/ts-rest/me.js.map +0 -1
- package/dist/routes/ts-rest/notification.d.ts +0 -4
- package/dist/routes/ts-rest/notification.js +0 -241
- package/dist/routes/ts-rest/notification.js.map +0 -1
- package/dist/routes/ts-rest/page-collab.d.ts +0 -29
- package/dist/routes/ts-rest/page-collab.js +0 -90
- package/dist/routes/ts-rest/page-collab.js.map +0 -1
- package/dist/routes/ts-rest/page-preview.d.ts +0 -26
- package/dist/routes/ts-rest/page-preview.js +0 -80
- package/dist/routes/ts-rest/page-preview.js.map +0 -1
- package/dist/routes/ts-rest/page.d.ts +0 -4
- package/dist/routes/ts-rest/page.js +0 -676
- package/dist/routes/ts-rest/page.js.map +0 -1
- package/dist/routes/ts-rest/presence.d.ts +0 -30
- package/dist/routes/ts-rest/presence.js +0 -155
- package/dist/routes/ts-rest/presence.js.map +0 -1
- package/dist/routes/ts-rest/revision.d.ts +0 -4
- package/dist/routes/ts-rest/revision.js +0 -240
- package/dist/routes/ts-rest/revision.js.map +0 -1
- package/dist/routes/ts-rest/search.d.ts +0 -4
- package/dist/routes/ts-rest/search.js +0 -121
- package/dist/routes/ts-rest/search.js.map +0 -1
- package/dist/routes/ts-rest/tokenAuth.d.ts +0 -4
- package/dist/routes/ts-rest/tokenAuth.js +0 -94
- package/dist/routes/ts-rest/tokenAuth.js.map +0 -1
- package/dist/routes/ts-rest/user.d.ts +0 -4
- package/dist/routes/ts-rest/user.js +0 -307
- package/dist/routes/ts-rest/user.js.map +0 -1
- package/dist/types/express.d.ts +0 -34
- package/dist/types/express.js +0 -50
- package/dist/types/express.js.map +0 -1
- package/dist/util/accessTokenParser.d.ts +0 -1
- package/dist/util/accessTokenParser.js +0 -34
- package/dist/util/accessTokenParser.js.map +0 -1
- package/dist/util/apiPaginate.d.ts +0 -11
- package/dist/util/apiPaginate.js +0 -33
- package/dist/util/apiPaginate.js.map +0 -1
- package/dist/util/apiResponse.d.ts +0 -9
- package/dist/util/apiResponse.js +0 -23
- package/dist/util/apiResponse.js.map +0 -1
- package/dist/util/auth.d.ts +0 -11
- package/dist/util/auth.js +0 -48
- package/dist/util/auth.js.map +0 -1
- package/dist/util/aws-config-migration.d.ts +0 -11
- package/dist/util/aws-config-migration.js +0 -68
- package/dist/util/aws-config-migration.js.map +0 -1
- package/dist/util/formUtil.d.ts +0 -2
- package/dist/util/formUtil.js +0 -15
- package/dist/util/formUtil.js.map +0 -1
- package/dist/util/githubAuth.d.ts +0 -2
- package/dist/util/githubAuth.js +0 -82
- package/dist/util/githubAuth.js.map +0 -1
- package/dist/util/googleAuth.d.ts +0 -2
- package/dist/util/googleAuth.js +0 -85
- package/dist/util/googleAuth.js.map +0 -1
- package/dist/util/mailer.d.ts +0 -7
- package/dist/util/mailer.js +0 -98
- package/dist/util/mailer.js.map +0 -1
- package/dist/util/page-status-migration.d.ts +0 -23
- package/dist/util/page-status-migration.js +0 -48
- package/dist/util/page-status-migration.js.map +0 -1
- package/dist/util/ssr.d.ts +0 -3
- package/dist/util/ssr.js +0 -9
- package/dist/util/ssr.js.map +0 -1
- package/dist/util/view.d.ts +0 -10
- package/dist/util/view.js +0 -99
- package/dist/util/view.js.map +0 -1
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const express_1 = require("@ts-rest/express");
|
|
7
|
-
const api_contract_1 = require("@crowi/api-contract");
|
|
8
|
-
const express_2 = require("express");
|
|
9
|
-
const admin_config_1 = require("../../../util/admin-config");
|
|
10
|
-
const ts_rest_helpers_1 = require("../../../util/ts-rest-helpers");
|
|
11
|
-
const debug_1 = __importDefault(require("debug"));
|
|
12
|
-
const debug = (0, debug_1.default)('crowi:routes:ts-rest:admin:auth');
|
|
13
|
-
const KEY_REQUIRE_THIRD_PARTY_AUTH = 'auth:requireThirdPartyAuth';
|
|
14
|
-
const KEY_DISABLE_PASSWORD_AUTH = 'auth:disablePasswordAuth';
|
|
15
|
-
const readAuthSettings = (crowi) => {
|
|
16
|
-
const ns = (0, admin_config_1.getCrowiConfigNamespace)(crowi);
|
|
17
|
-
return {
|
|
18
|
-
requireThirdPartyAuth: (0, admin_config_1.coerceBoolean)(ns[KEY_REQUIRE_THIRD_PARTY_AUTH]),
|
|
19
|
-
disablePasswordAuth: (0, admin_config_1.coerceBoolean)(ns[KEY_DISABLE_PASSWORD_AUTH]),
|
|
20
|
-
};
|
|
21
|
-
};
|
|
22
|
-
exports.default = (crowi, _app) => {
|
|
23
|
-
const s = (0, express_1.initServer)();
|
|
24
|
-
const router = (0, express_2.Router)();
|
|
25
|
-
const authRouter = s.router(api_contract_1.apiContract.admin.auth, {
|
|
26
|
-
/**
|
|
27
|
-
* GET /api/v2/admin/auth
|
|
28
|
-
* Returns the two `auth:*` config values currently in effect.
|
|
29
|
-
* Authorization (jwt + admin) is handled by the surrounding adminRouter
|
|
30
|
-
* middleware; missing/forbidden auth never reaches this handler.
|
|
31
|
-
*/
|
|
32
|
-
getAuthSettings: async () => {
|
|
33
|
-
try {
|
|
34
|
-
const settings = readAuthSettings(crowi);
|
|
35
|
-
return { status: 200, body: settings };
|
|
36
|
-
}
|
|
37
|
-
catch (err) {
|
|
38
|
-
const error = err;
|
|
39
|
-
debug('Error reading auth settings:', error.message);
|
|
40
|
-
return ts_rest_helpers_1.internalServerErrorResponse;
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
/**
|
|
44
|
-
* PUT /api/v2/admin/auth
|
|
45
|
-
* Persists the two `auth:*` keys via configService.saveConfig('crowi', ...).
|
|
46
|
-
*
|
|
47
|
-
* Self-lockout guard: if the requester sets `disablePasswordAuth: true`
|
|
48
|
-
* but their own account is not connected to a valid third-party identity
|
|
49
|
-
* (Google / GitHub), reject with 422. Mirrors the legacy guard in
|
|
50
|
-
* controllers/admin.ts:postSettings — it intentionally checks only the
|
|
51
|
-
* acting admin, not other admins, matching the previous behaviour.
|
|
52
|
-
*
|
|
53
|
-
* - We only write the two auth keys we own; saveConfig merges into the
|
|
54
|
-
* existing 'crowi' namespace so unrelated keys (app:*, security:*,
|
|
55
|
-
* mail:*) are untouched.
|
|
56
|
-
* - Returns the post-save settings so the UI doesn't need a follow-up GET.
|
|
57
|
-
*/
|
|
58
|
-
updateAuthSettings: async ({ body, req }) => {
|
|
59
|
-
// jwtAdminRequired guarantees req.user is populated; the augmentation
|
|
60
|
-
// declares it optional so we re-narrow here.
|
|
61
|
-
const user = req.user;
|
|
62
|
-
if (body.disablePasswordAuth && !user.hasValidThirdPartyId()) {
|
|
63
|
-
return {
|
|
64
|
-
status: 422,
|
|
65
|
-
body: {
|
|
66
|
-
error: {
|
|
67
|
-
code: 'PASSWORD_AUTH_REQUIRES_THIRDPARTY',
|
|
68
|
-
// Wire-level fallback; UIs key off `code` and render the
|
|
69
|
-
// localised message via paraglide. Kept non-empty so legacy
|
|
70
|
-
// / scripted callers see a hint without grepping for the code.
|
|
71
|
-
message: 'Disabling password auth requires the acting admin to be connected to a valid third-party identity.',
|
|
72
|
-
},
|
|
73
|
-
},
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
try {
|
|
77
|
-
await crowi.getConfigService().saveConfig('crowi', {
|
|
78
|
-
[KEY_REQUIRE_THIRD_PARTY_AUTH]: body.requireThirdPartyAuth,
|
|
79
|
-
[KEY_DISABLE_PASSWORD_AUTH]: body.disablePasswordAuth,
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
catch (err) {
|
|
83
|
-
const error = err;
|
|
84
|
-
debug('Error saving auth settings:', error.message);
|
|
85
|
-
return ts_rest_helpers_1.internalServerErrorResponse;
|
|
86
|
-
}
|
|
87
|
-
// Re-read from the in-memory cache (saveConfig updates it) so the
|
|
88
|
-
// response reflects the new values without a Mongo round-trip.
|
|
89
|
-
return { status: 200, body: readAuthSettings(crowi) };
|
|
90
|
-
},
|
|
91
|
-
});
|
|
92
|
-
(0, express_1.createExpressEndpoints)(api_contract_1.apiContract.admin.auth, authRouter, router);
|
|
93
|
-
return router;
|
|
94
|
-
};
|
|
95
|
-
//# sourceMappingURL=auth.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../src/routes/ts-rest/admin/auth.ts"],"names":[],"mappings":";;;;;AAAA,8CAAsE;AACtE,sDAAqE;AAErE,qCAA0C;AAE1C,wDAA+E;AAC/E,8DAAuE;AACvE,kDAA0B;AAE1B,MAAM,KAAK,GAAG,IAAA,eAAK,EAAC,iCAAiC,CAAC,CAAC;AAEvD,MAAM,4BAA4B,GAAG,4BAA4B,CAAC;AAClE,MAAM,yBAAyB,GAAG,0BAA0B,CAAC;AAE7D,MAAM,gBAAgB,GAAG,CAAC,KAAY,EAAgB,EAAE;IACtD,MAAM,EAAE,GAAG,IAAA,sCAAuB,EAAC,KAAK,CAAC,CAAC;IAC1C,OAAO;QACL,qBAAqB,EAAE,IAAA,4BAAa,EAAC,EAAE,CAAC,4BAA4B,CAAC,CAAC;QACtE,mBAAmB,EAAE,IAAA,4BAAa,EAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC;KAClE,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe,CAAC,KAAY,EAAE,IAAa,EAAE,EAAE;IAC7C,MAAM,CAAC,GAAG,IAAA,oBAAU,GAAE,CAAC;IACvB,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;IAExB,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,0BAAW,CAAC,KAAK,CAAC,IAAI,EAAE;QAClD;;;;;WAKG;QACH,eAAe,EAAE,KAAK,IAAI,EAAE;YAC1B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBACzC,OAAO,EAAE,MAAM,EAAE,GAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YAClD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,KAAK,GAAG,GAAY,CAAC;gBAC3B,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;gBACrD,OAAO,6CAA2B,CAAC;YACrC,CAAC;QACH,CAAC;QAED;;;;;;;;;;;;;;WAcG;QACH,kBAAkB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE;YAC1C,sEAAsE;YACtE,6CAA6C;YAC7C,MAAM,IAAI,GAAG,GAAG,CAAC,IAAoB,CAAC;YAEtC,IAAI,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;gBAC7D,OAAO;oBACL,MAAM,EAAE,GAAY;oBACpB,IAAI,EAAE;wBACJ,KAAK,EAAE;4BACL,IAAI,EAAE,mCAA4C;4BAClD,yDAAyD;4BACzD,4DAA4D;4BAC5D,+DAA+D;4BAC/D,OAAO,EAAE,oGAAoG;yBAC9G;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,gBAAgB,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE;oBACjD,CAAC,4BAA4B,CAAC,EAAE,IAAI,CAAC,qBAAqB;oBAC1D,CAAC,yBAAyB,CAAC,EAAE,IAAI,CAAC,mBAAmB;iBACtD,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,KAAK,GAAG,GAAY,CAAC;gBAC3B,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;gBACpD,OAAO,6CAA2B,CAAC;YACrC,CAAC;YAED,kEAAkE;YAClE,+DAA+D;YAC/D,OAAO,EAAE,MAAM,EAAE,GAAY,EAAE,IAAI,EAAE,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjE,CAAC;KACF,CAAC,CAAC;IAEH,IAAA,gCAAsB,EAAC,0BAAW,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAEnE,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import Crowi from '../../../crowi';
|
|
2
|
-
import { Express } from 'express';
|
|
3
|
-
/**
|
|
4
|
-
* Aggregate router for all admin-only ts-rest endpoints. Mounted under the
|
|
5
|
-
* adminRouter in `routes/ts-rest/index.ts` which already applies
|
|
6
|
-
* `jwtAdminRequired` (JWT + admin permission). Individual sub-routers should
|
|
7
|
-
* therefore not re-implement authorization.
|
|
8
|
-
*/
|
|
9
|
-
declare const _default: (crowi: Crowi, app: Express) => import("express-serve-static-core").Router;
|
|
10
|
-
export default _default;
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const express_1 = require("express");
|
|
7
|
-
const app_1 = __importDefault(require("./app"));
|
|
8
|
-
const auth_1 = __importDefault(require("./auth"));
|
|
9
|
-
const mail_1 = __importDefault(require("./mail"));
|
|
10
|
-
const plugins_1 = __importDefault(require("./plugins"));
|
|
11
|
-
const search_1 = __importDefault(require("./search"));
|
|
12
|
-
const security_1 = __importDefault(require("./security"));
|
|
13
|
-
const share_1 = __importDefault(require("./share"));
|
|
14
|
-
const storage_1 = __importDefault(require("./storage"));
|
|
15
|
-
const users_1 = __importDefault(require("./users"));
|
|
16
|
-
/**
|
|
17
|
-
* Aggregate router for all admin-only ts-rest endpoints. Mounted under the
|
|
18
|
-
* adminRouter in `routes/ts-rest/index.ts` which already applies
|
|
19
|
-
* `jwtAdminRequired` (JWT + admin permission). Individual sub-routers should
|
|
20
|
-
* therefore not re-implement authorization.
|
|
21
|
-
*/
|
|
22
|
-
exports.default = (crowi, app) => {
|
|
23
|
-
const router = (0, express_1.Router)();
|
|
24
|
-
router.use((0, app_1.default)(crowi, app));
|
|
25
|
-
router.use((0, auth_1.default)(crowi, app));
|
|
26
|
-
router.use((0, security_1.default)(crowi, app));
|
|
27
|
-
router.use((0, mail_1.default)(crowi, app));
|
|
28
|
-
router.use((0, share_1.default)(crowi, app));
|
|
29
|
-
router.use((0, storage_1.default)(crowi, app));
|
|
30
|
-
router.use((0, search_1.default)(crowi, app));
|
|
31
|
-
router.use((0, users_1.default)(crowi, app));
|
|
32
|
-
router.use((0, plugins_1.default)(crowi, app));
|
|
33
|
-
return router;
|
|
34
|
-
};
|
|
35
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/routes/ts-rest/admin/index.ts"],"names":[],"mappings":";;;;;AACA,qCAA0C;AAC1C,gDAA8B;AAC9B,kDAAgC;AAChC,kDAAgC;AAChC,wDAAsC;AACtC,sDAAoC;AACpC,0DAAwC;AACxC,oDAAkC;AAClC,wDAAsC;AACtC,oDAAkC;AAElC;;;;;GAKG;AACH,kBAAe,CAAC,KAAY,EAAE,GAAY,EAAE,EAAE;IAC5C,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;IAExB,MAAM,CAAC,GAAG,CAAC,IAAA,aAAS,EAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,CAAC,IAAA,cAAU,EAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,CAAC,IAAA,kBAAc,EAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACvC,MAAM,CAAC,GAAG,CAAC,IAAA,cAAU,EAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,CAAC,IAAA,eAAW,EAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,CAAC,IAAA,iBAAa,EAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,CAAC,IAAA,gBAAY,EAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,CAAC,IAAA,eAAW,EAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,CAAC,IAAA,iBAAa,EAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAEtC,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const express_1 = require("@ts-rest/express");
|
|
7
|
-
const api_contract_1 = require("@crowi/api-contract");
|
|
8
|
-
const express_2 = require("express");
|
|
9
|
-
const admin_config_1 = require("../../../util/admin-config");
|
|
10
|
-
const debug_1 = __importDefault(require("debug"));
|
|
11
|
-
const debug = (0, debug_1.default)('crowi:routes:ts-rest:admin:mail');
|
|
12
|
-
const KEY_FROM = 'mail:from';
|
|
13
|
-
const KEY_SMTP_HOST = 'mail:smtpHost';
|
|
14
|
-
const KEY_SMTP_PORT = 'mail:smtpPort';
|
|
15
|
-
const KEY_SMTP_USER = 'mail:smtpUser';
|
|
16
|
-
const KEY_SMTP_PASSWORD = 'mail:smtpPassword';
|
|
17
|
-
const KEY_AWS_REGION = 'mail:aws:region';
|
|
18
|
-
const KEY_AWS_ACCESS_KEY = 'mail:aws:accessKeyId';
|
|
19
|
-
const KEY_AWS_SECRET = 'mail:aws:secretAccessKey';
|
|
20
|
-
exports.default = (crowi, _app) => {
|
|
21
|
-
const s = (0, express_1.initServer)();
|
|
22
|
-
const router = (0, express_2.Router)();
|
|
23
|
-
const router_ = s.router(api_contract_1.apiContract.admin.mail, {
|
|
24
|
-
getMailSettings: async () => {
|
|
25
|
-
const ns = (0, admin_config_1.getCrowiConfigNamespace)(crowi);
|
|
26
|
-
const smtpPassword = (0, admin_config_1.coerceString)(ns[KEY_SMTP_PASSWORD]);
|
|
27
|
-
const awsSecret = (0, admin_config_1.coerceString)(ns[KEY_AWS_SECRET]);
|
|
28
|
-
return {
|
|
29
|
-
status: 200,
|
|
30
|
-
body: {
|
|
31
|
-
from: (0, admin_config_1.coerceString)(ns[KEY_FROM]),
|
|
32
|
-
smtpHost: (0, admin_config_1.coerceString)(ns[KEY_SMTP_HOST]),
|
|
33
|
-
smtpPort: (0, admin_config_1.coerceNumber)(ns[KEY_SMTP_PORT]),
|
|
34
|
-
smtpUser: (0, admin_config_1.coerceString)(ns[KEY_SMTP_USER]),
|
|
35
|
-
smtpPassword: { hasValue: smtpPassword.length > 0 },
|
|
36
|
-
aws: {
|
|
37
|
-
region: (0, admin_config_1.coerceString)(ns[KEY_AWS_REGION]),
|
|
38
|
-
accessKeyId: (0, admin_config_1.coerceString)(ns[KEY_AWS_ACCESS_KEY]),
|
|
39
|
-
secretAccessKey: { hasValue: awsSecret.length > 0 },
|
|
40
|
-
},
|
|
41
|
-
},
|
|
42
|
-
};
|
|
43
|
-
},
|
|
44
|
-
/**
|
|
45
|
-
* Partial update. `smtpPassword` and `aws.secretAccessKey` follow the same
|
|
46
|
-
* three-state semantics admin/app uses:
|
|
47
|
-
* - omitted → not added to the payload, value stays untouched.
|
|
48
|
-
* - empty '' → forwarded as '' to clear the row.
|
|
49
|
-
* - non-empty → forwarded; auto-encryption kicks in via `isSensitiveConfig`.
|
|
50
|
-
*
|
|
51
|
-
* After persisting we re-run `crowi.setupMailer()` so the in-memory mailer
|
|
52
|
-
* reflects the new values without a server restart.
|
|
53
|
-
*/
|
|
54
|
-
updateMailSettings: async ({ body }) => {
|
|
55
|
-
const updates = {};
|
|
56
|
-
if (body.from !== undefined)
|
|
57
|
-
updates[KEY_FROM] = body.from;
|
|
58
|
-
if (body.smtpHost !== undefined)
|
|
59
|
-
updates[KEY_SMTP_HOST] = body.smtpHost;
|
|
60
|
-
if (body.smtpPort !== undefined)
|
|
61
|
-
updates[KEY_SMTP_PORT] = body.smtpPort;
|
|
62
|
-
if (body.smtpUser !== undefined)
|
|
63
|
-
updates[KEY_SMTP_USER] = body.smtpUser;
|
|
64
|
-
if (body.smtpPassword !== undefined)
|
|
65
|
-
updates[KEY_SMTP_PASSWORD] = body.smtpPassword;
|
|
66
|
-
if (body.aws) {
|
|
67
|
-
const { region, accessKeyId, secretAccessKey } = body.aws;
|
|
68
|
-
if (region !== undefined)
|
|
69
|
-
updates[KEY_AWS_REGION] = region;
|
|
70
|
-
if (accessKeyId !== undefined)
|
|
71
|
-
updates[KEY_AWS_ACCESS_KEY] = accessKeyId;
|
|
72
|
-
if (secretAccessKey !== undefined)
|
|
73
|
-
updates[KEY_AWS_SECRET] = secretAccessKey;
|
|
74
|
-
}
|
|
75
|
-
if (Object.keys(updates).length > 0) {
|
|
76
|
-
debug('updateMailSettings keys=%o', Object.keys(updates));
|
|
77
|
-
await crowi.getConfigService().saveConfig('crowi', updates);
|
|
78
|
-
crowi.setupMailer();
|
|
79
|
-
}
|
|
80
|
-
return { status: 200, body: { ok: true } };
|
|
81
|
-
},
|
|
82
|
-
/**
|
|
83
|
-
* Send a test mail to the calling admin's email. Mirrors the legacy
|
|
84
|
-
* `validateMailSetting` controller: builds an SMTP transport from the
|
|
85
|
-
* supplied option (or current saved values) and dispatches a fixed-text
|
|
86
|
-
* mail. Network errors surface as 502.
|
|
87
|
-
*/
|
|
88
|
-
sendTestMail: async ({ body, req }) => {
|
|
89
|
-
const user = req.user;
|
|
90
|
-
if (!user || !user.email) {
|
|
91
|
-
return {
|
|
92
|
-
status: 502,
|
|
93
|
-
body: { error: { code: 'MAIL_TEST_FAILED', message: 'No email address on the calling user' } },
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
const ns = (0, admin_config_1.getCrowiConfigNamespace)(crowi);
|
|
97
|
-
const host = body?.smtpHost ?? (0, admin_config_1.coerceString)(ns[KEY_SMTP_HOST]);
|
|
98
|
-
const port = body?.smtpPort ?? (0, admin_config_1.coerceNumber)(ns[KEY_SMTP_PORT]);
|
|
99
|
-
const smtpUser = body?.smtpUser ?? (0, admin_config_1.coerceString)(ns[KEY_SMTP_USER]);
|
|
100
|
-
const smtpPassword = body?.smtpPassword ?? (0, admin_config_1.coerceString)(ns[KEY_SMTP_PASSWORD]);
|
|
101
|
-
if (!host || !port) {
|
|
102
|
-
return {
|
|
103
|
-
status: 502,
|
|
104
|
-
body: { error: { code: 'MAIL_TEST_FAILED', message: 'SMTP host / port is not configured' } },
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
const option = {
|
|
108
|
-
host,
|
|
109
|
-
port,
|
|
110
|
-
};
|
|
111
|
-
if (smtpUser && smtpPassword) {
|
|
112
|
-
option.auth = { user: smtpUser, pass: smtpPassword };
|
|
113
|
-
}
|
|
114
|
-
if (port === 465) {
|
|
115
|
-
option.secure = true;
|
|
116
|
-
}
|
|
117
|
-
const mailer = crowi.mailer;
|
|
118
|
-
if (!mailer || typeof mailer.createSMTPClient !== 'function') {
|
|
119
|
-
return {
|
|
120
|
-
status: 502,
|
|
121
|
-
body: { error: { code: 'MAIL_TEST_FAILED', message: 'Mailer is not initialized' } },
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
const smtpClient = mailer.createSMTPClient(option);
|
|
125
|
-
try {
|
|
126
|
-
await new Promise((resolve, reject) => {
|
|
127
|
-
smtpClient.sendMail({
|
|
128
|
-
to: user.email,
|
|
129
|
-
// ASCII-only: this is an SMTP smoke test that has to land
|
|
130
|
-
// in the recipient's inbox even when the configured
|
|
131
|
-
// transport's character-encoding settings are wrong.
|
|
132
|
-
subject: 'Crowi: SMTP test mail',
|
|
133
|
-
text: 'This is a test message dispatched from the Crowi admin SMTP settings page.',
|
|
134
|
-
}, (err) => {
|
|
135
|
-
if (err)
|
|
136
|
-
reject(err);
|
|
137
|
-
else
|
|
138
|
-
resolve();
|
|
139
|
-
});
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
catch (err) {
|
|
143
|
-
const error = err;
|
|
144
|
-
debug('sendTestMail failed: %s', error.message);
|
|
145
|
-
return {
|
|
146
|
-
status: 502,
|
|
147
|
-
body: { error: { code: 'MAIL_TEST_FAILED', message: error.message } },
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
return { status: 200, body: { ok: true, to: user.email } };
|
|
151
|
-
},
|
|
152
|
-
});
|
|
153
|
-
(0, express_1.createExpressEndpoints)(api_contract_1.apiContract.admin.mail, router_, router);
|
|
154
|
-
return router;
|
|
155
|
-
};
|
|
156
|
-
//# sourceMappingURL=mail.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mail.js","sourceRoot":"","sources":["../../../../src/routes/ts-rest/admin/mail.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,317 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const express_1 = require("@ts-rest/express");
|
|
7
|
-
const express_2 = require("express");
|
|
8
|
-
const api_contract_1 = require("@crowi/api-contract");
|
|
9
|
-
const schema_serializer_1 = require("../../../plugin/schema-serializer");
|
|
10
|
-
const ts_rest_helpers_1 = require("../../../util/ts-rest-helpers");
|
|
11
|
-
const debug_1 = __importDefault(require("debug"));
|
|
12
|
-
const debug = (0, debug_1.default)('crowi:routes:ts-rest:admin:plugins');
|
|
13
|
-
exports.default = (crowi, _app) => {
|
|
14
|
-
const s = (0, express_1.initServer)();
|
|
15
|
-
const router = (0, express_2.Router)();
|
|
16
|
-
const pluginsRouter = s.router(api_contract_1.apiContract.admin.plugins, {
|
|
17
|
-
/**
|
|
18
|
-
* GET /api/v2/admin/plugins
|
|
19
|
-
*
|
|
20
|
-
* Lists every plugin currently loaded by the PluginManager along
|
|
21
|
-
* with its declared registry slots. The admin "Plugins" page
|
|
22
|
-
* renders this as a table.
|
|
23
|
-
*/
|
|
24
|
-
listPlugins: async () => {
|
|
25
|
-
const manager = crowi.pluginManager;
|
|
26
|
-
if (!manager) {
|
|
27
|
-
return { status: 200, body: { plugins: [] } };
|
|
28
|
-
}
|
|
29
|
-
const all = manager.getLoadedPlugins();
|
|
30
|
-
const plugins = all.map((p) => toPluginInfo(p, all));
|
|
31
|
-
return { status: 200, body: { plugins } };
|
|
32
|
-
},
|
|
33
|
-
/**
|
|
34
|
-
* GET /api/v2/admin/plugins/:name/config
|
|
35
|
-
*
|
|
36
|
-
* Get the form schema + current values for a single plugin.
|
|
37
|
-
* Sensitive fields are masked to `{ hasValue: boolean }` before
|
|
38
|
-
* returning so plaintext secrets never reach the browser.
|
|
39
|
-
*/
|
|
40
|
-
getPluginConfig: async ({ query }) => {
|
|
41
|
-
const manager = crowi.pluginManager;
|
|
42
|
-
const plugin = manager?.getLoadedPlugin(query.name);
|
|
43
|
-
if (!plugin) {
|
|
44
|
-
return pluginNotFound(query.name);
|
|
45
|
-
}
|
|
46
|
-
if (!plugin.configSchema) {
|
|
47
|
-
// Plugin has no configurable values; return an empty form.
|
|
48
|
-
return {
|
|
49
|
-
status: 200,
|
|
50
|
-
body: { name: plugin.name, fields: [], values: {} },
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
const fields = (0, schema_serializer_1.serializeConfigSchema)(plugin.configSchema);
|
|
54
|
-
const ns = readPluginNamespace(crowi, plugin.name);
|
|
55
|
-
const values = {};
|
|
56
|
-
for (const field of fields) {
|
|
57
|
-
if (field.kind === 'secret') {
|
|
58
|
-
const raw = ns[field.name];
|
|
59
|
-
values[field.name] = { hasValue: typeof raw === 'string' && raw.length > 0 };
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
values[field.name] = ns[field.name] ?? field.defaultValue ?? null;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return {
|
|
66
|
-
status: 200,
|
|
67
|
-
body: { name: plugin.name, fields, values },
|
|
68
|
-
};
|
|
69
|
-
},
|
|
70
|
-
/**
|
|
71
|
-
* PUT /api/v2/admin/plugins/:name/config
|
|
72
|
-
*
|
|
73
|
-
* Validate the request body through the plugin's Zod schema and
|
|
74
|
-
* persist each field into `plugin:<name>:*` config rows. Sensitive
|
|
75
|
-
* fields follow the three-state convention used by /admin/app and
|
|
76
|
-
* /admin/mail:
|
|
77
|
-
* - undefined / missing → leave value untouched
|
|
78
|
-
* - empty string → clear the saved value
|
|
79
|
-
* - non-empty string → replace and re-encrypt
|
|
80
|
-
*/
|
|
81
|
-
updatePluginConfig: async ({ query, body }) => {
|
|
82
|
-
const manager = crowi.pluginManager;
|
|
83
|
-
const plugin = manager?.getLoadedPlugin(query.name);
|
|
84
|
-
if (!plugin) {
|
|
85
|
-
return pluginNotFound(query.name);
|
|
86
|
-
}
|
|
87
|
-
if (!plugin.configSchema) {
|
|
88
|
-
return {
|
|
89
|
-
status: 422,
|
|
90
|
-
body: {
|
|
91
|
-
error: {
|
|
92
|
-
code: 'PLUGIN_CONFIG_VALIDATION_FAILED',
|
|
93
|
-
message: 'Plugin does not declare any configurable values',
|
|
94
|
-
issues: [],
|
|
95
|
-
},
|
|
96
|
-
},
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
const fields = (0, schema_serializer_1.serializeConfigSchema)(plugin.configSchema);
|
|
100
|
-
const fieldsByName = new Map(fields.map((f) => [f.name, f]));
|
|
101
|
-
// Build a candidate object using new values + existing values
|
|
102
|
-
// for fields the operator did not touch (so secret-untouched
|
|
103
|
-
// doesn't overwrite the saved secret).
|
|
104
|
-
const existing = readPluginNamespace(crowi, plugin.name);
|
|
105
|
-
const merged = { ...existing };
|
|
106
|
-
const toWrite = {};
|
|
107
|
-
for (const [key, value] of Object.entries(body.values)) {
|
|
108
|
-
const field = fieldsByName.get(key);
|
|
109
|
-
if (!field) {
|
|
110
|
-
// Ignore unknown keys. The Zod parse below would also catch
|
|
111
|
-
// them via `.strict()`, but we strip first so users get
|
|
112
|
-
// friendlier per-field errors instead of a global one.
|
|
113
|
-
continue;
|
|
114
|
-
}
|
|
115
|
-
if (field.kind === 'secret' && value === undefined) {
|
|
116
|
-
// explicitly leave untouched
|
|
117
|
-
continue;
|
|
118
|
-
}
|
|
119
|
-
merged[key] = value;
|
|
120
|
-
toWrite[key] = value;
|
|
121
|
-
}
|
|
122
|
-
const parsed = plugin.configSchema.safeParse(merged);
|
|
123
|
-
if (!parsed.success) {
|
|
124
|
-
return {
|
|
125
|
-
status: 422,
|
|
126
|
-
body: {
|
|
127
|
-
error: {
|
|
128
|
-
code: 'PLUGIN_CONFIG_VALIDATION_FAILED',
|
|
129
|
-
message: 'Plugin config failed validation',
|
|
130
|
-
issues: parsed.error.issues.map((i) => ({
|
|
131
|
-
path: i.path.map((p) => (typeof p === 'symbol' ? String(p) : p)),
|
|
132
|
-
message: i.message,
|
|
133
|
-
})),
|
|
134
|
-
},
|
|
135
|
-
},
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
const configService = crowi.getConfigService();
|
|
139
|
-
const writes = {};
|
|
140
|
-
for (const [key, value] of Object.entries(toWrite)) {
|
|
141
|
-
writes[`plugin:${plugin.name}:${key}`] = value;
|
|
142
|
-
}
|
|
143
|
-
try {
|
|
144
|
-
if (Object.keys(writes).length > 0) {
|
|
145
|
-
await configService.saveConfig('crowi', writes);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
catch (err) {
|
|
149
|
-
const error = err;
|
|
150
|
-
debug('Error saving plugin config:', error.message);
|
|
151
|
-
return ts_rest_helpers_1.internalServerErrorResponse;
|
|
152
|
-
}
|
|
153
|
-
let hotReloaded = false;
|
|
154
|
-
let reconfigureFailed = false;
|
|
155
|
-
const pluginManager = crowi.pluginManager;
|
|
156
|
-
if (pluginManager && Object.keys(writes).length > 0) {
|
|
157
|
-
const result = await pluginManager.reconfigureAffected([`plugin:${plugin.name}`]);
|
|
158
|
-
hotReloaded = result.attempted > 0 && result.succeeded === result.attempted;
|
|
159
|
-
reconfigureFailed = result.attempted > result.succeeded;
|
|
160
|
-
}
|
|
161
|
-
return { status: 200, body: { ok: true, hotReloaded, reconfigureFailed } };
|
|
162
|
-
},
|
|
163
|
-
/**
|
|
164
|
-
* POST /api/v2/admin/plugins/render-cache/clear-all
|
|
165
|
-
*
|
|
166
|
-
* Drops every PluginRenderCache document. Surfaced by the
|
|
167
|
-
* "Clear all render cache" button in the admin UI. The next
|
|
168
|
-
* render of any embed-bearing page repopulates the cache.
|
|
169
|
-
*/
|
|
170
|
-
clearRenderCacheAll: async () => {
|
|
171
|
-
const renderer = crowi.renderer;
|
|
172
|
-
if (!renderer) {
|
|
173
|
-
return ts_rest_helpers_1.internalServerErrorResponse;
|
|
174
|
-
}
|
|
175
|
-
try {
|
|
176
|
-
const removedCount = await renderer.cache.invalidateAll();
|
|
177
|
-
return {
|
|
178
|
-
status: 200,
|
|
179
|
-
body: {
|
|
180
|
-
ok: true,
|
|
181
|
-
clearedAt: new Date().toISOString(),
|
|
182
|
-
removedCount,
|
|
183
|
-
},
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
catch (err) {
|
|
187
|
-
debug('clearRenderCacheAll failed:', err.message);
|
|
188
|
-
return ts_rest_helpers_1.internalServerErrorResponse;
|
|
189
|
-
}
|
|
190
|
-
},
|
|
191
|
-
/**
|
|
192
|
-
* POST /api/v2/admin/plugins/render-cache/clear-plugin?name=…
|
|
193
|
-
*
|
|
194
|
-
* Drops PluginRenderCache documents whose `pluginName` matches.
|
|
195
|
-
* Returns 404 when the named plugin is not loaded; that prevents
|
|
196
|
-
* typos from silently succeeding ("nothing matched, but ok").
|
|
197
|
-
*/
|
|
198
|
-
clearRenderCachePlugin: async ({ query }) => {
|
|
199
|
-
const renderer = crowi.renderer;
|
|
200
|
-
const manager = crowi.pluginManager;
|
|
201
|
-
if (!renderer) {
|
|
202
|
-
return ts_rest_helpers_1.internalServerErrorResponse;
|
|
203
|
-
}
|
|
204
|
-
if (manager && !manager.getLoadedPlugin(query.name)) {
|
|
205
|
-
return pluginNotFound(query.name);
|
|
206
|
-
}
|
|
207
|
-
try {
|
|
208
|
-
const removedCount = await renderer.cache.invalidatePlugin(query.name);
|
|
209
|
-
return {
|
|
210
|
-
status: 200,
|
|
211
|
-
body: {
|
|
212
|
-
ok: true,
|
|
213
|
-
clearedAt: new Date().toISOString(),
|
|
214
|
-
removedCount,
|
|
215
|
-
},
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
catch (err) {
|
|
219
|
-
debug('clearRenderCachePlugin failed:', err.message);
|
|
220
|
-
return ts_rest_helpers_1.internalServerErrorResponse;
|
|
221
|
-
}
|
|
222
|
-
},
|
|
223
|
-
});
|
|
224
|
-
(0, express_1.createExpressEndpoints)(api_contract_1.apiContract.admin.plugins, pluginsRouter, router);
|
|
225
|
-
return router;
|
|
226
|
-
};
|
|
227
|
-
const toPluginInfo = (plugin, all) => ({
|
|
228
|
-
name: plugin.name,
|
|
229
|
-
version: plugin.version,
|
|
230
|
-
requires: plugin.requires,
|
|
231
|
-
hasConfig: !!plugin.configSchema,
|
|
232
|
-
registers: collectRegistrySlots(plugin),
|
|
233
|
-
adminPlacement: resolvePlacement(plugin),
|
|
234
|
-
supportsHotReload: hasReconfigureOrDependent(plugin, all),
|
|
235
|
-
});
|
|
236
|
-
/**
|
|
237
|
-
* A plugin "supports hot reload" if changing its config can be applied
|
|
238
|
-
* live. That is true when the plugin itself implements `reconfigure`
|
|
239
|
-
* OR when a plugin that requires it does — config-only base plugins
|
|
240
|
-
* (e.g. `@crowi/plugin-aws`) flow through this transitively because
|
|
241
|
-
* the dependents fan-out fires their reconfigure.
|
|
242
|
-
*/
|
|
243
|
-
function hasReconfigureOrDependent(plugin, all) {
|
|
244
|
-
if (plugin.reconfigure)
|
|
245
|
-
return true;
|
|
246
|
-
for (const other of all) {
|
|
247
|
-
if (other.requires?.includes(plugin.name) && other.reconfigure)
|
|
248
|
-
return true;
|
|
249
|
-
}
|
|
250
|
-
return false;
|
|
251
|
-
}
|
|
252
|
-
function collectRegistrySlots(plugin) {
|
|
253
|
-
const slots = [];
|
|
254
|
-
if (plugin.registerStorage)
|
|
255
|
-
slots.push('storage');
|
|
256
|
-
if (plugin.registerSearch)
|
|
257
|
-
slots.push('search');
|
|
258
|
-
if (plugin.registerAuth)
|
|
259
|
-
slots.push('auth');
|
|
260
|
-
if (plugin.registerNotifier)
|
|
261
|
-
slots.push('notifier');
|
|
262
|
-
return slots;
|
|
263
|
-
}
|
|
264
|
-
/**
|
|
265
|
-
* Compute the effective sidebar placement for a plugin. The plugin's
|
|
266
|
-
* own `adminPlacement` wins where it sets a field; missing fields
|
|
267
|
-
* fall back to derived defaults:
|
|
268
|
-
* - section: derived from register* hooks (storage / search / auth /
|
|
269
|
-
* notification → matching section). Plugins with no register*
|
|
270
|
-
* hook need to declare `section: 'shared'` themselves to appear
|
|
271
|
-
* under the "shared services" section; if they didn't declare it
|
|
272
|
-
* either, fall through to `'settings'`.
|
|
273
|
-
* - label: defaults to the plugin's npm name.
|
|
274
|
-
* - icon: optional, no default.
|
|
275
|
-
*/
|
|
276
|
-
function resolvePlacement(plugin) {
|
|
277
|
-
const declared = plugin.adminPlacement;
|
|
278
|
-
const derivedSection = deriveSectionFromHooks(plugin);
|
|
279
|
-
return {
|
|
280
|
-
section: declared?.section ?? derivedSection ?? 'settings',
|
|
281
|
-
label: declared?.label ?? plugin.name,
|
|
282
|
-
icon: declared?.icon,
|
|
283
|
-
};
|
|
284
|
-
}
|
|
285
|
-
function deriveSectionFromHooks(plugin) {
|
|
286
|
-
if (plugin.registerStorage)
|
|
287
|
-
return 'storage';
|
|
288
|
-
if (plugin.registerAuth)
|
|
289
|
-
return 'auth';
|
|
290
|
-
if (plugin.registerNotifier)
|
|
291
|
-
return 'notification';
|
|
292
|
-
// search has no top-level section in the to-be sidebar; surface
|
|
293
|
-
// search-only plugins under "settings" by default.
|
|
294
|
-
return undefined;
|
|
295
|
-
}
|
|
296
|
-
function readPluginNamespace(crowi, pluginName) {
|
|
297
|
-
const all = crowi.getConfig();
|
|
298
|
-
const crowiNs = (all && typeof all === 'object' ? all.crowi : undefined) ?? {};
|
|
299
|
-
const prefix = `plugin:${pluginName}:`;
|
|
300
|
-
const out = {};
|
|
301
|
-
for (const [key, value] of Object.entries(crowiNs)) {
|
|
302
|
-
if (key.startsWith(prefix)) {
|
|
303
|
-
out[key.slice(prefix.length)] = value;
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
return out;
|
|
307
|
-
}
|
|
308
|
-
const pluginNotFound = (name) => ({
|
|
309
|
-
status: 404,
|
|
310
|
-
body: {
|
|
311
|
-
error: {
|
|
312
|
-
code: 'PLUGIN_NOT_FOUND',
|
|
313
|
-
message: `Plugin '${name}' is not loaded`,
|
|
314
|
-
},
|
|
315
|
-
},
|
|
316
|
-
});
|
|
317
|
-
//# sourceMappingURL=plugins.js.map
|