alepha 0.21.2 → 0.23.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/README.md +0 -1
- package/dist/api/audits/index.browser.js.map +1 -1
- package/dist/api/audits/index.d.ts +393 -403
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/audits/index.js +25 -56
- package/dist/api/audits/index.js.map +1 -1
- package/dist/api/files/index.browser.js +31 -1
- package/dist/api/files/index.browser.js.map +1 -1
- package/dist/api/files/index.d.ts +313 -208
- package/dist/api/files/index.d.ts.map +1 -1
- package/dist/api/files/index.js +152 -42
- package/dist/api/files/index.js.map +1 -1
- package/dist/api/jobs/index.browser.js +2 -2
- package/dist/api/jobs/index.browser.js.map +1 -1
- package/dist/api/jobs/index.d.ts +282 -285
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/jobs/index.js +39 -33
- package/dist/api/jobs/index.js.map +1 -1
- package/dist/api/keys/index.d.ts +217 -222
- package/dist/api/keys/index.d.ts.map +1 -1
- package/dist/api/keys/index.js.map +1 -1
- package/dist/api/notifications/index.browser.js.map +1 -1
- package/dist/api/notifications/index.d.ts +188 -195
- package/dist/api/notifications/index.d.ts.map +1 -1
- package/dist/api/notifications/index.js.map +1 -1
- package/dist/api/oauth/index.d.ts +71 -76
- package/dist/api/oauth/index.d.ts.map +1 -1
- package/dist/api/oauth/index.js.map +1 -1
- package/dist/api/organizations/index.browser.js.map +1 -1
- package/dist/api/organizations/index.d.ts +104 -109
- package/dist/api/organizations/index.d.ts.map +1 -1
- package/dist/api/organizations/index.js.map +1 -1
- package/dist/api/parameters/index.browser.js +43 -16
- package/dist/api/parameters/index.browser.js.map +1 -1
- package/dist/api/parameters/index.d.ts +488 -344
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/parameters/index.js +175 -35
- package/dist/api/parameters/index.js.map +1 -1
- package/dist/api/payments/index.d.ts +396 -402
- package/dist/api/payments/index.d.ts.map +1 -1
- package/dist/api/payments/index.js.map +1 -1
- package/dist/api/subscriptions/index.d.ts +644 -652
- package/dist/api/subscriptions/index.d.ts.map +1 -1
- package/dist/api/subscriptions/index.js +1 -1
- package/dist/api/subscriptions/index.js.map +1 -1
- package/dist/api/users/index.browser.js +7 -0
- package/dist/api/users/index.browser.js.map +1 -1
- package/dist/api/users/index.d.ts +1106 -1005
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +307 -64
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.browser.js.map +1 -1
- package/dist/api/verifications/index.d.ts +137 -143
- package/dist/api/verifications/index.d.ts.map +1 -1
- package/dist/api/verifications/index.js.map +1 -1
- package/dist/background/index.d.ts +95 -0
- package/dist/background/index.d.ts.map +1 -0
- package/dist/background/index.js +121 -0
- package/dist/background/index.js.map +1 -0
- package/dist/background/index.workerd.js +110 -0
- package/dist/background/index.workerd.js.map +1 -0
- package/dist/batch/index.d.ts +5 -7
- package/dist/batch/index.d.ts.map +1 -1
- package/dist/batch/index.js.map +1 -1
- package/dist/bin/index.js.map +1 -1
- package/dist/bucket/index.d.ts +76 -54
- package/dist/bucket/index.d.ts.map +1 -1
- package/dist/bucket/index.js +58 -11
- package/dist/bucket/index.js.map +1 -1
- package/dist/bucket/index.workerd.js +200 -5
- package/dist/bucket/index.workerd.js.map +1 -1
- package/dist/cache/core/index.d.ts +7 -10
- package/dist/cache/core/index.d.ts.map +1 -1
- package/dist/cache/core/index.js.map +1 -1
- package/dist/cache/core/index.workerd.js.map +1 -1
- package/dist/cache/database/index.d.ts +22 -26
- package/dist/cache/database/index.d.ts.map +1 -1
- package/dist/cache/database/index.js.map +1 -1
- package/dist/cache/redis/index.d.ts +4 -7
- package/dist/cache/redis/index.d.ts.map +1 -1
- package/dist/cache/redis/index.js.map +1 -1
- package/dist/captcha/index.d.ts +3 -6
- package/dist/captcha/index.d.ts.map +1 -1
- package/dist/captcha/index.js.map +1 -1
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/config/index.js.map +1 -1
- package/dist/cli/core/index.d.ts +458 -249
- package/dist/cli/core/index.d.ts.map +1 -1
- package/dist/cli/core/index.js +372 -660
- package/dist/cli/core/index.js.map +1 -1
- package/dist/cli/devtools/index.d.ts +3 -5
- package/dist/cli/devtools/index.d.ts.map +1 -1
- package/dist/cli/devtools/index.js.map +1 -1
- package/dist/cli/i18n/index.d.ts +20 -17
- package/dist/cli/i18n/index.d.ts.map +1 -1
- package/dist/cli/i18n/index.js +45 -11
- package/dist/cli/i18n/index.js.map +1 -1
- package/dist/cli/platform/index.d.ts +126 -1342
- package/dist/cli/platform/index.d.ts.map +1 -1
- package/dist/cli/platform/index.js +136 -2374
- package/dist/cli/platform/index.js.map +1 -1
- package/dist/cli/platform-lib/index.d.ts +1472 -0
- package/dist/cli/platform-lib/index.d.ts.map +1 -0
- package/dist/cli/platform-lib/index.js +2660 -0
- package/dist/cli/platform-lib/index.js.map +1 -0
- package/dist/cli/vendor/index.d.ts +17 -21
- package/dist/cli/vendor/index.d.ts.map +1 -1
- package/dist/cli/vendor/index.js.map +1 -1
- package/dist/command/index.d.ts +20 -19
- package/dist/command/index.d.ts.map +1 -1
- package/dist/command/index.js +39 -10
- package/dist/command/index.js.map +1 -1
- package/dist/{containers → container}/core/index.d.ts +13 -15
- package/dist/container/core/index.d.ts.map +1 -0
- package/dist/{containers → container}/core/index.js +23 -14
- package/dist/container/core/index.js.map +1 -0
- package/dist/{containers → container}/core/index.workerd.js +37 -22
- package/dist/container/core/index.workerd.js.map +1 -0
- package/dist/core/index.browser.js +27 -1
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +48 -24
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +27 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +27 -1
- package/dist/core/index.native.js.map +1 -1
- package/dist/core/index.workerd.js +27 -1
- package/dist/core/index.workerd.js.map +1 -1
- package/dist/crypto/index.browser.js.map +1 -1
- package/dist/crypto/index.d.ts +5 -8
- package/dist/crypto/index.d.ts.map +1 -1
- package/dist/crypto/index.js.map +1 -1
- package/dist/datetime/index.d.ts +3 -4
- package/dist/datetime/index.d.ts.map +1 -1
- package/dist/datetime/index.js.map +1 -1
- package/dist/email/brevo/index.d.ts +2 -4
- package/dist/email/brevo/index.d.ts.map +1 -1
- package/dist/email/brevo/index.js.map +1 -1
- package/dist/email/cloudflare/index.d.ts +20 -7
- package/dist/email/cloudflare/index.d.ts.map +1 -1
- package/dist/email/cloudflare/index.js +46 -9
- package/dist/email/cloudflare/index.js.map +1 -1
- package/dist/email/core/index.d.ts +6 -9
- package/dist/email/core/index.d.ts.map +1 -1
- package/dist/email/core/index.js.map +1 -1
- package/dist/email/core/index.workerd.js.map +1 -1
- package/dist/email/smtp/index.d.ts +10 -13
- package/dist/email/smtp/index.d.ts.map +1 -1
- package/dist/email/smtp/index.js +107 -32
- package/dist/email/smtp/index.js.map +1 -1
- package/dist/fake/index.d.ts +1 -2
- package/dist/fake/index.d.ts.map +1 -1
- package/dist/fake/index.js.map +1 -1
- package/dist/lock/core/index.d.ts +9 -14
- package/dist/lock/core/index.d.ts.map +1 -1
- package/dist/lock/core/index.js.map +1 -1
- package/dist/lock/redis/index.d.ts +2 -4
- package/dist/lock/redis/index.d.ts.map +1 -1
- package/dist/lock/redis/index.js.map +1 -1
- package/dist/logger/index.d.ts +105 -76
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +196 -174
- package/dist/logger/index.js.map +1 -1
- package/dist/mcp/index.d.ts +25 -20
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +23 -0
- package/dist/mcp/index.js.map +1 -1
- package/dist/orm/core/index.browser.js.map +1 -1
- package/dist/orm/core/index.bun.js +19 -1
- package/dist/orm/core/index.bun.js.map +1 -1
- package/dist/orm/core/index.d.ts +76 -62
- package/dist/orm/core/index.d.ts.map +1 -1
- package/dist/orm/core/index.js +20 -2
- package/dist/orm/core/index.js.map +1 -1
- package/dist/orm/postgres/index.bun.js.map +1 -1
- package/dist/orm/postgres/index.d.ts +28 -20
- package/dist/orm/postgres/index.d.ts.map +1 -1
- package/dist/orm/postgres/index.js.map +1 -1
- package/dist/queue/core/index.d.ts +12 -15
- package/dist/queue/core/index.d.ts.map +1 -1
- package/dist/queue/core/index.js.map +1 -1
- package/dist/queue/core/index.workerd.js.map +1 -1
- package/dist/queue/redis/index.d.ts +3 -5
- package/dist/queue/redis/index.d.ts.map +1 -1
- package/dist/queue/redis/index.js.map +1 -1
- package/dist/react/auth/index.browser.js +9 -2
- package/dist/react/auth/index.browser.js.map +1 -1
- package/dist/react/auth/index.d.ts +14 -9
- package/dist/react/auth/index.d.ts.map +1 -1
- package/dist/react/auth/index.js +9 -2
- package/dist/react/auth/index.js.map +1 -1
- package/dist/react/core/index.d.ts +7 -8
- package/dist/react/core/index.d.ts.map +1 -1
- package/dist/react/core/index.js +6 -3
- package/dist/react/core/index.js.map +1 -1
- package/dist/react/form/index.d.ts +2 -5
- package/dist/react/form/index.d.ts.map +1 -1
- package/dist/react/form/index.js +16 -15
- package/dist/react/form/index.js.map +1 -1
- package/dist/react/head/index.browser.js.map +1 -1
- package/dist/react/head/index.d.ts +2 -4
- package/dist/react/head/index.d.ts.map +1 -1
- package/dist/react/head/index.js.map +1 -1
- package/dist/react/i18n/index.d.ts +90 -11
- package/dist/react/i18n/index.d.ts.map +1 -1
- package/dist/react/i18n/index.js +147 -11
- package/dist/react/i18n/index.js.map +1 -1
- package/dist/react/intro/index.d.ts +1 -2
- package/dist/react/intro/index.d.ts.map +1 -1
- package/dist/react/intro/index.js +2 -2
- package/dist/react/intro/index.js.map +1 -1
- package/dist/react/router/index.browser.js +193 -24
- package/dist/react/router/index.browser.js.map +1 -1
- package/dist/react/router/index.d.ts +434 -222
- package/dist/react/router/index.d.ts.map +1 -1
- package/dist/react/router/index.js +249 -35
- package/dist/react/router/index.js.map +1 -1
- package/dist/react/sitemap/index.browser.js +35 -0
- package/dist/react/sitemap/index.browser.js.map +1 -0
- package/dist/react/sitemap/index.d.ts +92 -0
- package/dist/react/sitemap/index.d.ts.map +1 -0
- package/dist/react/sitemap/index.js +131 -0
- package/dist/react/sitemap/index.js.map +1 -0
- package/dist/react/testing/index.d.ts +1 -2
- package/dist/react/testing/index.d.ts.map +1 -1
- package/dist/react/testing/index.js +16 -17
- package/dist/react/testing/index.js.map +1 -1
- package/dist/react/ui/index.d.ts +20 -25
- package/dist/react/ui/index.d.ts.map +1 -1
- package/dist/react/ui/index.js.map +1 -1
- package/dist/redis/index.bun.js.map +1 -1
- package/dist/redis/index.d.ts +17 -19
- package/dist/redis/index.d.ts.map +1 -1
- package/dist/redis/index.js.map +1 -1
- package/dist/retry/index.d.ts +2 -4
- package/dist/retry/index.d.ts.map +1 -1
- package/dist/retry/index.js.map +1 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/index.js.map +1 -1
- package/dist/scheduler/index.d.ts +10 -13
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/index.workerd.js.map +1 -1
- package/dist/security/index.browser.js.map +1 -1
- package/dist/security/index.d.ts +45 -48
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.browser.js.map +1 -1
- package/dist/server/auth/index.d.ts +272 -173
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +1608 -15
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cookies/index.browser.js.map +1 -1
- package/dist/server/cookies/index.d.ts +20 -7
- package/dist/server/cookies/index.d.ts.map +1 -1
- package/dist/server/cookies/index.js +22 -3
- package/dist/server/cookies/index.js.map +1 -1
- package/dist/server/core/index.browser.js.map +1 -1
- package/dist/server/core/index.d.ts +106 -73
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +44 -0
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/cors/index.d.ts +11 -14
- package/dist/server/cors/index.d.ts.map +1 -1
- package/dist/server/cors/index.js.map +1 -1
- package/dist/server/etag/index.d.ts +6 -9
- package/dist/server/etag/index.d.ts.map +1 -1
- package/dist/server/etag/index.js.map +1 -1
- package/dist/server/health/index.d.ts +18 -21
- package/dist/server/health/index.d.ts.map +1 -1
- package/dist/server/health/index.js.map +1 -1
- package/dist/server/links/index.browser.js +2 -0
- package/dist/server/links/index.browser.js.map +1 -1
- package/dist/server/links/index.d.ts +63 -67
- package/dist/server/links/index.d.ts.map +1 -1
- package/dist/server/links/index.js +2 -0
- package/dist/server/links/index.js.map +1 -1
- package/dist/server/metrics/index.d.ts +5 -7
- package/dist/server/metrics/index.d.ts.map +1 -1
- package/dist/server/metrics/index.js.map +1 -1
- package/dist/server/proxy/index.d.ts +3 -5
- package/dist/server/proxy/index.d.ts.map +1 -1
- package/dist/server/proxy/index.js.map +1 -1
- package/dist/server/rate-limit/index.d.ts +10 -13
- package/dist/server/rate-limit/index.d.ts.map +1 -1
- package/dist/server/rate-limit/index.js.map +1 -1
- package/dist/server/static/index.d.ts +3 -5
- package/dist/server/static/index.d.ts.map +1 -1
- package/dist/server/static/index.js.map +1 -1
- package/dist/server/swagger/index.d.ts +5 -8
- package/dist/server/swagger/index.d.ts.map +1 -1
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/sms/index.d.ts +3 -5
- package/dist/sms/index.d.ts.map +1 -1
- package/dist/sms/index.js.map +1 -1
- package/dist/system/index.browser.js.map +1 -1
- package/dist/system/index.d.ts +2 -4
- package/dist/system/index.d.ts.map +1 -1
- package/dist/system/index.js.map +1 -1
- package/dist/system/index.workerd.js.map +1 -1
- package/dist/topic/core/index.d.ts +4 -6
- package/dist/topic/core/index.d.ts.map +1 -1
- package/dist/topic/core/index.js.map +1 -1
- package/dist/topic/redis/index.d.ts +5 -8
- package/dist/topic/redis/index.d.ts.map +1 -1
- package/dist/topic/redis/index.js.map +1 -1
- package/package.json +59 -23
- package/src/api/audits/__tests__/AuditService.spec.ts +18 -110
- package/src/api/audits/controllers/AdminAuditController.ts +14 -0
- package/src/api/audits/services/AuditService.ts +21 -88
- package/src/api/files/__tests__/FileService.spec.ts +207 -2
- package/src/api/files/index.ts +3 -0
- package/src/api/files/schemas/fileCreatorSummarySchema.ts +22 -0
- package/src/api/files/schemas/fileResourceSchema.ts +10 -1
- package/src/api/files/services/FileService.ts +170 -72
- package/src/api/jobs/__tests__/$job.spec.ts +24 -1
- package/src/api/jobs/index.ts +4 -3
- package/src/api/jobs/primitives/$job.ts +7 -3
- package/src/api/jobs/providers/DirectJobDispatcher.ts +17 -36
- package/src/api/jobs/providers/JobProvider.ts +53 -24
- package/src/api/jobs/schemas/jobConfigAtom.ts +1 -1
- package/src/api/jobs/schemas/jobExecutionResourceSchema.ts +4 -1
- package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +3 -1
- package/src/api/parameters/__tests__/$parameter.spec.ts +19 -2
- package/src/api/parameters/audits/ParameterAudits.ts +17 -0
- package/src/api/parameters/controllers/AdminParameterController.ts +95 -19
- package/src/api/parameters/index.ts +3 -0
- package/src/api/parameters/schemas/activateParameterBodySchema.ts +3 -3
- package/src/api/parameters/schemas/createParameterVersionBodySchema.ts +3 -2
- package/src/api/parameters/schemas/parameterCreatorSummarySchema.ts +25 -0
- package/src/api/parameters/schemas/parameterResponseSchema.ts +5 -0
- package/src/api/parameters/schemas/rollbackParameterBodySchema.ts +4 -2
- package/src/api/parameters/services/ParameterProvider.ts +69 -6
- package/src/api/subscriptions/jobs/SubscriptionJobs.ts +1 -1
- package/src/api/users/__tests__/AdminSessionController.spec.ts +37 -0
- package/src/api/users/audits/SessionAudits.ts +33 -0
- package/src/api/users/audits/UserAudits.ts +19 -43
- package/src/api/users/controllers/AdminUserController.ts +66 -1
- package/src/api/users/controllers/RealmController.ts +1 -0
- package/src/api/users/entities/sessions.ts +6 -0
- package/src/api/users/entities/users.ts +2 -0
- package/src/api/users/index.ts +9 -1
- package/src/api/users/primitives/$realm.ts +29 -0
- package/src/api/users/providers/RealmProvider.ts +15 -0
- package/src/api/users/schemas/realmConfigSchema.ts +14 -0
- package/src/api/users/schemas/sessionResourceSchema.ts +16 -0
- package/src/api/users/schemas/updateUserSchema.ts +1 -8
- package/src/api/users/schemas/userQuerySchema.ts +7 -0
- package/src/api/users/services/CredentialService.ts +15 -6
- package/src/api/users/services/IdentityService.ts +2 -1
- package/src/api/users/services/RegistrationService.ts +2 -1
- package/src/api/users/services/SessionCrudService.ts +19 -2
- package/src/api/users/services/SessionService.ts +39 -19
- package/src/api/users/services/UserService.ts +106 -8
- package/src/background/__tests__/BackgroundTaskProvider.spec.ts +96 -0
- package/src/background/index.ts +37 -0
- package/src/background/index.workerd.ts +28 -0
- package/src/background/providers/BackgroundTaskProvider.ts +70 -0
- package/src/background/providers/WorkerdBackgroundTaskProvider.ts +43 -0
- package/src/bucket/__tests__/$bucket.spec.ts +18 -0
- package/src/bucket/__tests__/LocalFileStorageProvider.spec.ts +5 -0
- package/src/bucket/__tests__/MemoryFileStorageProvider.spec.ts +5 -0
- package/src/bucket/__tests__/NodeS3BucketProvider.spec.ts +23 -4
- package/src/bucket/__tests__/shared.ts +30 -0
- package/src/bucket/index.ts +5 -5
- package/src/bucket/index.workerd.ts +11 -4
- package/src/bucket/primitives/$bucket.ts +27 -0
- package/src/bucket/providers/FileStorageProvider.ts +13 -0
- package/src/bucket/providers/LocalFileStorageProvider.ts +17 -1
- package/src/bucket/providers/MemoryFileStorageProvider.ts +7 -0
- package/src/bucket/providers/{CloudflareR2Provider.ts → R2FileStorageProvider.ts} +10 -1
- package/src/bucket/providers/{NodeS3BucketProvider.ts → S3FileStorageProvider.ts} +27 -5
- package/src/cli/core/__tests__/BuildDockerTask.spec.ts +25 -1
- package/src/cli/core/__tests__/init.spec.ts +0 -219
- package/src/cli/core/atoms/buildOptions.ts +0 -12
- package/src/cli/core/commands/__tests__/BuildCommand.spec.ts +43 -0
- package/src/cli/core/commands/build.ts +105 -37
- package/src/cli/core/commands/init.ts +0 -12
- package/src/cli/core/commands/pack.ts +133 -0
- package/src/cli/core/index.ts +3 -3
- package/src/cli/core/providers/ViteDevServerProvider.ts +40 -16
- package/src/cli/core/services/PackageManagerUtils.ts +0 -16
- package/src/cli/core/services/ProjectScaffolder.ts +29 -291
- package/src/cli/core/tasks/BuildCloudflareTask.ts +382 -56
- package/src/cli/core/tasks/BuildDockerTask.ts +33 -3
- package/src/cli/core/tasks/BuildPrerenderTask.ts +44 -7
- package/src/cli/core/tasks/BuildTask.ts +34 -0
- package/src/cli/core/templates/apiIndexTs.ts +1 -22
- package/src/cli/core/templates/mainCss.ts +0 -1
- package/src/cli/core/templates/webAppRouterTs.ts +0 -99
- package/src/cli/core/templates/webIndexTs.ts +1 -22
- package/src/cli/i18n/__tests__/I18nCheckService.spec.ts +48 -0
- package/src/cli/i18n/services/I18nCheckService.ts +65 -11
- package/src/cli/platform/__tests__/SecretsCommand.spec.ts +5 -3
- package/src/cli/platform/commands/SecretsCommand.ts +8 -6
- package/src/cli/platform/commands/platform.ts +192 -46
- package/src/cli/platform/index.ts +12 -52
- package/src/cli/{platform → platform-lib}/__tests__/CloudflareAdapter.spec.ts +426 -169
- package/src/cli/{platform → platform-lib}/__tests__/NamingService.spec.ts +91 -4
- package/src/cli/{platform → platform-lib}/__tests__/VercelAdapter.spec.ts +56 -85
- package/src/cli/{platform → platform-lib}/adapters/CloudflareAdapter.ts +519 -190
- package/src/cli/{platform → platform-lib}/adapters/PlatformAdapter.ts +62 -35
- package/src/cli/{platform → platform-lib}/adapters/VercelAdapter.ts +6 -10
- package/src/cli/{platform → platform-lib}/atoms/platformOptions.ts +34 -1
- package/src/cli/platform-lib/index.ts +67 -0
- package/src/cli/platform-lib/services/NamingService.ts +136 -0
- package/src/cli/{platform → platform-lib}/services/PlatformInspector.ts +60 -13
- package/src/cli/{platform → platform-lib}/services/PlatformOrchestrator.ts +54 -43
- package/src/cli/{platform → platform-lib}/services/WranglerApi.ts +4 -2
- package/src/command/__tests__/Runner.spec.ts +20 -0
- package/src/command/helpers/EnvUtils.ts +19 -3
- package/src/command/helpers/Runner.ts +12 -2
- package/src/command/providers/CliProvider.ts +34 -1
- package/src/{containers → container}/core/__tests__/$container.spec.ts +5 -5
- package/src/{containers → container}/core/index.ts +4 -4
- package/src/{containers → container}/core/index.workerd.ts +19 -3
- package/src/{containers → container}/core/primitives/$container.ts +1 -1
- package/src/{containers → container}/core/providers/CloudflareContainerProvider.ts +17 -19
- package/src/{containers → container}/core/providers/ContainerProvider.ts +16 -2
- package/src/{containers → container}/core/providers/MockContainerProvider.ts +1 -1
- package/src/core/Alepha.ts +49 -1
- package/src/core/__tests__/$env.spec.ts +42 -0
- package/src/core/__tests__/dump.spec.ts +47 -0
- package/src/email/cloudflare/__tests__/CloudflareEmailProvider.spec.ts +42 -10
- package/src/email/cloudflare/index.ts +14 -5
- package/src/email/cloudflare/providers/CloudflareEmailProvider.ts +54 -9
- package/src/logger/__tests__/Logger.spec.ts +55 -0
- package/src/logger/index.ts +13 -0
- package/src/logger/services/Logger.ts +31 -1
- package/src/mcp/__tests__/McpServerProvider.spec.ts +71 -0
- package/src/mcp/providers/McpServerProvider.ts +55 -0
- package/src/orm/__tests__/orm-showcase-tests.ts +27 -0
- package/src/orm/__tests__/orm-showcase.spec.ts +12 -0
- package/src/orm/core/interfaces/PgQuery.ts +4 -1
- package/src/orm/core/services/Repository.ts +27 -11
- package/src/react/auth/hooks/useAuth.ts +10 -5
- package/src/react/core/__tests__/useQuery.browser.spec.tsx +25 -0
- package/src/react/core/hooks/useAction.ts +14 -3
- package/src/react/core/hooks/useQuery.ts +24 -4
- package/src/react/form/__tests__/FormModel-submit-loading.spec.ts +71 -0
- package/src/react/form/__tests__/form-submitting-reactive.browser.spec.tsx +96 -0
- package/src/react/form/services/FormModel.ts +57 -39
- package/src/react/i18n/__tests__/I18nProvider.spec.ts +89 -0
- package/src/react/i18n/__tests__/locale-routing.spec.ts +107 -0
- package/src/react/i18n/components/Translate.tsx +47 -0
- package/src/react/i18n/index.ts +2 -0
- package/src/react/i18n/providers/I18nProvider.ts +171 -12
- package/src/react/intro/components/GettingStartedAdminSlide.tsx +2 -2
- package/src/react/router/__tests__/$page.spec.tsx +3 -2
- package/src/react/router/__tests__/RouterLocaleProvider.spec.ts +127 -0
- package/src/react/router/__tests__/page-can.spec.ts +18 -13
- package/src/react/router/hooks/useQueryParams.ts +114 -14
- package/src/react/router/index.browser.ts +4 -0
- package/src/react/router/index.shared.ts +1 -0
- package/src/react/router/index.ts +9 -0
- package/src/react/router/primitives/$page.ts +85 -4
- package/src/react/router/providers/ReactBrowserRouterProvider.ts +18 -8
- package/src/react/router/providers/ReactPageProvider.ts +12 -1
- package/src/react/router/providers/ReactServerProvider.ts +96 -14
- package/src/react/router/providers/RootComponentsProvider.ts +13 -0
- package/src/react/router/providers/RouterLocaleProvider.ts +125 -0
- package/src/react/router/providers/__tests__/RootComponentsProvider.spec.ts +15 -0
- package/src/react/router/providers/__tests__/rootComponents.ssr.browser.spec.tsx +67 -0
- package/src/react/sitemap/__tests__/$sitemap.spec.ts +131 -0
- package/src/react/sitemap/index.browser.ts +21 -0
- package/src/react/sitemap/index.ts +25 -0
- package/src/react/sitemap/primitives/$sitemap.browser.ts +26 -0
- package/src/react/sitemap/primitives/$sitemap.ts +196 -0
- package/src/react/ui/services/SchemaControl.ts +3 -4
- package/src/server/auth/__tests__/appleClientSecret.spec.ts +34 -0
- package/src/server/auth/__tests__/authFederationClient.spec.ts +40 -0
- package/src/server/auth/__tests__/federationAssertion.spec.ts +146 -0
- package/src/server/auth/__tests__/federationRedirectReplay.spec.ts +44 -0
- package/src/server/auth/helpers/appleClientSecret.ts +24 -0
- package/src/server/auth/helpers/federationAssertion.ts +74 -0
- package/src/server/auth/helpers/jtiReplayGuard.ts +41 -0
- package/src/server/auth/helpers/safeRedirectPath.ts +19 -0
- package/src/server/auth/index.ts +4 -0
- package/src/server/auth/primitives/$authFederationBroker.ts +273 -0
- package/src/server/auth/primitives/$authFederationClient.ts +89 -0
- package/src/server/auth/providers/ServerAuthProvider.ts +18 -4
- package/src/server/cookies/__tests__/ServerCookiesProvider.spec.ts +70 -0
- package/src/server/cookies/providers/ServerCookiesProvider.ts +23 -3
- package/src/server/core/interfaces/ServerRequest.ts +8 -0
- package/src/server/core/primitives/$route.ts +27 -0
- package/src/server/core/providers/ServerMultipartProvider.ts +19 -0
- package/src/server/links/providers/LinkProvider.ts +10 -0
- package/dist/containers/core/index.d.ts.map +0 -1
- package/dist/containers/core/index.js.map +0 -1
- package/dist/containers/core/index.workerd.js.map +0 -1
- package/src/cli/core/tasks/BuildSitemapTask.ts +0 -130
- package/src/cli/core/templates/componentsJsonTs.ts +0 -39
- package/src/cli/core/templates/saasAdminLayoutTsx.ts +0 -77
- package/src/cli/core/templates/saasAdminPagesTsx.ts +0 -26
- package/src/cli/core/templates/saasAuthLayoutTsx.ts +0 -22
- package/src/cli/core/templates/saasAuthPagesTsx.ts +0 -62
- package/src/cli/core/templates/saasRealmProviderTs.ts +0 -52
- package/src/cli/platform/services/NamingService.ts +0 -54
- /package/dist/orm/core/{chunk-o8xxKEmq.js → chunk-B4FMCO8f.js} +0 -0
- /package/dist/react/testing/{chunk-6Ep1yQYe.js → chunk-BpyX8vjI.js} +0 -0
- /package/src/cli/{platform → platform-lib}/__tests__/GitHubSecretStore.spec.ts +0 -0
- /package/src/cli/{platform → platform-lib}/__tests__/PlatformCacheProvider.spec.ts +0 -0
- /package/src/cli/{platform → platform-lib}/__tests__/PlatformInspector.spec.ts +0 -0
- /package/src/cli/{platform → platform-lib}/__tests__/PlatformOrchestrator.spec.ts +0 -0
- /package/src/cli/{platform → platform-lib}/__tests__/SecretFilterService.spec.ts +0 -0
- /package/src/cli/{platform → platform-lib}/__tests__/detectResources.spec.ts +0 -0
- /package/src/cli/{platform → platform-lib}/providers/GitHubSecretStore.ts +0 -0
- /package/src/cli/{platform → platform-lib}/providers/MemorySecretStore.ts +0 -0
- /package/src/cli/{platform → platform-lib}/providers/PlatformCacheProvider.ts +0 -0
- /package/src/cli/{platform → platform-lib}/providers/SecretStoreProvider.ts +0 -0
- /package/src/cli/{platform → platform-lib}/schemas/cloudflare.ts +0 -0
- /package/src/cli/{platform → platform-lib}/schemas/platform.ts +0 -0
- /package/src/cli/{platform → platform-lib}/schemas/vercel.ts +0 -0
- /package/src/cli/{platform → platform-lib}/services/CloudflareApi.ts +0 -0
- /package/src/cli/{platform → platform-lib}/services/SecretFilterService.ts +0 -0
- /package/src/cli/{platform → platform-lib}/services/VercelApi.ts +0 -0
- /package/src/cli/{platform → platform-lib}/services/VercelCli.ts +0 -0
- /package/src/{containers → container}/core/interfaces/ContainerOptions.ts +0 -0
- /package/src/{containers → container}/core/providers/NodeContainerProvider.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["urllib","urllib","net","PassThrough","urllib","util","fs","dns","net","os","path","Transform","Transform","Transform","Transform","Transform","crypto","fs","formattedHeaders","PassThrough","Transform","crypto","Transform","crypto","crypto","PassThrough","net","tls","urllib","EventEmitter","net","crypto","crypto","EventEmitter","EventEmitter","EventEmitter","EventEmitter","nodemailer"],"sources":["../../../../../node_modules/nodemailer/lib/fetch/cookies.js","../../../../../node_modules/nodemailer/package.json","../../../../../node_modules/nodemailer/lib/errors.js","../../../../../node_modules/nodemailer/lib/fetch/index.js","../../../../../node_modules/nodemailer/lib/shared/index.js","../../../../../node_modules/nodemailer/lib/mime-funcs/mime-types.js","../../../../../node_modules/nodemailer/lib/punycode/index.js","../../../../../node_modules/nodemailer/lib/base64/index.js","../../../../../node_modules/nodemailer/lib/qp/index.js","../../../../../node_modules/nodemailer/lib/mime-funcs/index.js","../../../../../node_modules/nodemailer/lib/addressparser/index.js","../../../../../node_modules/nodemailer/lib/mime-node/last-newline.js","../../../../../node_modules/nodemailer/lib/mime-node/le-windows.js","../../../../../node_modules/nodemailer/lib/mime-node/le-unix.js","../../../../../node_modules/nodemailer/lib/mime-node/index.js","../../../../../node_modules/nodemailer/lib/mail-composer/index.js","../../../../../node_modules/nodemailer/lib/dkim/message-parser.js","../../../../../node_modules/nodemailer/lib/dkim/relaxed-body.js","../../../../../node_modules/nodemailer/lib/dkim/sign.js","../../../../../node_modules/nodemailer/lib/dkim/index.js","../../../../../node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js","../../../../../node_modules/nodemailer/lib/mailer/mail-message.js","../../../../../node_modules/nodemailer/lib/mailer/index.js","../../../../../node_modules/nodemailer/lib/smtp-connection/data-stream.js","../../../../../node_modules/nodemailer/lib/smtp-connection/index.js","../../../../../node_modules/nodemailer/lib/xoauth2/index.js","../../../../../node_modules/nodemailer/lib/smtp-pool/pool-resource.js","../../../../../node_modules/nodemailer/lib/well-known/services.json","../../../../../node_modules/nodemailer/lib/well-known/index.js","../../../../../node_modules/nodemailer/lib/smtp-pool/index.js","../../../../../node_modules/nodemailer/lib/smtp-transport/index.js","../../../../../node_modules/nodemailer/lib/sendmail-transport/index.js","../../../../../node_modules/nodemailer/lib/stream-transport/index.js","../../../../../node_modules/nodemailer/lib/json-transport/index.js","../../../../../node_modules/nodemailer/lib/ses-transport/index.js","../../../../../node_modules/nodemailer/lib/nodemailer.js","../../../src/email/smtp/providers/NodemailerEmailProvider.ts","../../../src/email/smtp/index.ts"],"sourcesContent":["'use strict';\n\n// module to handle cookies\n\nconst urllib = require('url');\n\nconst SESSION_TIMEOUT = 1800; // 30 min\n\n/**\n * Creates a biskviit cookie jar for managing cookie values in memory\n *\n * @constructor\n * @param {Object} [options] Optional options object\n */\nclass Cookies {\n constructor(options) {\n this.options = options || {};\n this.cookies = [];\n }\n\n /**\n * Stores a cookie string to the cookie storage\n *\n * @param {String} cookieStr Value from the 'Set-Cookie:' header\n * @param {String} url Current URL\n */\n set(cookieStr, url) {\n const urlparts = urllib.parse(url || '');\n const cookie = this.parse(cookieStr);\n let domain;\n\n if (cookie.domain) {\n domain = cookie.domain.replace(/^\\./, '');\n\n // do not allow cross origin cookies\n if (\n // can't be valid if the requested domain is shorter than current hostname\n urlparts.hostname.length < domain.length ||\n // prefix domains with dot to be sure that partial matches are not used\n ('.' + urlparts.hostname).substr(-domain.length + 1) !== '.' + domain\n ) {\n cookie.domain = urlparts.hostname;\n }\n } else {\n cookie.domain = urlparts.hostname;\n }\n\n if (!cookie.path) {\n cookie.path = this.getPath(urlparts.pathname);\n }\n\n // if no expire date, then use sessionTimeout value\n if (!cookie.expires) {\n cookie.expires = new Date(Date.now() + (Number(this.options.sessionTimeout || SESSION_TIMEOUT) || SESSION_TIMEOUT) * 1000);\n }\n\n return this.add(cookie);\n }\n\n /**\n * Returns cookie string for the 'Cookie:' header.\n *\n * @param {String} url URL to check for\n * @returns {String} Cookie header or empty string if no matches were found\n */\n get(url) {\n return this.list(url)\n .map(cookie => cookie.name + '=' + cookie.value)\n .join('; ');\n }\n\n /**\n * Lists all valied cookie objects for the specified URL\n *\n * @param {String} url URL to check for\n * @returns {Array} An array of cookie objects\n */\n list(url) {\n const result = [];\n\n for (let i = this.cookies.length - 1; i >= 0; i--) {\n const cookie = this.cookies[i];\n\n if (this.isExpired(cookie)) {\n this.cookies.splice(i, 1);\n continue;\n }\n\n if (this.match(cookie, url)) {\n result.unshift(cookie);\n }\n }\n\n return result;\n }\n\n /**\n * Parses cookie string from the 'Set-Cookie:' header\n *\n * @param {String} cookieStr String from the 'Set-Cookie:' header\n * @returns {Object} Cookie object\n */\n parse(cookieStr) {\n const cookie = {};\n\n (cookieStr || '')\n .toString()\n .split(';')\n .forEach(cookiePart => {\n const valueParts = cookiePart.split('=');\n const key = valueParts.shift().trim().toLowerCase();\n let value = valueParts.join('=').trim();\n let domain;\n\n if (!key) {\n // skip empty parts\n return;\n }\n\n switch (key) {\n case 'expires':\n value = new Date(value);\n // ignore date if can not parse it\n if (value.toString() !== 'Invalid Date') {\n cookie.expires = value;\n }\n break;\n\n case 'path':\n cookie.path = value;\n break;\n\n case 'domain':\n domain = value.toLowerCase();\n if (domain.length && domain.charAt(0) !== '.') {\n domain = '.' + domain; // ensure preceeding dot for user set domains\n }\n cookie.domain = domain;\n break;\n\n case 'max-age':\n cookie.expires = new Date(Date.now() + (Number(value) || 0) * 1000);\n break;\n\n case 'secure':\n cookie.secure = true;\n break;\n\n case 'httponly':\n cookie.httponly = true;\n break;\n\n default:\n if (!cookie.name) {\n cookie.name = key;\n cookie.value = value;\n }\n }\n });\n\n return cookie;\n }\n\n /**\n * Checks if a cookie object is valid for a specified URL\n *\n * @param {Object} cookie Cookie object\n * @param {String} url URL to check for\n * @returns {Boolean} true if cookie is valid for specifiec URL\n */\n match(cookie, url) {\n const urlparts = urllib.parse(url || '');\n\n // check if hostname matches\n // .foo.com also matches subdomains, foo.com does not\n if (\n urlparts.hostname !== cookie.domain &&\n (cookie.domain.charAt(0) !== '.' || ('.' + urlparts.hostname).substr(-cookie.domain.length) !== cookie.domain)\n ) {\n return false;\n }\n\n // check if path matches\n const path = this.getPath(urlparts.pathname);\n if (path.substr(0, cookie.path.length) !== cookie.path) {\n return false;\n }\n\n // check secure argument\n if (cookie.secure && urlparts.protocol !== 'https:') {\n return false;\n }\n\n return true;\n }\n\n /**\n * Adds (or updates/removes if needed) a cookie object to the cookie storage\n *\n * @param {Object} cookie Cookie value to be stored\n */\n add(cookie) {\n // nothing to do here\n if (!cookie || !cookie.name) {\n return false;\n }\n\n // overwrite if has same params\n for (let i = 0, len = this.cookies.length; i < len; i++) {\n if (this.compare(this.cookies[i], cookie)) {\n // check if the cookie needs to be removed instead\n if (this.isExpired(cookie)) {\n this.cookies.splice(i, 1); // remove expired/unset cookie\n return false;\n }\n\n this.cookies[i] = cookie;\n return true;\n }\n }\n\n // add as new if not already expired\n if (!this.isExpired(cookie)) {\n this.cookies.push(cookie);\n }\n\n return true;\n }\n\n /**\n * Checks if two cookie objects are the same\n *\n * @param {Object} a Cookie to check against\n * @param {Object} b Cookie to check against\n * @returns {Boolean} True, if the cookies are the same\n */\n compare(a, b) {\n return a.name === b.name && a.path === b.path && a.domain === b.domain && a.secure === b.secure && a.httponly === b.httponly;\n }\n\n /**\n * Checks if a cookie is expired\n *\n * @param {Object} cookie Cookie object to check against\n * @returns {Boolean} True, if the cookie is expired\n */\n isExpired(cookie) {\n return (cookie.expires && cookie.expires < new Date()) || !cookie.value;\n }\n\n /**\n * Returns normalized cookie path for an URL path argument\n *\n * @param {String} pathname\n * @returns {String} Normalized path\n */\n getPath(pathname) {\n let path = (pathname || '/').split('/');\n path.pop(); // remove filename part\n path = path.join('/').trim();\n\n // ensure path prefix /\n if (path.charAt(0) !== '/') {\n path = '/' + path;\n }\n\n // ensure path suffix /\n if (path.substr(-1) !== '/') {\n path += '/';\n }\n\n return path;\n }\n}\n\nmodule.exports = Cookies;\n","","'use strict';\n\n/**\n * Nodemailer Error Codes\n *\n * Centralized error code definitions for consistent error handling.\n *\n * Usage:\n * const errors = require('./errors');\n * let err = new Error('Connection closed');\n * err.code = errors.ECONNECTION;\n */\n\n/**\n * Error code descriptions for documentation and debugging\n */\nconst ERROR_CODES = {\n // Connection errors\n ECONNECTION: 'Connection closed unexpectedly',\n ETIMEDOUT: 'Connection or operation timed out',\n ESOCKET: 'Socket-level error',\n EDNS: 'DNS resolution failed',\n\n // TLS/Security errors\n ETLS: 'TLS handshake or STARTTLS failed',\n EREQUIRETLS: 'REQUIRETLS not supported by server (RFC 8689)',\n\n // Protocol errors\n EPROTOCOL: 'Invalid SMTP server response',\n EENVELOPE: 'Invalid mail envelope (sender or recipients)',\n EMESSAGE: 'Message delivery error',\n ESTREAM: 'Stream processing error',\n\n // Authentication errors\n EAUTH: 'Authentication failed',\n ENOAUTH: 'Authentication credentials not provided',\n EOAUTH2: 'OAuth2 token generation or refresh error',\n\n // Resource errors\n EMAXLIMIT: 'Pool resource limit reached (max messages per connection)',\n\n // Transport-specific errors\n ESENDMAIL: 'Sendmail command error',\n ESES: 'AWS SES transport error',\n\n // Configuration and access errors\n ECONFIG: 'Invalid configuration',\n EPROXY: 'Proxy connection error',\n EFILEACCESS: 'File access rejected (disableFileAccess is set)',\n EURLACCESS: 'URL access rejected (disableUrlAccess is set)',\n EFETCH: 'HTTP fetch error'\n};\n\n// Export error codes as string constants and the full definitions object\nmodule.exports = { ERROR_CODES };\nfor (const code of Object.keys(ERROR_CODES)) {\n module.exports[code] = code;\n}\n","'use strict';\n\nconst http = require('http');\nconst https = require('https');\nconst urllib = require('url');\nconst zlib = require('zlib');\nconst { PassThrough } = require('stream');\nconst Cookies = require('./cookies');\nconst packageData = require('../../package.json');\nconst net = require('net');\nconst errors = require('../errors');\n\nconst MAX_REDIRECTS = 5;\n\nmodule.exports = function (url, options) {\n return nmfetch(url, options);\n};\n\nmodule.exports.Cookies = Cookies;\n\nfunction nmfetch(url, options) {\n options = options || {};\n\n options.fetchRes = options.fetchRes || new PassThrough();\n options.cookies = options.cookies || new Cookies();\n options.redirects = options.redirects || 0;\n options.maxRedirects = isNaN(options.maxRedirects) ? MAX_REDIRECTS : options.maxRedirects;\n\n if (options.cookie) {\n [].concat(options.cookie || []).forEach(cookie => {\n options.cookies.set(cookie, url);\n });\n options.cookie = false;\n }\n\n const fetchRes = options.fetchRes;\n const parsed = urllib.parse(url);\n let method = (options.method || '').toString().trim().toUpperCase() || 'GET';\n let finished = false;\n let cookies;\n let body;\n\n const handler = parsed.protocol === 'https:' ? https : http;\n\n const headers = {\n 'accept-encoding': 'gzip,deflate',\n 'user-agent': 'nodemailer/' + packageData.version\n };\n\n Object.keys(options.headers || {}).forEach(key => {\n headers[key.toLowerCase().trim()] = options.headers[key];\n });\n\n if (options.userAgent) {\n headers['user-agent'] = options.userAgent;\n }\n\n if (parsed.auth) {\n headers.Authorization = 'Basic ' + Buffer.from(parsed.auth).toString('base64');\n }\n\n if ((cookies = options.cookies.get(url))) {\n headers.cookie = cookies;\n }\n\n if (options.body) {\n if (options.contentType !== false) {\n headers['Content-Type'] = options.contentType || 'application/x-www-form-urlencoded';\n }\n\n if (typeof options.body.pipe === 'function') {\n // it's a stream\n headers['Transfer-Encoding'] = 'chunked';\n body = options.body;\n body.on('error', err => {\n if (finished) {\n return;\n }\n finished = true;\n err.code = errors.EFETCH;\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n });\n } else {\n if (options.body instanceof Buffer) {\n body = options.body;\n } else if (typeof options.body === 'object') {\n try {\n // encodeURIComponent can fail on invalid input (partial emoji etc.)\n body = Buffer.from(\n Object.keys(options.body)\n .map(key => {\n const value = options.body[key].toString().trim();\n return encodeURIComponent(key) + '=' + encodeURIComponent(value);\n })\n .join('&')\n );\n } catch (E) {\n if (finished) {\n return;\n }\n finished = true;\n E.code = errors.EFETCH;\n E.sourceUrl = url;\n fetchRes.emit('error', E);\n return;\n }\n } else {\n body = Buffer.from(options.body.toString().trim());\n }\n\n headers['Content-Type'] = options.contentType || 'application/x-www-form-urlencoded';\n headers['Content-Length'] = body.length;\n }\n // if method is not provided, use POST instead of GET\n method = (options.method || '').toString().trim().toUpperCase() || 'POST';\n }\n\n let req;\n const reqOptions = {\n method,\n host: parsed.hostname,\n path: parsed.path,\n port: parsed.port ? parsed.port : parsed.protocol === 'https:' ? 443 : 80,\n headers,\n rejectUnauthorized: false,\n agent: false\n };\n\n if (options.tls) {\n Object.assign(reqOptions, options.tls);\n }\n\n if (\n parsed.protocol === 'https:' &&\n parsed.hostname &&\n parsed.hostname !== reqOptions.host &&\n !net.isIP(parsed.hostname) &&\n !reqOptions.servername\n ) {\n reqOptions.servername = parsed.hostname;\n }\n\n try {\n req = handler.request(reqOptions);\n } catch (E) {\n finished = true;\n setImmediate(() => {\n E.code = errors.EFETCH;\n E.sourceUrl = url;\n fetchRes.emit('error', E);\n });\n return fetchRes;\n }\n\n if (options.timeout) {\n req.setTimeout(options.timeout, () => {\n if (finished) {\n return;\n }\n finished = true;\n req.abort();\n const err = new Error('Request Timeout');\n err.code = errors.EFETCH;\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n });\n }\n\n req.on('error', err => {\n if (finished) {\n return;\n }\n finished = true;\n err.code = errors.EFETCH;\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n });\n\n req.on('response', res => {\n let inflate;\n\n if (finished) {\n return;\n }\n\n switch (res.headers['content-encoding']) {\n case 'gzip':\n case 'deflate':\n inflate = zlib.createUnzip();\n break;\n }\n\n if (res.headers['set-cookie']) {\n [].concat(res.headers['set-cookie'] || []).forEach(cookie => {\n options.cookies.set(cookie, url);\n });\n }\n\n if ([301, 302, 303, 307, 308].includes(res.statusCode) && res.headers.location) {\n // redirect\n options.redirects++;\n if (options.redirects > options.maxRedirects) {\n finished = true;\n const err = new Error('Maximum redirect count exceeded');\n err.code = errors.EFETCH;\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n req.abort();\n return;\n }\n // redirect does not include POST body\n options.method = 'GET';\n options.body = false;\n return nmfetch(urllib.resolve(url, res.headers.location), options);\n }\n\n fetchRes.statusCode = res.statusCode;\n fetchRes.headers = res.headers;\n\n if (res.statusCode >= 300 && !options.allowErrorResponse) {\n finished = true;\n const err = new Error('Invalid status code ' + res.statusCode);\n err.code = errors.EFETCH;\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n req.abort();\n return;\n }\n\n res.on('error', err => {\n if (finished) {\n return;\n }\n finished = true;\n err.code = errors.EFETCH;\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n req.abort();\n });\n\n if (inflate) {\n res.pipe(inflate).pipe(fetchRes);\n inflate.on('error', err => {\n if (finished) {\n return;\n }\n finished = true;\n err.code = errors.EFETCH;\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n req.abort();\n });\n } else {\n res.pipe(fetchRes);\n }\n });\n\n setImmediate(() => {\n if (body) {\n try {\n if (typeof body.pipe === 'function') {\n return body.pipe(req);\n }\n req.write(body);\n } catch (err) {\n finished = true;\n err.code = errors.EFETCH;\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n return;\n }\n }\n req.end();\n });\n\n return fetchRes;\n}\n","/* eslint no-console: 0 */\n\n'use strict';\n\nconst urllib = require('url');\nconst util = require('util');\nconst fs = require('fs');\nconst nmfetch = require('../fetch');\nconst dns = require('dns');\nconst net = require('net');\nconst os = require('os');\n\nconst DNS_TTL = 5 * 60 * 1000;\nconst CACHE_CLEANUP_INTERVAL = 30 * 1000; // Minimum 30 seconds between cleanups\nconst MAX_CACHE_SIZE = 1000; // Maximum number of entries in cache\n\nlet lastCacheCleanup = 0;\nmodule.exports._lastCacheCleanup = () => lastCacheCleanup;\nmodule.exports._resetCacheCleanup = () => {\n lastCacheCleanup = 0;\n};\n\nlet networkInterfaces;\ntry {\n networkInterfaces = os.networkInterfaces();\n} catch (_err) {\n // fails on some systems\n}\n\nmodule.exports.networkInterfaces = networkInterfaces;\n\nconst isFamilySupported = (family, allowInternal) => {\n const ifaces = module.exports.networkInterfaces;\n if (!ifaces) {\n // hope for the best\n return true;\n }\n\n return Object.keys(ifaces)\n .map(key => ifaces[key])\n .reduce((acc, val) => acc.concat(val), [])\n .filter(i => !i.internal || allowInternal)\n .some(i => i.family === 'IPv' + family || i.family === family);\n};\n\nconst resolve = (family, hostname, options, callback) => {\n options = options || {};\n\n if (!isFamilySupported(family, options.allowInternalNetworkInterfaces)) {\n return callback(null, []);\n }\n\n const dnsResolver = dns.Resolver ? new dns.Resolver(options) : dns;\n dnsResolver['resolve' + family](hostname, (err, addresses) => {\n if (err) {\n switch (err.code) {\n case dns.NODATA:\n case dns.NOTFOUND:\n case dns.NOTIMP:\n case dns.SERVFAIL:\n case dns.CONNREFUSED:\n case dns.REFUSED:\n case 'EAI_AGAIN':\n return callback(null, []);\n }\n return callback(err);\n }\n return callback(null, Array.isArray(addresses) ? addresses : [].concat(addresses || []));\n });\n};\n\nconst dnsCache = (module.exports.dnsCache = new Map());\n\nconst formatDNSValue = (value, extra) => {\n if (!value) {\n return Object.assign({}, extra || {});\n }\n\n const addresses = value.addresses || [];\n\n // Select a random address from available addresses, or null if none\n const host = addresses.length > 0 ? addresses[Math.floor(Math.random() * addresses.length)] : null;\n\n return Object.assign(\n {\n servername: value.servername,\n host,\n // Include all addresses for connection fallback support\n _addresses: addresses\n },\n extra || {}\n );\n};\n\nmodule.exports.resolveHostname = (options, callback) => {\n options = options || {};\n\n if (!options.host && options.servername) {\n options.host = options.servername;\n }\n\n if (!options.host || net.isIP(options.host)) {\n // nothing to do here\n const value = {\n addresses: [options.host],\n servername: options.servername || false\n };\n return callback(\n null,\n formatDNSValue(value, {\n cached: false\n })\n );\n }\n\n let cached;\n if (dnsCache.has(options.host)) {\n cached = dnsCache.get(options.host);\n\n // Lazy cleanup with time throttling\n const now = Date.now();\n if (now - lastCacheCleanup > CACHE_CLEANUP_INTERVAL) {\n lastCacheCleanup = now;\n\n // Clean up expired entries\n for (const [host, entry] of dnsCache.entries()) {\n if (entry.expires && entry.expires < now) {\n dnsCache.delete(host);\n }\n }\n\n // If cache is still too large, remove oldest entries\n if (dnsCache.size > MAX_CACHE_SIZE) {\n const toDelete = Math.floor(MAX_CACHE_SIZE * 0.1); // Remove 10% of entries\n const keys = Array.from(dnsCache.keys()).slice(0, toDelete);\n keys.forEach(key => dnsCache.delete(key));\n }\n }\n\n if (!cached.expires || cached.expires >= now) {\n return callback(\n null,\n formatDNSValue(cached.value, {\n cached: true\n })\n );\n }\n }\n\n // Resolve both IPv4 and IPv6 addresses for fallback support\n let ipv4Addresses = [];\n let ipv6Addresses = [];\n let ipv4Error = null;\n let ipv6Error = null;\n\n resolve(4, options.host, options, (err, addresses) => {\n if (err) {\n ipv4Error = err;\n } else {\n ipv4Addresses = addresses || [];\n }\n\n resolve(6, options.host, options, (err, addresses) => {\n if (err) {\n ipv6Error = err;\n } else {\n ipv6Addresses = addresses || [];\n }\n\n // Combine addresses: IPv4 first, then IPv6\n const allAddresses = ipv4Addresses.concat(ipv6Addresses);\n\n if (allAddresses.length) {\n const value = {\n addresses: allAddresses,\n servername: options.servername || options.host\n };\n\n dnsCache.set(options.host, {\n value,\n expires: Date.now() + (options.dnsTtl || DNS_TTL)\n });\n\n return callback(\n null,\n formatDNSValue(value, {\n cached: false\n })\n );\n }\n\n // No addresses from resolve4/resolve6, try dns.lookup as fallback\n if (ipv4Error && ipv6Error) {\n // Both resolvers had errors\n if (cached) {\n dnsCache.set(options.host, {\n value: cached.value,\n expires: Date.now() + (options.dnsTtl || DNS_TTL)\n });\n\n return callback(\n null,\n formatDNSValue(cached.value, {\n cached: true,\n error: ipv4Error\n })\n );\n }\n }\n\n try {\n dns.lookup(options.host, { all: true }, (err, addresses) => {\n if (err) {\n if (cached) {\n dnsCache.set(options.host, {\n value: cached.value,\n expires: Date.now() + (options.dnsTtl || DNS_TTL)\n });\n\n return callback(\n null,\n formatDNSValue(cached.value, {\n cached: true,\n error: err\n })\n );\n }\n return callback(err);\n }\n\n // Get all supported addresses from dns.lookup\n const supportedAddresses = addresses\n ? addresses.filter(addr => isFamilySupported(addr.family)).map(addr => addr.address)\n : [];\n\n if (addresses && addresses.length && !supportedAddresses.length) {\n // there are addresses but none can be used\n console.warn(`Failed to resolve IPv${addresses[0].family} addresses with current network`);\n }\n\n if (!supportedAddresses.length && cached) {\n // nothing was found, fallback to cached value\n return callback(\n null,\n formatDNSValue(cached.value, {\n cached: true\n })\n );\n }\n\n const value = {\n addresses: supportedAddresses.length ? supportedAddresses : [options.host],\n servername: options.servername || options.host\n };\n\n dnsCache.set(options.host, {\n value,\n expires: Date.now() + (options.dnsTtl || DNS_TTL)\n });\n\n return callback(\n null,\n formatDNSValue(value, {\n cached: false\n })\n );\n });\n } catch (lookupErr) {\n if (cached) {\n dnsCache.set(options.host, {\n value: cached.value,\n expires: Date.now() + (options.dnsTtl || DNS_TTL)\n });\n\n return callback(\n null,\n formatDNSValue(cached.value, {\n cached: true,\n error: lookupErr\n })\n );\n }\n return callback(ipv4Error || ipv6Error || lookupErr);\n }\n });\n });\n};\n/**\n * Parses connection url to a structured configuration object\n *\n * @param {String} str Connection url\n * @return {Object} Configuration object\n */\nmodule.exports.parseConnectionUrl = str => {\n str = str || '';\n const options = {};\n const url = urllib.parse(str, true);\n\n switch (url.protocol) {\n case 'smtp:':\n options.secure = false;\n break;\n case 'smtps:':\n options.secure = true;\n break;\n case 'direct:':\n options.direct = true;\n break;\n }\n\n if (!isNaN(url.port) && Number(url.port)) {\n options.port = Number(url.port);\n }\n\n if (url.hostname) {\n options.host = url.hostname;\n }\n\n if (url.auth) {\n const auth = url.auth.split(':');\n options.auth = {\n user: auth.shift(),\n pass: auth.join(':')\n };\n }\n\n Object.keys(url.query || {}).forEach(key => {\n let obj = options;\n let lKey = key;\n let value = url.query[key];\n\n if (!isNaN(value)) {\n value = Number(value);\n }\n\n switch (value) {\n case 'true':\n value = true;\n break;\n case 'false':\n value = false;\n break;\n }\n\n // tls is nested object\n if (key.indexOf('tls.') === 0) {\n lKey = key.substr(4);\n if (!options.tls) {\n options.tls = {};\n }\n obj = options.tls;\n } else if (key.indexOf('.') >= 0) {\n // ignore nested properties besides tls\n return;\n }\n\n if (!(lKey in obj)) {\n obj[lKey] = value;\n }\n });\n\n return options;\n};\n\nmodule.exports._logFunc = (logger, level, defaults, data, message, ...args) => {\n const entry = Object.assign({}, defaults || {}, data || {});\n delete entry.level;\n\n logger[level](entry, message, ...args);\n};\n\n/**\n * Returns a bunyan-compatible logger interface. Uses either provided logger or\n * creates a default console logger\n *\n * @param {Object} [options] Options object that might include 'logger' value\n * @return {Object} bunyan compatible logger\n */\nmodule.exports.getLogger = (options, defaults) => {\n options = options || {};\n\n const response = {};\n const levels = ['trace', 'debug', 'info', 'warn', 'error', 'fatal'];\n\n if (!options.logger) {\n // use vanity logger\n levels.forEach(level => {\n response[level] = () => false;\n });\n return response;\n }\n\n const logger = options.logger === true ? createDefaultLogger(levels) : options.logger;\n\n levels.forEach(level => {\n response[level] = (data, message, ...args) => {\n module.exports._logFunc(logger, level, defaults, data, message, ...args);\n };\n });\n\n return response;\n};\n\n/**\n * Wrapper for creating a callback that either resolves or rejects a promise\n * based on input\n *\n * @param {Function} resolve Function to run if callback is called\n * @param {Function} reject Function to run if callback ends with an error\n */\nmodule.exports.callbackPromise = (resolve, reject) =>\n function () {\n const args = Array.from(arguments);\n const err = args.shift();\n if (err) {\n reject(err);\n } else {\n resolve(...args);\n }\n };\n\nmodule.exports.parseDataURI = uri => {\n if (typeof uri !== 'string') {\n return null;\n }\n\n // Early return for non-data URIs to avoid unnecessary processing\n if (!uri.startsWith('data:')) {\n return null;\n }\n\n // Find the first comma safely - this prevents ReDoS\n const commaPos = uri.indexOf(',');\n if (commaPos === -1) {\n return null;\n }\n\n const data = uri.substring(commaPos + 1);\n const metaStr = uri.substring('data:'.length, commaPos);\n\n let encoding;\n const metaEntries = metaStr.split(';');\n\n if (metaEntries.length > 0) {\n const lastEntry = metaEntries[metaEntries.length - 1].toLowerCase().trim();\n // Only recognize valid encoding types to prevent manipulation\n if (['base64', 'utf8', 'utf-8'].includes(lastEntry) && lastEntry.indexOf('=') === -1) {\n encoding = lastEntry;\n metaEntries.pop();\n }\n }\n\n const contentType = metaEntries.length > 0 ? metaEntries.shift() : 'application/octet-stream';\n const params = {};\n\n for (let i = 0; i < metaEntries.length; i++) {\n const entry = metaEntries[i];\n const sepPos = entry.indexOf('=');\n if (sepPos > 0) {\n // Ensure there's a key before the '='\n const key = entry.substring(0, sepPos).trim();\n const value = entry.substring(sepPos + 1).trim();\n if (key) {\n params[key] = value;\n }\n }\n }\n\n // Decode data based on encoding with proper error handling\n let bufferData;\n try {\n if (encoding === 'base64') {\n bufferData = Buffer.from(data, 'base64');\n } else {\n try {\n bufferData = Buffer.from(decodeURIComponent(data));\n } catch (_decodeError) {\n bufferData = Buffer.from(data);\n }\n }\n } catch (_bufferError) {\n bufferData = Buffer.alloc(0);\n }\n\n return {\n data: bufferData,\n encoding: encoding || null,\n contentType: contentType || 'application/octet-stream',\n params\n };\n};\n\n/**\n * Resolves a String or a Buffer value for content value. Useful if the value\n * is a Stream or a file or an URL. If the value is a Stream, overwrites\n * the stream object with the resolved value (you can't stream a value twice).\n *\n * This is useful when you want to create a plugin that needs a content value,\n * for example the `html` or `text` value as a String or a Buffer but not as\n * a file path or an URL.\n *\n * @param {Object} data An object or an Array you want to resolve an element for\n * @param {String|Number} key Property name or an Array index\n * @param {Function} callback Callback function with (err, value)\n */\nmodule.exports.resolveContent = (data, key, callback) => {\n let promise;\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = module.exports.callbackPromise(resolve, reject);\n });\n }\n\n let content = (data && data[key] && data[key].content) || data[key];\n const encoding = ((typeof data[key] === 'object' && data[key].encoding) || 'utf8')\n .toString()\n .toLowerCase()\n .replace(/[-_\\s]/g, '');\n\n if (!content) {\n return callback(null, content);\n }\n\n if (typeof content === 'object') {\n if (typeof content.pipe === 'function') {\n return resolveStream(content, (err, value) => {\n if (err) {\n return callback(err);\n }\n // we can't stream twice the same content, so we need\n // to replace the stream object with the streaming result\n if (data[key].content) {\n data[key].content = value;\n } else {\n data[key] = value;\n }\n callback(null, value);\n });\n } else if (/^https?:\\/\\//i.test(content.path || content.href)) {\n return resolveStream(nmfetch(content.path || content.href), callback);\n } else if (/^data:/i.test(content.path || content.href)) {\n const parsedDataUri = module.exports.parseDataURI(content.path || content.href);\n\n if (!parsedDataUri || !parsedDataUri.data) {\n return callback(null, Buffer.from(0));\n }\n return callback(null, parsedDataUri.data);\n } else if (content.path) {\n return resolveStream(fs.createReadStream(content.path), callback);\n }\n }\n\n if (typeof data[key].content === 'string' && !['utf8', 'usascii', 'ascii'].includes(encoding)) {\n content = Buffer.from(data[key].content, encoding);\n }\n\n // default action, return as is\n setImmediate(() => callback(null, content));\n\n return promise;\n};\n\n/**\n * Copies properties from source objects to target objects\n */\nmodule.exports.assign = function (/* target, ... sources */) {\n const args = Array.from(arguments);\n const target = args.shift() || {};\n\n args.forEach(source => {\n Object.keys(source || {}).forEach(key => {\n if (['tls', 'auth'].includes(key) && source[key] && typeof source[key] === 'object') {\n // tls and auth are special keys that need to be enumerated separately\n // other objects are passed as is\n target[key] = Object.assign(target[key] || {}, source[key]);\n } else {\n target[key] = source[key];\n }\n });\n });\n return target;\n};\n\nmodule.exports.encodeXText = str => {\n // ! 0x21\n // + 0x2B\n // = 0x3D\n // ~ 0x7E\n if (!/[^\\x21-\\x2A\\x2C-\\x3C\\x3E-\\x7E]/.test(str)) {\n return str;\n }\n const buf = Buffer.from(str);\n let result = '';\n for (let i = 0, len = buf.length; i < len; i++) {\n const c = buf[i];\n if (c < 0x21 || c > 0x7e || c === 0x2b || c === 0x3d) {\n result += '+' + (c < 0x10 ? '0' : '') + c.toString(16).toUpperCase();\n } else {\n result += String.fromCharCode(c);\n }\n }\n return result;\n};\n\n/**\n * Streams a stream value into a Buffer\n *\n * @param {Object} stream Readable stream\n * @param {Function} callback Callback function with (err, value)\n */\nfunction resolveStream(stream, callback) {\n let responded = false;\n const chunks = [];\n let chunklen = 0;\n\n stream.on('error', err => {\n if (responded) {\n return;\n }\n\n responded = true;\n callback(err);\n });\n\n stream.on('readable', () => {\n let chunk;\n while ((chunk = stream.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n\n stream.on('end', () => {\n if (responded) {\n return;\n }\n responded = true;\n\n let value;\n\n try {\n value = Buffer.concat(chunks, chunklen);\n } catch (E) {\n return callback(E);\n }\n callback(null, value);\n });\n}\n\n/**\n * Generates a bunyan-like logger that prints to console\n *\n * @returns {Object} Bunyan logger instance\n */\nfunction createDefaultLogger(levels) {\n const levelMaxLen = levels.reduce((max, level) => Math.max(max, level.length), 0);\n const levelNames = new Map();\n\n levels.forEach(level => {\n let levelName = level.toUpperCase();\n if (levelName.length < levelMaxLen) {\n levelName += ' '.repeat(levelMaxLen - levelName.length);\n }\n levelNames.set(level, levelName);\n });\n\n const print = (level, entry, message, ...args) => {\n let prefix = '';\n if (entry) {\n if (entry.tnx === 'server') {\n prefix = 'S: ';\n } else if (entry.tnx === 'client') {\n prefix = 'C: ';\n }\n\n if (entry.sid) {\n prefix = '[' + entry.sid + '] ' + prefix;\n }\n\n if (entry.cid) {\n prefix = '[#' + entry.cid + '] ' + prefix;\n }\n }\n\n message = util.format(message, ...args);\n message.split(/\\r?\\n/).forEach(line => {\n console.log('[%s] %s %s', new Date().toISOString().substr(0, 19).replace(/T/, ' '), levelNames.get(level), prefix + line);\n });\n };\n\n const logger = {};\n levels.forEach(level => {\n logger[level] = print.bind(null, level);\n });\n\n return logger;\n}\n","/* eslint quote-props: 0 */\n\n'use strict';\n\nconst path = require('path');\n\nconst defaultMimeType = 'application/octet-stream';\nconst defaultExtension = 'bin';\n\nconst mimeTypes = new Map([\n ['application/acad', 'dwg'],\n ['application/applixware', 'aw'],\n ['application/arj', 'arj'],\n ['application/atom+xml', 'xml'],\n ['application/atomcat+xml', 'atomcat'],\n ['application/atomsvc+xml', 'atomsvc'],\n ['application/base64', ['mm', 'mme']],\n ['application/binhex', 'hqx'],\n ['application/binhex4', 'hqx'],\n ['application/book', ['book', 'boo']],\n ['application/ccxml+xml,', 'ccxml'],\n ['application/cdf', 'cdf'],\n ['application/cdmi-capability', 'cdmia'],\n ['application/cdmi-container', 'cdmic'],\n ['application/cdmi-domain', 'cdmid'],\n ['application/cdmi-object', 'cdmio'],\n ['application/cdmi-queue', 'cdmiq'],\n ['application/clariscad', 'ccad'],\n ['application/commonground', 'dp'],\n ['application/cu-seeme', 'cu'],\n ['application/davmount+xml', 'davmount'],\n ['application/drafting', 'drw'],\n ['application/dsptype', 'tsp'],\n ['application/dssc+der', 'dssc'],\n ['application/dssc+xml', 'xdssc'],\n ['application/dxf', 'dxf'],\n ['application/ecmascript', ['js', 'es']],\n ['application/emma+xml', 'emma'],\n ['application/envoy', 'evy'],\n ['application/epub+zip', 'epub'],\n ['application/excel', ['xls', 'xl', 'xla', 'xlb', 'xlc', 'xld', 'xlk', 'xll', 'xlm', 'xlt', 'xlv', 'xlw']],\n ['application/exi', 'exi'],\n ['application/font-tdpfr', 'pfr'],\n ['application/fractals', 'fif'],\n ['application/freeloader', 'frl'],\n ['application/futuresplash', 'spl'],\n ['application/geo+json', 'geojson'],\n ['application/gnutar', 'tgz'],\n ['application/groupwise', 'vew'],\n ['application/hlp', 'hlp'],\n ['application/hta', 'hta'],\n ['application/hyperstudio', 'stk'],\n ['application/i-deas', 'unv'],\n ['application/iges', ['iges', 'igs']],\n ['application/inf', 'inf'],\n ['application/internet-property-stream', 'acx'],\n ['application/ipfix', 'ipfix'],\n ['application/java', 'class'],\n ['application/java-archive', 'jar'],\n ['application/java-byte-code', 'class'],\n ['application/java-serialized-object', 'ser'],\n ['application/java-vm', 'class'],\n ['application/javascript', 'js'],\n ['application/json', 'json'],\n ['application/lha', 'lha'],\n ['application/lzx', 'lzx'],\n ['application/mac-binary', 'bin'],\n ['application/mac-binhex', 'hqx'],\n ['application/mac-binhex40', 'hqx'],\n ['application/mac-compactpro', 'cpt'],\n ['application/macbinary', 'bin'],\n ['application/mads+xml', 'mads'],\n ['application/marc', 'mrc'],\n ['application/marcxml+xml', 'mrcx'],\n ['application/mathematica', 'ma'],\n ['application/mathml+xml', 'mathml'],\n ['application/mbedlet', 'mbd'],\n ['application/mbox', 'mbox'],\n ['application/mcad', 'mcd'],\n ['application/mediaservercontrol+xml', 'mscml'],\n ['application/metalink4+xml', 'meta4'],\n ['application/mets+xml', 'mets'],\n ['application/mime', 'aps'],\n ['application/mods+xml', 'mods'],\n ['application/mp21', 'm21'],\n ['application/mp4', 'mp4'],\n ['application/mspowerpoint', ['ppt', 'pot', 'pps', 'ppz']],\n ['application/msword', ['doc', 'dot', 'w6w', 'wiz', 'word']],\n ['application/mswrite', 'wri'],\n ['application/mxf', 'mxf'],\n ['application/netmc', 'mcp'],\n ['application/octet-stream', ['*']],\n ['application/oda', 'oda'],\n ['application/oebps-package+xml', 'opf'],\n ['application/ogg', 'ogx'],\n ['application/olescript', 'axs'],\n ['application/onenote', 'onetoc'],\n ['application/patch-ops-error+xml', 'xer'],\n ['application/pdf', 'pdf'],\n ['application/pgp-encrypted', 'asc'],\n ['application/pgp-signature', 'pgp'],\n ['application/pics-rules', 'prf'],\n ['application/pkcs-12', 'p12'],\n ['application/pkcs-crl', 'crl'],\n ['application/pkcs10', 'p10'],\n ['application/pkcs7-mime', ['p7c', 'p7m']],\n ['application/pkcs7-signature', 'p7s'],\n ['application/pkcs8', 'p8'],\n ['application/pkix-attr-cert', 'ac'],\n ['application/pkix-cert', ['cer', 'crt']],\n ['application/pkix-crl', 'crl'],\n ['application/pkix-pkipath', 'pkipath'],\n ['application/pkixcmp', 'pki'],\n ['application/plain', 'text'],\n ['application/pls+xml', 'pls'],\n ['application/postscript', ['ps', 'ai', 'eps']],\n ['application/powerpoint', 'ppt'],\n ['application/pro_eng', ['part', 'prt']],\n ['application/prs.cww', 'cww'],\n ['application/pskc+xml', 'pskcxml'],\n ['application/rdf+xml', 'rdf'],\n ['application/reginfo+xml', 'rif'],\n ['application/relax-ng-compact-syntax', 'rnc'],\n ['application/resource-lists+xml', 'rl'],\n ['application/resource-lists-diff+xml', 'rld'],\n ['application/ringing-tones', 'rng'],\n ['application/rls-services+xml', 'rs'],\n ['application/rsd+xml', 'rsd'],\n ['application/rss+xml', 'xml'],\n ['application/rtf', ['rtf', 'rtx']],\n ['application/sbml+xml', 'sbml'],\n ['application/scvp-cv-request', 'scq'],\n ['application/scvp-cv-response', 'scs'],\n ['application/scvp-vp-request', 'spq'],\n ['application/scvp-vp-response', 'spp'],\n ['application/sdp', 'sdp'],\n ['application/sea', 'sea'],\n ['application/set', 'set'],\n ['application/set-payment-initiation', 'setpay'],\n ['application/set-registration-initiation', 'setreg'],\n ['application/shf+xml', 'shf'],\n ['application/sla', 'stl'],\n ['application/smil', ['smi', 'smil']],\n ['application/smil+xml', 'smi'],\n ['application/solids', 'sol'],\n ['application/sounder', 'sdr'],\n ['application/sparql-query', 'rq'],\n ['application/sparql-results+xml', 'srx'],\n ['application/srgs', 'gram'],\n ['application/srgs+xml', 'grxml'],\n ['application/sru+xml', 'sru'],\n ['application/ssml+xml', 'ssml'],\n ['application/step', ['step', 'stp']],\n ['application/streamingmedia', 'ssm'],\n ['application/tei+xml', 'tei'],\n ['application/thraud+xml', 'tfi'],\n ['application/timestamped-data', 'tsd'],\n ['application/toolbook', 'tbk'],\n ['application/vda', 'vda'],\n ['application/vnd.3gpp.pic-bw-large', 'plb'],\n ['application/vnd.3gpp.pic-bw-small', 'psb'],\n ['application/vnd.3gpp.pic-bw-var', 'pvb'],\n ['application/vnd.3gpp2.tcap', 'tcap'],\n ['application/vnd.3m.post-it-notes', 'pwn'],\n ['application/vnd.accpac.simply.aso', 'aso'],\n ['application/vnd.accpac.simply.imp', 'imp'],\n ['application/vnd.acucobol', 'acu'],\n ['application/vnd.acucorp', 'atc'],\n ['application/vnd.adobe.air-application-installer-package+zip', 'air'],\n ['application/vnd.adobe.fxp', 'fxp'],\n ['application/vnd.adobe.xdp+xml', 'xdp'],\n ['application/vnd.adobe.xfdf', 'xfdf'],\n ['application/vnd.ahead.space', 'ahead'],\n ['application/vnd.airzip.filesecure.azf', 'azf'],\n ['application/vnd.airzip.filesecure.azs', 'azs'],\n ['application/vnd.amazon.ebook', 'azw'],\n ['application/vnd.americandynamics.acc', 'acc'],\n ['application/vnd.amiga.ami', 'ami'],\n ['application/vnd.android.package-archive', 'apk'],\n ['application/vnd.anser-web-certificate-issue-initiation', 'cii'],\n ['application/vnd.anser-web-funds-transfer-initiation', 'fti'],\n ['application/vnd.antix.game-component', 'atx'],\n ['application/vnd.apple.installer+xml', 'mpkg'],\n ['application/vnd.apple.mpegurl', 'm3u8'],\n ['application/vnd.aristanetworks.swi', 'swi'],\n ['application/vnd.audiograph', 'aep'],\n ['application/vnd.blueice.multipass', 'mpm'],\n ['application/vnd.bmi', 'bmi'],\n ['application/vnd.businessobjects', 'rep'],\n ['application/vnd.chemdraw+xml', 'cdxml'],\n ['application/vnd.chipnuts.karaoke-mmd', 'mmd'],\n ['application/vnd.cinderella', 'cdy'],\n ['application/vnd.claymore', 'cla'],\n ['application/vnd.cloanto.rp9', 'rp9'],\n ['application/vnd.clonk.c4group', 'c4g'],\n ['application/vnd.cluetrust.cartomobile-config', 'c11amc'],\n ['application/vnd.cluetrust.cartomobile-config-pkg', 'c11amz'],\n ['application/vnd.commonspace', 'csp'],\n ['application/vnd.contact.cmsg', 'cdbcmsg'],\n ['application/vnd.cosmocaller', 'cmc'],\n ['application/vnd.crick.clicker', 'clkx'],\n ['application/vnd.crick.clicker.keyboard', 'clkk'],\n ['application/vnd.crick.clicker.palette', 'clkp'],\n ['application/vnd.crick.clicker.template', 'clkt'],\n ['application/vnd.crick.clicker.wordbank', 'clkw'],\n ['application/vnd.criticaltools.wbs+xml', 'wbs'],\n ['application/vnd.ctc-posml', 'pml'],\n ['application/vnd.cups-ppd', 'ppd'],\n ['application/vnd.curl.car', 'car'],\n ['application/vnd.curl.pcurl', 'pcurl'],\n ['application/vnd.data-vision.rdz', 'rdz'],\n ['application/vnd.denovo.fcselayout-link', 'fe_launch'],\n ['application/vnd.dna', 'dna'],\n ['application/vnd.dolby.mlp', 'mlp'],\n ['application/vnd.dpgraph', 'dpg'],\n ['application/vnd.dreamfactory', 'dfac'],\n ['application/vnd.dvb.ait', 'ait'],\n ['application/vnd.dvb.service', 'svc'],\n ['application/vnd.dynageo', 'geo'],\n ['application/vnd.ecowin.chart', 'mag'],\n ['application/vnd.enliven', 'nml'],\n ['application/vnd.epson.esf', 'esf'],\n ['application/vnd.epson.msf', 'msf'],\n ['application/vnd.epson.quickanime', 'qam'],\n ['application/vnd.epson.salt', 'slt'],\n ['application/vnd.epson.ssf', 'ssf'],\n ['application/vnd.eszigno3+xml', 'es3'],\n ['application/vnd.ezpix-album', 'ez2'],\n ['application/vnd.ezpix-package', 'ez3'],\n ['application/vnd.fdf', 'fdf'],\n ['application/vnd.fdsn.seed', 'seed'],\n ['application/vnd.flographit', 'gph'],\n ['application/vnd.fluxtime.clip', 'ftc'],\n ['application/vnd.framemaker', 'fm'],\n ['application/vnd.frogans.fnc', 'fnc'],\n ['application/vnd.frogans.ltf', 'ltf'],\n ['application/vnd.fsc.weblaunch', 'fsc'],\n ['application/vnd.fujitsu.oasys', 'oas'],\n ['application/vnd.fujitsu.oasys2', 'oa2'],\n ['application/vnd.fujitsu.oasys3', 'oa3'],\n ['application/vnd.fujitsu.oasysgp', 'fg5'],\n ['application/vnd.fujitsu.oasysprs', 'bh2'],\n ['application/vnd.fujixerox.ddd', 'ddd'],\n ['application/vnd.fujixerox.docuworks', 'xdw'],\n ['application/vnd.fujixerox.docuworks.binder', 'xbd'],\n ['application/vnd.fuzzysheet', 'fzs'],\n ['application/vnd.genomatix.tuxedo', 'txd'],\n ['application/vnd.geogebra.file', 'ggb'],\n ['application/vnd.geogebra.tool', 'ggt'],\n ['application/vnd.geometry-explorer', 'gex'],\n ['application/vnd.geonext', 'gxt'],\n ['application/vnd.geoplan', 'g2w'],\n ['application/vnd.geospace', 'g3w'],\n ['application/vnd.gmx', 'gmx'],\n ['application/vnd.google-earth.kml+xml', 'kml'],\n ['application/vnd.google-earth.kmz', 'kmz'],\n ['application/vnd.grafeq', 'gqf'],\n ['application/vnd.groove-account', 'gac'],\n ['application/vnd.groove-help', 'ghf'],\n ['application/vnd.groove-identity-message', 'gim'],\n ['application/vnd.groove-injector', 'grv'],\n ['application/vnd.groove-tool-message', 'gtm'],\n ['application/vnd.groove-tool-template', 'tpl'],\n ['application/vnd.groove-vcard', 'vcg'],\n ['application/vnd.hal+xml', 'hal'],\n ['application/vnd.handheld-entertainment+xml', 'zmm'],\n ['application/vnd.hbci', 'hbci'],\n ['application/vnd.hhe.lesson-player', 'les'],\n ['application/vnd.hp-hpgl', ['hgl', 'hpg', 'hpgl']],\n ['application/vnd.hp-hpid', 'hpid'],\n ['application/vnd.hp-hps', 'hps'],\n ['application/vnd.hp-jlyt', 'jlt'],\n ['application/vnd.hp-pcl', 'pcl'],\n ['application/vnd.hp-pclxl', 'pclxl'],\n ['application/vnd.hydrostatix.sof-data', 'sfd-hdstx'],\n ['application/vnd.hzn-3d-crossword', 'x3d'],\n ['application/vnd.ibm.minipay', 'mpy'],\n ['application/vnd.ibm.modcap', 'afp'],\n ['application/vnd.ibm.rights-management', 'irm'],\n ['application/vnd.ibm.secure-container', 'sc'],\n ['application/vnd.iccprofile', 'icc'],\n ['application/vnd.igloader', 'igl'],\n ['application/vnd.immervision-ivp', 'ivp'],\n ['application/vnd.immervision-ivu', 'ivu'],\n ['application/vnd.insors.igm', 'igm'],\n ['application/vnd.intercon.formnet', 'xpw'],\n ['application/vnd.intergeo', 'i2g'],\n ['application/vnd.intu.qbo', 'qbo'],\n ['application/vnd.intu.qfx', 'qfx'],\n ['application/vnd.ipunplugged.rcprofile', 'rcprofile'],\n ['application/vnd.irepository.package+xml', 'irp'],\n ['application/vnd.is-xpr', 'xpr'],\n ['application/vnd.isac.fcs', 'fcs'],\n ['application/vnd.jam', 'jam'],\n ['application/vnd.jcp.javame.midlet-rms', 'rms'],\n ['application/vnd.jisp', 'jisp'],\n ['application/vnd.joost.joda-archive', 'joda'],\n ['application/vnd.kahootz', 'ktz'],\n ['application/vnd.kde.karbon', 'karbon'],\n ['application/vnd.kde.kchart', 'chrt'],\n ['application/vnd.kde.kformula', 'kfo'],\n ['application/vnd.kde.kivio', 'flw'],\n ['application/vnd.kde.kontour', 'kon'],\n ['application/vnd.kde.kpresenter', 'kpr'],\n ['application/vnd.kde.kspread', 'ksp'],\n ['application/vnd.kde.kword', 'kwd'],\n ['application/vnd.kenameaapp', 'htke'],\n ['application/vnd.kidspiration', 'kia'],\n ['application/vnd.kinar', 'kne'],\n ['application/vnd.koan', 'skp'],\n ['application/vnd.kodak-descriptor', 'sse'],\n ['application/vnd.las.las+xml', 'lasxml'],\n ['application/vnd.llamagraphics.life-balance.desktop', 'lbd'],\n ['application/vnd.llamagraphics.life-balance.exchange+xml', 'lbe'],\n ['application/vnd.lotus-1-2-3', '123'],\n ['application/vnd.lotus-approach', 'apr'],\n ['application/vnd.lotus-freelance', 'pre'],\n ['application/vnd.lotus-notes', 'nsf'],\n ['application/vnd.lotus-organizer', 'org'],\n ['application/vnd.lotus-screencam', 'scm'],\n ['application/vnd.lotus-wordpro', 'lwp'],\n ['application/vnd.macports.portpkg', 'portpkg'],\n ['application/vnd.mcd', 'mcd'],\n ['application/vnd.medcalcdata', 'mc1'],\n ['application/vnd.mediastation.cdkey', 'cdkey'],\n ['application/vnd.mfer', 'mwf'],\n ['application/vnd.mfmp', 'mfm'],\n ['application/vnd.micrografx.flo', 'flo'],\n ['application/vnd.micrografx.igx', 'igx'],\n ['application/vnd.mif', 'mif'],\n ['application/vnd.mobius.daf', 'daf'],\n ['application/vnd.mobius.dis', 'dis'],\n ['application/vnd.mobius.mbk', 'mbk'],\n ['application/vnd.mobius.mqy', 'mqy'],\n ['application/vnd.mobius.msl', 'msl'],\n ['application/vnd.mobius.plc', 'plc'],\n ['application/vnd.mobius.txf', 'txf'],\n ['application/vnd.mophun.application', 'mpn'],\n ['application/vnd.mophun.certificate', 'mpc'],\n ['application/vnd.mozilla.xul+xml', 'xul'],\n ['application/vnd.ms-artgalry', 'cil'],\n ['application/vnd.ms-cab-compressed', 'cab'],\n ['application/vnd.ms-excel', ['xls', 'xla', 'xlc', 'xlm', 'xlt', 'xlw', 'xlb', 'xll']],\n ['application/vnd.ms-excel.addin.macroenabled.12', 'xlam'],\n ['application/vnd.ms-excel.sheet.binary.macroenabled.12', 'xlsb'],\n ['application/vnd.ms-excel.sheet.macroenabled.12', 'xlsm'],\n ['application/vnd.ms-excel.template.macroenabled.12', 'xltm'],\n ['application/vnd.ms-fontobject', 'eot'],\n ['application/vnd.ms-htmlhelp', 'chm'],\n ['application/vnd.ms-ims', 'ims'],\n ['application/vnd.ms-lrm', 'lrm'],\n ['application/vnd.ms-officetheme', 'thmx'],\n ['application/vnd.ms-outlook', 'msg'],\n ['application/vnd.ms-pki.certstore', 'sst'],\n ['application/vnd.ms-pki.pko', 'pko'],\n ['application/vnd.ms-pki.seccat', 'cat'],\n ['application/vnd.ms-pki.stl', 'stl'],\n ['application/vnd.ms-pkicertstore', 'sst'],\n ['application/vnd.ms-pkiseccat', 'cat'],\n ['application/vnd.ms-pkistl', 'stl'],\n ['application/vnd.ms-powerpoint', ['ppt', 'pot', 'pps', 'ppa', 'pwz']],\n ['application/vnd.ms-powerpoint.addin.macroenabled.12', 'ppam'],\n ['application/vnd.ms-powerpoint.presentation.macroenabled.12', 'pptm'],\n ['application/vnd.ms-powerpoint.slide.macroenabled.12', 'sldm'],\n ['application/vnd.ms-powerpoint.slideshow.macroenabled.12', 'ppsm'],\n ['application/vnd.ms-powerpoint.template.macroenabled.12', 'potm'],\n ['application/vnd.ms-project', 'mpp'],\n ['application/vnd.ms-word.document.macroenabled.12', 'docm'],\n ['application/vnd.ms-word.template.macroenabled.12', 'dotm'],\n ['application/vnd.ms-works', ['wks', 'wcm', 'wdb', 'wps']],\n ['application/vnd.ms-wpl', 'wpl'],\n ['application/vnd.ms-xpsdocument', 'xps'],\n ['application/vnd.mseq', 'mseq'],\n ['application/vnd.musician', 'mus'],\n ['application/vnd.muvee.style', 'msty'],\n ['application/vnd.neurolanguage.nlu', 'nlu'],\n ['application/vnd.noblenet-directory', 'nnd'],\n ['application/vnd.noblenet-sealer', 'nns'],\n ['application/vnd.noblenet-web', 'nnw'],\n ['application/vnd.nokia.configuration-message', 'ncm'],\n ['application/vnd.nokia.n-gage.data', 'ngdat'],\n ['application/vnd.nokia.n-gage.symbian.install', 'n-gage'],\n ['application/vnd.nokia.radio-preset', 'rpst'],\n ['application/vnd.nokia.radio-presets', 'rpss'],\n ['application/vnd.nokia.ringing-tone', 'rng'],\n ['application/vnd.novadigm.edm', 'edm'],\n ['application/vnd.novadigm.edx', 'edx'],\n ['application/vnd.novadigm.ext', 'ext'],\n ['application/vnd.oasis.opendocument.chart', 'odc'],\n ['application/vnd.oasis.opendocument.chart-template', 'otc'],\n ['application/vnd.oasis.opendocument.database', 'odb'],\n ['application/vnd.oasis.opendocument.formula', 'odf'],\n ['application/vnd.oasis.opendocument.formula-template', 'odft'],\n ['application/vnd.oasis.opendocument.graphics', 'odg'],\n ['application/vnd.oasis.opendocument.graphics-template', 'otg'],\n ['application/vnd.oasis.opendocument.image', 'odi'],\n ['application/vnd.oasis.opendocument.image-template', 'oti'],\n ['application/vnd.oasis.opendocument.presentation', 'odp'],\n ['application/vnd.oasis.opendocument.presentation-template', 'otp'],\n ['application/vnd.oasis.opendocument.spreadsheet', 'ods'],\n ['application/vnd.oasis.opendocument.spreadsheet-template', 'ots'],\n ['application/vnd.oasis.opendocument.text', 'odt'],\n ['application/vnd.oasis.opendocument.text-master', 'odm'],\n ['application/vnd.oasis.opendocument.text-template', 'ott'],\n ['application/vnd.oasis.opendocument.text-web', 'oth'],\n ['application/vnd.olpc-sugar', 'xo'],\n ['application/vnd.oma.dd2+xml', 'dd2'],\n ['application/vnd.openofficeorg.extension', 'oxt'],\n ['application/vnd.openxmlformats-officedocument.presentationml.presentation', 'pptx'],\n ['application/vnd.openxmlformats-officedocument.presentationml.slide', 'sldx'],\n ['application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'ppsx'],\n ['application/vnd.openxmlformats-officedocument.presentationml.template', 'potx'],\n ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'xlsx'],\n ['application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'xltx'],\n ['application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'docx'],\n ['application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'dotx'],\n ['application/vnd.osgeo.mapguide.package', 'mgp'],\n ['application/vnd.osgi.dp', 'dp'],\n ['application/vnd.palm', 'pdb'],\n ['application/vnd.pawaafile', 'paw'],\n ['application/vnd.pg.format', 'str'],\n ['application/vnd.pg.osasli', 'ei6'],\n ['application/vnd.picsel', 'efif'],\n ['application/vnd.pmi.widget', 'wg'],\n ['application/vnd.pocketlearn', 'plf'],\n ['application/vnd.powerbuilder6', 'pbd'],\n ['application/vnd.previewsystems.box', 'box'],\n ['application/vnd.proteus.magazine', 'mgz'],\n ['application/vnd.publishare-delta-tree', 'qps'],\n ['application/vnd.pvi.ptid1', 'ptid'],\n ['application/vnd.quark.quarkxpress', 'qxd'],\n ['application/vnd.realvnc.bed', 'bed'],\n ['application/vnd.recordare.musicxml', 'mxl'],\n ['application/vnd.recordare.musicxml+xml', 'musicxml'],\n ['application/vnd.rig.cryptonote', 'cryptonote'],\n ['application/vnd.rim.cod', 'cod'],\n ['application/vnd.rn-realmedia', 'rm'],\n ['application/vnd.rn-realplayer', 'rnx'],\n ['application/vnd.route66.link66+xml', 'link66'],\n ['application/vnd.sailingtracker.track', 'st'],\n ['application/vnd.seemail', 'see'],\n ['application/vnd.sema', 'sema'],\n ['application/vnd.semd', 'semd'],\n ['application/vnd.semf', 'semf'],\n ['application/vnd.shana.informed.formdata', 'ifm'],\n ['application/vnd.shana.informed.formtemplate', 'itp'],\n ['application/vnd.shana.informed.interchange', 'iif'],\n ['application/vnd.shana.informed.package', 'ipk'],\n ['application/vnd.simtech-mindmapper', 'twd'],\n ['application/vnd.smaf', 'mmf'],\n ['application/vnd.smart.teacher', 'teacher'],\n ['application/vnd.solent.sdkm+xml', 'sdkm'],\n ['application/vnd.spotfire.dxp', 'dxp'],\n ['application/vnd.spotfire.sfs', 'sfs'],\n ['application/vnd.stardivision.calc', 'sdc'],\n ['application/vnd.stardivision.draw', 'sda'],\n ['application/vnd.stardivision.impress', 'sdd'],\n ['application/vnd.stardivision.math', 'smf'],\n ['application/vnd.stardivision.writer', 'sdw'],\n ['application/vnd.stardivision.writer-global', 'sgl'],\n ['application/vnd.stepmania.stepchart', 'sm'],\n ['application/vnd.sun.xml.calc', 'sxc'],\n ['application/vnd.sun.xml.calc.template', 'stc'],\n ['application/vnd.sun.xml.draw', 'sxd'],\n ['application/vnd.sun.xml.draw.template', 'std'],\n ['application/vnd.sun.xml.impress', 'sxi'],\n ['application/vnd.sun.xml.impress.template', 'sti'],\n ['application/vnd.sun.xml.math', 'sxm'],\n ['application/vnd.sun.xml.writer', 'sxw'],\n ['application/vnd.sun.xml.writer.global', 'sxg'],\n ['application/vnd.sun.xml.writer.template', 'stw'],\n ['application/vnd.sus-calendar', 'sus'],\n ['application/vnd.svd', 'svd'],\n ['application/vnd.symbian.install', 'sis'],\n ['application/vnd.syncml+xml', 'xsm'],\n ['application/vnd.syncml.dm+wbxml', 'bdm'],\n ['application/vnd.syncml.dm+xml', 'xdm'],\n ['application/vnd.tao.intent-module-archive', 'tao'],\n ['application/vnd.tmobile-livetv', 'tmo'],\n ['application/vnd.trid.tpt', 'tpt'],\n ['application/vnd.triscape.mxs', 'mxs'],\n ['application/vnd.trueapp', 'tra'],\n ['application/vnd.ufdl', 'ufd'],\n ['application/vnd.uiq.theme', 'utz'],\n ['application/vnd.umajin', 'umj'],\n ['application/vnd.unity', 'unityweb'],\n ['application/vnd.uoml+xml', 'uoml'],\n ['application/vnd.vcx', 'vcx'],\n ['application/vnd.visio', 'vsd'],\n ['application/vnd.visionary', 'vis'],\n ['application/vnd.vsf', 'vsf'],\n ['application/vnd.wap.wbxml', 'wbxml'],\n ['application/vnd.wap.wmlc', 'wmlc'],\n ['application/vnd.wap.wmlscriptc', 'wmlsc'],\n ['application/vnd.webturbo', 'wtb'],\n ['application/vnd.wolfram.player', 'nbp'],\n ['application/vnd.wordperfect', 'wpd'],\n ['application/vnd.wqd', 'wqd'],\n ['application/vnd.wt.stf', 'stf'],\n ['application/vnd.xara', ['web', 'xar']],\n ['application/vnd.xfdl', 'xfdl'],\n ['application/vnd.yamaha.hv-dic', 'hvd'],\n ['application/vnd.yamaha.hv-script', 'hvs'],\n ['application/vnd.yamaha.hv-voice', 'hvp'],\n ['application/vnd.yamaha.openscoreformat', 'osf'],\n ['application/vnd.yamaha.openscoreformat.osfpvg+xml', 'osfpvg'],\n ['application/vnd.yamaha.smaf-audio', 'saf'],\n ['application/vnd.yamaha.smaf-phrase', 'spf'],\n ['application/vnd.yellowriver-custom-menu', 'cmp'],\n ['application/vnd.zul', 'zir'],\n ['application/vnd.zzazz.deck+xml', 'zaz'],\n ['application/vocaltec-media-desc', 'vmd'],\n ['application/vocaltec-media-file', 'vmf'],\n ['application/voicexml+xml', 'vxml'],\n ['application/widget', 'wgt'],\n ['application/winhlp', 'hlp'],\n ['application/wordperfect', ['wp', 'wp5', 'wp6', 'wpd']],\n ['application/wordperfect6.0', ['w60', 'wp5']],\n ['application/wordperfect6.1', 'w61'],\n ['application/wsdl+xml', 'wsdl'],\n ['application/wspolicy+xml', 'wspolicy'],\n ['application/x-123', 'wk1'],\n ['application/x-7z-compressed', '7z'],\n ['application/x-abiword', 'abw'],\n ['application/x-ace-compressed', 'ace'],\n ['application/x-aim', 'aim'],\n ['application/x-authorware-bin', 'aab'],\n ['application/x-authorware-map', 'aam'],\n ['application/x-authorware-seg', 'aas'],\n ['application/x-bcpio', 'bcpio'],\n ['application/x-binary', 'bin'],\n ['application/x-binhex40', 'hqx'],\n ['application/x-bittorrent', 'torrent'],\n ['application/x-bsh', ['bsh', 'sh', 'shar']],\n ['application/x-bytecode.elisp', 'elc'],\n ['application/x-bytecode.python', 'pyc'],\n ['application/x-bzip', 'bz'],\n ['application/x-bzip2', ['boz', 'bz2']],\n ['application/x-cdf', 'cdf'],\n ['application/x-cdlink', 'vcd'],\n ['application/x-chat', ['cha', 'chat']],\n ['application/x-chess-pgn', 'pgn'],\n ['application/x-cmu-raster', 'ras'],\n ['application/x-cocoa', 'cco'],\n ['application/x-compactpro', 'cpt'],\n ['application/x-compress', 'z'],\n ['application/x-compressed', ['tgz', 'gz', 'z', 'zip']],\n ['application/x-conference', 'nsc'],\n ['application/x-cpio', 'cpio'],\n ['application/x-cpt', 'cpt'],\n ['application/x-csh', 'csh'],\n ['application/x-debian-package', 'deb'],\n ['application/x-deepv', 'deepv'],\n ['application/x-director', ['dir', 'dcr', 'dxr']],\n ['application/x-doom', 'wad'],\n ['application/x-dtbncx+xml', 'ncx'],\n ['application/x-dtbook+xml', 'dtb'],\n ['application/x-dtbresource+xml', 'res'],\n ['application/x-dvi', 'dvi'],\n ['application/x-elc', 'elc'],\n ['application/x-envoy', ['env', 'evy']],\n ['application/x-esrehber', 'es'],\n ['application/x-excel', ['xls', 'xla', 'xlb', 'xlc', 'xld', 'xlk', 'xll', 'xlm', 'xlt', 'xlv', 'xlw']],\n ['application/x-font-bdf', 'bdf'],\n ['application/x-font-ghostscript', 'gsf'],\n ['application/x-font-linux-psf', 'psf'],\n ['application/x-font-otf', 'otf'],\n ['application/x-font-pcf', 'pcf'],\n ['application/x-font-snf', 'snf'],\n ['application/x-font-ttf', 'ttf'],\n ['application/x-font-type1', 'pfa'],\n ['application/x-font-woff', 'woff'],\n ['application/x-frame', 'mif'],\n ['application/x-freelance', 'pre'],\n ['application/x-futuresplash', 'spl'],\n ['application/x-gnumeric', 'gnumeric'],\n ['application/x-gsp', 'gsp'],\n ['application/x-gss', 'gss'],\n ['application/x-gtar', 'gtar'],\n ['application/x-gzip', ['gz', 'gzip']],\n ['application/x-hdf', 'hdf'],\n ['application/x-helpfile', ['help', 'hlp']],\n ['application/x-httpd-imap', 'imap'],\n ['application/x-ima', 'ima'],\n ['application/x-internet-signup', ['ins', 'isp']],\n ['application/x-internett-signup', 'ins'],\n ['application/x-inventor', 'iv'],\n ['application/x-ip2', 'ip'],\n ['application/x-iphone', 'iii'],\n ['application/x-java-class', 'class'],\n ['application/x-java-commerce', 'jcm'],\n ['application/x-java-jnlp-file', 'jnlp'],\n ['application/x-javascript', 'js'],\n ['application/x-koan', ['skd', 'skm', 'skp', 'skt']],\n ['application/x-ksh', 'ksh'],\n ['application/x-latex', ['latex', 'ltx']],\n ['application/x-lha', 'lha'],\n ['application/x-lisp', 'lsp'],\n ['application/x-livescreen', 'ivy'],\n ['application/x-lotus', 'wq1'],\n ['application/x-lotusscreencam', 'scm'],\n ['application/x-lzh', 'lzh'],\n ['application/x-lzx', 'lzx'],\n ['application/x-mac-binhex40', 'hqx'],\n ['application/x-macbinary', 'bin'],\n ['application/x-magic-cap-package-1.0', 'mc$'],\n ['application/x-mathcad', 'mcd'],\n ['application/x-meme', 'mm'],\n ['application/x-midi', ['mid', 'midi']],\n ['application/x-mif', 'mif'],\n ['application/x-mix-transfer', 'nix'],\n ['application/x-mobipocket-ebook', 'prc'],\n ['application/x-mplayer2', 'asx'],\n ['application/x-ms-application', 'application'],\n ['application/x-ms-wmd', 'wmd'],\n ['application/x-ms-wmz', 'wmz'],\n ['application/x-ms-xbap', 'xbap'],\n ['application/x-msaccess', 'mdb'],\n ['application/x-msbinder', 'obd'],\n ['application/x-mscardfile', 'crd'],\n ['application/x-msclip', 'clp'],\n ['application/x-msdownload', ['exe', 'dll']],\n ['application/x-msexcel', ['xls', 'xla', 'xlw']],\n ['application/x-msmediaview', ['mvb', 'm13', 'm14']],\n ['application/x-msmetafile', 'wmf'],\n ['application/x-msmoney', 'mny'],\n ['application/x-mspowerpoint', 'ppt'],\n ['application/x-mspublisher', 'pub'],\n ['application/x-msschedule', 'scd'],\n ['application/x-msterminal', 'trm'],\n ['application/x-mswrite', 'wri'],\n ['application/x-navi-animation', 'ani'],\n ['application/x-navidoc', 'nvd'],\n ['application/x-navimap', 'map'],\n ['application/x-navistyle', 'stl'],\n ['application/x-netcdf', ['cdf', 'nc']],\n ['application/x-newton-compatible-pkg', 'pkg'],\n ['application/x-nokia-9000-communicator-add-on-software', 'aos'],\n ['application/x-omc', 'omc'],\n ['application/x-omcdatamaker', 'omcd'],\n ['application/x-omcregerator', 'omcr'],\n ['application/x-pagemaker', ['pm4', 'pm5']],\n ['application/x-pcl', 'pcl'],\n ['application/x-perfmon', ['pma', 'pmc', 'pml', 'pmr', 'pmw']],\n ['application/x-pixclscript', 'plx'],\n ['application/x-pkcs10', 'p10'],\n ['application/x-pkcs12', ['p12', 'pfx']],\n ['application/x-pkcs7-certificates', ['p7b', 'spc']],\n ['application/x-pkcs7-certreqresp', 'p7r'],\n ['application/x-pkcs7-mime', ['p7m', 'p7c']],\n ['application/x-pkcs7-signature', ['p7s', 'p7a']],\n ['application/x-pointplus', 'css'],\n ['application/x-portable-anymap', 'pnm'],\n ['application/x-project', ['mpc', 'mpt', 'mpv', 'mpx']],\n ['application/x-qpro', 'wb1'],\n ['application/x-rar-compressed', 'rar'],\n ['application/x-rtf', 'rtf'],\n ['application/x-sdp', 'sdp'],\n ['application/x-sea', 'sea'],\n ['application/x-seelogo', 'sl'],\n ['application/x-sh', 'sh'],\n ['application/x-shar', ['shar', 'sh']],\n ['application/x-shockwave-flash', 'swf'],\n ['application/x-silverlight-app', 'xap'],\n ['application/x-sit', 'sit'],\n ['application/x-sprite', ['spr', 'sprite']],\n ['application/x-stuffit', 'sit'],\n ['application/x-stuffitx', 'sitx'],\n ['application/x-sv4cpio', 'sv4cpio'],\n ['application/x-sv4crc', 'sv4crc'],\n ['application/x-tar', 'tar'],\n ['application/x-tbook', ['sbk', 'tbk']],\n ['application/x-tcl', 'tcl'],\n ['application/x-tex', 'tex'],\n ['application/x-tex-tfm', 'tfm'],\n ['application/x-texinfo', ['texi', 'texinfo']],\n ['application/x-troff', ['roff', 't', 'tr']],\n ['application/x-troff-man', 'man'],\n ['application/x-troff-me', 'me'],\n ['application/x-troff-ms', 'ms'],\n ['application/x-troff-msvideo', 'avi'],\n ['application/x-ustar', 'ustar'],\n ['application/x-visio', ['vsd', 'vst', 'vsw']],\n ['application/x-vnd.audioexplosion.mzz', 'mzz'],\n ['application/x-vnd.ls-xpix', 'xpix'],\n ['application/x-vrml', 'vrml'],\n ['application/x-wais-source', ['src', 'wsrc']],\n ['application/x-winhelp', 'hlp'],\n ['application/x-wintalk', 'wtk'],\n ['application/x-world', ['wrl', 'svr']],\n ['application/x-wpwin', 'wpd'],\n ['application/x-wri', 'wri'],\n ['application/x-x509-ca-cert', ['cer', 'crt', 'der']],\n ['application/x-x509-user-cert', 'crt'],\n ['application/x-xfig', 'fig'],\n ['application/x-xpinstall', 'xpi'],\n ['application/x-zip-compressed', 'zip'],\n ['application/xcap-diff+xml', 'xdf'],\n ['application/xenc+xml', 'xenc'],\n ['application/xhtml+xml', 'xhtml'],\n ['application/xml', 'xml'],\n ['application/xml-dtd', 'dtd'],\n ['application/xop+xml', 'xop'],\n ['application/xslt+xml', 'xslt'],\n ['application/xspf+xml', 'xspf'],\n ['application/xv+xml', 'mxml'],\n ['application/yang', 'yang'],\n ['application/yin+xml', 'yin'],\n ['application/ynd.ms-pkipko', 'pko'],\n ['application/zip', 'zip'],\n ['audio/adpcm', 'adp'],\n ['audio/aiff', ['aiff', 'aif', 'aifc']],\n ['audio/basic', ['snd', 'au']],\n ['audio/it', 'it'],\n ['audio/make', ['funk', 'my', 'pfunk']],\n ['audio/make.my.funk', 'pfunk'],\n ['audio/mid', ['mid', 'rmi']],\n ['audio/midi', ['midi', 'kar', 'mid']],\n ['audio/mod', 'mod'],\n ['audio/mp4', 'mp4a'],\n ['audio/mpeg', ['mpga', 'mp3', 'm2a', 'mp2', 'mpa', 'mpg']],\n ['audio/mpeg3', 'mp3'],\n ['audio/nspaudio', ['la', 'lma']],\n ['audio/ogg', 'oga'],\n ['audio/s3m', 's3m'],\n ['audio/tsp-audio', 'tsi'],\n ['audio/tsplayer', 'tsp'],\n ['audio/vnd.dece.audio', 'uva'],\n ['audio/vnd.digital-winds', 'eol'],\n ['audio/vnd.dra', 'dra'],\n ['audio/vnd.dts', 'dts'],\n ['audio/vnd.dts.hd', 'dtshd'],\n ['audio/vnd.lucent.voice', 'lvp'],\n ['audio/vnd.ms-playready.media.pya', 'pya'],\n ['audio/vnd.nuera.ecelp4800', 'ecelp4800'],\n ['audio/vnd.nuera.ecelp7470', 'ecelp7470'],\n ['audio/vnd.nuera.ecelp9600', 'ecelp9600'],\n ['audio/vnd.qcelp', 'qcp'],\n ['audio/vnd.rip', 'rip'],\n ['audio/voc', 'voc'],\n ['audio/voxware', 'vox'],\n ['audio/wav', 'wav'],\n ['audio/webm', 'weba'],\n ['audio/x-aac', 'aac'],\n ['audio/x-adpcm', 'snd'],\n ['audio/x-aiff', ['aiff', 'aif', 'aifc']],\n ['audio/x-au', 'au'],\n ['audio/x-gsm', ['gsd', 'gsm']],\n ['audio/x-jam', 'jam'],\n ['audio/x-liveaudio', 'lam'],\n ['audio/x-mid', ['mid', 'midi']],\n ['audio/x-midi', ['midi', 'mid']],\n ['audio/x-mod', 'mod'],\n ['audio/x-mpeg', 'mp2'],\n ['audio/x-mpeg-3', 'mp3'],\n ['audio/x-mpegurl', 'm3u'],\n ['audio/x-mpequrl', 'm3u'],\n ['audio/x-ms-wax', 'wax'],\n ['audio/x-ms-wma', 'wma'],\n ['audio/x-nspaudio', ['la', 'lma']],\n ['audio/x-pn-realaudio', ['ra', 'ram', 'rm', 'rmm', 'rmp']],\n ['audio/x-pn-realaudio-plugin', ['ra', 'rmp', 'rpm']],\n ['audio/x-psid', 'sid'],\n ['audio/x-realaudio', 'ra'],\n ['audio/x-twinvq', 'vqf'],\n ['audio/x-twinvq-plugin', ['vqe', 'vql']],\n ['audio/x-vnd.audioexplosion.mjuicemediafile', 'mjf'],\n ['audio/x-voc', 'voc'],\n ['audio/x-wav', 'wav'],\n ['audio/xm', 'xm'],\n ['chemical/x-cdx', 'cdx'],\n ['chemical/x-cif', 'cif'],\n ['chemical/x-cmdf', 'cmdf'],\n ['chemical/x-cml', 'cml'],\n ['chemical/x-csml', 'csml'],\n ['chemical/x-pdb', ['pdb', 'xyz']],\n ['chemical/x-xyz', 'xyz'],\n ['drawing/x-dwf', 'dwf'],\n ['i-world/i-vrml', 'ivr'],\n ['image/bmp', ['bmp', 'bm']],\n ['image/cgm', 'cgm'],\n ['image/cis-cod', 'cod'],\n ['image/cmu-raster', ['ras', 'rast']],\n ['image/fif', 'fif'],\n ['image/florian', ['flo', 'turbot']],\n ['image/g3fax', 'g3'],\n ['image/gif', 'gif'],\n ['image/ief', ['ief', 'iefs']],\n ['image/jpeg', ['jpeg', 'jpe', 'jpg', 'jfif', 'jfif-tbnl']],\n ['image/jutvision', 'jut'],\n ['image/ktx', 'ktx'],\n ['image/naplps', ['nap', 'naplps']],\n ['image/pict', ['pic', 'pict']],\n ['image/pipeg', 'jfif'],\n ['image/pjpeg', ['jfif', 'jpe', 'jpeg', 'jpg']],\n ['image/png', ['png', 'x-png']],\n ['image/prs.btif', 'btif'],\n ['image/svg+xml', 'svg'],\n ['image/tiff', ['tif', 'tiff']],\n ['image/vasa', 'mcf'],\n ['image/vnd.adobe.photoshop', 'psd'],\n ['image/vnd.dece.graphic', 'uvi'],\n ['image/vnd.djvu', 'djvu'],\n ['image/vnd.dvb.subtitle', 'sub'],\n ['image/vnd.dwg', ['dwg', 'dxf', 'svf']],\n ['image/vnd.dxf', 'dxf'],\n ['image/vnd.fastbidsheet', 'fbs'],\n ['image/vnd.fpx', 'fpx'],\n ['image/vnd.fst', 'fst'],\n ['image/vnd.fujixerox.edmics-mmr', 'mmr'],\n ['image/vnd.fujixerox.edmics-rlc', 'rlc'],\n ['image/vnd.ms-modi', 'mdi'],\n ['image/vnd.net-fpx', ['fpx', 'npx']],\n ['image/vnd.rn-realflash', 'rf'],\n ['image/vnd.rn-realpix', 'rp'],\n ['image/vnd.wap.wbmp', 'wbmp'],\n ['image/vnd.xiff', 'xif'],\n ['image/webp', 'webp'],\n ['image/x-cmu-raster', 'ras'],\n ['image/x-cmx', 'cmx'],\n ['image/x-dwg', ['dwg', 'dxf', 'svf']],\n ['image/x-freehand', 'fh'],\n ['image/x-icon', 'ico'],\n ['image/x-jg', 'art'],\n ['image/x-jps', 'jps'],\n ['image/x-niff', ['niff', 'nif']],\n ['image/x-pcx', 'pcx'],\n ['image/x-pict', ['pct', 'pic']],\n ['image/x-portable-anymap', 'pnm'],\n ['image/x-portable-bitmap', 'pbm'],\n ['image/x-portable-graymap', 'pgm'],\n ['image/x-portable-greymap', 'pgm'],\n ['image/x-portable-pixmap', 'ppm'],\n ['image/x-quicktime', ['qif', 'qti', 'qtif']],\n ['image/x-rgb', 'rgb'],\n ['image/x-tiff', ['tif', 'tiff']],\n ['image/x-windows-bmp', 'bmp'],\n ['image/x-xbitmap', 'xbm'],\n ['image/x-xbm', 'xbm'],\n ['image/x-xpixmap', ['xpm', 'pm']],\n ['image/x-xwd', 'xwd'],\n ['image/x-xwindowdump', 'xwd'],\n ['image/xbm', 'xbm'],\n ['image/xpm', 'xpm'],\n ['message/rfc822', ['eml', 'mht', 'mhtml', 'nws', 'mime']],\n ['model/iges', ['iges', 'igs']],\n ['model/mesh', 'msh'],\n ['model/vnd.collada+xml', 'dae'],\n ['model/vnd.dwf', 'dwf'],\n ['model/vnd.gdl', 'gdl'],\n ['model/vnd.gtw', 'gtw'],\n ['model/vnd.mts', 'mts'],\n ['model/vnd.vtu', 'vtu'],\n ['model/vrml', ['vrml', 'wrl', 'wrz']],\n ['model/x-pov', 'pov'],\n ['multipart/x-gzip', 'gzip'],\n ['multipart/x-ustar', 'ustar'],\n ['multipart/x-zip', 'zip'],\n ['music/crescendo', ['mid', 'midi']],\n ['music/x-karaoke', 'kar'],\n ['paleovu/x-pv', 'pvu'],\n ['text/asp', 'asp'],\n ['text/calendar', 'ics'],\n ['text/css', 'css'],\n ['text/csv', 'csv'],\n ['text/ecmascript', 'js'],\n ['text/h323', '323'],\n ['text/html', ['html', 'htm', 'stm', 'acgi', 'htmls', 'htx', 'shtml']],\n ['text/iuls', 'uls'],\n ['text/javascript', 'js'],\n ['text/mcf', 'mcf'],\n ['text/n3', 'n3'],\n ['text/pascal', 'pas'],\n [\n 'text/plain',\n [\n 'txt',\n 'bas',\n 'c',\n 'h',\n 'c++',\n 'cc',\n 'com',\n 'conf',\n 'cxx',\n 'def',\n 'f',\n 'f90',\n 'for',\n 'g',\n 'hh',\n 'idc',\n 'jav',\n 'java',\n 'list',\n 'log',\n 'lst',\n 'm',\n 'mar',\n 'pl',\n 'sdml',\n 'text'\n ]\n ],\n ['text/plain-bas', 'par'],\n ['text/prs.lines.tag', 'dsc'],\n ['text/richtext', ['rtx', 'rt', 'rtf']],\n ['text/scriplet', 'wsc'],\n ['text/scriptlet', 'sct'],\n ['text/sgml', ['sgm', 'sgml']],\n ['text/tab-separated-values', 'tsv'],\n ['text/troff', 't'],\n ['text/turtle', 'ttl'],\n ['text/uri-list', ['uni', 'unis', 'uri', 'uris']],\n ['text/vnd.abc', 'abc'],\n ['text/vnd.curl', 'curl'],\n ['text/vnd.curl.dcurl', 'dcurl'],\n ['text/vnd.curl.mcurl', 'mcurl'],\n ['text/vnd.curl.scurl', 'scurl'],\n ['text/vnd.fly', 'fly'],\n ['text/vnd.fmi.flexstor', 'flx'],\n ['text/vnd.graphviz', 'gv'],\n ['text/vnd.in3d.3dml', '3dml'],\n ['text/vnd.in3d.spot', 'spot'],\n ['text/vnd.rn-realtext', 'rt'],\n ['text/vnd.sun.j2me.app-descriptor', 'jad'],\n ['text/vnd.wap.wml', 'wml'],\n ['text/vnd.wap.wmlscript', 'wmls'],\n ['text/webviewhtml', 'htt'],\n ['text/x-asm', ['asm', 's']],\n ['text/x-audiosoft-intra', 'aip'],\n ['text/x-c', ['c', 'cc', 'cpp']],\n ['text/x-component', 'htc'],\n ['text/x-fortran', ['for', 'f', 'f77', 'f90']],\n ['text/x-h', ['h', 'hh']],\n ['text/x-java-source', ['java', 'jav']],\n ['text/x-java-source,java', 'java'],\n ['text/x-la-asf', 'lsx'],\n ['text/x-m', 'm'],\n ['text/x-pascal', 'p'],\n ['text/x-script', 'hlb'],\n ['text/x-script.csh', 'csh'],\n ['text/x-script.elisp', 'el'],\n ['text/x-script.guile', 'scm'],\n ['text/x-script.ksh', 'ksh'],\n ['text/x-script.lisp', 'lsp'],\n ['text/x-script.perl', 'pl'],\n ['text/x-script.perl-module', 'pm'],\n ['text/x-script.phyton', 'py'],\n ['text/x-script.rexx', 'rexx'],\n ['text/x-script.scheme', 'scm'],\n ['text/x-script.sh', 'sh'],\n ['text/x-script.tcl', 'tcl'],\n ['text/x-script.tcsh', 'tcsh'],\n ['text/x-script.zsh', 'zsh'],\n ['text/x-server-parsed-html', ['shtml', 'ssi']],\n ['text/x-setext', 'etx'],\n ['text/x-sgml', ['sgm', 'sgml']],\n ['text/x-speech', ['spc', 'talk']],\n ['text/x-uil', 'uil'],\n ['text/x-uuencode', ['uu', 'uue']],\n ['text/x-vcalendar', 'vcs'],\n ['text/x-vcard', 'vcf'],\n ['text/xml', 'xml'],\n ['video/3gpp', '3gp'],\n ['video/3gpp2', '3g2'],\n ['video/animaflex', 'afl'],\n ['video/avi', 'avi'],\n ['video/avs-video', 'avs'],\n ['video/dl', 'dl'],\n ['video/fli', 'fli'],\n ['video/gl', 'gl'],\n ['video/h261', 'h261'],\n ['video/h263', 'h263'],\n ['video/h264', 'h264'],\n ['video/jpeg', 'jpgv'],\n ['video/jpm', 'jpm'],\n ['video/mj2', 'mj2'],\n ['video/mp4', 'mp4'],\n ['video/mpeg', ['mpeg', 'mp2', 'mpa', 'mpe', 'mpg', 'mpv2', 'm1v', 'm2v', 'mp3']],\n ['video/msvideo', 'avi'],\n ['video/ogg', 'ogv'],\n ['video/quicktime', ['mov', 'qt', 'moov']],\n ['video/vdo', 'vdo'],\n ['video/vivo', ['viv', 'vivo']],\n ['video/vnd.dece.hd', 'uvh'],\n ['video/vnd.dece.mobile', 'uvm'],\n ['video/vnd.dece.pd', 'uvp'],\n ['video/vnd.dece.sd', 'uvs'],\n ['video/vnd.dece.video', 'uvv'],\n ['video/vnd.fvt', 'fvt'],\n ['video/vnd.mpegurl', 'mxu'],\n ['video/vnd.ms-playready.media.pyv', 'pyv'],\n ['video/vnd.rn-realvideo', 'rv'],\n ['video/vnd.uvvu.mp4', 'uvu'],\n ['video/vnd.vivo', ['viv', 'vivo']],\n ['video/vosaic', 'vos'],\n ['video/webm', 'webm'],\n ['video/x-amt-demorun', 'xdr'],\n ['video/x-amt-showrun', 'xsr'],\n ['video/x-atomic3d-feature', 'fmf'],\n ['video/x-dl', 'dl'],\n ['video/x-dv', ['dif', 'dv']],\n ['video/x-f4v', 'f4v'],\n ['video/x-fli', 'fli'],\n ['video/x-flv', 'flv'],\n ['video/x-gl', 'gl'],\n ['video/x-isvideo', 'isu'],\n ['video/x-la-asf', ['lsf', 'lsx']],\n ['video/x-m4v', 'm4v'],\n ['video/x-motion-jpeg', 'mjpg'],\n ['video/x-mpeg', ['mp3', 'mp2']],\n ['video/x-mpeq2a', 'mp2'],\n ['video/x-ms-asf', ['asf', 'asr', 'asx']],\n ['video/x-ms-asf-plugin', 'asx'],\n ['video/x-ms-wm', 'wm'],\n ['video/x-ms-wmv', 'wmv'],\n ['video/x-ms-wmx', 'wmx'],\n ['video/x-ms-wvx', 'wvx'],\n ['video/x-msvideo', 'avi'],\n ['video/x-qtc', 'qtc'],\n ['video/x-scm', 'scm'],\n ['video/x-sgi-movie', ['movie', 'mv']],\n ['windows/metafile', 'wmf'],\n ['www/mime', 'mime'],\n ['x-conference/x-cooltalk', 'ice'],\n ['x-music/x-midi', ['mid', 'midi']],\n ['x-world/x-3dmf', ['3dm', '3dmf', 'qd3', 'qd3d']],\n ['x-world/x-svr', 'svr'],\n ['x-world/x-vrml', ['flr', 'vrml', 'wrl', 'wrz', 'xaf', 'xof']],\n ['x-world/x-vrt', 'vrt'],\n ['xgl/drawing', 'xgz'],\n ['xgl/movie', 'xmz']\n]);\nconst extensions = new Map([\n ['123', 'application/vnd.lotus-1-2-3'],\n ['323', 'text/h323'],\n ['*', 'application/octet-stream'],\n ['3dm', 'x-world/x-3dmf'],\n ['3dmf', 'x-world/x-3dmf'],\n ['3dml', 'text/vnd.in3d.3dml'],\n ['3g2', 'video/3gpp2'],\n ['3gp', 'video/3gpp'],\n ['7z', 'application/x-7z-compressed'],\n ['a', 'application/octet-stream'],\n ['aab', 'application/x-authorware-bin'],\n ['aac', 'audio/x-aac'],\n ['aam', 'application/x-authorware-map'],\n ['aas', 'application/x-authorware-seg'],\n ['abc', 'text/vnd.abc'],\n ['abw', 'application/x-abiword'],\n ['ac', 'application/pkix-attr-cert'],\n ['acc', 'application/vnd.americandynamics.acc'],\n ['ace', 'application/x-ace-compressed'],\n ['acgi', 'text/html'],\n ['acu', 'application/vnd.acucobol'],\n ['acx', 'application/internet-property-stream'],\n ['adp', 'audio/adpcm'],\n ['aep', 'application/vnd.audiograph'],\n ['afl', 'video/animaflex'],\n ['afp', 'application/vnd.ibm.modcap'],\n ['ahead', 'application/vnd.ahead.space'],\n ['ai', 'application/postscript'],\n ['aif', ['audio/aiff', 'audio/x-aiff']],\n ['aifc', ['audio/aiff', 'audio/x-aiff']],\n ['aiff', ['audio/aiff', 'audio/x-aiff']],\n ['aim', 'application/x-aim'],\n ['aip', 'text/x-audiosoft-intra'],\n ['air', 'application/vnd.adobe.air-application-installer-package+zip'],\n ['ait', 'application/vnd.dvb.ait'],\n ['ami', 'application/vnd.amiga.ami'],\n ['ani', 'application/x-navi-animation'],\n ['aos', 'application/x-nokia-9000-communicator-add-on-software'],\n ['apk', 'application/vnd.android.package-archive'],\n ['application', 'application/x-ms-application'],\n ['apr', 'application/vnd.lotus-approach'],\n ['aps', 'application/mime'],\n ['arc', 'application/octet-stream'],\n ['arj', ['application/arj', 'application/octet-stream']],\n ['art', 'image/x-jg'],\n ['asf', 'video/x-ms-asf'],\n ['asm', 'text/x-asm'],\n ['aso', 'application/vnd.accpac.simply.aso'],\n ['asp', 'text/asp'],\n ['asr', 'video/x-ms-asf'],\n ['asx', ['video/x-ms-asf', 'application/x-mplayer2', 'video/x-ms-asf-plugin']],\n ['atc', 'application/vnd.acucorp'],\n ['atomcat', 'application/atomcat+xml'],\n ['atomsvc', 'application/atomsvc+xml'],\n ['atx', 'application/vnd.antix.game-component'],\n ['au', ['audio/basic', 'audio/x-au']],\n ['avi', ['video/avi', 'video/msvideo', 'application/x-troff-msvideo', 'video/x-msvideo']],\n ['avs', 'video/avs-video'],\n ['aw', 'application/applixware'],\n ['axs', 'application/olescript'],\n ['azf', 'application/vnd.airzip.filesecure.azf'],\n ['azs', 'application/vnd.airzip.filesecure.azs'],\n ['azw', 'application/vnd.amazon.ebook'],\n ['bas', 'text/plain'],\n ['bcpio', 'application/x-bcpio'],\n ['bdf', 'application/x-font-bdf'],\n ['bdm', 'application/vnd.syncml.dm+wbxml'],\n ['bed', 'application/vnd.realvnc.bed'],\n ['bh2', 'application/vnd.fujitsu.oasysprs'],\n [\n 'bin',\n ['application/octet-stream', 'application/mac-binary', 'application/macbinary', 'application/x-macbinary', 'application/x-binary']\n ],\n ['bm', 'image/bmp'],\n ['bmi', 'application/vnd.bmi'],\n ['bmp', ['image/bmp', 'image/x-windows-bmp']],\n ['boo', 'application/book'],\n ['book', 'application/book'],\n ['box', 'application/vnd.previewsystems.box'],\n ['boz', 'application/x-bzip2'],\n ['bsh', 'application/x-bsh'],\n ['btif', 'image/prs.btif'],\n ['bz', 'application/x-bzip'],\n ['bz2', 'application/x-bzip2'],\n ['c', ['text/plain', 'text/x-c']],\n ['c++', 'text/plain'],\n ['c11amc', 'application/vnd.cluetrust.cartomobile-config'],\n ['c11amz', 'application/vnd.cluetrust.cartomobile-config-pkg'],\n ['c4g', 'application/vnd.clonk.c4group'],\n ['cab', 'application/vnd.ms-cab-compressed'],\n ['car', 'application/vnd.curl.car'],\n ['cat', ['application/vnd.ms-pkiseccat', 'application/vnd.ms-pki.seccat']],\n ['cc', ['text/plain', 'text/x-c']],\n ['ccad', 'application/clariscad'],\n ['cco', 'application/x-cocoa'],\n ['ccxml', 'application/ccxml+xml,'],\n ['cdbcmsg', 'application/vnd.contact.cmsg'],\n ['cdf', ['application/cdf', 'application/x-cdf', 'application/x-netcdf']],\n ['cdkey', 'application/vnd.mediastation.cdkey'],\n ['cdmia', 'application/cdmi-capability'],\n ['cdmic', 'application/cdmi-container'],\n ['cdmid', 'application/cdmi-domain'],\n ['cdmio', 'application/cdmi-object'],\n ['cdmiq', 'application/cdmi-queue'],\n ['cdx', 'chemical/x-cdx'],\n ['cdxml', 'application/vnd.chemdraw+xml'],\n ['cdy', 'application/vnd.cinderella'],\n ['cer', ['application/pkix-cert', 'application/x-x509-ca-cert']],\n ['cgm', 'image/cgm'],\n ['cha', 'application/x-chat'],\n ['chat', 'application/x-chat'],\n ['chm', 'application/vnd.ms-htmlhelp'],\n ['chrt', 'application/vnd.kde.kchart'],\n ['cif', 'chemical/x-cif'],\n ['cii', 'application/vnd.anser-web-certificate-issue-initiation'],\n ['cil', 'application/vnd.ms-artgalry'],\n ['cla', 'application/vnd.claymore'],\n [\n 'class',\n ['application/octet-stream', 'application/java', 'application/java-byte-code', 'application/java-vm', 'application/x-java-class']\n ],\n ['clkk', 'application/vnd.crick.clicker.keyboard'],\n ['clkp', 'application/vnd.crick.clicker.palette'],\n ['clkt', 'application/vnd.crick.clicker.template'],\n ['clkw', 'application/vnd.crick.clicker.wordbank'],\n ['clkx', 'application/vnd.crick.clicker'],\n ['clp', 'application/x-msclip'],\n ['cmc', 'application/vnd.cosmocaller'],\n ['cmdf', 'chemical/x-cmdf'],\n ['cml', 'chemical/x-cml'],\n ['cmp', 'application/vnd.yellowriver-custom-menu'],\n ['cmx', 'image/x-cmx'],\n ['cod', ['image/cis-cod', 'application/vnd.rim.cod']],\n ['com', ['application/octet-stream', 'text/plain']],\n ['conf', 'text/plain'],\n ['cpio', 'application/x-cpio'],\n ['cpp', 'text/x-c'],\n ['cpt', ['application/mac-compactpro', 'application/x-compactpro', 'application/x-cpt']],\n ['crd', 'application/x-mscardfile'],\n ['crl', ['application/pkix-crl', 'application/pkcs-crl']],\n ['crt', ['application/pkix-cert', 'application/x-x509-user-cert', 'application/x-x509-ca-cert']],\n ['cryptonote', 'application/vnd.rig.cryptonote'],\n ['csh', ['text/x-script.csh', 'application/x-csh']],\n ['csml', 'chemical/x-csml'],\n ['csp', 'application/vnd.commonspace'],\n ['css', ['text/css', 'application/x-pointplus']],\n ['csv', 'text/csv'],\n ['cu', 'application/cu-seeme'],\n ['curl', 'text/vnd.curl'],\n ['cww', 'application/prs.cww'],\n ['cxx', 'text/plain'],\n ['dae', 'model/vnd.collada+xml'],\n ['daf', 'application/vnd.mobius.daf'],\n ['davmount', 'application/davmount+xml'],\n ['dcr', 'application/x-director'],\n ['dcurl', 'text/vnd.curl.dcurl'],\n ['dd2', 'application/vnd.oma.dd2+xml'],\n ['ddd', 'application/vnd.fujixerox.ddd'],\n ['deb', 'application/x-debian-package'],\n ['deepv', 'application/x-deepv'],\n ['def', 'text/plain'],\n ['der', 'application/x-x509-ca-cert'],\n ['dfac', 'application/vnd.dreamfactory'],\n ['dif', 'video/x-dv'],\n ['dir', 'application/x-director'],\n ['dis', 'application/vnd.mobius.dis'],\n ['djvu', 'image/vnd.djvu'],\n ['dl', ['video/dl', 'video/x-dl']],\n ['dll', 'application/x-msdownload'],\n ['dms', 'application/octet-stream'],\n ['dna', 'application/vnd.dna'],\n ['doc', 'application/msword'],\n ['docm', 'application/vnd.ms-word.document.macroenabled.12'],\n ['docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n ['dot', 'application/msword'],\n ['dotm', 'application/vnd.ms-word.template.macroenabled.12'],\n ['dotx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.template'],\n ['dp', ['application/commonground', 'application/vnd.osgi.dp']],\n ['dpg', 'application/vnd.dpgraph'],\n ['dra', 'audio/vnd.dra'],\n ['drw', 'application/drafting'],\n ['dsc', 'text/prs.lines.tag'],\n ['dssc', 'application/dssc+der'],\n ['dtb', 'application/x-dtbook+xml'],\n ['dtd', 'application/xml-dtd'],\n ['dts', 'audio/vnd.dts'],\n ['dtshd', 'audio/vnd.dts.hd'],\n ['dump', 'application/octet-stream'],\n ['dv', 'video/x-dv'],\n ['dvi', 'application/x-dvi'],\n ['dwf', ['model/vnd.dwf', 'drawing/x-dwf']],\n ['dwg', ['application/acad', 'image/vnd.dwg', 'image/x-dwg']],\n ['dxf', ['application/dxf', 'image/vnd.dwg', 'image/vnd.dxf', 'image/x-dwg']],\n ['dxp', 'application/vnd.spotfire.dxp'],\n ['dxr', 'application/x-director'],\n ['ecelp4800', 'audio/vnd.nuera.ecelp4800'],\n ['ecelp7470', 'audio/vnd.nuera.ecelp7470'],\n ['ecelp9600', 'audio/vnd.nuera.ecelp9600'],\n ['edm', 'application/vnd.novadigm.edm'],\n ['edx', 'application/vnd.novadigm.edx'],\n ['efif', 'application/vnd.picsel'],\n ['ei6', 'application/vnd.pg.osasli'],\n ['el', 'text/x-script.elisp'],\n ['elc', ['application/x-elc', 'application/x-bytecode.elisp']],\n ['eml', 'message/rfc822'],\n ['emma', 'application/emma+xml'],\n ['env', 'application/x-envoy'],\n ['eol', 'audio/vnd.digital-winds'],\n ['eot', 'application/vnd.ms-fontobject'],\n ['eps', 'application/postscript'],\n ['epub', 'application/epub+zip'],\n ['es', ['application/ecmascript', 'application/x-esrehber']],\n ['es3', 'application/vnd.eszigno3+xml'],\n ['esf', 'application/vnd.epson.esf'],\n ['etx', 'text/x-setext'],\n ['evy', ['application/envoy', 'application/x-envoy']],\n ['exe', ['application/octet-stream', 'application/x-msdownload']],\n ['exi', 'application/exi'],\n ['ext', 'application/vnd.novadigm.ext'],\n ['ez2', 'application/vnd.ezpix-album'],\n ['ez3', 'application/vnd.ezpix-package'],\n ['f', ['text/plain', 'text/x-fortran']],\n ['f4v', 'video/x-f4v'],\n ['f77', 'text/x-fortran'],\n ['f90', ['text/plain', 'text/x-fortran']],\n ['fbs', 'image/vnd.fastbidsheet'],\n ['fcs', 'application/vnd.isac.fcs'],\n ['fdf', 'application/vnd.fdf'],\n ['fe_launch', 'application/vnd.denovo.fcselayout-link'],\n ['fg5', 'application/vnd.fujitsu.oasysgp'],\n ['fh', 'image/x-freehand'],\n ['fif', ['application/fractals', 'image/fif']],\n ['fig', 'application/x-xfig'],\n ['fli', ['video/fli', 'video/x-fli']],\n ['flo', ['image/florian', 'application/vnd.micrografx.flo']],\n ['flr', 'x-world/x-vrml'],\n ['flv', 'video/x-flv'],\n ['flw', 'application/vnd.kde.kivio'],\n ['flx', 'text/vnd.fmi.flexstor'],\n ['fly', 'text/vnd.fly'],\n ['fm', 'application/vnd.framemaker'],\n ['fmf', 'video/x-atomic3d-feature'],\n ['fnc', 'application/vnd.frogans.fnc'],\n ['for', ['text/plain', 'text/x-fortran']],\n ['fpx', ['image/vnd.fpx', 'image/vnd.net-fpx']],\n ['frl', 'application/freeloader'],\n ['fsc', 'application/vnd.fsc.weblaunch'],\n ['fst', 'image/vnd.fst'],\n ['ftc', 'application/vnd.fluxtime.clip'],\n ['fti', 'application/vnd.anser-web-funds-transfer-initiation'],\n ['funk', 'audio/make'],\n ['fvt', 'video/vnd.fvt'],\n ['fxp', 'application/vnd.adobe.fxp'],\n ['fzs', 'application/vnd.fuzzysheet'],\n ['g', 'text/plain'],\n ['g2w', 'application/vnd.geoplan'],\n ['g3', 'image/g3fax'],\n ['g3w', 'application/vnd.geospace'],\n ['gac', 'application/vnd.groove-account'],\n ['gdl', 'model/vnd.gdl'],\n ['geo', 'application/vnd.dynageo'],\n ['geojson', 'application/geo+json'],\n ['gex', 'application/vnd.geometry-explorer'],\n ['ggb', 'application/vnd.geogebra.file'],\n ['ggt', 'application/vnd.geogebra.tool'],\n ['ghf', 'application/vnd.groove-help'],\n ['gif', 'image/gif'],\n ['gim', 'application/vnd.groove-identity-message'],\n ['gl', ['video/gl', 'video/x-gl']],\n ['gmx', 'application/vnd.gmx'],\n ['gnumeric', 'application/x-gnumeric'],\n ['gph', 'application/vnd.flographit'],\n ['gqf', 'application/vnd.grafeq'],\n ['gram', 'application/srgs'],\n ['grv', 'application/vnd.groove-injector'],\n ['grxml', 'application/srgs+xml'],\n ['gsd', 'audio/x-gsm'],\n ['gsf', 'application/x-font-ghostscript'],\n ['gsm', 'audio/x-gsm'],\n ['gsp', 'application/x-gsp'],\n ['gss', 'application/x-gss'],\n ['gtar', 'application/x-gtar'],\n ['gtm', 'application/vnd.groove-tool-message'],\n ['gtw', 'model/vnd.gtw'],\n ['gv', 'text/vnd.graphviz'],\n ['gxt', 'application/vnd.geonext'],\n ['gz', ['application/x-gzip', 'application/x-compressed']],\n ['gzip', ['multipart/x-gzip', 'application/x-gzip']],\n ['h', ['text/plain', 'text/x-h']],\n ['h261', 'video/h261'],\n ['h263', 'video/h263'],\n ['h264', 'video/h264'],\n ['hal', 'application/vnd.hal+xml'],\n ['hbci', 'application/vnd.hbci'],\n ['hdf', 'application/x-hdf'],\n ['help', 'application/x-helpfile'],\n ['hgl', 'application/vnd.hp-hpgl'],\n ['hh', ['text/plain', 'text/x-h']],\n ['hlb', 'text/x-script'],\n ['hlp', ['application/winhlp', 'application/hlp', 'application/x-helpfile', 'application/x-winhelp']],\n ['hpg', 'application/vnd.hp-hpgl'],\n ['hpgl', 'application/vnd.hp-hpgl'],\n ['hpid', 'application/vnd.hp-hpid'],\n ['hps', 'application/vnd.hp-hps'],\n [\n 'hqx',\n [\n 'application/mac-binhex40',\n 'application/binhex',\n 'application/binhex4',\n 'application/mac-binhex',\n 'application/x-binhex40',\n 'application/x-mac-binhex40'\n ]\n ],\n ['hta', 'application/hta'],\n ['htc', 'text/x-component'],\n ['htke', 'application/vnd.kenameaapp'],\n ['htm', 'text/html'],\n ['html', 'text/html'],\n ['htmls', 'text/html'],\n ['htt', 'text/webviewhtml'],\n ['htx', 'text/html'],\n ['hvd', 'application/vnd.yamaha.hv-dic'],\n ['hvp', 'application/vnd.yamaha.hv-voice'],\n ['hvs', 'application/vnd.yamaha.hv-script'],\n ['i2g', 'application/vnd.intergeo'],\n ['icc', 'application/vnd.iccprofile'],\n ['ice', 'x-conference/x-cooltalk'],\n ['ico', 'image/x-icon'],\n ['ics', 'text/calendar'],\n ['idc', 'text/plain'],\n ['ief', 'image/ief'],\n ['iefs', 'image/ief'],\n ['ifm', 'application/vnd.shana.informed.formdata'],\n ['iges', ['application/iges', 'model/iges']],\n ['igl', 'application/vnd.igloader'],\n ['igm', 'application/vnd.insors.igm'],\n ['igs', ['application/iges', 'model/iges']],\n ['igx', 'application/vnd.micrografx.igx'],\n ['iif', 'application/vnd.shana.informed.interchange'],\n ['iii', 'application/x-iphone'],\n ['ima', 'application/x-ima'],\n ['imap', 'application/x-httpd-imap'],\n ['imp', 'application/vnd.accpac.simply.imp'],\n ['ims', 'application/vnd.ms-ims'],\n ['inf', 'application/inf'],\n ['ins', ['application/x-internet-signup', 'application/x-internett-signup']],\n ['ip', 'application/x-ip2'],\n ['ipfix', 'application/ipfix'],\n ['ipk', 'application/vnd.shana.informed.package'],\n ['irm', 'application/vnd.ibm.rights-management'],\n ['irp', 'application/vnd.irepository.package+xml'],\n ['isp', 'application/x-internet-signup'],\n ['isu', 'video/x-isvideo'],\n ['it', 'audio/it'],\n ['itp', 'application/vnd.shana.informed.formtemplate'],\n ['iv', 'application/x-inventor'],\n ['ivp', 'application/vnd.immervision-ivp'],\n ['ivr', 'i-world/i-vrml'],\n ['ivu', 'application/vnd.immervision-ivu'],\n ['ivy', 'application/x-livescreen'],\n ['jad', 'text/vnd.sun.j2me.app-descriptor'],\n ['jam', ['application/vnd.jam', 'audio/x-jam']],\n ['jar', 'application/java-archive'],\n ['jav', ['text/plain', 'text/x-java-source']],\n ['java', ['text/plain', 'text/x-java-source,java', 'text/x-java-source']],\n ['jcm', 'application/x-java-commerce'],\n ['jfif', ['image/pipeg', 'image/jpeg', 'image/pjpeg']],\n ['jfif-tbnl', 'image/jpeg'],\n ['jisp', 'application/vnd.jisp'],\n ['jlt', 'application/vnd.hp-jlyt'],\n ['jnlp', 'application/x-java-jnlp-file'],\n ['joda', 'application/vnd.joost.joda-archive'],\n ['jpe', ['image/jpeg', 'image/pjpeg']],\n ['jpeg', ['image/jpeg', 'image/pjpeg']],\n ['jpg', ['image/jpeg', 'image/pjpeg']],\n ['jpgv', 'video/jpeg'],\n ['jpm', 'video/jpm'],\n ['jps', 'image/x-jps'],\n ['js', ['application/javascript', 'application/ecmascript', 'text/javascript', 'text/ecmascript', 'application/x-javascript']],\n ['json', 'application/json'],\n ['jut', 'image/jutvision'],\n ['kar', ['audio/midi', 'music/x-karaoke']],\n ['karbon', 'application/vnd.kde.karbon'],\n ['kfo', 'application/vnd.kde.kformula'],\n ['kia', 'application/vnd.kidspiration'],\n ['kml', 'application/vnd.google-earth.kml+xml'],\n ['kmz', 'application/vnd.google-earth.kmz'],\n ['kne', 'application/vnd.kinar'],\n ['kon', 'application/vnd.kde.kontour'],\n ['kpr', 'application/vnd.kde.kpresenter'],\n ['ksh', ['application/x-ksh', 'text/x-script.ksh']],\n ['ksp', 'application/vnd.kde.kspread'],\n ['ktx', 'image/ktx'],\n ['ktz', 'application/vnd.kahootz'],\n ['kwd', 'application/vnd.kde.kword'],\n ['la', ['audio/nspaudio', 'audio/x-nspaudio']],\n ['lam', 'audio/x-liveaudio'],\n ['lasxml', 'application/vnd.las.las+xml'],\n ['latex', 'application/x-latex'],\n ['lbd', 'application/vnd.llamagraphics.life-balance.desktop'],\n ['lbe', 'application/vnd.llamagraphics.life-balance.exchange+xml'],\n ['les', 'application/vnd.hhe.lesson-player'],\n ['lha', ['application/octet-stream', 'application/lha', 'application/x-lha']],\n ['lhx', 'application/octet-stream'],\n ['link66', 'application/vnd.route66.link66+xml'],\n ['list', 'text/plain'],\n ['lma', ['audio/nspaudio', 'audio/x-nspaudio']],\n ['log', 'text/plain'],\n ['lrm', 'application/vnd.ms-lrm'],\n ['lsf', 'video/x-la-asf'],\n ['lsp', ['application/x-lisp', 'text/x-script.lisp']],\n ['lst', 'text/plain'],\n ['lsx', ['video/x-la-asf', 'text/x-la-asf']],\n ['ltf', 'application/vnd.frogans.ltf'],\n ['ltx', 'application/x-latex'],\n ['lvp', 'audio/vnd.lucent.voice'],\n ['lwp', 'application/vnd.lotus-wordpro'],\n ['lzh', ['application/octet-stream', 'application/x-lzh']],\n ['lzx', ['application/lzx', 'application/octet-stream', 'application/x-lzx']],\n ['m', ['text/plain', 'text/x-m']],\n ['m13', 'application/x-msmediaview'],\n ['m14', 'application/x-msmediaview'],\n ['m1v', 'video/mpeg'],\n ['m21', 'application/mp21'],\n ['m2a', 'audio/mpeg'],\n ['m2v', 'video/mpeg'],\n ['m3u', ['audio/x-mpegurl', 'audio/x-mpequrl']],\n ['m3u8', 'application/vnd.apple.mpegurl'],\n ['m4v', 'video/x-m4v'],\n ['ma', 'application/mathematica'],\n ['mads', 'application/mads+xml'],\n ['mag', 'application/vnd.ecowin.chart'],\n ['man', 'application/x-troff-man'],\n ['map', 'application/x-navimap'],\n ['mar', 'text/plain'],\n ['mathml', 'application/mathml+xml'],\n ['mbd', 'application/mbedlet'],\n ['mbk', 'application/vnd.mobius.mbk'],\n ['mbox', 'application/mbox'],\n ['mc$', 'application/x-magic-cap-package-1.0'],\n ['mc1', 'application/vnd.medcalcdata'],\n ['mcd', ['application/mcad', 'application/vnd.mcd', 'application/x-mathcad']],\n ['mcf', ['image/vasa', 'text/mcf']],\n ['mcp', 'application/netmc'],\n ['mcurl', 'text/vnd.curl.mcurl'],\n ['mdb', 'application/x-msaccess'],\n ['mdi', 'image/vnd.ms-modi'],\n ['me', 'application/x-troff-me'],\n ['meta4', 'application/metalink4+xml'],\n ['mets', 'application/mets+xml'],\n ['mfm', 'application/vnd.mfmp'],\n ['mgp', 'application/vnd.osgeo.mapguide.package'],\n ['mgz', 'application/vnd.proteus.magazine'],\n ['mht', 'message/rfc822'],\n ['mhtml', 'message/rfc822'],\n ['mid', ['audio/mid', 'audio/midi', 'music/crescendo', 'x-music/x-midi', 'audio/x-midi', 'application/x-midi', 'audio/x-mid']],\n ['midi', ['audio/midi', 'music/crescendo', 'x-music/x-midi', 'audio/x-midi', 'application/x-midi', 'audio/x-mid']],\n ['mif', ['application/vnd.mif', 'application/x-mif', 'application/x-frame']],\n ['mime', ['message/rfc822', 'www/mime']],\n ['mj2', 'video/mj2'],\n ['mjf', 'audio/x-vnd.audioexplosion.mjuicemediafile'],\n ['mjpg', 'video/x-motion-jpeg'],\n ['mlp', 'application/vnd.dolby.mlp'],\n ['mm', ['application/base64', 'application/x-meme']],\n ['mmd', 'application/vnd.chipnuts.karaoke-mmd'],\n ['mme', 'application/base64'],\n ['mmf', 'application/vnd.smaf'],\n ['mmr', 'image/vnd.fujixerox.edmics-mmr'],\n ['mny', 'application/x-msmoney'],\n ['mod', ['audio/mod', 'audio/x-mod']],\n ['mods', 'application/mods+xml'],\n ['moov', 'video/quicktime'],\n ['mov', 'video/quicktime'],\n ['movie', 'video/x-sgi-movie'],\n ['mp2', ['video/mpeg', 'audio/mpeg', 'video/x-mpeg', 'audio/x-mpeg', 'video/x-mpeq2a']],\n ['mp3', ['audio/mpeg', 'audio/mpeg3', 'video/mpeg', 'audio/x-mpeg-3', 'video/x-mpeg']],\n ['mp4', ['video/mp4', 'application/mp4']],\n ['mp4a', 'audio/mp4'],\n ['mpa', ['video/mpeg', 'audio/mpeg']],\n ['mpc', ['application/vnd.mophun.certificate', 'application/x-project']],\n ['mpe', 'video/mpeg'],\n ['mpeg', 'video/mpeg'],\n ['mpg', ['video/mpeg', 'audio/mpeg']],\n ['mpga', 'audio/mpeg'],\n ['mpkg', 'application/vnd.apple.installer+xml'],\n ['mpm', 'application/vnd.blueice.multipass'],\n ['mpn', 'application/vnd.mophun.application'],\n ['mpp', 'application/vnd.ms-project'],\n ['mpt', 'application/x-project'],\n ['mpv', 'application/x-project'],\n ['mpv2', 'video/mpeg'],\n ['mpx', 'application/x-project'],\n ['mpy', 'application/vnd.ibm.minipay'],\n ['mqy', 'application/vnd.mobius.mqy'],\n ['mrc', 'application/marc'],\n ['mrcx', 'application/marcxml+xml'],\n ['ms', 'application/x-troff-ms'],\n ['mscml', 'application/mediaservercontrol+xml'],\n ['mseq', 'application/vnd.mseq'],\n ['msf', 'application/vnd.epson.msf'],\n ['msg', 'application/vnd.ms-outlook'],\n ['msh', 'model/mesh'],\n ['msl', 'application/vnd.mobius.msl'],\n ['msty', 'application/vnd.muvee.style'],\n ['mts', 'model/vnd.mts'],\n ['mus', 'application/vnd.musician'],\n ['musicxml', 'application/vnd.recordare.musicxml+xml'],\n ['mv', 'video/x-sgi-movie'],\n ['mvb', 'application/x-msmediaview'],\n ['mwf', 'application/vnd.mfer'],\n ['mxf', 'application/mxf'],\n ['mxl', 'application/vnd.recordare.musicxml'],\n ['mxml', 'application/xv+xml'],\n ['mxs', 'application/vnd.triscape.mxs'],\n ['mxu', 'video/vnd.mpegurl'],\n ['my', 'audio/make'],\n ['mzz', 'application/x-vnd.audioexplosion.mzz'],\n ['n-gage', 'application/vnd.nokia.n-gage.symbian.install'],\n ['n3', 'text/n3'],\n ['nap', 'image/naplps'],\n ['naplps', 'image/naplps'],\n ['nbp', 'application/vnd.wolfram.player'],\n ['nc', 'application/x-netcdf'],\n ['ncm', 'application/vnd.nokia.configuration-message'],\n ['ncx', 'application/x-dtbncx+xml'],\n ['ngdat', 'application/vnd.nokia.n-gage.data'],\n ['nif', 'image/x-niff'],\n ['niff', 'image/x-niff'],\n ['nix', 'application/x-mix-transfer'],\n ['nlu', 'application/vnd.neurolanguage.nlu'],\n ['nml', 'application/vnd.enliven'],\n ['nnd', 'application/vnd.noblenet-directory'],\n ['nns', 'application/vnd.noblenet-sealer'],\n ['nnw', 'application/vnd.noblenet-web'],\n ['npx', 'image/vnd.net-fpx'],\n ['nsc', 'application/x-conference'],\n ['nsf', 'application/vnd.lotus-notes'],\n ['nvd', 'application/x-navidoc'],\n ['nws', 'message/rfc822'],\n ['o', 'application/octet-stream'],\n ['oa2', 'application/vnd.fujitsu.oasys2'],\n ['oa3', 'application/vnd.fujitsu.oasys3'],\n ['oas', 'application/vnd.fujitsu.oasys'],\n ['obd', 'application/x-msbinder'],\n ['oda', 'application/oda'],\n ['odb', 'application/vnd.oasis.opendocument.database'],\n ['odc', 'application/vnd.oasis.opendocument.chart'],\n ['odf', 'application/vnd.oasis.opendocument.formula'],\n ['odft', 'application/vnd.oasis.opendocument.formula-template'],\n ['odg', 'application/vnd.oasis.opendocument.graphics'],\n ['odi', 'application/vnd.oasis.opendocument.image'],\n ['odm', 'application/vnd.oasis.opendocument.text-master'],\n ['odp', 'application/vnd.oasis.opendocument.presentation'],\n ['ods', 'application/vnd.oasis.opendocument.spreadsheet'],\n ['odt', 'application/vnd.oasis.opendocument.text'],\n ['oga', 'audio/ogg'],\n ['ogv', 'video/ogg'],\n ['ogx', 'application/ogg'],\n ['omc', 'application/x-omc'],\n ['omcd', 'application/x-omcdatamaker'],\n ['omcr', 'application/x-omcregerator'],\n ['onetoc', 'application/onenote'],\n ['opf', 'application/oebps-package+xml'],\n ['org', 'application/vnd.lotus-organizer'],\n ['osf', 'application/vnd.yamaha.openscoreformat'],\n ['osfpvg', 'application/vnd.yamaha.openscoreformat.osfpvg+xml'],\n ['otc', 'application/vnd.oasis.opendocument.chart-template'],\n ['otf', 'application/x-font-otf'],\n ['otg', 'application/vnd.oasis.opendocument.graphics-template'],\n ['oth', 'application/vnd.oasis.opendocument.text-web'],\n ['oti', 'application/vnd.oasis.opendocument.image-template'],\n ['otp', 'application/vnd.oasis.opendocument.presentation-template'],\n ['ots', 'application/vnd.oasis.opendocument.spreadsheet-template'],\n ['ott', 'application/vnd.oasis.opendocument.text-template'],\n ['oxt', 'application/vnd.openofficeorg.extension'],\n ['p', 'text/x-pascal'],\n ['p10', ['application/pkcs10', 'application/x-pkcs10']],\n ['p12', ['application/pkcs-12', 'application/x-pkcs12']],\n ['p7a', 'application/x-pkcs7-signature'],\n ['p7b', 'application/x-pkcs7-certificates'],\n ['p7c', ['application/pkcs7-mime', 'application/x-pkcs7-mime']],\n ['p7m', ['application/pkcs7-mime', 'application/x-pkcs7-mime']],\n ['p7r', 'application/x-pkcs7-certreqresp'],\n ['p7s', ['application/pkcs7-signature', 'application/x-pkcs7-signature']],\n ['p8', 'application/pkcs8'],\n ['par', 'text/plain-bas'],\n ['part', 'application/pro_eng'],\n ['pas', 'text/pascal'],\n ['paw', 'application/vnd.pawaafile'],\n ['pbd', 'application/vnd.powerbuilder6'],\n ['pbm', 'image/x-portable-bitmap'],\n ['pcf', 'application/x-font-pcf'],\n ['pcl', ['application/vnd.hp-pcl', 'application/x-pcl']],\n ['pclxl', 'application/vnd.hp-pclxl'],\n ['pct', 'image/x-pict'],\n ['pcurl', 'application/vnd.curl.pcurl'],\n ['pcx', 'image/x-pcx'],\n ['pdb', ['application/vnd.palm', 'chemical/x-pdb']],\n ['pdf', 'application/pdf'],\n ['pfa', 'application/x-font-type1'],\n ['pfr', 'application/font-tdpfr'],\n ['pfunk', ['audio/make', 'audio/make.my.funk']],\n ['pfx', 'application/x-pkcs12'],\n ['pgm', ['image/x-portable-graymap', 'image/x-portable-greymap']],\n ['pgn', 'application/x-chess-pgn'],\n ['pgp', 'application/pgp-signature'],\n ['pic', ['image/pict', 'image/x-pict']],\n ['pict', 'image/pict'],\n ['pkg', 'application/x-newton-compatible-pkg'],\n ['pki', 'application/pkixcmp'],\n ['pkipath', 'application/pkix-pkipath'],\n ['pko', ['application/ynd.ms-pkipko', 'application/vnd.ms-pki.pko']],\n ['pl', ['text/plain', 'text/x-script.perl']],\n ['plb', 'application/vnd.3gpp.pic-bw-large'],\n ['plc', 'application/vnd.mobius.plc'],\n ['plf', 'application/vnd.pocketlearn'],\n ['pls', 'application/pls+xml'],\n ['plx', 'application/x-pixclscript'],\n ['pm', ['text/x-script.perl-module', 'image/x-xpixmap']],\n ['pm4', 'application/x-pagemaker'],\n ['pm5', 'application/x-pagemaker'],\n ['pma', 'application/x-perfmon'],\n ['pmc', 'application/x-perfmon'],\n ['pml', ['application/vnd.ctc-posml', 'application/x-perfmon']],\n ['pmr', 'application/x-perfmon'],\n ['pmw', 'application/x-perfmon'],\n ['png', 'image/png'],\n ['pnm', ['application/x-portable-anymap', 'image/x-portable-anymap']],\n ['portpkg', 'application/vnd.macports.portpkg'],\n ['pot', ['application/vnd.ms-powerpoint', 'application/mspowerpoint']],\n ['potm', 'application/vnd.ms-powerpoint.template.macroenabled.12'],\n ['potx', 'application/vnd.openxmlformats-officedocument.presentationml.template'],\n ['pov', 'model/x-pov'],\n ['ppa', 'application/vnd.ms-powerpoint'],\n ['ppam', 'application/vnd.ms-powerpoint.addin.macroenabled.12'],\n ['ppd', 'application/vnd.cups-ppd'],\n ['ppm', 'image/x-portable-pixmap'],\n ['pps', ['application/vnd.ms-powerpoint', 'application/mspowerpoint']],\n ['ppsm', 'application/vnd.ms-powerpoint.slideshow.macroenabled.12'],\n ['ppsx', 'application/vnd.openxmlformats-officedocument.presentationml.slideshow'],\n ['ppt', ['application/vnd.ms-powerpoint', 'application/mspowerpoint', 'application/powerpoint', 'application/x-mspowerpoint']],\n ['pptm', 'application/vnd.ms-powerpoint.presentation.macroenabled.12'],\n ['pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'],\n ['ppz', 'application/mspowerpoint'],\n ['prc', 'application/x-mobipocket-ebook'],\n ['pre', ['application/vnd.lotus-freelance', 'application/x-freelance']],\n ['prf', 'application/pics-rules'],\n ['prt', 'application/pro_eng'],\n ['ps', 'application/postscript'],\n ['psb', 'application/vnd.3gpp.pic-bw-small'],\n ['psd', ['application/octet-stream', 'image/vnd.adobe.photoshop']],\n ['psf', 'application/x-font-linux-psf'],\n ['pskcxml', 'application/pskc+xml'],\n ['ptid', 'application/vnd.pvi.ptid1'],\n ['pub', 'application/x-mspublisher'],\n ['pvb', 'application/vnd.3gpp.pic-bw-var'],\n ['pvu', 'paleovu/x-pv'],\n ['pwn', 'application/vnd.3m.post-it-notes'],\n ['pwz', 'application/vnd.ms-powerpoint'],\n ['py', 'text/x-script.phyton'],\n ['pya', 'audio/vnd.ms-playready.media.pya'],\n ['pyc', 'application/x-bytecode.python'],\n ['pyv', 'video/vnd.ms-playready.media.pyv'],\n ['qam', 'application/vnd.epson.quickanime'],\n ['qbo', 'application/vnd.intu.qbo'],\n ['qcp', 'audio/vnd.qcelp'],\n ['qd3', 'x-world/x-3dmf'],\n ['qd3d', 'x-world/x-3dmf'],\n ['qfx', 'application/vnd.intu.qfx'],\n ['qif', 'image/x-quicktime'],\n ['qps', 'application/vnd.publishare-delta-tree'],\n ['qt', 'video/quicktime'],\n ['qtc', 'video/x-qtc'],\n ['qti', 'image/x-quicktime'],\n ['qtif', 'image/x-quicktime'],\n ['qxd', 'application/vnd.quark.quarkxpress'],\n ['ra', ['audio/x-realaudio', 'audio/x-pn-realaudio', 'audio/x-pn-realaudio-plugin']],\n ['ram', 'audio/x-pn-realaudio'],\n ['rar', 'application/x-rar-compressed'],\n ['ras', ['image/cmu-raster', 'application/x-cmu-raster', 'image/x-cmu-raster']],\n ['rast', 'image/cmu-raster'],\n ['rcprofile', 'application/vnd.ipunplugged.rcprofile'],\n ['rdf', 'application/rdf+xml'],\n ['rdz', 'application/vnd.data-vision.rdz'],\n ['rep', 'application/vnd.businessobjects'],\n ['res', 'application/x-dtbresource+xml'],\n ['rexx', 'text/x-script.rexx'],\n ['rf', 'image/vnd.rn-realflash'],\n ['rgb', 'image/x-rgb'],\n ['rif', 'application/reginfo+xml'],\n ['rip', 'audio/vnd.rip'],\n ['rl', 'application/resource-lists+xml'],\n ['rlc', 'image/vnd.fujixerox.edmics-rlc'],\n ['rld', 'application/resource-lists-diff+xml'],\n ['rm', ['application/vnd.rn-realmedia', 'audio/x-pn-realaudio']],\n ['rmi', 'audio/mid'],\n ['rmm', 'audio/x-pn-realaudio'],\n ['rmp', ['audio/x-pn-realaudio-plugin', 'audio/x-pn-realaudio']],\n ['rms', 'application/vnd.jcp.javame.midlet-rms'],\n ['rnc', 'application/relax-ng-compact-syntax'],\n ['rng', ['application/ringing-tones', 'application/vnd.nokia.ringing-tone']],\n ['rnx', 'application/vnd.rn-realplayer'],\n ['roff', 'application/x-troff'],\n ['rp', 'image/vnd.rn-realpix'],\n ['rp9', 'application/vnd.cloanto.rp9'],\n ['rpm', 'audio/x-pn-realaudio-plugin'],\n ['rpss', 'application/vnd.nokia.radio-presets'],\n ['rpst', 'application/vnd.nokia.radio-preset'],\n ['rq', 'application/sparql-query'],\n ['rs', 'application/rls-services+xml'],\n ['rsd', 'application/rsd+xml'],\n ['rt', ['text/richtext', 'text/vnd.rn-realtext']],\n ['rtf', ['application/rtf', 'text/richtext', 'application/x-rtf']],\n ['rtx', ['text/richtext', 'application/rtf']],\n ['rv', 'video/vnd.rn-realvideo'],\n ['s', 'text/x-asm'],\n ['s3m', 'audio/s3m'],\n ['saf', 'application/vnd.yamaha.smaf-audio'],\n ['saveme', 'application/octet-stream'],\n ['sbk', 'application/x-tbook'],\n ['sbml', 'application/sbml+xml'],\n ['sc', 'application/vnd.ibm.secure-container'],\n ['scd', 'application/x-msschedule'],\n [\n 'scm',\n ['application/vnd.lotus-screencam', 'video/x-scm', 'text/x-script.guile', 'application/x-lotusscreencam', 'text/x-script.scheme']\n ],\n ['scq', 'application/scvp-cv-request'],\n ['scs', 'application/scvp-cv-response'],\n ['sct', 'text/scriptlet'],\n ['scurl', 'text/vnd.curl.scurl'],\n ['sda', 'application/vnd.stardivision.draw'],\n ['sdc', 'application/vnd.stardivision.calc'],\n ['sdd', 'application/vnd.stardivision.impress'],\n ['sdkm', 'application/vnd.solent.sdkm+xml'],\n ['sdml', 'text/plain'],\n ['sdp', ['application/sdp', 'application/x-sdp']],\n ['sdr', 'application/sounder'],\n ['sdw', 'application/vnd.stardivision.writer'],\n ['sea', ['application/sea', 'application/x-sea']],\n ['see', 'application/vnd.seemail'],\n ['seed', 'application/vnd.fdsn.seed'],\n ['sema', 'application/vnd.sema'],\n ['semd', 'application/vnd.semd'],\n ['semf', 'application/vnd.semf'],\n ['ser', 'application/java-serialized-object'],\n ['set', 'application/set'],\n ['setpay', 'application/set-payment-initiation'],\n ['setreg', 'application/set-registration-initiation'],\n ['sfd-hdstx', 'application/vnd.hydrostatix.sof-data'],\n ['sfs', 'application/vnd.spotfire.sfs'],\n ['sgl', 'application/vnd.stardivision.writer-global'],\n ['sgm', ['text/sgml', 'text/x-sgml']],\n ['sgml', ['text/sgml', 'text/x-sgml']],\n ['sh', ['application/x-shar', 'application/x-bsh', 'application/x-sh', 'text/x-script.sh']],\n ['shar', ['application/x-bsh', 'application/x-shar']],\n ['shf', 'application/shf+xml'],\n ['shtml', ['text/html', 'text/x-server-parsed-html']],\n ['sid', 'audio/x-psid'],\n ['sis', 'application/vnd.symbian.install'],\n ['sit', ['application/x-stuffit', 'application/x-sit']],\n ['sitx', 'application/x-stuffitx'],\n ['skd', 'application/x-koan'],\n ['skm', 'application/x-koan'],\n ['skp', ['application/vnd.koan', 'application/x-koan']],\n ['skt', 'application/x-koan'],\n ['sl', 'application/x-seelogo'],\n ['sldm', 'application/vnd.ms-powerpoint.slide.macroenabled.12'],\n ['sldx', 'application/vnd.openxmlformats-officedocument.presentationml.slide'],\n ['slt', 'application/vnd.epson.salt'],\n ['sm', 'application/vnd.stepmania.stepchart'],\n ['smf', 'application/vnd.stardivision.math'],\n ['smi', ['application/smil', 'application/smil+xml']],\n ['smil', 'application/smil'],\n ['snd', ['audio/basic', 'audio/x-adpcm']],\n ['snf', 'application/x-font-snf'],\n ['sol', 'application/solids'],\n ['spc', ['text/x-speech', 'application/x-pkcs7-certificates']],\n ['spf', 'application/vnd.yamaha.smaf-phrase'],\n ['spl', ['application/futuresplash', 'application/x-futuresplash']],\n ['spot', 'text/vnd.in3d.spot'],\n ['spp', 'application/scvp-vp-response'],\n ['spq', 'application/scvp-vp-request'],\n ['spr', 'application/x-sprite'],\n ['sprite', 'application/x-sprite'],\n ['src', 'application/x-wais-source'],\n ['sru', 'application/sru+xml'],\n ['srx', 'application/sparql-results+xml'],\n ['sse', 'application/vnd.kodak-descriptor'],\n ['ssf', 'application/vnd.epson.ssf'],\n ['ssi', 'text/x-server-parsed-html'],\n ['ssm', 'application/streamingmedia'],\n ['ssml', 'application/ssml+xml'],\n ['sst', ['application/vnd.ms-pkicertstore', 'application/vnd.ms-pki.certstore']],\n ['st', 'application/vnd.sailingtracker.track'],\n ['stc', 'application/vnd.sun.xml.calc.template'],\n ['std', 'application/vnd.sun.xml.draw.template'],\n ['step', 'application/step'],\n ['stf', 'application/vnd.wt.stf'],\n ['sti', 'application/vnd.sun.xml.impress.template'],\n ['stk', 'application/hyperstudio'],\n ['stl', ['application/vnd.ms-pkistl', 'application/sla', 'application/vnd.ms-pki.stl', 'application/x-navistyle']],\n ['stm', 'text/html'],\n ['stp', 'application/step'],\n ['str', 'application/vnd.pg.format'],\n ['stw', 'application/vnd.sun.xml.writer.template'],\n ['sub', 'image/vnd.dvb.subtitle'],\n ['sus', 'application/vnd.sus-calendar'],\n ['sv4cpio', 'application/x-sv4cpio'],\n ['sv4crc', 'application/x-sv4crc'],\n ['svc', 'application/vnd.dvb.service'],\n ['svd', 'application/vnd.svd'],\n ['svf', ['image/vnd.dwg', 'image/x-dwg']],\n ['svg', 'image/svg+xml'],\n ['svr', ['x-world/x-svr', 'application/x-world']],\n ['swf', 'application/x-shockwave-flash'],\n ['swi', 'application/vnd.aristanetworks.swi'],\n ['sxc', 'application/vnd.sun.xml.calc'],\n ['sxd', 'application/vnd.sun.xml.draw'],\n ['sxg', 'application/vnd.sun.xml.writer.global'],\n ['sxi', 'application/vnd.sun.xml.impress'],\n ['sxm', 'application/vnd.sun.xml.math'],\n ['sxw', 'application/vnd.sun.xml.writer'],\n ['t', ['text/troff', 'application/x-troff']],\n ['talk', 'text/x-speech'],\n ['tao', 'application/vnd.tao.intent-module-archive'],\n ['tar', 'application/x-tar'],\n ['tbk', ['application/toolbook', 'application/x-tbook']],\n ['tcap', 'application/vnd.3gpp2.tcap'],\n ['tcl', ['text/x-script.tcl', 'application/x-tcl']],\n ['tcsh', 'text/x-script.tcsh'],\n ['teacher', 'application/vnd.smart.teacher'],\n ['tei', 'application/tei+xml'],\n ['tex', 'application/x-tex'],\n ['texi', 'application/x-texinfo'],\n ['texinfo', 'application/x-texinfo'],\n ['text', ['application/plain', 'text/plain']],\n ['tfi', 'application/thraud+xml'],\n ['tfm', 'application/x-tex-tfm'],\n ['tgz', ['application/gnutar', 'application/x-compressed']],\n ['thmx', 'application/vnd.ms-officetheme'],\n ['tif', ['image/tiff', 'image/x-tiff']],\n ['tiff', ['image/tiff', 'image/x-tiff']],\n ['tmo', 'application/vnd.tmobile-livetv'],\n ['torrent', 'application/x-bittorrent'],\n ['tpl', 'application/vnd.groove-tool-template'],\n ['tpt', 'application/vnd.trid.tpt'],\n ['tr', 'application/x-troff'],\n ['tra', 'application/vnd.trueapp'],\n ['trm', 'application/x-msterminal'],\n ['tsd', 'application/timestamped-data'],\n ['tsi', 'audio/tsp-audio'],\n ['tsp', ['application/dsptype', 'audio/tsplayer']],\n ['tsv', 'text/tab-separated-values'],\n ['ttf', 'application/x-font-ttf'],\n ['ttl', 'text/turtle'],\n ['turbot', 'image/florian'],\n ['twd', 'application/vnd.simtech-mindmapper'],\n ['txd', 'application/vnd.genomatix.tuxedo'],\n ['txf', 'application/vnd.mobius.txf'],\n ['txt', 'text/plain'],\n ['ufd', 'application/vnd.ufdl'],\n ['uil', 'text/x-uil'],\n ['uls', 'text/iuls'],\n ['umj', 'application/vnd.umajin'],\n ['uni', 'text/uri-list'],\n ['unis', 'text/uri-list'],\n ['unityweb', 'application/vnd.unity'],\n ['unv', 'application/i-deas'],\n ['uoml', 'application/vnd.uoml+xml'],\n ['uri', 'text/uri-list'],\n ['uris', 'text/uri-list'],\n ['ustar', ['application/x-ustar', 'multipart/x-ustar']],\n ['utz', 'application/vnd.uiq.theme'],\n ['uu', ['application/octet-stream', 'text/x-uuencode']],\n ['uue', 'text/x-uuencode'],\n ['uva', 'audio/vnd.dece.audio'],\n ['uvh', 'video/vnd.dece.hd'],\n ['uvi', 'image/vnd.dece.graphic'],\n ['uvm', 'video/vnd.dece.mobile'],\n ['uvp', 'video/vnd.dece.pd'],\n ['uvs', 'video/vnd.dece.sd'],\n ['uvu', 'video/vnd.uvvu.mp4'],\n ['uvv', 'video/vnd.dece.video'],\n ['vcd', 'application/x-cdlink'],\n ['vcf', 'text/x-vcard'],\n ['vcg', 'application/vnd.groove-vcard'],\n ['vcs', 'text/x-vcalendar'],\n ['vcx', 'application/vnd.vcx'],\n ['vda', 'application/vda'],\n ['vdo', 'video/vdo'],\n ['vew', 'application/groupwise'],\n ['vis', 'application/vnd.visionary'],\n ['viv', ['video/vivo', 'video/vnd.vivo']],\n ['vivo', ['video/vivo', 'video/vnd.vivo']],\n ['vmd', 'application/vocaltec-media-desc'],\n ['vmf', 'application/vocaltec-media-file'],\n ['voc', ['audio/voc', 'audio/x-voc']],\n ['vos', 'video/vosaic'],\n ['vox', 'audio/voxware'],\n ['vqe', 'audio/x-twinvq-plugin'],\n ['vqf', 'audio/x-twinvq'],\n ['vql', 'audio/x-twinvq-plugin'],\n ['vrml', ['model/vrml', 'x-world/x-vrml', 'application/x-vrml']],\n ['vrt', 'x-world/x-vrt'],\n ['vsd', ['application/vnd.visio', 'application/x-visio']],\n ['vsf', 'application/vnd.vsf'],\n ['vst', 'application/x-visio'],\n ['vsw', 'application/x-visio'],\n ['vtu', 'model/vnd.vtu'],\n ['vxml', 'application/voicexml+xml'],\n ['w60', 'application/wordperfect6.0'],\n ['w61', 'application/wordperfect6.1'],\n ['w6w', 'application/msword'],\n ['wad', 'application/x-doom'],\n ['wav', ['audio/wav', 'audio/x-wav']],\n ['wax', 'audio/x-ms-wax'],\n ['wb1', 'application/x-qpro'],\n ['wbmp', 'image/vnd.wap.wbmp'],\n ['wbs', 'application/vnd.criticaltools.wbs+xml'],\n ['wbxml', 'application/vnd.wap.wbxml'],\n ['wcm', 'application/vnd.ms-works'],\n ['wdb', 'application/vnd.ms-works'],\n ['web', 'application/vnd.xara'],\n ['weba', 'audio/webm'],\n ['webm', 'video/webm'],\n ['webp', 'image/webp'],\n ['wg', 'application/vnd.pmi.widget'],\n ['wgt', 'application/widget'],\n ['wiz', 'application/msword'],\n ['wk1', 'application/x-123'],\n ['wks', 'application/vnd.ms-works'],\n ['wm', 'video/x-ms-wm'],\n ['wma', 'audio/x-ms-wma'],\n ['wmd', 'application/x-ms-wmd'],\n ['wmf', ['windows/metafile', 'application/x-msmetafile']],\n ['wml', 'text/vnd.wap.wml'],\n ['wmlc', 'application/vnd.wap.wmlc'],\n ['wmls', 'text/vnd.wap.wmlscript'],\n ['wmlsc', 'application/vnd.wap.wmlscriptc'],\n ['wmv', 'video/x-ms-wmv'],\n ['wmx', 'video/x-ms-wmx'],\n ['wmz', 'application/x-ms-wmz'],\n ['woff', 'application/x-font-woff'],\n ['word', 'application/msword'],\n ['wp', 'application/wordperfect'],\n ['wp5', ['application/wordperfect', 'application/wordperfect6.0']],\n ['wp6', 'application/wordperfect'],\n ['wpd', ['application/wordperfect', 'application/vnd.wordperfect', 'application/x-wpwin']],\n ['wpl', 'application/vnd.ms-wpl'],\n ['wps', 'application/vnd.ms-works'],\n ['wq1', 'application/x-lotus'],\n ['wqd', 'application/vnd.wqd'],\n ['wri', ['application/mswrite', 'application/x-wri', 'application/x-mswrite']],\n ['wrl', ['model/vrml', 'x-world/x-vrml', 'application/x-world']],\n ['wrz', ['model/vrml', 'x-world/x-vrml']],\n ['wsc', 'text/scriplet'],\n ['wsdl', 'application/wsdl+xml'],\n ['wspolicy', 'application/wspolicy+xml'],\n ['wsrc', 'application/x-wais-source'],\n ['wtb', 'application/vnd.webturbo'],\n ['wtk', 'application/x-wintalk'],\n ['wvx', 'video/x-ms-wvx'],\n ['x-png', 'image/png'],\n ['x3d', 'application/vnd.hzn-3d-crossword'],\n ['xaf', 'x-world/x-vrml'],\n ['xap', 'application/x-silverlight-app'],\n ['xar', 'application/vnd.xara'],\n ['xbap', 'application/x-ms-xbap'],\n ['xbd', 'application/vnd.fujixerox.docuworks.binder'],\n ['xbm', ['image/xbm', 'image/x-xbm', 'image/x-xbitmap']],\n ['xdf', 'application/xcap-diff+xml'],\n ['xdm', 'application/vnd.syncml.dm+xml'],\n ['xdp', 'application/vnd.adobe.xdp+xml'],\n ['xdr', 'video/x-amt-demorun'],\n ['xdssc', 'application/dssc+xml'],\n ['xdw', 'application/vnd.fujixerox.docuworks'],\n ['xenc', 'application/xenc+xml'],\n ['xer', 'application/patch-ops-error+xml'],\n ['xfdf', 'application/vnd.adobe.xfdf'],\n ['xfdl', 'application/vnd.xfdl'],\n ['xgz', 'xgl/drawing'],\n ['xhtml', 'application/xhtml+xml'],\n ['xif', 'image/vnd.xiff'],\n ['xl', 'application/excel'],\n ['xla', ['application/vnd.ms-excel', 'application/excel', 'application/x-msexcel', 'application/x-excel']],\n ['xlam', 'application/vnd.ms-excel.addin.macroenabled.12'],\n ['xlb', ['application/excel', 'application/vnd.ms-excel', 'application/x-excel']],\n ['xlc', ['application/vnd.ms-excel', 'application/excel', 'application/x-excel']],\n ['xld', ['application/excel', 'application/x-excel']],\n ['xlk', ['application/excel', 'application/x-excel']],\n ['xll', ['application/excel', 'application/vnd.ms-excel', 'application/x-excel']],\n ['xlm', ['application/vnd.ms-excel', 'application/excel', 'application/x-excel']],\n ['xls', ['application/vnd.ms-excel', 'application/excel', 'application/x-msexcel', 'application/x-excel']],\n ['xlsb', 'application/vnd.ms-excel.sheet.binary.macroenabled.12'],\n ['xlsm', 'application/vnd.ms-excel.sheet.macroenabled.12'],\n ['xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],\n ['xlt', ['application/vnd.ms-excel', 'application/excel', 'application/x-excel']],\n ['xltm', 'application/vnd.ms-excel.template.macroenabled.12'],\n ['xltx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.template'],\n ['xlv', ['application/excel', 'application/x-excel']],\n ['xlw', ['application/vnd.ms-excel', 'application/excel', 'application/x-msexcel', 'application/x-excel']],\n ['xm', 'audio/xm'],\n ['xml', ['application/xml', 'text/xml', 'application/atom+xml', 'application/rss+xml']],\n ['xmz', 'xgl/movie'],\n ['xo', 'application/vnd.olpc-sugar'],\n ['xof', 'x-world/x-vrml'],\n ['xop', 'application/xop+xml'],\n ['xpi', 'application/x-xpinstall'],\n ['xpix', 'application/x-vnd.ls-xpix'],\n ['xpm', ['image/xpm', 'image/x-xpixmap']],\n ['xpr', 'application/vnd.is-xpr'],\n ['xps', 'application/vnd.ms-xpsdocument'],\n ['xpw', 'application/vnd.intercon.formnet'],\n ['xslt', 'application/xslt+xml'],\n ['xsm', 'application/vnd.syncml+xml'],\n ['xspf', 'application/xspf+xml'],\n ['xsr', 'video/x-amt-showrun'],\n ['xul', 'application/vnd.mozilla.xul+xml'],\n ['xwd', ['image/x-xwd', 'image/x-xwindowdump']],\n ['xyz', ['chemical/x-xyz', 'chemical/x-pdb']],\n ['yang', 'application/yang'],\n ['yin', 'application/yin+xml'],\n ['z', ['application/x-compressed', 'application/x-compress']],\n ['zaz', 'application/vnd.zzazz.deck+xml'],\n ['zip', ['application/zip', 'multipart/x-zip', 'application/x-zip-compressed', 'application/x-compressed']],\n ['zir', 'application/vnd.zul'],\n ['zmm', 'application/vnd.handheld-entertainment+xml'],\n ['zoo', 'application/octet-stream'],\n ['zsh', 'text/x-script.zsh']\n]);\n\nmodule.exports = {\n detectMimeType(filename) {\n if (!filename) {\n return defaultMimeType;\n }\n\n const parsed = path.parse(filename);\n const extension = (parsed.ext.substr(1) || parsed.name || '').split('?').shift().trim().toLowerCase();\n const value = extensions.has(extension) ? extensions.get(extension) : defaultMimeType;\n\n if (Array.isArray(value)) {\n return value[0];\n }\n return value;\n },\n\n detectExtension(mimeType) {\n if (!mimeType) {\n return defaultExtension;\n }\n const parts = (mimeType || '').toLowerCase().trim().split('/');\n const rootType = parts.shift().trim();\n const subType = parts.join('/').trim();\n\n if (mimeTypes.has(rootType + '/' + subType)) {\n const value = mimeTypes.get(rootType + '/' + subType);\n if (Array.isArray(value)) {\n return value[0];\n }\n return value;\n }\n\n switch (rootType) {\n case 'text':\n return 'txt';\n default:\n return 'bin';\n }\n }\n};\n","/*\n\nCopied from https://github.com/mathiasbynens/punycode.js/blob/ef3505c8abb5143a00d53ce59077c9f7f4b2ac47/punycode.js\n\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n*/\n/* eslint callback-return: 0, no-bitwise: 0, eqeqeq: 0, prefer-arrow-callback: 0, object-shorthand: 0 */\n\n'use strict';\n\n/** Highest positive signed 32-bit float value */\nconst maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base = 36;\nconst tMin = 1;\nconst tMax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initialBias = 72;\nconst initialN = 128; // 0x80\nconst delimiter = '-'; // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode = /^xn--/;\nconst regexNonASCII = /[^\\0-\\x7F]/; // Note: U+007F DEL is excluded too.\nconst regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n/** Error messages */\nconst errors = {\n overflow: 'Overflow: input needs wider integers to process',\n 'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n 'invalid-input': 'Invalid input'\n};\n\n/** Convenience shortcuts */\nconst baseMinusTMin = base - tMin;\nconst floor = Math.floor;\nconst stringFromCharCode = String.fromCharCode;\n\n/*--------------------------------------------------------------------------*/\n\n/**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\nfunction error(type) {\n throw new RangeError(errors[type]);\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\nfunction map(array, callback) {\n const result = [];\n let length = array.length;\n while (length--) {\n result[length] = callback(array[length]);\n }\n return result;\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {String} A new string of characters returned by the callback\n * function.\n */\nfunction mapDomain(domain, callback) {\n const parts = domain.split('@');\n let result = '';\n if (parts.length > 1) {\n // In email addresses, only the domain name should be punycoded. Leave\n // the local part (i.e. everything up to `@`) intact.\n result = parts[0] + '@';\n domain = parts[1];\n }\n // Avoid `split(regex)` for IE8 compatibility. See #17.\n domain = domain.replace(regexSeparators, '\\x2E');\n const labels = domain.split('.');\n const encoded = map(labels, callback).join('.');\n return result + encoded;\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see <https://mathiasbynens.be/notes/javascript-encoding>\n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\nfunction ucs2decode(string) {\n const output = [];\n let counter = 0;\n const length = string.length;\n while (counter < length) {\n const value = string.charCodeAt(counter++);\n if (value >= 0xd800 && value <= 0xdbff && counter < length) {\n // It's a high surrogate, and there is a next character.\n const extra = string.charCodeAt(counter++);\n if ((extra & 0xfc00) == 0xdc00) {\n // Low surrogate.\n output.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\nconst ucs2encode = codePoints => String.fromCodePoint(...codePoints);\n\n/**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\nconst basicToDigit = function (codePoint) {\n if (codePoint >= 0x30 && codePoint < 0x3a) {\n return 26 + (codePoint - 0x30);\n }\n if (codePoint >= 0x41 && codePoint < 0x5b) {\n return codePoint - 0x41;\n }\n if (codePoint >= 0x61 && codePoint < 0x7b) {\n return codePoint - 0x61;\n }\n return base;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\nconst digitToBasic = function (digit, flag) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\nconst adapt = function (delta, numPoints, firstTime) {\n let k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n for (; /* no initialization */ delta > (baseMinusTMin * tMax) >> 1; k += base) {\n delta = floor(delta / baseMinusTMin);\n }\n return floor(k + ((baseMinusTMin + 1) * delta) / (delta + skew));\n};\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\nconst decode = function (input) {\n // Don't use UCS-2.\n const output = [];\n const inputLength = input.length;\n let i = 0;\n let n = initialN;\n let bias = initialBias;\n\n // Handle the basic code points: let `basic` be the number of input code\n // points before the last delimiter, or `0` if there is none, then copy\n // the first basic code points to the output.\n\n let basic = input.lastIndexOf(delimiter);\n if (basic < 0) {\n basic = 0;\n }\n\n for (let j = 0; j < basic; ++j) {\n // if it's not a basic code point\n if (input.charCodeAt(j) >= 0x80) {\n error('not-basic');\n }\n output.push(input.charCodeAt(j));\n }\n\n // Main decoding loop: start just after the last delimiter if any basic code\n // points were copied; start at the beginning otherwise.\n\n for (let index = basic > 0 ? basic + 1 : 0; index < inputLength /* no final expression */; ) {\n // `index` is the index of the next character to be consumed.\n // Decode a generalized variable-length integer into `delta`,\n // which gets added to `i`. The overflow checking is easier\n // if we increase `i` as we go, then subtract off its starting\n // value at the end to obtain `delta`.\n const oldi = i;\n for (let w = 1, k = base /* no condition */; ; k += base) {\n if (index >= inputLength) {\n error('invalid-input');\n }\n\n const digit = basicToDigit(input.charCodeAt(index++));\n\n if (digit >= base) {\n error('invalid-input');\n }\n if (digit > floor((maxInt - i) / w)) {\n error('overflow');\n }\n\n i += digit * w;\n const t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n\n if (digit < t) {\n break;\n }\n\n const baseMinusT = base - t;\n if (w > floor(maxInt / baseMinusT)) {\n error('overflow');\n }\n\n w *= baseMinusT;\n }\n\n const out = output.length + 1;\n bias = adapt(i - oldi, out, oldi == 0);\n\n // `i` was supposed to wrap around from `out` to `0`,\n // incrementing `n` each time, so we'll fix that now:\n if (floor(i / out) > maxInt - n) {\n error('overflow');\n }\n\n n += floor(i / out);\n i %= out;\n\n // Insert `n` at position `i` of the output.\n output.splice(i++, 0, n);\n }\n\n return String.fromCodePoint(...output);\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = function (input) {\n const output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n const inputLength = input.length;\n\n // Initialize the state.\n let n = initialN;\n let delta = 0;\n let bias = initialBias;\n\n // Handle the basic code points.\n for (const currentValue of input) {\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n\n const basicLength = output.length;\n let handledCPCount = basicLength;\n\n // `handledCPCount` is the number of code points that have been handled;\n // `basicLength` is the number of basic code points.\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next\n // larger one:\n let m = maxInt;\n for (const currentValue of input) {\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n // but guard against overflow.\n const handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n error('overflow');\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (const currentValue of input) {\n if (currentValue < n && ++delta > maxInt) {\n error('overflow');\n }\n if (currentValue === n) {\n // Represent delta as a generalized variable-length integer.\n let q = delta;\n for (let k = base /* no condition */; ; k += base) {\n const t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n if (q < t) {\n break;\n }\n const qMinusT = q - t;\n const baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + (qMinusT % baseMinusT), 0)));\n q = floor(qMinusT / baseMinusT);\n }\n\n output.push(stringFromCharCode(digitToBasic(q, 0)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount === basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n\n ++delta;\n ++n;\n }\n return output.join('');\n};\n\n/**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\nconst toUnicode = function (input) {\n return mapDomain(input, function (string) {\n return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string;\n });\n};\n\n/**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\nconst toASCII = function (input) {\n return mapDomain(input, function (string) {\n return regexNonASCII.test(string) ? 'xn--' + encode(string) : string;\n });\n};\n\n/*--------------------------------------------------------------------------*/\n\n/** Define the public API */\nconst punycode = {\n /**\n * A string representing the current Punycode.js version number.\n * @memberOf punycode\n * @type String\n */\n version: '2.3.1',\n /**\n * An object of methods to convert from JavaScript's internal character\n * representation (UCS-2) to Unicode code points, and back.\n * @see <https://mathiasbynens.be/notes/javascript-encoding>\n * @memberOf punycode\n * @type Object\n */\n ucs2: {\n decode: ucs2decode,\n encode: ucs2encode\n },\n decode: decode,\n encode: encode,\n toASCII: toASCII,\n toUnicode: toUnicode\n};\n\nmodule.exports = punycode;\n","'use strict';\n\nconst { Transform } = require('stream');\n\n/**\n * Encodes a Buffer into a base64 encoded string\n *\n * @param {Buffer} buffer Buffer to convert\n * @returns {String} base64 encoded string\n */\nfunction encode(buffer) {\n if (typeof buffer === 'string') {\n buffer = Buffer.from(buffer, 'utf-8');\n }\n\n return buffer.toString('base64');\n}\n\n/**\n * Adds soft line breaks to a base64 string\n *\n * @param {String} str base64 encoded string that might need line wrapping\n * @param {Number} [lineLength=76] Maximum allowed length for a line\n * @returns {String} Soft-wrapped base64 encoded string\n */\nfunction wrap(str, lineLength) {\n str = (str || '').toString();\n lineLength = lineLength || 76;\n\n if (str.length <= lineLength) {\n return str;\n }\n\n const result = [];\n let pos = 0;\n const chunkLength = lineLength * 1024;\n const wrapRegex = new RegExp('.{' + lineLength + '}', 'g');\n while (pos < str.length) {\n const wrappedLines = str.substr(pos, chunkLength).replace(wrapRegex, '$&\\r\\n').trim();\n result.push(wrappedLines);\n pos += chunkLength;\n }\n\n return result.join('\\r\\n').trim();\n}\n\n/**\n * Creates a transform stream for encoding data to base64 encoding\n *\n * @constructor\n * @param {Object} options Stream options\n * @param {Number} [options.lineLength=76] Maximum length for lines, set to false to disable wrapping\n */\nclass Encoder extends Transform {\n constructor(options) {\n super();\n this.options = options || {};\n\n if (this.options.lineLength !== false) {\n this.options.lineLength = this.options.lineLength || 76;\n }\n\n this._curLine = '';\n this._remainingBytes = false;\n\n this.inputBytes = 0;\n this.outputBytes = 0;\n }\n\n _transform(chunk, encoding, done) {\n if (encoding !== 'buffer') {\n chunk = Buffer.from(chunk, encoding);\n }\n\n if (!chunk || !chunk.length) {\n return setImmediate(done);\n }\n\n this.inputBytes += chunk.length;\n\n if (this._remainingBytes && this._remainingBytes.length) {\n chunk = Buffer.concat([this._remainingBytes, chunk], this._remainingBytes.length + chunk.length);\n this._remainingBytes = false;\n }\n\n if (chunk.length % 3) {\n this._remainingBytes = chunk.slice(chunk.length - (chunk.length % 3));\n chunk = chunk.slice(0, chunk.length - (chunk.length % 3));\n } else {\n this._remainingBytes = false;\n }\n\n let b64 = this._curLine + encode(chunk);\n\n if (this.options.lineLength) {\n b64 = wrap(b64, this.options.lineLength);\n\n // remove last line as it is still most probably incomplete\n const lastLF = b64.lastIndexOf('\\n');\n if (lastLF < 0) {\n this._curLine = b64;\n b64 = '';\n } else if (lastLF === b64.length - 1) {\n this._curLine = '';\n } else {\n this._curLine = b64.substring(lastLF + 1);\n b64 = b64.substring(0, lastLF + 1);\n }\n }\n\n if (b64) {\n this.outputBytes += b64.length;\n this.push(Buffer.from(b64, 'ascii'));\n }\n\n setImmediate(done);\n }\n\n _flush(done) {\n if (this._remainingBytes && this._remainingBytes.length) {\n this._curLine += encode(this._remainingBytes);\n }\n\n if (this._curLine) {\n this._curLine = wrap(this._curLine, this.options.lineLength);\n this.outputBytes += this._curLine.length;\n this.push(Buffer.from(this._curLine, 'ascii'));\n this._curLine = '';\n }\n done();\n }\n}\n\nmodule.exports = {\n encode,\n wrap,\n Encoder\n};\n","'use strict';\n\nconst { Transform } = require('stream');\n\n/**\n * Encodes a Buffer into a Quoted-Printable encoded string\n *\n * @param {Buffer} buffer Buffer to convert\n * @returns {String} Quoted-Printable encoded string\n */\n// usable characters that do not need encoding\n// https://tools.ietf.org/html/rfc2045#section-6.7\nconst QP_RANGES = [\n [0x09], // <TAB>\n [0x0a], // <LF>\n [0x0d], // <CR>\n [0x20, 0x3c], // <SP>!\"#$%&'()*+,-./0123456789:;\n [0x3e, 0x7e] // >?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}\n];\n\nfunction encode(buffer) {\n if (typeof buffer === 'string') {\n buffer = Buffer.from(buffer, 'utf-8');\n }\n\n let result = '';\n let ord;\n\n for (let i = 0, len = buffer.length; i < len; i++) {\n ord = buffer[i];\n // if the char is in allowed range, then keep as is, unless it is a WS in the end of a line\n if (\n checkRanges(ord, QP_RANGES) &&\n !((ord === 0x20 || ord === 0x09) && (i === len - 1 || buffer[i + 1] === 0x0a || buffer[i + 1] === 0x0d))\n ) {\n result += String.fromCharCode(ord);\n continue;\n }\n result += '=' + (ord < 0x10 ? '0' : '') + ord.toString(16).toUpperCase();\n }\n\n return result;\n}\n\n/**\n * Adds soft line breaks to a Quoted-Printable string\n *\n * @param {String} str Quoted-Printable encoded string that might need line wrapping\n * @param {Number} [lineLength=76] Maximum allowed length for a line\n * @returns {String} Soft-wrapped Quoted-Printable encoded string\n */\nfunction wrap(str, lineLength) {\n str = (str || '').toString();\n lineLength = lineLength || 76;\n\n if (str.length <= lineLength) {\n return str;\n }\n\n let pos = 0;\n const len = str.length;\n let match, code, line;\n const lineMargin = Math.floor(lineLength / 3);\n let result = '';\n\n // insert soft linebreaks where needed\n while (pos < len) {\n line = str.substr(pos, lineLength);\n if ((match = line.match(/\\r\\n/))) {\n line = line.substr(0, match.index + match[0].length);\n result += line;\n pos += line.length;\n continue;\n }\n\n if (line.substr(-1) === '\\n') {\n result += line;\n pos += line.length;\n continue;\n }\n\n if ((match = line.substr(-lineMargin).match(/\\n.*?$/))) {\n // truncate to nearest line break\n line = line.substr(0, line.length - (match[0].length - 1));\n result += line;\n pos += line.length;\n continue;\n }\n\n if (line.length > lineLength - lineMargin && (match = line.substr(-lineMargin).match(/[ \\t.,!?][^ \\t.,!?]*$/))) {\n // truncate to nearest space\n line = line.substr(0, line.length - (match[0].length - 1));\n } else if (line.match(/[=][\\da-f]{0,2}$/i)) {\n // push incomplete encoding sequences to the next line\n if ((match = line.match(/[=][\\da-f]{0,1}$/i))) {\n line = line.substr(0, line.length - match[0].length);\n }\n\n // ensure that utf-8 sequences are not split\n while (\n line.length > 3 &&\n line.length < len - pos &&\n !line.match(/^(?:=[\\da-f]{2}){1,4}$/i) &&\n (match = line.match(/[=][\\da-f]{2}$/gi))\n ) {\n code = parseInt(match[0].substr(1, 2), 16);\n if (code < 128) {\n break;\n }\n\n line = line.substr(0, line.length - 3);\n\n if (code >= 0xc0) {\n break;\n }\n }\n }\n\n if (pos + line.length < len && line.substr(-1) !== '\\n') {\n if (line.length === lineLength && line.match(/[=][\\da-f]{2}$/i)) {\n line = line.substr(0, line.length - 3);\n } else if (line.length === lineLength) {\n line = line.substr(0, line.length - 1);\n }\n pos += line.length;\n line += '=\\r\\n';\n } else {\n pos += line.length;\n }\n\n result += line;\n }\n\n return result;\n}\n\n/**\n * Helper function to check if a number is inside provided ranges\n *\n * @param {Number} nr Number to check for\n * @param {Array} ranges An Array of allowed values\n * @returns {Boolean} True if the value was found inside allowed ranges, false otherwise\n */\nfunction checkRanges(nr, ranges) {\n for (let i = ranges.length - 1; i >= 0; i--) {\n const range = ranges[i];\n if (!range.length) {\n continue;\n }\n if (range.length === 1 && nr === range[0]) {\n return true;\n }\n if (range.length === 2 && nr >= range[0] && nr <= range[1]) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Creates a transform stream for encoding data to Quoted-Printable encoding\n *\n * @constructor\n * @param {Object} options Stream options\n * @param {Number} [options.lineLength=76] Maximum length for lines, set to false to disable wrapping\n */\nclass Encoder extends Transform {\n constructor(options) {\n super();\n\n this.options = options || {};\n\n if (this.options.lineLength !== false) {\n this.options.lineLength = this.options.lineLength || 76;\n }\n\n this._curLine = '';\n\n this.inputBytes = 0;\n this.outputBytes = 0;\n }\n\n _transform(chunk, encoding, done) {\n let qp;\n\n if (encoding !== 'buffer') {\n chunk = Buffer.from(chunk, encoding);\n }\n\n if (!chunk || !chunk.length) {\n return done();\n }\n\n this.inputBytes += chunk.length;\n\n if (this.options.lineLength) {\n qp = this._curLine + encode(chunk);\n qp = wrap(qp, this.options.lineLength);\n qp = qp.replace(/(^|\\n)([^\\n]*)$/, (match, lineBreak, lastLine) => {\n this._curLine = lastLine;\n return lineBreak;\n });\n\n if (qp) {\n this.outputBytes += qp.length;\n this.push(qp);\n }\n } else {\n qp = encode(chunk);\n this.outputBytes += qp.length;\n this.push(qp, 'ascii');\n }\n\n done();\n }\n\n _flush(done) {\n if (this._curLine) {\n this.outputBytes += this._curLine.length;\n this.push(this._curLine, 'ascii');\n }\n done();\n }\n}\n\nmodule.exports = {\n encode,\n wrap,\n Encoder\n};\n","/* eslint no-control-regex:0 */\n\n'use strict';\n\nconst base64 = require('../base64');\nconst qp = require('../qp');\nconst mimeTypes = require('./mime-types');\n\nmodule.exports = {\n /**\n * Checks if a value is plaintext string (uses only printable 7bit chars)\n *\n * @param {String} value String to be tested\n * @returns {Boolean} true if it is a plaintext string\n */\n isPlainText(value, isParam) {\n const re = isParam ? /[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\"\\u0080-\\uFFFF]/ : /[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\u0080-\\uFFFF]/;\n return typeof value === 'string' && !re.test(value);\n },\n\n /**\n * Checks if a multi line string containes lines longer than the selected value.\n *\n * Useful when detecting if a mail message needs any processing at all –\n * if only plaintext characters are used and lines are short, then there is\n * no need to encode the values in any way. If the value is plaintext but has\n * longer lines then allowed, then use format=flowed\n *\n * @param {Number} lineLength Max line length to check for\n * @returns {Boolean} Returns true if there is at least one line longer than lineLength chars\n */\n hasLongerLines(str, lineLength) {\n if (str.length > 128 * 1024) {\n // do not test strings longer than 128kB\n return true;\n }\n return new RegExp('^.{' + (lineLength + 1) + ',}', 'm').test(str);\n },\n\n /**\n * Encodes a string or an Buffer to an UTF-8 MIME Word (rfc2047)\n *\n * @param {String|Buffer} data String to be encoded\n * @param {String} mimeWordEncoding='Q' Encoding for the mime word, either Q or B\n * @param {Number} [maxLength=0] If set, split mime words into several chunks if needed\n * @return {String} Single or several mime words joined together\n */\n encodeWord(data, mimeWordEncoding, maxLength) {\n mimeWordEncoding = (mimeWordEncoding || 'Q').toString().toUpperCase().trim().charAt(0);\n maxLength = maxLength || 0;\n\n let encodedStr;\n const toCharset = 'UTF-8';\n\n if (maxLength && maxLength > 7 + toCharset.length) {\n maxLength -= 7 + toCharset.length;\n }\n\n if (mimeWordEncoding === 'Q') {\n // https://tools.ietf.org/html/rfc2047#section-5 rule (3)\n encodedStr = qp.encode(data).replace(/[^a-z0-9!*+\\-/=]/gi, chr => {\n const ord = chr.charCodeAt(0).toString(16).toUpperCase();\n if (chr === ' ') {\n return '_';\n }\n return '=' + (ord.length === 1 ? '0' + ord : ord);\n });\n } else if (mimeWordEncoding === 'B') {\n encodedStr = typeof data === 'string' ? data : base64.encode(data);\n maxLength = maxLength ? Math.max(3, ((maxLength - (maxLength % 4)) / 4) * 3) : 0;\n }\n\n if (maxLength && (mimeWordEncoding !== 'B' ? encodedStr : base64.encode(data)).length > maxLength) {\n if (mimeWordEncoding === 'Q') {\n encodedStr = this.splitMimeEncodedString(encodedStr, maxLength).join('?= =?' + toCharset + '?' + mimeWordEncoding + '?');\n } else {\n // RFC2047 6.3 (2) states that encoded-word must include an integral number of characters, so no chopping unicode sequences\n const parts = [];\n let lpart = '';\n for (let i = 0, len = encodedStr.length; i < len; i++) {\n let chr = encodedStr.charAt(i);\n\n if (/[\\ud83c\\ud83d\\ud83e]/.test(chr) && i < len - 1) {\n // composite emoji byte, so add the next byte as well\n chr += encodedStr.charAt(++i);\n }\n\n // check if we can add this character to the existing string\n // without breaking byte length limit\n if (Buffer.byteLength(lpart + chr) <= maxLength || i === 0) {\n lpart += chr;\n } else {\n // we hit the length limit, so push the existing string and start over\n parts.push(base64.encode(lpart));\n lpart = chr;\n }\n }\n if (lpart) {\n parts.push(base64.encode(lpart));\n }\n\n if (parts.length > 1) {\n encodedStr = parts.join('?= =?' + toCharset + '?' + mimeWordEncoding + '?');\n } else {\n encodedStr = parts.join('');\n }\n }\n } else if (mimeWordEncoding === 'B') {\n encodedStr = base64.encode(data);\n }\n\n return '=?' + toCharset + '?' + mimeWordEncoding + '?' + encodedStr + (encodedStr.substr(-2) === '?=' ? '' : '?=');\n },\n\n /**\n * Finds word sequences with non ascii text and converts these to mime words\n *\n * @param {String} value String to be encoded\n * @param {String} mimeWordEncoding='Q' Encoding for the mime word, either Q or B\n * @param {Number} [maxLength=0] If set, split mime words into several chunks if needed\n * @param {Boolean} [encodeAll=false] If true and the value needs encoding then encodes entire string, not just the smallest match\n * @return {String} String with possible mime words\n */\n encodeWords(value, mimeWordEncoding, maxLength, encodeAll) {\n maxLength = maxLength || 0;\n\n // find first word with a non-printable ascii or special symbol in it\n const firstMatch = value.match(/(?:^|\\s)([^\\s]*[\"\\u0080-\\uFFFF])/);\n if (!firstMatch) {\n return value;\n }\n\n if (encodeAll) {\n // if it is requested to encode everything or the string contains something that resebles encoded word, then encode everything\n return this.encodeWord(value, mimeWordEncoding, maxLength);\n }\n\n // find the last word with a non-printable ascii in it\n const lastMatch = value.match(/([\"\\u0080-\\uFFFF][^\\s]*)[^\"\\u0080-\\uFFFF]*$/);\n if (!lastMatch) {\n // should not happen\n return value;\n }\n\n const startIndex =\n firstMatch.index +\n (\n firstMatch[0].match(/[^\\s]/) || {\n index: 0\n }\n ).index;\n const endIndex = lastMatch.index + (lastMatch[1] || '').length;\n\n return (\n (startIndex ? value.substr(0, startIndex) : '') +\n this.encodeWord(value.substring(startIndex, endIndex), mimeWordEncoding || 'Q', maxLength) +\n (endIndex < value.length ? value.substr(endIndex) : '')\n );\n },\n\n /**\n * Joins parsed header value together as 'value; param1=value1; param2=value2'\n * PS: We are following RFC 822 for the list of special characters that we need to keep in quotes.\n * Refer: https://www.w3.org/Protocols/rfc1341/4_Content-Type.html\n * @param {Object} structured Parsed header value\n * @return {String} joined header value\n */\n buildHeaderValue(structured) {\n const paramsArray = [];\n\n Object.keys(structured.params || {}).forEach(param => {\n // filename might include unicode characters so it is a special case\n // other values probably do not\n const value = structured.params[param];\n if (!this.isPlainText(value, true) || value.length >= 75) {\n this.buildHeaderParam(param, value, 50).forEach(encodedParam => {\n if (!/[\\s\"\\\\;:/=(),<>@[\\]?]|^[-']|'$/.test(encodedParam.value) || encodedParam.key.substr(-1) === '*') {\n paramsArray.push(encodedParam.key + '=' + encodedParam.value);\n } else {\n paramsArray.push(encodedParam.key + '=' + JSON.stringify(encodedParam.value));\n }\n });\n } else if (/[\\s'\"\\\\;:/=(),<>@[\\]?]|^-/.test(value)) {\n paramsArray.push(param + '=' + JSON.stringify(value));\n } else {\n paramsArray.push(param + '=' + value);\n }\n });\n\n return structured.value + (paramsArray.length ? '; ' + paramsArray.join('; ') : '');\n },\n\n /**\n * Encodes a string or an Buffer to an UTF-8 Parameter Value Continuation encoding (rfc2231)\n * Useful for splitting long parameter values.\n *\n * For example\n * title=\"unicode string\"\n * becomes\n * title*0*=utf-8''unicode\n * title*1*=%20string\n *\n * @param {String|Buffer} data String to be encoded\n * @param {Number} [maxLength=50] Max length for generated chunks\n * @param {String} [fromCharset='UTF-8'] Source sharacter set\n * @return {Array} A list of encoded keys and headers\n */\n buildHeaderParam(key, data, maxLength) {\n const list = [];\n let encodedStr = typeof data === 'string' ? data : (data || '').toString();\n let chr, ord;\n let line;\n let startPos = 0;\n let i, len;\n\n maxLength = maxLength || 50;\n\n // process ascii only text\n if (this.isPlainText(data, true)) {\n // check if conversion is even needed\n if (encodedStr.length <= maxLength) {\n return [\n {\n key,\n value: encodedStr\n }\n ];\n }\n\n encodedStr = encodedStr.replace(new RegExp('.{' + maxLength + '}', 'g'), str => {\n list.push({\n line: str\n });\n return '';\n });\n\n if (encodedStr) {\n list.push({\n line: encodedStr\n });\n }\n } else {\n if (/[\\uD800-\\uDBFF]/.test(encodedStr)) {\n // string containts surrogate pairs, so normalize it to an array of bytes\n const encodedStrArr = [];\n for (i = 0, len = encodedStr.length; i < len; i++) {\n chr = encodedStr.charAt(i);\n ord = chr.charCodeAt(0);\n if (ord >= 0xd800 && ord <= 0xdbff && i < len - 1) {\n chr += encodedStr.charAt(i + 1);\n encodedStrArr.push(chr);\n i++;\n } else {\n encodedStrArr.push(chr);\n }\n }\n encodedStr = encodedStrArr;\n }\n\n // first line includes the charset and language info and needs to be encoded\n // even if it does not contain any unicode characters\n line = \"utf-8''\";\n let encoded = true;\n startPos = 0;\n\n // process text with unicode or special chars\n for (i = 0, len = encodedStr.length; i < len; i++) {\n chr = encodedStr[i];\n\n if (encoded) {\n chr = this.safeEncodeURIComponent(chr);\n } else {\n // try to urlencode current char\n chr = chr === ' ' ? chr : this.safeEncodeURIComponent(chr);\n // By default it is not required to encode a line, the need\n // only appears when the string contains unicode or special chars\n // in this case we start processing the line over and encode all chars\n if (chr !== encodedStr[i]) {\n // Check if it is even possible to add the encoded char to the line\n // If not, there is no reason to use this line, just push it to the list\n // and start a new line with the char that needs encoding\n if ((this.safeEncodeURIComponent(line) + chr).length >= maxLength) {\n list.push({\n line,\n encoded\n });\n line = '';\n startPos = i - 1;\n } else {\n encoded = true;\n i = startPos;\n line = '';\n continue;\n }\n }\n }\n\n // if the line is already too long, push it to the list and start a new one\n if ((line + chr).length >= maxLength) {\n list.push({\n line,\n encoded\n });\n line = chr = encodedStr[i] === ' ' ? ' ' : this.safeEncodeURIComponent(encodedStr[i]);\n if (chr === encodedStr[i]) {\n encoded = false;\n startPos = i - 1;\n } else {\n encoded = true;\n }\n } else {\n line += chr;\n }\n }\n\n if (line) {\n list.push({\n line,\n encoded\n });\n }\n }\n\n return list.map((item, i) => ({\n // encoded lines: {name}*{part}*\n // unencoded lines: {name}*{part}\n // if any line needs to be encoded then the first line (part==0) is always encoded\n key: key + '*' + i + (item.encoded ? '*' : ''),\n value: item.line\n }));\n },\n\n /**\n * Parses a header value with key=value arguments into a structured\n * object.\n *\n * parseHeaderValue('content-type: text/plain; CHARSET='UTF-8'') ->\n * {\n * 'value': 'text/plain',\n * 'params': {\n * 'charset': 'UTF-8'\n * }\n * }\n *\n * @param {String} str Header value\n * @return {Object} Header value as a parsed structure\n */\n parseHeaderValue(str) {\n const response = {\n value: false,\n params: {}\n };\n let key = false;\n let value = '';\n let type = 'value';\n let quote = false;\n let escaped = false;\n let chr;\n\n for (let i = 0, len = str.length; i < len; i++) {\n chr = str.charAt(i);\n if (type === 'key') {\n if (chr === '=') {\n key = value.trim().toLowerCase();\n type = 'value';\n value = '';\n continue;\n }\n value += chr;\n } else {\n if (escaped) {\n value += chr;\n } else if (chr === '\\\\') {\n escaped = true;\n continue;\n } else if (quote && chr === quote) {\n quote = false;\n } else if (!quote && chr === '\"') {\n quote = chr;\n } else if (!quote && chr === ';') {\n if (key === false) {\n response.value = value.trim();\n } else {\n response.params[key] = value.trim();\n }\n type = 'key';\n value = '';\n } else {\n value += chr;\n }\n escaped = false;\n }\n }\n\n if (type === 'value') {\n if (key === false) {\n response.value = value.trim();\n } else {\n response.params[key] = value.trim();\n }\n } else if (value.trim()) {\n response.params[value.trim().toLowerCase()] = '';\n }\n\n // handle parameter value continuations\n // https://tools.ietf.org/html/rfc2231#section-3\n\n // preprocess values\n Object.keys(response.params).forEach(key => {\n let actualKey, nr, match, value;\n if ((match = key.match(/(\\*(\\d+)|\\*(\\d+)\\*|\\*)$/))) {\n actualKey = key.substr(0, match.index);\n nr = Number(match[2] || match[3]) || 0;\n\n if (!response.params[actualKey] || typeof response.params[actualKey] !== 'object') {\n response.params[actualKey] = {\n charset: false,\n values: []\n };\n }\n\n value = response.params[key];\n\n if (nr === 0 && match[0].substr(-1) === '*' && (match = value.match(/^([^']*)'[^']*'(.*)$/))) {\n response.params[actualKey].charset = match[1] || 'iso-8859-1';\n value = match[2];\n }\n\n response.params[actualKey].values[nr] = value;\n\n // remove the old reference\n delete response.params[key];\n }\n });\n\n // concatenate split rfc2231 strings and convert encoded strings to mime encoded words\n Object.keys(response.params).forEach(key => {\n let value;\n if (response.params[key] && Array.isArray(response.params[key].values)) {\n value = response.params[key].values.map(val => val || '').join('');\n\n if (response.params[key].charset) {\n // convert \"%AB\" to \"=?charset?Q?=AB?=\"\n response.params[key] =\n '=?' +\n response.params[key].charset +\n '?Q?' +\n value\n // fix invalidly encoded chars\n .replace(/[=?_\\s]/g, s => {\n const c = s.charCodeAt(0).toString(16);\n if (s === ' ') {\n return '_';\n }\n return '%' + (c.length < 2 ? '0' : '') + c;\n })\n // change from urlencoding to percent encoding\n .replace(/%/g, '=') +\n '?=';\n } else {\n response.params[key] = value;\n }\n }\n });\n\n return response;\n },\n\n /**\n * Returns file extension for a content type string. If no suitable extensions\n * are found, 'bin' is used as the default extension\n *\n * @param {String} mimeType Content type to be checked for\n * @return {String} File extension\n */\n detectExtension: mimeType => mimeTypes.detectExtension(mimeType),\n\n /**\n * Returns content type for a file extension. If no suitable content types\n * are found, 'application/octet-stream' is used as the default content type\n *\n * @param {String} extension Extension to be checked for\n * @return {String} File extension\n */\n detectMimeType: extension => mimeTypes.detectMimeType(extension),\n\n /**\n * Folds long lines, useful for folding header lines (afterSpace=false) and\n * flowed text (afterSpace=true)\n *\n * @param {String} str String to be folded\n * @param {Number} [lineLength=76] Maximum length of a line\n * @param {Boolean} afterSpace If true, leave a space in th end of a line\n * @return {String} String with folded lines\n */\n foldLines(str, lineLength, afterSpace) {\n str = (str || '').toString();\n lineLength = lineLength || 76;\n\n let pos = 0;\n const len = str.length;\n let result = '';\n let line, match;\n\n while (pos < len) {\n line = str.substr(pos, lineLength);\n if (line.length < lineLength) {\n result += line;\n break;\n }\n if ((match = line.match(/^[^\\n\\r]*(\\r?\\n|\\r)/))) {\n line = match[0];\n result += line;\n pos += line.length;\n continue;\n } else if ((match = line.match(/(\\s+)[^\\s]*$/)) && match[0].length - (afterSpace ? (match[1] || '').length : 0) < line.length) {\n line = line.substr(0, line.length - (match[0].length - (afterSpace ? (match[1] || '').length : 0)));\n } else if ((match = str.substr(pos + line.length).match(/^[^\\s]+(\\s*)/))) {\n line = line + match[0].substr(0, match[0].length - (!afterSpace ? (match[1] || '').length : 0));\n }\n\n result += line;\n pos += line.length;\n if (pos < len) {\n result += '\\r\\n';\n }\n }\n\n return result;\n },\n\n /**\n * Splits a mime encoded string. Needed for dividing mime words into smaller chunks\n *\n * @param {String} str Mime encoded string to be split up\n * @param {Number} maxlen Maximum length of characters for one part (minimum 12)\n * @return {Array} Split string\n */\n splitMimeEncodedString: (str, maxlen) => {\n const lines = [];\n let curLine, match, chr, done;\n\n // require at least 12 symbols to fit possible 4 octet UTF-8 sequences\n maxlen = Math.max(maxlen || 0, 12);\n\n while (str.length) {\n curLine = str.substr(0, maxlen);\n\n // move incomplete escaped char back to main\n if ((match = curLine.match(/[=][0-9A-F]?$/i))) {\n curLine = curLine.substr(0, match.index);\n }\n\n done = false;\n while (!done) {\n done = true;\n // check if not middle of a unicode char sequence\n if ((match = str.substr(curLine.length).match(/^[=]([0-9A-F]{2})/i))) {\n chr = parseInt(match[1], 16);\n // invalid sequence, move one char back anc recheck\n if (chr < 0xc2 && chr > 0x7f) {\n curLine = curLine.substr(0, curLine.length - 3);\n done = false;\n }\n }\n }\n\n if (curLine.length) {\n lines.push(curLine);\n }\n str = str.substr(curLine.length);\n }\n\n return lines;\n },\n\n encodeURICharComponent: chr => {\n let res = '';\n let ord = chr.charCodeAt(0).toString(16).toUpperCase();\n\n if (ord.length % 2) {\n ord = '0' + ord;\n }\n\n if (ord.length > 2) {\n for (let i = 0, len = ord.length / 2; i < len; i++) {\n res += '%' + ord.substr(i, 2);\n }\n } else {\n res += '%' + ord;\n }\n\n return res;\n },\n\n safeEncodeURIComponent(str) {\n str = (str || '').toString();\n\n try {\n // might throw if we try to encode invalid sequences, eg. partial emoji\n str = encodeURIComponent(str);\n } catch (_E) {\n // should never run\n return str.replace(/[^\\x00-\\x1F *'()<>@,;:\\\\\"[\\]?=\\u007F-\\uFFFF]+/g, '');\n }\n\n // ensure chars that are not handled by encodeURICompent are converted as well\n return str.replace(/[\\x00-\\x1F *'()<>@,;:\\\\\"[\\]?=\\u007F-\\uFFFF]/g, chr => this.encodeURICharComponent(chr));\n }\n};\n","'use strict';\n\n/**\n * Converts tokens for a single address into an address object\n *\n * @param {Array} tokens Tokens object\n * @param {Number} depth Current recursion depth for nested group protection\n * @return {Object} Address object\n */\nfunction _handleAddress(tokens, depth) {\n let isGroup = false;\n let state = 'text';\n const addresses = [];\n const data = {\n address: [],\n comment: [],\n group: [],\n text: [],\n textWasQuoted: []\n };\n let insideQuotes = false;\n\n // Filter out <addresses>, (comments) and regular text\n for (let i = 0, len = tokens.length; i < len; i++) {\n const token = tokens[i];\n const prevToken = i ? tokens[i - 1] : null;\n if (token.type === 'operator') {\n switch (token.value) {\n case '<':\n state = 'address';\n insideQuotes = false;\n break;\n case '(':\n state = 'comment';\n insideQuotes = false;\n break;\n case ':':\n state = 'group';\n isGroup = true;\n insideQuotes = false;\n break;\n case '\"':\n insideQuotes = !insideQuotes;\n state = 'text';\n break;\n default:\n state = 'text';\n insideQuotes = false;\n break;\n }\n } else if (token.value) {\n if (state === 'address') {\n // Handle unquoted name that includes a \"<\".\n // Apple Mail truncates everything between an unexpected < and an address.\n token.value = token.value.replace(/^[^<]*<\\s*/, '');\n }\n\n if (prevToken && prevToken.noBreak && data[state].length) {\n data[state][data[state].length - 1] += token.value;\n if (state === 'text' && insideQuotes) {\n data.textWasQuoted[data.textWasQuoted.length - 1] = true;\n }\n } else {\n data[state].push(token.value);\n if (state === 'text') {\n data.textWasQuoted.push(insideQuotes);\n }\n }\n }\n }\n\n // If there is no text but a comment, replace the two\n if (!data.text.length && data.comment.length) {\n data.text = data.comment;\n data.comment = [];\n }\n\n if (isGroup) {\n // http://tools.ietf.org/html/rfc2822#appendix-A.1.3\n data.text = data.text.join(' ');\n\n // Parse group members, but flatten any nested groups (RFC 5322 doesn't allow nesting)\n let groupMembers = [];\n if (data.group.length) {\n const parsedGroup = addressparser(data.group.join(','), { _depth: depth + 1 });\n parsedGroup.forEach(member => {\n if (member.group) {\n groupMembers = groupMembers.concat(member.group);\n } else {\n groupMembers.push(member);\n }\n });\n }\n\n addresses.push({\n name: data.text || '',\n group: groupMembers\n });\n } else {\n // If no address was found, try to detect one from regular text\n if (!data.address.length && data.text.length) {\n for (let i = data.text.length - 1; i >= 0; i--) {\n // Security: Do not extract email addresses from quoted strings.\n // RFC 5321 allows @ inside quoted local-parts like \"user@domain\"@example.com.\n // Extracting emails from quoted text leads to misrouting vulnerabilities.\n if (!data.textWasQuoted[i] && /^[^@\\s]+@[^@\\s]+$/.test(data.text[i])) {\n data.address = data.text.splice(i, 1);\n data.textWasQuoted.splice(i, 1);\n break;\n }\n }\n\n // Try a looser regex match if strict match found nothing\n if (!data.address.length) {\n let extracted = false;\n for (let i = data.text.length - 1; i >= 0; i--) {\n // Security: Do not extract email addresses from quoted strings\n if (!data.textWasQuoted[i]) {\n data.text[i] = data.text[i]\n .replace(/\\s*\\b[^@\\s]+@[^\\s]+\\b\\s*/, match => {\n if (!extracted) {\n data.address = [match.trim()];\n extracted = true;\n return ' ';\n }\n return match;\n })\n .trim();\n if (extracted) {\n break;\n }\n }\n }\n }\n }\n\n // If there's still no text but a comment exists, replace the two\n if (!data.text.length && data.comment.length) {\n data.text = data.comment;\n data.comment = [];\n }\n\n // Keep only the first address occurrence, push others to regular text\n if (data.address.length > 1) {\n data.text = data.text.concat(data.address.splice(1));\n }\n\n // Join values with spaces\n data.text = data.text.join(' ');\n data.address = data.address.join(' ');\n\n const address = {\n address: data.address || data.text || '',\n name: data.text || data.address || ''\n };\n\n if (address.address === address.name) {\n if (/@/.test(address.address || '')) {\n address.name = '';\n } else {\n address.address = '';\n }\n }\n\n addresses.push(address);\n }\n\n return addresses;\n}\n\n/**\n * Creates a Tokenizer object for tokenizing address field strings\n *\n * @constructor\n * @param {String} str Address field string\n */\nclass Tokenizer {\n constructor(str) {\n this.str = (str || '').toString();\n this.operatorCurrent = '';\n this.operatorExpecting = '';\n this.node = null;\n this.escaped = false;\n\n this.list = [];\n /**\n * Operator tokens and which tokens are expected to end the sequence\n */\n this.operators = {\n '\"': '\"',\n '(': ')',\n '<': '>',\n ',': '',\n ':': ';',\n // Semicolons are not a legal delimiter per the RFC2822 grammar other\n // than for terminating a group, but they are also not valid for any\n // other use in this context. Given that some mail clients have\n // historically allowed the semicolon as a delimiter equivalent to the\n // comma in their UI, it makes sense to treat them the same as a comma\n // when used outside of a group.\n ';': ''\n };\n }\n\n /**\n * Tokenizes the original input string\n *\n * @return {Array} An array of operator|text tokens\n */\n tokenize() {\n const list = [];\n\n for (let i = 0, len = this.str.length; i < len; i++) {\n const chr = this.str.charAt(i);\n const nextChr = i < len - 1 ? this.str.charAt(i + 1) : null;\n this.checkChar(chr, nextChr);\n }\n\n this.list.forEach(node => {\n node.value = (node.value || '').toString().trim();\n if (node.value) {\n list.push(node);\n }\n });\n\n return list;\n }\n\n /**\n * Checks if a character is an operator or text and acts accordingly\n *\n * @param {String} chr Character from the address field\n */\n checkChar(chr, nextChr) {\n if (this.escaped) {\n // ignore next condition blocks\n } else if (chr === this.operatorExpecting) {\n this.node = {\n type: 'operator',\n value: chr\n };\n\n if (nextChr && ![' ', '\\t', '\\r', '\\n', ',', ';'].includes(nextChr)) {\n this.node.noBreak = true;\n }\n\n this.list.push(this.node);\n this.node = null;\n this.operatorExpecting = '';\n this.escaped = false;\n\n return;\n } else if (!this.operatorExpecting && chr in this.operators) {\n this.node = {\n type: 'operator',\n value: chr\n };\n this.list.push(this.node);\n this.node = null;\n this.operatorExpecting = this.operators[chr];\n this.escaped = false;\n return;\n } else if (['\"', \"'\"].includes(this.operatorExpecting) && chr === '\\\\') {\n this.escaped = true;\n return;\n }\n\n if (!this.node) {\n this.node = {\n type: 'text',\n value: ''\n };\n this.list.push(this.node);\n }\n\n if (chr === '\\n') {\n // Convert newlines to spaces. Carriage return is ignored as \\r and \\n usually\n // go together anyway and there already is a WS for \\n. Lone \\r means something is fishy.\n chr = ' ';\n }\n\n if (chr.charCodeAt(0) >= 0x21 || [' ', '\\t'].includes(chr)) {\n // skip command bytes\n this.node.value += chr;\n }\n\n this.escaped = false;\n }\n}\n\n/**\n * Maximum recursion depth for parsing nested groups.\n * RFC 5322 doesn't allow nested groups, so this is a safeguard against\n * malicious input that could cause stack overflow.\n */\nconst MAX_NESTED_GROUP_DEPTH = 50;\n\n/**\n * Parses structured e-mail addresses from an address field\n *\n * Example:\n *\n * 'Name <address@domain>'\n *\n * will be converted to\n *\n * [{name: 'Name', address: 'address@domain'}]\n *\n * @param {String} str Address field\n * @param {Object} options Optional options object\n * @param {Number} options._depth Internal recursion depth counter (do not set manually)\n * @return {Array} An array of address objects\n */\nfunction addressparser(str, options) {\n options = options || {};\n const depth = options._depth || 0;\n\n // Prevent stack overflow from deeply nested groups (DoS protection)\n if (depth > MAX_NESTED_GROUP_DEPTH) {\n return [];\n }\n\n const tokenizer = new Tokenizer(str);\n const tokens = tokenizer.tokenize();\n\n const addresses = [];\n let address = [];\n let parsedAddresses = [];\n\n tokens.forEach(token => {\n if (token.type === 'operator' && (token.value === ',' || token.value === ';')) {\n if (address.length) {\n addresses.push(address);\n }\n address = [];\n } else {\n address.push(token);\n }\n });\n\n if (address.length) {\n addresses.push(address);\n }\n\n addresses.forEach(addr => {\n const handled = _handleAddress(addr, depth);\n if (handled.length) {\n parsedAddresses = parsedAddresses.concat(handled);\n }\n });\n\n // Merge fragments produced when unquoted display names contain commas.\n // \"Joe Foo, PhD <joe@example.com>\" is split on the comma into\n // [{name:\"Joe Foo\", address:\"\"}, {name:\"PhD\", address:\"joe@example.com\"}].\n // Recombine: a name-only entry followed by an entry with both name and address.\n for (let i = parsedAddresses.length - 2; i >= 0; i--) {\n const current = parsedAddresses[i];\n const next = parsedAddresses[i + 1];\n if (current.address === '' && current.name && !current.group && next.address && next.name) {\n next.name = current.name + ', ' + next.name;\n parsedAddresses.splice(i, 1);\n }\n }\n\n if (options.flatten) {\n const flatAddresses = [];\n const walkAddressList = list => {\n list.forEach(entry => {\n if (entry.group) {\n return walkAddressList(entry.group);\n }\n flatAddresses.push(entry);\n });\n };\n walkAddressList(parsedAddresses);\n return flatAddresses;\n }\n\n return parsedAddresses;\n}\n\nmodule.exports = addressparser;\n","'use strict';\n\nconst { Transform } = require('stream');\n\nclass LastNewline extends Transform {\n constructor() {\n super();\n this.lastByte = false;\n }\n\n _transform(chunk, encoding, done) {\n if (chunk.length) {\n this.lastByte = chunk[chunk.length - 1];\n }\n\n this.push(chunk);\n done();\n }\n\n _flush(done) {\n if (this.lastByte === 0x0a) {\n return done();\n }\n if (this.lastByte === 0x0d) {\n this.push(Buffer.from('\\n'));\n return done();\n }\n this.push(Buffer.from('\\r\\n'));\n return done();\n }\n}\n\nmodule.exports = LastNewline;\n","'use strict';\n\nconst { Transform } = require('stream');\n\n/**\n * Ensures that only <CR><LF> sequences are used for linebreaks\n *\n * @param {Object} options Stream options\n */\nclass LeWindows extends Transform {\n constructor(options) {\n super(options);\n this.lastByte = false;\n }\n\n /**\n * Escapes dots\n */\n _transform(chunk, encoding, done) {\n let buf;\n let lastPos = 0;\n\n for (let i = 0, len = chunk.length; i < len; i++) {\n if (chunk[i] === 0x0a) {\n // \\n\n if ((i && chunk[i - 1] !== 0x0d) || (!i && this.lastByte !== 0x0d)) {\n if (i > lastPos) {\n buf = chunk.slice(lastPos, i);\n this.push(buf);\n }\n this.push(Buffer.from('\\r\\n'));\n lastPos = i + 1;\n }\n }\n }\n\n if (lastPos && lastPos < chunk.length) {\n buf = chunk.slice(lastPos);\n this.push(buf);\n } else if (!lastPos) {\n this.push(chunk);\n }\n\n this.lastByte = chunk[chunk.length - 1];\n done();\n }\n}\n\nmodule.exports = LeWindows;\n","'use strict';\n\nconst { Transform } = require('stream');\n\n/**\n * Ensures that only <LF> is used for linebreaks\n *\n * @param {Object} options Stream options\n */\nclass LeUnix extends Transform {\n constructor(options) {\n super(options);\n }\n\n /**\n * Escapes dots\n */\n _transform(chunk, encoding, done) {\n let buf;\n let lastPos = 0;\n\n for (let i = 0, len = chunk.length; i < len; i++) {\n if (chunk[i] === 0x0d) {\n // \\r\n buf = chunk.slice(lastPos, i);\n lastPos = i + 1;\n this.push(buf);\n }\n }\n if (lastPos && lastPos < chunk.length) {\n buf = chunk.slice(lastPos);\n this.push(buf);\n } else if (!lastPos) {\n this.push(chunk);\n }\n done();\n }\n}\n\nmodule.exports = LeUnix;\n","/* eslint no-undefined: 0, prefer-spread: 0, no-control-regex: 0 */\n\n'use strict';\n\nconst crypto = require('crypto');\nconst fs = require('fs');\nconst punycode = require('../punycode');\nconst { PassThrough } = require('stream');\nconst shared = require('../shared');\n\nconst mimeFuncs = require('../mime-funcs');\nconst qp = require('../qp');\nconst base64 = require('../base64');\nconst addressparser = require('../addressparser');\nconst nmfetch = require('../fetch');\nconst errors = require('../errors');\nconst LastNewline = require('./last-newline');\n\nconst LeWindows = require('./le-windows');\nconst LeUnix = require('./le-unix');\n\nconst FORMATTED_HEADERS = ['From', 'Sender', 'To', 'Cc', 'Bcc', 'Reply-To', 'Date', 'References'];\n\n/**\n * Creates a new mime tree node. Assumes 'multipart/*' as the content type\n * if it is a branch, anything else counts as leaf. If rootNode is missing from\n * the options, assumes this is the root.\n *\n * @param {String} contentType Define the content type for the node. Can be left blank for attachments (derived from filename)\n * @param {Object} [options] optional options\n * @param {Object} [options.rootNode] root node for this tree\n * @param {Object} [options.parentNode] immediate parent for this node\n * @param {Object} [options.filename] filename for an attachment node\n * @param {String} [options.baseBoundary] shared part of the unique multipart boundary\n * @param {Boolean} [options.keepBcc] If true, do not exclude Bcc from the generated headers\n * @param {Function} [options.normalizeHeaderKey] method to normalize header keys for custom caseing\n * @param {String} [options.textEncoding] either 'Q' (the default) or 'B'\n */\nclass MimeNode {\n constructor(contentType, options) {\n this.nodeCounter = 0;\n\n options = options || {};\n\n /**\n * shared part of the unique multipart boundary\n */\n this.baseBoundary = options.baseBoundary || crypto.randomBytes(8).toString('hex');\n this.boundaryPrefix = options.boundaryPrefix || '--_NmP';\n\n this.disableFileAccess = !!options.disableFileAccess;\n this.disableUrlAccess = !!options.disableUrlAccess;\n\n this.normalizeHeaderKey = options.normalizeHeaderKey;\n\n /**\n * If date headers is missing and current node is the root, this value is used instead\n */\n this.date = options.parentNode ? null : new Date();\n\n /**\n * Root node for current mime tree\n */\n this.rootNode = options.rootNode || this;\n\n /**\n * If true include Bcc in generated headers (if available)\n */\n this.keepBcc = !!options.keepBcc;\n\n /**\n * If filename is specified but contentType is not (probably an attachment)\n * detect the content type from filename extension\n */\n if (options.filename) {\n /**\n * Filename for this node. Useful with attachments\n */\n this.filename = options.filename;\n if (!contentType) {\n contentType = mimeFuncs.detectMimeType(this.filename.split('.').pop());\n }\n }\n\n /**\n * Indicates which encoding should be used for header strings: \"Q\" or \"B\"\n */\n this.textEncoding = (options.textEncoding || '').toString().trim().charAt(0).toUpperCase();\n\n /**\n * Immediate parent for this node (or undefined if not set)\n */\n this.parentNode = options.parentNode;\n\n /**\n * Hostname for default message-id values\n */\n this.hostname = options.hostname;\n\n /**\n * If set to 'win' then uses \\r\\n, if 'linux' then \\n. If not set (or `raw` is used) then newlines are kept as is.\n */\n this.newline = options.newline;\n\n /**\n * An array for possible child nodes\n */\n this.childNodes = [];\n\n /**\n * Used for generating unique boundaries (prepended to the shared base)\n */\n this._nodeId = ++this.rootNode.nodeCounter;\n\n /**\n * A list of header values for this node in the form of [{key:'', value:''}]\n */\n this._headers = [];\n\n /**\n * True if the content only uses ASCII printable characters\n * @type {Boolean}\n */\n this._isPlainText = false;\n\n /**\n * True if the content is plain text but has longer lines than allowed\n * @type {Boolean}\n */\n this._hasLongLines = false;\n\n /**\n * If set, use instead this value for envelopes instead of generating one\n * @type {Boolean}\n */\n this._envelope = false;\n\n /**\n * If set then use this value as the stream content instead of building it\n * @type {String|Buffer|Stream}\n */\n this._raw = false;\n\n /**\n * Additional transform streams that the message will be piped before\n * exposing by createReadStream\n * @type {Array}\n */\n this._transforms = [];\n\n /**\n * Additional process functions that the message will be piped through before\n * exposing by createReadStream. These functions are run after transforms\n * @type {Array}\n */\n this._processFuncs = [];\n\n /**\n * If content type is set (or derived from the filename) add it to headers\n */\n if (contentType) {\n this.setHeader('Content-Type', contentType);\n }\n }\n\n /////// PUBLIC METHODS\n\n /**\n * Creates and appends a child node.Arguments provided are passed to MimeNode constructor\n *\n * @param {String} [contentType] Optional content type\n * @param {Object} [options] Optional options object\n * @return {Object} Created node object\n */\n createChild(contentType, options) {\n if (!options && typeof contentType === 'object') {\n options = contentType;\n contentType = undefined;\n }\n const node = new MimeNode(contentType, options);\n this.appendChild(node);\n return node;\n }\n\n /**\n * Appends an existing node to the mime tree. Removes the node from an existing\n * tree if needed\n *\n * @param {Object} childNode node to be appended\n * @return {Object} Appended node object\n */\n appendChild(childNode) {\n if (childNode.rootNode !== this.rootNode) {\n childNode.rootNode = this.rootNode;\n childNode._nodeId = ++this.rootNode.nodeCounter;\n }\n\n childNode.parentNode = this;\n\n this.childNodes.push(childNode);\n return childNode;\n }\n\n /**\n * Replaces current node with another node\n *\n * @param {Object} node Replacement node\n * @return {Object} Replacement node\n */\n replace(node) {\n if (node === this) {\n return this;\n }\n\n this.parentNode.childNodes.forEach((childNode, i) => {\n if (childNode === this) {\n node.rootNode = this.rootNode;\n node.parentNode = this.parentNode;\n node._nodeId = this._nodeId;\n\n this.rootNode = this;\n this.parentNode = undefined;\n\n node.parentNode.childNodes[i] = node;\n }\n });\n\n return node;\n }\n\n /**\n * Removes current node from the mime tree\n *\n * @return {Object} removed node\n */\n remove() {\n if (!this.parentNode) {\n return this;\n }\n\n for (let i = this.parentNode.childNodes.length - 1; i >= 0; i--) {\n if (this.parentNode.childNodes[i] === this) {\n this.parentNode.childNodes.splice(i, 1);\n this.parentNode = undefined;\n this.rootNode = this;\n return this;\n }\n }\n }\n\n /**\n * Sets a header value. If the value for selected key exists, it is overwritten.\n * You can set multiple values as well by using [{key:'', value:''}] or\n * {key: 'value'} as the first argument.\n *\n * @param {String|Array|Object} key Header key or a list of key value pairs\n * @param {String} value Header value\n * @return {Object} current node\n */\n setHeader(key, value) {\n let added = false;\n\n // Allow setting multiple headers at once\n if (!value && key && typeof key === 'object') {\n // allow {key:'content-type', value: 'text/plain'}\n if (key.key && 'value' in key) {\n this.setHeader(key.key, key.value);\n } else if (Array.isArray(key)) {\n // allow [{key:'content-type', value: 'text/plain'}]\n key.forEach(i => {\n this.setHeader(i.key, i.value);\n });\n } else {\n // allow {'content-type': 'text/plain'}\n Object.keys(key).forEach(i => {\n this.setHeader(i, key[i]);\n });\n }\n return this;\n }\n\n key = this._normalizeHeaderKey(key);\n\n const headerValue = {\n key,\n value\n };\n\n // Check if the value exists and overwrite\n for (let i = 0, len = this._headers.length; i < len; i++) {\n if (this._headers[i].key === key) {\n if (!added) {\n // replace the first match\n this._headers[i] = headerValue;\n added = true;\n } else {\n // remove following matches\n this._headers.splice(i, 1);\n i--;\n len--;\n }\n }\n }\n\n // match not found, append the value\n if (!added) {\n this._headers.push(headerValue);\n }\n\n return this;\n }\n\n /**\n * Adds a header value. If the value for selected key exists, the value is appended\n * as a new field and old one is not touched.\n * You can set multiple values as well by using [{key:'', value:''}] or\n * {key: 'value'} as the first argument.\n *\n * @param {String|Array|Object} key Header key or a list of key value pairs\n * @param {String} value Header value\n * @return {Object} current node\n */\n addHeader(key, value) {\n // Allow setting multiple headers at once\n if (!value && key && typeof key === 'object') {\n // allow {key:'content-type', value: 'text/plain'}\n if (key.key && key.value) {\n this.addHeader(key.key, key.value);\n } else if (Array.isArray(key)) {\n // allow [{key:'content-type', value: 'text/plain'}]\n key.forEach(i => {\n this.addHeader(i.key, i.value);\n });\n } else {\n // allow {'content-type': 'text/plain'}\n Object.keys(key).forEach(i => {\n this.addHeader(i, key[i]);\n });\n }\n return this;\n } else if (Array.isArray(value)) {\n value.forEach(val => {\n this.addHeader(key, val);\n });\n return this;\n }\n\n this._headers.push({\n key: this._normalizeHeaderKey(key),\n value\n });\n\n return this;\n }\n\n /**\n * Retrieves the first mathcing value of a selected key\n *\n * @param {String} key Key to search for\n * @retun {String} Value for the key\n */\n getHeader(key) {\n key = this._normalizeHeaderKey(key);\n for (let i = 0, len = this._headers.length; i < len; i++) {\n if (this._headers[i].key === key) {\n return this._headers[i].value;\n }\n }\n }\n\n /**\n * Sets body content for current node. If the value is a string, charset is added automatically\n * to Content-Type (if it is text/*). If the value is a Buffer, you need to specify\n * the charset yourself\n *\n * @param (String|Buffer) content Body content\n * @return {Object} current node\n */\n setContent(content) {\n this.content = content;\n if (typeof this.content.pipe === 'function') {\n // pre-stream handler. might be triggered if a stream is set as content\n // and 'error' fires before anything is done with this stream\n this._contentErrorHandler = err => {\n this.content.removeListener('error', this._contentErrorHandler);\n this.content = err;\n };\n this.content.once('error', this._contentErrorHandler);\n } else if (typeof this.content === 'string') {\n this._isPlainText = mimeFuncs.isPlainText(this.content);\n if (this._isPlainText && mimeFuncs.hasLongerLines(this.content, 76)) {\n // If there are lines longer than 76 symbols/bytes do not use 7bit\n this._hasLongLines = true;\n }\n }\n return this;\n }\n\n build(callback) {\n let promise;\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = shared.callbackPromise(resolve, reject);\n });\n }\n\n const stream = this.createReadStream();\n const buf = [];\n let buflen = 0;\n let returned = false;\n\n stream.on('readable', () => {\n let chunk;\n\n while ((chunk = stream.read()) !== null) {\n buf.push(chunk);\n buflen += chunk.length;\n }\n });\n\n stream.once('error', err => {\n if (returned) {\n return;\n }\n returned = true;\n\n return callback(err);\n });\n\n stream.once('end', chunk => {\n if (returned) {\n return;\n }\n returned = true;\n\n if (chunk && chunk.length) {\n buf.push(chunk);\n buflen += chunk.length;\n }\n return callback(null, Buffer.concat(buf, buflen));\n });\n\n return promise;\n }\n\n getTransferEncoding() {\n let transferEncoding = false;\n const contentType = (this.getHeader('Content-Type') || '').toString().toLowerCase().trim();\n\n if (this.content) {\n transferEncoding = (this.getHeader('Content-Transfer-Encoding') || '').toString().toLowerCase().trim();\n if (!transferEncoding || !['base64', 'quoted-printable'].includes(transferEncoding)) {\n if (/^text\\//i.test(contentType)) {\n // If there are no special symbols, no need to modify the text\n if (this._isPlainText && !this._hasLongLines) {\n transferEncoding = '7bit';\n } else if (typeof this.content === 'string' || this.content instanceof Buffer) {\n // detect preferred encoding for string value\n transferEncoding = this._getTextEncoding(this.content) === 'Q' ? 'quoted-printable' : 'base64';\n } else {\n // we can not check content for a stream, so either use preferred encoding or fallback to QP\n transferEncoding = this.textEncoding === 'B' ? 'base64' : 'quoted-printable';\n }\n } else if (!/^(multipart|message)\\//i.test(contentType)) {\n transferEncoding = transferEncoding || 'base64';\n }\n }\n }\n return transferEncoding;\n }\n\n /**\n * Builds the header block for the mime node. Append \\r\\n\\r\\n before writing the content\n *\n * @returns {String} Headers\n */\n buildHeaders() {\n const transferEncoding = this.getTransferEncoding();\n const headers = [];\n\n if (transferEncoding) {\n this.setHeader('Content-Transfer-Encoding', transferEncoding);\n }\n\n if (this.filename && !this.getHeader('Content-Disposition')) {\n this.setHeader('Content-Disposition', 'attachment');\n }\n\n // Ensure mandatory header fields\n if (this.rootNode === this) {\n if (!this.getHeader('Date')) {\n this.setHeader('Date', this.date.toUTCString().replace(/GMT/, '+0000'));\n }\n\n // ensure that Message-Id is present\n this.messageId();\n\n if (!this.getHeader('MIME-Version')) {\n this.setHeader('MIME-Version', '1.0');\n }\n\n // Ensure that Content-Type is the last header for the root node\n for (let i = this._headers.length - 2; i >= 0; i--) {\n const header = this._headers[i];\n if (header.key === 'Content-Type') {\n this._headers.splice(i, 1);\n this._headers.push(header);\n }\n }\n }\n\n this._headers.forEach(header => {\n let key = header.key;\n let value = header.value;\n let structured;\n let param;\n const options = {};\n const formattedHeaders = FORMATTED_HEADERS;\n\n if (value && typeof value === 'object' && !formattedHeaders.includes(key)) {\n Object.keys(value).forEach(key => {\n if (key !== 'value') {\n options[key] = value[key];\n }\n });\n value = (value.value || '').toString();\n if (!value.trim()) {\n return;\n }\n }\n\n if (options.prepared) {\n // header value is\n if (options.foldLines) {\n headers.push(mimeFuncs.foldLines(key + ': ' + value));\n } else {\n headers.push(key + ': ' + value);\n }\n return;\n }\n\n switch (header.key) {\n case 'Content-Disposition':\n structured = mimeFuncs.parseHeaderValue(value);\n if (this.filename) {\n structured.params.filename = this.filename;\n }\n value = mimeFuncs.buildHeaderValue(structured);\n break;\n\n case 'Content-Type':\n structured = mimeFuncs.parseHeaderValue(value);\n\n this._handleContentType(structured);\n\n if (\n structured.value.match(/^text\\/plain\\b/) &&\n typeof this.content === 'string' &&\n /[\\u0080-\\uFFFF]/.test(this.content)\n ) {\n structured.params.charset = 'utf-8';\n }\n\n value = mimeFuncs.buildHeaderValue(structured);\n\n if (this.filename) {\n // add support for non-compliant clients like QQ webmail\n // we can't build the value with buildHeaderValue as the value is non standard and\n // would be converted to parameter continuation encoding that we do not want\n param = this._encodeWords(this.filename);\n\n if (param !== this.filename || /[\\s'\"\\\\;:/=(),<>@[\\]?]|^-/.test(param)) {\n // include value in quotes if needed\n param = '\"' + param + '\"';\n }\n value += '; name=' + param;\n }\n break;\n\n case 'Bcc':\n if (!this.keepBcc) {\n // skip BCC values\n return;\n }\n break;\n }\n\n value = this._encodeHeaderValue(key, value);\n\n // skip empty lines\n if (!(value || '').toString().trim()) {\n return;\n }\n\n if (typeof this.normalizeHeaderKey === 'function') {\n const normalized = this.normalizeHeaderKey(key, value);\n if (normalized && typeof normalized === 'string' && normalized.length) {\n key = normalized;\n }\n }\n\n headers.push(mimeFuncs.foldLines(key + ': ' + value, 76));\n });\n\n return headers.join('\\r\\n');\n }\n\n /**\n * Streams the rfc2822 message from the current node. If this is a root node,\n * mandatory header fields are set if missing (Date, Message-Id, MIME-Version)\n *\n * @return {String} Compiled message\n */\n createReadStream(options) {\n options = options || {};\n\n const stream = new PassThrough(options);\n let outputStream = stream;\n let transform;\n\n this.stream(stream, options, err => {\n if (err) {\n outputStream.emit('error', err);\n return;\n }\n stream.end();\n });\n\n for (let i = 0, len = this._transforms.length; i < len; i++) {\n transform = typeof this._transforms[i] === 'function' ? this._transforms[i]() : this._transforms[i];\n outputStream.once('error', err => {\n transform.emit('error', err);\n });\n outputStream = outputStream.pipe(transform);\n }\n\n // ensure terminating newline after possible user transforms\n transform = new LastNewline();\n outputStream.once('error', err => {\n transform.emit('error', err);\n });\n outputStream = outputStream.pipe(transform);\n\n // dkim and stuff\n for (let i = 0, len = this._processFuncs.length; i < len; i++) {\n transform = this._processFuncs[i];\n outputStream = transform(outputStream);\n }\n\n if (this.newline) {\n const winbreak = ['win', 'windows', 'dos', '\\r\\n'].includes(this.newline.toString().toLowerCase());\n const newlineTransform = winbreak ? new LeWindows() : new LeUnix();\n\n const stream = outputStream.pipe(newlineTransform);\n outputStream.on('error', err => stream.emit('error', err));\n return stream;\n }\n\n return outputStream;\n }\n\n /**\n * Appends a transform stream object to the transforms list. Final output\n * is passed through this stream before exposing\n *\n * @param {Object} transform Read-Write stream\n */\n transform(transform) {\n this._transforms.push(transform);\n }\n\n /**\n * Appends a post process function. The functon is run after transforms and\n * uses the following syntax\n *\n * processFunc(input) -> outputStream\n *\n * @param {Object} processFunc Read-Write stream\n */\n processFunc(processFunc) {\n this._processFuncs.push(processFunc);\n }\n\n stream(outputStream, options, done) {\n const transferEncoding = this.getTransferEncoding();\n let contentStream;\n let localStream;\n\n // protect actual callback against multiple triggering\n let returned = false;\n const callback = err => {\n if (returned) {\n return;\n }\n returned = true;\n done(err);\n };\n\n // for multipart nodes, push child nodes\n // for content nodes end the stream\n const finalize = () => {\n let childId = 0;\n const processChildNode = () => {\n if (childId >= this.childNodes.length) {\n outputStream.write('\\r\\n--' + this.boundary + '--\\r\\n');\n return callback();\n }\n const child = this.childNodes[childId++];\n outputStream.write((childId > 1 ? '\\r\\n' : '') + '--' + this.boundary + '\\r\\n');\n child.stream(outputStream, options, err => {\n if (err) {\n return callback(err);\n }\n setImmediate(processChildNode);\n });\n };\n\n if (this.multipart) {\n setImmediate(processChildNode);\n } else {\n return callback();\n }\n };\n\n // pushes node content\n const sendContent = () => {\n if (this.content) {\n if (Object.prototype.toString.call(this.content) === '[object Error]') {\n // content is already errored\n return callback(this.content);\n }\n\n if (typeof this.content.pipe === 'function') {\n this.content.removeListener('error', this._contentErrorHandler);\n this._contentErrorHandler = err => callback(err);\n this.content.once('error', this._contentErrorHandler);\n }\n\n const createStream = () => {\n if (['quoted-printable', 'base64'].includes(transferEncoding)) {\n contentStream = new (transferEncoding === 'base64' ? base64 : qp).Encoder(options);\n\n contentStream.pipe(outputStream, {\n end: false\n });\n contentStream.once('end', finalize);\n contentStream.once('error', err => callback(err));\n\n localStream = this._getStream(this.content);\n localStream.pipe(contentStream);\n } else {\n // anything that is not QP or Base54 passes as-is\n localStream = this._getStream(this.content);\n localStream.pipe(outputStream, {\n end: false\n });\n localStream.once('end', finalize);\n }\n\n localStream.once('error', err => callback(err));\n };\n\n if (this.content._resolve) {\n const chunks = [];\n let chunklen = 0;\n let returned = false;\n const sourceStream = this._getStream(this.content);\n sourceStream.on('error', err => {\n if (returned) {\n return;\n }\n returned = true;\n callback(err);\n });\n sourceStream.on('readable', () => {\n let chunk;\n while ((chunk = sourceStream.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n sourceStream.on('end', () => {\n if (returned) {\n return;\n }\n returned = true;\n this.content._resolve = false;\n this.content._resolvedValue = Buffer.concat(chunks, chunklen);\n setImmediate(createStream);\n });\n } else {\n setImmediate(createStream);\n }\n return;\n }\n return setImmediate(finalize);\n };\n\n if (this._raw) {\n setImmediate(() => {\n if (Object.prototype.toString.call(this._raw) === '[object Error]') {\n // content is already errored\n return callback(this._raw);\n }\n\n // remove default error handler (if set)\n if (typeof this._raw.pipe === 'function') {\n this._raw.removeListener('error', this._contentErrorHandler);\n }\n\n const raw = this._getStream(this._raw);\n raw.pipe(outputStream, {\n end: false\n });\n raw.on('error', err => outputStream.emit('error', err));\n raw.on('end', finalize);\n });\n } else {\n outputStream.write(this.buildHeaders() + '\\r\\n\\r\\n');\n setImmediate(sendContent);\n }\n }\n\n /**\n * Sets envelope to be used instead of the generated one\n *\n * @return {Object} SMTP envelope in the form of {from: 'from@example.com', to: ['to@example.com']}\n */\n setEnvelope(envelope) {\n let list;\n\n this._envelope = {\n from: false,\n to: []\n };\n\n if (envelope.from) {\n list = [];\n this._convertAddresses(this._parseAddresses(envelope.from), list);\n list = list.filter(address => address && address.address);\n if (list.length && list[0]) {\n this._envelope.from = list[0].address;\n }\n }\n ['to', 'cc', 'bcc'].forEach(key => {\n if (envelope[key]) {\n this._convertAddresses(this._parseAddresses(envelope[key]), this._envelope.to);\n }\n });\n\n this._envelope.to = this._envelope.to.map(to => to.address).filter(address => address);\n\n const standardFields = ['to', 'cc', 'bcc', 'from'];\n Object.keys(envelope).forEach(key => {\n if (!standardFields.includes(key)) {\n this._envelope[key] = envelope[key];\n }\n });\n\n return this;\n }\n\n /**\n * Generates and returns an object with parsed address fields\n *\n * @return {Object} Address object\n */\n getAddresses() {\n const addresses = {};\n\n this._headers.forEach(header => {\n const key = header.key.toLowerCase();\n if (['from', 'sender', 'reply-to', 'to', 'cc', 'bcc'].includes(key)) {\n if (!Array.isArray(addresses[key])) {\n addresses[key] = [];\n }\n\n this._convertAddresses(this._parseAddresses(header.value), addresses[key]);\n }\n });\n\n return addresses;\n }\n\n /**\n * Generates and returns SMTP envelope with the sender address and a list of recipients addresses\n *\n * @return {Object} SMTP envelope in the form of {from: 'from@example.com', to: ['to@example.com']}\n */\n getEnvelope() {\n if (this._envelope) {\n return this._envelope;\n }\n\n const envelope = {\n from: false,\n to: []\n };\n this._headers.forEach(header => {\n const list = [];\n if (header.key === 'From' || (!envelope.from && ['Reply-To', 'Sender'].includes(header.key))) {\n this._convertAddresses(this._parseAddresses(header.value), list);\n if (list.length && list[0]) {\n envelope.from = list[0].address;\n }\n } else if (['To', 'Cc', 'Bcc'].includes(header.key)) {\n this._convertAddresses(this._parseAddresses(header.value), envelope.to);\n }\n });\n\n envelope.to = envelope.to.map(to => to.address);\n\n return envelope;\n }\n\n /**\n * Returns Message-Id value. If it does not exist, then creates one\n *\n * @return {String} Message-Id value\n */\n messageId() {\n let messageId = this.getHeader('Message-ID');\n // You really should define your own Message-Id field!\n if (!messageId) {\n messageId = this._generateMessageId();\n this.setHeader('Message-ID', messageId);\n }\n return messageId;\n }\n\n /**\n * Sets pregenerated content that will be used as the output of this node\n *\n * @param {String|Buffer|Stream} Raw MIME contents\n */\n setRaw(raw) {\n this._raw = raw;\n\n if (this._raw && typeof this._raw.pipe === 'function') {\n // pre-stream handler. might be triggered if a stream is set as content\n // and 'error' fires before anything is done with this stream\n this._contentErrorHandler = err => {\n this._raw.removeListener('error', this._contentErrorHandler);\n this._raw = err;\n };\n this._raw.once('error', this._contentErrorHandler);\n }\n\n return this;\n }\n\n /////// PRIVATE METHODS\n\n /**\n * Detects and returns handle to a stream related with the content.\n *\n * @param {Mixed} content Node content\n * @returns {Object} Stream object\n */\n _getStream(content) {\n let contentStream;\n\n if (content._resolvedValue) {\n // pass string or buffer content as a stream\n contentStream = new PassThrough();\n\n setImmediate(() => {\n try {\n contentStream.end(content._resolvedValue);\n } catch (_err) {\n contentStream.emit('error', _err);\n }\n });\n\n return contentStream;\n }\n\n if (typeof content.pipe === 'function') {\n // assume as stream\n return content;\n }\n\n if (content && typeof content.path === 'string' && !content.href) {\n if (this.disableFileAccess) {\n contentStream = new PassThrough();\n setImmediate(() => {\n const err = new Error('File access rejected for ' + content.path);\n err.code = errors.EFILEACCESS;\n contentStream.emit('error', err);\n });\n return contentStream;\n }\n // read file\n return fs.createReadStream(content.path);\n }\n\n if (content && typeof content.href === 'string') {\n if (this.disableUrlAccess) {\n contentStream = new PassThrough();\n setImmediate(() => {\n const err = new Error('Url access rejected for ' + content.href);\n err.code = errors.EURLACCESS;\n contentStream.emit('error', err);\n });\n return contentStream;\n }\n // fetch URL\n return nmfetch(content.href, { headers: content.httpHeaders });\n }\n\n // pass string or buffer content as a stream\n contentStream = new PassThrough();\n\n setImmediate(() => {\n try {\n contentStream.end(content || '');\n } catch (_err) {\n contentStream.emit('error', _err);\n }\n });\n return contentStream;\n }\n\n /**\n * Parses addresses. Takes in a single address or an array or an\n * array of address arrays (eg. To: [[first group], [second group],...])\n *\n * @param {Mixed} addresses Addresses to be parsed\n * @return {Array} An array of address objects\n */\n _parseAddresses(addresses) {\n return [].concat.apply(\n [],\n [].concat(addresses).map(address => {\n if (address && address.address) {\n address.address = this._normalizeAddress(address.address);\n address.name = address.name || '';\n return [address];\n }\n return addressparser(address);\n })\n );\n }\n\n /**\n * Normalizes a header key, uses Camel-Case form, except for uppercase MIME-\n *\n * @param {String} key Key to be normalized\n * @return {String} key in Camel-Case form\n */\n _normalizeHeaderKey(key) {\n key = (key || '')\n .toString()\n // no newlines in keys\n .replace(/\\r?\\n|\\r/g, ' ')\n .trim()\n .toLowerCase()\n // use uppercase words, except MIME\n .replace(/^X-SMTPAPI$|^(MIME|DKIM|ARC|BIMI)\\b|^[a-z]|-(SPF|FBL|ID|MD5)$|-[a-z]/gi, c => c.toUpperCase())\n // special case\n .replace(/^Content-Features$/i, 'Content-features');\n\n return key;\n }\n\n /**\n * Checks if the content type is multipart and defines boundary if needed.\n * Doesn't return anything, modifies object argument instead.\n *\n * @param {Object} structured Parsed header value for 'Content-Type' key\n */\n _handleContentType(structured) {\n this.contentType = structured.value.trim().toLowerCase();\n\n this.multipart = /^multipart\\//i.test(this.contentType) ? this.contentType.substr(this.contentType.indexOf('/') + 1) : false;\n\n if (this.multipart) {\n this.boundary = structured.params.boundary = structured.params.boundary || this.boundary || this._generateBoundary();\n } else {\n this.boundary = false;\n }\n }\n\n /**\n * Generates a multipart boundary value\n *\n * @return {String} boundary value\n */\n _generateBoundary() {\n return this.rootNode.boundaryPrefix + '-' + this.rootNode.baseBoundary + '-Part_' + this._nodeId;\n }\n\n /**\n * Encodes a header value for use in the generated rfc2822 email.\n *\n * @param {String} key Header key\n * @param {String} value Header value\n */\n _encodeHeaderValue(key, value) {\n key = this._normalizeHeaderKey(key);\n\n switch (key) {\n // Structured headers\n case 'From':\n case 'Sender':\n case 'To':\n case 'Cc':\n case 'Bcc':\n case 'Reply-To':\n return this._convertAddresses(this._parseAddresses(value));\n\n // values enclosed in <>\n case 'Message-ID':\n case 'In-Reply-To':\n case 'Content-Id':\n value = (value || '').toString().replace(/\\r?\\n|\\r/g, ' ');\n\n if (value.charAt(0) !== '<') {\n value = '<' + value;\n }\n\n if (value.charAt(value.length - 1) !== '>') {\n value = value + '>';\n }\n return value;\n\n // space separated list of values enclosed in <>\n case 'References':\n value = [].concat\n .apply(\n [],\n [].concat(value || '').map(elm => {\n elm = (elm || '')\n .toString()\n .replace(/\\r?\\n|\\r/g, ' ')\n .trim();\n return elm.replace(/<[^>]*>/g, str => str.replace(/\\s/g, '')).split(/\\s+/);\n })\n )\n .map(elm => {\n if (elm.charAt(0) !== '<') {\n elm = '<' + elm;\n }\n if (elm.charAt(elm.length - 1) !== '>') {\n elm = elm + '>';\n }\n return elm;\n });\n\n return value.join(' ').trim();\n\n case 'Date':\n if (Object.prototype.toString.call(value) === '[object Date]') {\n return value.toUTCString().replace(/GMT/, '+0000');\n }\n\n value = (value || '').toString().replace(/\\r?\\n|\\r/g, ' ');\n return this._encodeWords(value);\n\n case 'Content-Type':\n case 'Content-Disposition':\n // if it includes a filename then it is already encoded\n return (value || '').toString().replace(/\\r?\\n|\\r/g, ' ');\n\n default:\n value = (value || '').toString().replace(/\\r?\\n|\\r/g, ' ');\n // encodeWords only encodes if needed, otherwise the original string is returned\n return this._encodeWords(value);\n }\n }\n\n /**\n * Rebuilds address object using punycode and other adjustments\n *\n * @param {Array} addresses An array of address objects\n * @param {Array} [uniqueList] An array to be populated with addresses\n * @return {String} address string\n */\n _convertAddresses(addresses, uniqueList) {\n const values = [];\n\n uniqueList = uniqueList || [];\n\n [].concat(addresses || []).forEach(address => {\n if (address.address) {\n address.address = this._normalizeAddress(address.address);\n\n if (!address.name) {\n values.push(address.address.indexOf(' ') >= 0 ? `<${address.address}>` : `${address.address}`);\n } else {\n values.push(`${this._encodeAddressName(address.name)} <${address.address}>`);\n }\n\n if (!uniqueList.some(a => a.address === address.address)) {\n uniqueList.push(address);\n }\n } else if (address.group) {\n const groupListAddresses = (address.group.length ? this._convertAddresses(address.group, uniqueList) : '').trim();\n values.push(`${this._encodeAddressName(address.name)}:${groupListAddresses};`);\n }\n });\n\n return values.join(', ');\n }\n\n /**\n * Normalizes an email address\n *\n * @param {Array} address An array of address objects\n * @return {String} address string\n */\n _normalizeAddress(address) {\n address = (address || '')\n .toString()\n .replace(/[\\x00-\\x1F<>]+/g, ' ') // remove unallowed characters\n .trim();\n\n const lastAt = address.lastIndexOf('@');\n if (lastAt < 0) {\n // Bare username\n return address;\n }\n\n let user = address.substr(0, lastAt);\n const domain = address.substr(lastAt + 1);\n\n // Usernames are not touched and are kept as is even if these include unicode.\n // Domains are punycoded when the local part is ASCII ('safe@jõgeva.ee' -> 'safe@xn--jgeva-dua.ee').\n // When the local part contains non-ASCII bytes the address already requires SMTPUTF8,\n // so the domain is kept (or decoded back) as UTF-8 for symmetry on both sides of '@'.\n\n let encodedDomain = domain;\n\n try {\n if (/[\\x80-\\uFFFF]/.test(user)) {\n encodedDomain = punycode.toUnicode(domain.toLowerCase());\n } else {\n encodedDomain = punycode.toASCII(domain.toLowerCase());\n }\n } catch (_err) {\n // keep domain as supplied\n }\n\n if (user.indexOf(' ') >= 0) {\n if (user.charAt(0) !== '\"') {\n user = '\"' + user;\n }\n if (user.substr(-1) !== '\"') {\n user = user + '\"';\n }\n }\n\n return `${user}@${encodedDomain}`;\n }\n\n /**\n * If needed, mime encodes the name part\n *\n * @param {String} name Name part of an address\n * @returns {String} Mime word encoded string if needed\n */\n _encodeAddressName(name) {\n if (!/^[\\w ]*$/.test(name)) {\n if (/^[\\x20-\\x7e]*$/.test(name)) {\n return '\"' + name.replace(/([\\\\\"])/g, '\\\\$1') + '\"';\n } else {\n return mimeFuncs.encodeWord(name, this._getTextEncoding(name), 52);\n }\n }\n return name;\n }\n\n /**\n * If needed, mime encodes the name part\n *\n * @param {String} name Name part of an address\n * @returns {String} Mime word encoded string if needed\n */\n _encodeWords(value) {\n // set encodeAll parameter to true even though it is against the recommendation of RFC2047,\n // by default only words that include non-ascii should be converted into encoded words\n // but some clients (eg. Zimbra) do not handle it properly and remove surrounding whitespace\n return mimeFuncs.encodeWords(value, this._getTextEncoding(value), 52, true);\n }\n\n /**\n * Detects best mime encoding for a text value\n *\n * @param {String} value Value to check for\n * @return {String} either 'Q' or 'B'\n */\n _getTextEncoding(value) {\n value = (value || '').toString();\n\n if (this.textEncoding) {\n return this.textEncoding;\n }\n\n // count latin alphabet symbols and 8-bit range symbols + control symbols\n // if there are more latin characters, then use quoted-printable\n // encoding, otherwise use base64\n let nonLatinLen = 0;\n let latinLen = 0;\n for (let i = 0, len = value.length; i < len; i++) {\n const code = value.charCodeAt(i);\n if ((code >= 0x00 && code <= 0x08) || code === 0x0b || code === 0x0c || (code >= 0x0e && code <= 0x1f) || code >= 0x80) {\n nonLatinLen++;\n } else if ((code >= 0x41 && code <= 0x5a) || (code >= 0x61 && code <= 0x7a)) {\n latinLen++;\n }\n }\n // if there are more latin symbols than binary/unicode, then prefer Q, otherwise B\n return nonLatinLen < latinLen ? 'Q' : 'B';\n }\n\n /**\n * Generates a message id\n *\n * @return {String} Random Message-ID value\n */\n _generateMessageId() {\n return (\n '<' +\n [2, 2, 2, 6].reduce(\n // crux to generate UUID-like random strings\n (prev, len) => prev + '-' + crypto.randomBytes(len).toString('hex'),\n crypto.randomBytes(4).toString('hex')\n ) +\n '@' +\n // try to use the domain of the FROM address or fallback to server hostname\n (this.getEnvelope().from || this.hostname || 'localhost').split('@').pop() +\n '>'\n );\n }\n}\n\nmodule.exports = MimeNode;\n","/* eslint no-undefined: 0 */\n\n'use strict';\n\nconst MimeNode = require('../mime-node');\nconst mimeFuncs = require('../mime-funcs');\nconst { parseDataURI } = require('../shared');\n\n/**\n * Creates the object for composing a MimeNode instance out from the mail options\n *\n * @constructor\n * @param {Object} mail Mail options\n */\nclass MailComposer {\n constructor(mail) {\n this.mail = mail || {};\n this.message = false;\n }\n\n /**\n * Builds MimeNode instance\n */\n compile() {\n this._alternatives = this.getAlternatives();\n this._htmlNode = this._alternatives.filter(alternative => /^text\\/html\\b/i.test(alternative.contentType)).pop();\n this._attachments = this.getAttachments(!!this._htmlNode);\n\n this._useRelated = !!(this._htmlNode && this._attachments.related.length);\n this._useAlternative = this._alternatives.length > 1;\n this._useMixed = this._attachments.attached.length > 1 || (this._alternatives.length && this._attachments.attached.length === 1);\n\n // Compose MIME tree\n if (this.mail.raw) {\n this.message = new MimeNode('message/rfc822', { newline: this.mail.newline }).setRaw(this.mail.raw);\n } else if (this._useMixed) {\n this.message = this._createMixed();\n } else if (this._useAlternative) {\n this.message = this._createAlternative();\n } else if (this._useRelated) {\n this.message = this._createRelated();\n } else {\n this.message = this._createContentNode(\n false,\n []\n .concat(this._alternatives || [])\n .concat(this._attachments.attached || [])\n .shift() || {\n contentType: 'text/plain',\n content: ''\n }\n );\n }\n\n // Add custom headers\n if (this.mail.headers) {\n this.message.addHeader(this.mail.headers);\n }\n\n // Add headers to the root node, always overrides custom headers\n ['from', 'sender', 'to', 'cc', 'bcc', 'reply-to', 'in-reply-to', 'references', 'subject', 'message-id', 'date'].forEach(header => {\n const key = header.replace(/-(\\w)/g, (o, c) => c.toUpperCase());\n if (this.mail[key]) {\n this.message.setHeader(header, this.mail[key]);\n }\n });\n\n // Sets custom envelope\n if (this.mail.envelope) {\n this.message.setEnvelope(this.mail.envelope);\n }\n\n // ensure Message-Id value\n this.message.messageId();\n\n return this.message;\n }\n\n /**\n * List all attachments. Resulting attachment objects can be used as input for MimeNode nodes\n *\n * @param {Boolean} findRelated If true separate related attachments from attached ones\n * @returns {Object} An object of arrays (`related` and `attached`)\n */\n getAttachments(findRelated) {\n let icalEvent, eventObject;\n const attachments = [].concat(this.mail.attachments || []).map((attachment, i) => {\n if (/^data:/i.test(attachment.path || attachment.href)) {\n attachment = this._processDataUrl(attachment);\n }\n\n const contentType =\n attachment.contentType || mimeFuncs.detectMimeType(attachment.filename || attachment.path || attachment.href || 'bin');\n\n const isImage = /^image\\//i.test(contentType);\n const isMessageNode = /^message\\//i.test(contentType);\n\n const contentDisposition =\n attachment.contentDisposition || (isMessageNode || (isImage && attachment.cid) ? 'inline' : 'attachment');\n\n let contentTransferEncoding;\n if ('contentTransferEncoding' in attachment) {\n // also contains `false`, to set\n contentTransferEncoding = attachment.contentTransferEncoding;\n } else if (isMessageNode) {\n // the content might include non-ASCII bytes but at this point we do not know it yet\n contentTransferEncoding = '8bit';\n } else {\n contentTransferEncoding = 'base64'; // the default\n }\n\n const data = {\n contentType,\n contentDisposition,\n contentTransferEncoding\n };\n\n if (attachment.filename) {\n data.filename = attachment.filename;\n } else if (!isMessageNode && attachment.filename !== false) {\n data.filename = (attachment.path || attachment.href || '').split('/').pop().split('?').shift() || 'attachment-' + (i + 1);\n if (data.filename.indexOf('.') < 0) {\n data.filename += '.' + mimeFuncs.detectExtension(data.contentType);\n }\n }\n\n if (/^https?:\\/\\//i.test(attachment.path)) {\n attachment.href = attachment.path;\n attachment.path = undefined;\n }\n\n if (attachment.cid) {\n data.cid = attachment.cid;\n }\n\n if (attachment.raw) {\n data.raw = attachment.raw;\n } else if (attachment.path) {\n data.content = {\n path: attachment.path\n };\n } else if (attachment.href) {\n data.content = {\n href: attachment.href,\n httpHeaders: attachment.httpHeaders\n };\n } else {\n data.content = attachment.content || '';\n }\n\n if (attachment.encoding) {\n data.encoding = attachment.encoding;\n }\n\n if (attachment.headers) {\n data.headers = attachment.headers;\n }\n\n return data;\n });\n\n if (this.mail.icalEvent) {\n if (\n typeof this.mail.icalEvent === 'object' &&\n (this.mail.icalEvent.content || this.mail.icalEvent.path || this.mail.icalEvent.href || this.mail.icalEvent.raw)\n ) {\n icalEvent = this.mail.icalEvent;\n } else {\n icalEvent = {\n content: this.mail.icalEvent\n };\n }\n\n eventObject = Object.assign({}, icalEvent);\n\n eventObject.contentType = 'application/ics';\n if (!eventObject.headers) {\n eventObject.headers = {};\n }\n eventObject.filename = eventObject.filename || 'invite.ics';\n eventObject.headers['Content-Disposition'] = 'attachment';\n eventObject.headers['Content-Transfer-Encoding'] = 'base64';\n }\n\n if (!findRelated) {\n return {\n attached: attachments.concat(eventObject || []),\n related: []\n };\n }\n\n return {\n attached: attachments.filter(attachment => !attachment.cid).concat(eventObject || []),\n related: attachments.filter(attachment => !!attachment.cid)\n };\n }\n\n /**\n * List alternatives. Resulting objects can be used as input for MimeNode nodes\n *\n * @returns {Array} An array of alternative elements. Includes the `text` and `html` values as well\n */\n getAlternatives() {\n const alternatives = [];\n let text, html, watchHtml, amp, icalEvent, eventObject;\n\n if (this.mail.text) {\n if (\n typeof this.mail.text === 'object' &&\n (this.mail.text.content || this.mail.text.path || this.mail.text.href || this.mail.text.raw)\n ) {\n text = this.mail.text;\n } else {\n text = {\n content: this.mail.text\n };\n }\n text.contentType = 'text/plain; charset=utf-8';\n }\n\n if (this.mail.watchHtml) {\n if (\n typeof this.mail.watchHtml === 'object' &&\n (this.mail.watchHtml.content || this.mail.watchHtml.path || this.mail.watchHtml.href || this.mail.watchHtml.raw)\n ) {\n watchHtml = this.mail.watchHtml;\n } else {\n watchHtml = {\n content: this.mail.watchHtml\n };\n }\n watchHtml.contentType = 'text/watch-html; charset=utf-8';\n }\n\n if (this.mail.amp) {\n if (\n typeof this.mail.amp === 'object' &&\n (this.mail.amp.content || this.mail.amp.path || this.mail.amp.href || this.mail.amp.raw)\n ) {\n amp = this.mail.amp;\n } else {\n amp = {\n content: this.mail.amp\n };\n }\n amp.contentType = 'text/x-amp-html; charset=utf-8';\n }\n\n // NB! when including attachments with a calendar alternative you might end up in a blank screen on some clients\n if (this.mail.icalEvent) {\n if (\n typeof this.mail.icalEvent === 'object' &&\n (this.mail.icalEvent.content || this.mail.icalEvent.path || this.mail.icalEvent.href || this.mail.icalEvent.raw)\n ) {\n icalEvent = this.mail.icalEvent;\n } else {\n icalEvent = {\n content: this.mail.icalEvent\n };\n }\n\n eventObject = Object.assign({}, icalEvent);\n\n if (eventObject.content && typeof eventObject.content === 'object') {\n // we are going to have the same attachment twice, so mark this to be\n // resolved just once\n eventObject.content._resolve = true;\n }\n\n eventObject.filename = false;\n eventObject.contentType =\n 'text/calendar; charset=utf-8; method=' + (eventObject.method || 'PUBLISH').toString().trim().toUpperCase();\n if (!eventObject.headers) {\n eventObject.headers = {};\n }\n }\n\n if (this.mail.html) {\n if (\n typeof this.mail.html === 'object' &&\n (this.mail.html.content || this.mail.html.path || this.mail.html.href || this.mail.html.raw)\n ) {\n html = this.mail.html;\n } else {\n html = {\n content: this.mail.html\n };\n }\n html.contentType = 'text/html; charset=utf-8';\n }\n\n []\n .concat(text || [])\n .concat(watchHtml || [])\n .concat(amp || [])\n .concat(html || [])\n .concat(eventObject || [])\n .concat(this.mail.alternatives || [])\n .forEach(alternative => {\n if (/^data:/i.test(alternative.path || alternative.href)) {\n alternative = this._processDataUrl(alternative);\n }\n\n const data = {\n contentType:\n alternative.contentType ||\n mimeFuncs.detectMimeType(alternative.filename || alternative.path || alternative.href || 'txt'),\n contentTransferEncoding: alternative.contentTransferEncoding\n };\n\n if (alternative.filename) {\n data.filename = alternative.filename;\n }\n\n if (/^https?:\\/\\//i.test(alternative.path)) {\n alternative.href = alternative.path;\n alternative.path = undefined;\n }\n\n if (alternative.raw) {\n data.raw = alternative.raw;\n } else if (alternative.path) {\n data.content = {\n path: alternative.path\n };\n } else if (alternative.href) {\n data.content = {\n href: alternative.href\n };\n } else {\n data.content = alternative.content || '';\n }\n\n if (alternative.encoding) {\n data.encoding = alternative.encoding;\n }\n\n if (alternative.headers) {\n data.headers = alternative.headers;\n }\n\n alternatives.push(data);\n });\n\n return alternatives;\n }\n\n /**\n * Builds multipart/mixed node. It should always contain different type of elements on the same level\n * eg. text + attachments\n *\n * @param {Object} parentNode Parent for this note. If it does not exist, a root node is created\n * @returns {Object} MimeNode node element\n */\n _createMixed(parentNode) {\n const node = parentNode\n ? parentNode.createChild('multipart/mixed', {\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n })\n : new MimeNode('multipart/mixed', {\n baseBoundary: this.mail.baseBoundary,\n textEncoding: this.mail.textEncoding,\n boundaryPrefix: this.mail.boundaryPrefix,\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n });\n\n if (this._useAlternative) {\n this._createAlternative(node);\n } else if (this._useRelated) {\n this._createRelated(node);\n }\n\n []\n .concat((!this._useAlternative && this._alternatives) || [])\n .concat(this._attachments.attached || [])\n .forEach(element => {\n // if the element is a html node from related subpart then ignore it\n if (!this._useRelated || element !== this._htmlNode) {\n this._createContentNode(node, element);\n }\n });\n\n return node;\n }\n\n /**\n * Builds multipart/alternative node. It should always contain same type of elements on the same level\n * eg. text + html view of the same data\n *\n * @param {Object} parentNode Parent for this note. If it does not exist, a root node is created\n * @returns {Object} MimeNode node element\n */\n _createAlternative(parentNode) {\n const node = parentNode\n ? parentNode.createChild('multipart/alternative', {\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n })\n : new MimeNode('multipart/alternative', {\n baseBoundary: this.mail.baseBoundary,\n textEncoding: this.mail.textEncoding,\n boundaryPrefix: this.mail.boundaryPrefix,\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n });\n\n this._alternatives.forEach(alternative => {\n if (this._useRelated && this._htmlNode === alternative) {\n this._createRelated(node);\n } else {\n this._createContentNode(node, alternative);\n }\n });\n\n return node;\n }\n\n /**\n * Builds multipart/related node. It should always contain html node with related attachments\n *\n * @param {Object} parentNode Parent for this note. If it does not exist, a root node is created\n * @returns {Object} MimeNode node element\n */\n _createRelated(parentNode) {\n const node = parentNode\n ? parentNode.createChild('multipart/related; type=\"text/html\"', {\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n })\n : new MimeNode('multipart/related; type=\"text/html\"', {\n baseBoundary: this.mail.baseBoundary,\n textEncoding: this.mail.textEncoding,\n boundaryPrefix: this.mail.boundaryPrefix,\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n });\n\n this._createContentNode(node, this._htmlNode);\n\n this._attachments.related.forEach(alternative => this._createContentNode(node, alternative));\n\n return node;\n }\n\n /**\n * Creates a regular node with contents\n *\n * @param {Object} parentNode Parent for this note. If it does not exist, a root node is created\n * @param {Object} element Node data\n * @returns {Object} MimeNode node element\n */\n _createContentNode(parentNode, element) {\n element = element || {};\n element.content = element.content || '';\n\n const encoding = (element.encoding || 'utf8')\n .toString()\n .toLowerCase()\n .replace(/[-_\\s]/g, '');\n\n const node = parentNode\n ? parentNode.createChild(element.contentType, {\n filename: element.filename,\n textEncoding: this.mail.textEncoding,\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n })\n : new MimeNode(element.contentType, {\n filename: element.filename,\n baseBoundary: this.mail.baseBoundary,\n textEncoding: this.mail.textEncoding,\n boundaryPrefix: this.mail.boundaryPrefix,\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n });\n\n // add custom headers\n if (element.headers) {\n node.addHeader(element.headers);\n }\n\n if (element.cid) {\n node.setHeader('Content-Id', '<' + element.cid.replace(/[<>]/g, '') + '>');\n }\n\n if (element.contentTransferEncoding) {\n node.setHeader('Content-Transfer-Encoding', element.contentTransferEncoding);\n } else if (this.mail.encoding && /^text\\//i.test(element.contentType)) {\n node.setHeader('Content-Transfer-Encoding', this.mail.encoding);\n }\n\n if (!/^text\\//i.test(element.contentType) || element.contentDisposition) {\n node.setHeader(\n 'Content-Disposition',\n element.contentDisposition || (element.cid && /^image\\//i.test(element.contentType) ? 'inline' : 'attachment')\n );\n }\n\n if (typeof element.content === 'string' && !['utf8', 'usascii', 'ascii'].includes(encoding)) {\n element.content = Buffer.from(element.content, encoding);\n }\n\n // prefer pregenerated raw content\n if (element.raw) {\n node.setRaw(element.raw);\n } else {\n node.setContent(element.content);\n }\n\n return node;\n }\n\n /**\n * Parses data uri and converts it to a Buffer\n *\n * @param {Object} element Content element\n * @return {Object} Parsed element\n */\n _processDataUrl(element) {\n const dataUrl = element.path || element.href;\n\n // Early validation to prevent ReDoS\n if (!dataUrl || typeof dataUrl !== 'string') {\n return element;\n }\n\n if (!dataUrl.startsWith('data:')) {\n return element;\n }\n\n if (dataUrl.length > 52428800) {\n // 52428800 chars = 50MB limit for data URL string (~37.5MB decoded image)\n // Extract content type before rejecting to preserve MIME type\n let detectedType = 'application/octet-stream';\n const commaPos = dataUrl.indexOf(',');\n\n if (commaPos > 0 && commaPos < 200) {\n // Parse header safely with size limit\n const header = dataUrl.substring(5, commaPos); // skip 'data:'\n const parts = header.split(';');\n if (parts[0] && parts[0].includes('/')) {\n detectedType = parts[0].trim();\n }\n }\n\n // Return empty content for excessively long data URLs\n return Object.assign({}, element, {\n path: false,\n href: false,\n content: Buffer.alloc(0),\n contentType: element.contentType || detectedType\n });\n }\n\n let parsedDataUri;\n try {\n parsedDataUri = parseDataURI(dataUrl);\n } catch (_err) {\n return element;\n }\n\n if (!parsedDataUri) {\n return element;\n }\n\n element.content = parsedDataUri.data;\n element.contentType = element.contentType || parsedDataUri.contentType;\n\n if ('path' in element) {\n element.path = false;\n }\n\n if ('href' in element) {\n element.href = false;\n }\n\n return element;\n }\n}\n\nmodule.exports = MailComposer;\n","'use strict';\n\nconst { Transform } = require('stream');\n\n/**\n * MessageParser instance is a transform stream that separates message headers\n * from the rest of the body. Headers are emitted with the 'headers' event. Message\n * body is passed on as the resulting stream.\n */\nclass MessageParser extends Transform {\n constructor(options) {\n super(options);\n this.lastBytes = Buffer.alloc(4);\n this.headersParsed = false;\n this.headerBytes = 0;\n this.headerChunks = [];\n this.rawHeaders = false;\n this.bodySize = 0;\n }\n\n /**\n * Keeps count of the last 4 bytes in order to detect line breaks on chunk boundaries\n *\n * @param {Buffer} data Next data chunk from the stream\n */\n updateLastBytes(data) {\n const lblen = this.lastBytes.length;\n const nblen = Math.min(data.length, lblen);\n\n // shift existing bytes\n for (let i = 0, len = lblen - nblen; i < len; i++) {\n this.lastBytes[i] = this.lastBytes[i + nblen];\n }\n\n // add new bytes\n for (let i = 1; i <= nblen; i++) {\n this.lastBytes[lblen - i] = data[data.length - i];\n }\n }\n\n /**\n * Finds and removes message headers from the remaining body. We want to keep\n * headers separated until final delivery to be able to modify these\n *\n * @param {Buffer} data Next chunk of data\n * @return {Boolean} Returns true if headers are already found or false otherwise\n */\n checkHeaders(data) {\n if (this.headersParsed) {\n return true;\n }\n\n const lblen = this.lastBytes.length;\n let headerPos = 0;\n for (let i = 0, len = this.lastBytes.length + data.length; i < len; i++) {\n let chr;\n if (i < lblen) {\n chr = this.lastBytes[i];\n } else {\n chr = data[i - lblen];\n }\n if (chr === 0x0a && i) {\n const pr1 = i - 1 < lblen ? this.lastBytes[i - 1] : data[i - 1 - lblen];\n const pr2 = i > 1 ? (i - 2 < lblen ? this.lastBytes[i - 2] : data[i - 2 - lblen]) : false;\n if (pr1 === 0x0a) {\n this.headersParsed = true;\n headerPos = i - lblen + 1;\n this.headerBytes += headerPos;\n break;\n } else if (pr1 === 0x0d && pr2 === 0x0a) {\n this.headersParsed = true;\n headerPos = i - lblen + 1;\n this.headerBytes += headerPos;\n break;\n }\n }\n }\n\n if (this.headersParsed) {\n this.headerChunks.push(data.slice(0, headerPos));\n this.rawHeaders = Buffer.concat(this.headerChunks, this.headerBytes);\n this.headerChunks = null;\n this.emit('headers', this.parseHeaders());\n if (data.length - 1 > headerPos) {\n const chunk = data.slice(headerPos);\n this.bodySize += chunk.length;\n // this would be the first chunk of data sent downstream\n setImmediate(() => this.push(chunk));\n }\n return false;\n }\n\n this.headerBytes += data.length;\n this.headerChunks.push(data);\n\n // store last 4 bytes to catch header break\n this.updateLastBytes(data);\n\n return false;\n }\n\n _transform(chunk, encoding, callback) {\n if (!chunk || !chunk.length) {\n return callback();\n }\n\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding);\n }\n\n let headersFound;\n\n try {\n headersFound = this.checkHeaders(chunk);\n } catch (E) {\n return callback(E);\n }\n\n if (headersFound) {\n this.bodySize += chunk.length;\n this.push(chunk);\n }\n\n setImmediate(callback);\n }\n\n _flush(callback) {\n if (this.headerChunks) {\n const chunk = Buffer.concat(this.headerChunks, this.headerBytes);\n this.bodySize += chunk.length;\n this.push(chunk);\n this.headerChunks = null;\n }\n callback();\n }\n\n parseHeaders() {\n const lines = (this.rawHeaders || '').toString().split(/\\r?\\n/);\n for (let i = lines.length - 1; i > 0; i--) {\n if (/^\\s/.test(lines[i])) {\n lines[i - 1] += '\\n' + lines[i];\n lines.splice(i, 1);\n }\n }\n return lines\n .filter(line => line.trim())\n .map(line => ({\n key: line.substr(0, line.indexOf(':')).trim().toLowerCase(),\n line\n }));\n }\n}\n\nmodule.exports = MessageParser;\n","'use strict';\n\n// streams through a message body and calculates relaxed body hash\n\nconst { Transform } = require('stream');\nconst crypto = require('crypto');\n\nclass RelaxedBody extends Transform {\n constructor(options) {\n super();\n options = options || {};\n this.chunkBuffer = [];\n this.chunkBufferLen = 0;\n this.bodyHash = crypto.createHash(options.hashAlgo || 'sha1');\n this.remainder = '';\n this.byteLength = 0;\n\n this.debug = options.debug;\n this._debugBody = options.debug ? [] : false;\n }\n\n updateHash(chunk) {\n let bodyStr;\n\n // find next remainder\n let nextRemainder = '';\n\n // This crux finds and removes the spaces from the last line and the newline characters after the last non-empty line\n // If we get another chunk that does not match this description then we can restore the previously processed data\n let state = 'file';\n for (let i = chunk.length - 1; i >= 0; i--) {\n const c = chunk[i];\n\n if (state === 'file' && (c === 0x0a || c === 0x0d)) {\n // do nothing, found \\n or \\r at the end of chunk, stil end of file\n } else if (state === 'file' && (c === 0x09 || c === 0x20)) {\n // switch to line ending mode, this is the last non-empty line\n state = 'line';\n } else if (state === 'line' && (c === 0x09 || c === 0x20)) {\n // do nothing, found ' ' or \\t at the end of line, keep processing the last non-empty line\n } else if (state === 'file' || state === 'line') {\n // non line/file ending character found, switch to body mode\n state = 'body';\n if (i === chunk.length - 1) {\n // final char is not part of line end or file end, so do nothing\n break;\n }\n }\n\n if (i === 0) {\n // reached to the beginning of the chunk, check if it is still about the ending\n // and if the remainder also matches\n if (\n (state === 'file' && (!this.remainder || /[\\r\\n]$/.test(this.remainder))) ||\n (state === 'line' && (!this.remainder || /[ \\t]$/.test(this.remainder)))\n ) {\n // keep everything\n this.remainder += chunk.toString('binary');\n return;\n } else if (state === 'line' || state === 'file') {\n // process existing remainder as normal line but store the current chunk\n nextRemainder = chunk.toString('binary');\n chunk = false;\n break;\n }\n }\n\n if (state !== 'body') {\n continue;\n }\n\n // reached first non ending byte\n nextRemainder = chunk.slice(i + 1).toString('binary');\n chunk = chunk.slice(0, i + 1);\n break;\n }\n\n let needsFixing = !!this.remainder;\n if (chunk && !needsFixing) {\n // check if we even need to change anything\n for (let i = 0, len = chunk.length; i < len; i++) {\n if (i && chunk[i] === 0x0a && chunk[i - 1] !== 0x0d) {\n // missing \\r before \\n\n needsFixing = true;\n break;\n } else if (i && chunk[i] === 0x0d && chunk[i - 1] === 0x20) {\n // trailing WSP found\n needsFixing = true;\n break;\n } else if (i && chunk[i] === 0x20 && chunk[i - 1] === 0x20) {\n // multiple spaces found, needs to be replaced with just one\n needsFixing = true;\n break;\n } else if (chunk[i] === 0x09) {\n // TAB found, needs to be replaced with a space\n needsFixing = true;\n break;\n }\n }\n }\n\n if (needsFixing) {\n bodyStr = this.remainder + (chunk ? chunk.toString('binary') : '');\n this.remainder = nextRemainder;\n bodyStr = bodyStr\n .replace(/\\r?\\n/g, '\\n') // use js line endings\n .replace(/[ \\t]*$/gm, '') // remove line endings, rtrim\n .replace(/[ \\t]+/gm, ' ') // single spaces\n .replace(/\\n/g, '\\r\\n'); // restore rfc822 line endings\n chunk = Buffer.from(bodyStr, 'binary');\n } else if (nextRemainder) {\n this.remainder = nextRemainder;\n }\n\n if (this.debug) {\n this._debugBody.push(chunk);\n }\n this.bodyHash.update(chunk);\n }\n\n _transform(chunk, encoding, callback) {\n if (!chunk || !chunk.length) {\n return callback();\n }\n\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding);\n }\n\n this.updateHash(chunk);\n\n this.byteLength += chunk.length;\n this.push(chunk);\n callback();\n }\n\n _flush(callback) {\n // generate final hash and emit it\n if (/[\\r\\n]$/.test(this.remainder) && this.byteLength > 2) {\n // add terminating line end\n this.bodyHash.update(Buffer.from('\\r\\n'));\n }\n if (!this.byteLength) {\n // emit empty line buffer to keep the stream flowing\n this.push(Buffer.from('\\r\\n'));\n // this.bodyHash.update(Buffer.from('\\r\\n'));\n }\n\n this.emit('hash', this.bodyHash.digest('base64'), this.debug ? Buffer.concat(this._debugBody) : false);\n callback();\n }\n}\n\nmodule.exports = RelaxedBody;\n","'use strict';\n\nconst punycode = require('../punycode');\nconst mimeFuncs = require('../mime-funcs');\nconst crypto = require('crypto');\n\n/**\n * Returns DKIM signature header line\n *\n * @param {Object} headers Parsed headers object from MessageParser\n * @param {String} bodyHash Base64 encoded hash of the message\n * @param {Object} options DKIM options\n * @param {String} options.domainName Domain name to be signed for\n * @param {String} options.keySelector DKIM key selector to use\n * @param {String} options.privateKey DKIM private key to use\n * @return {String} Complete header line\n */\n\nmodule.exports = (headers, hashAlgo, bodyHash, options) => {\n options = options || {};\n\n // all listed fields from RFC4871 #5.5\n const defaultFieldNames =\n 'From:Sender:Reply-To:Subject:Date:Message-ID:To:' +\n 'Cc:MIME-Version:Content-Type:Content-Transfer-Encoding:Content-ID:' +\n 'Content-Description:Resent-Date:Resent-From:Resent-Sender:' +\n 'Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:' +\n 'List-Id:List-Help:List-Unsubscribe:List-Subscribe:List-Post:' +\n 'List-Owner:List-Archive';\n\n const fieldNames = options.headerFieldNames || defaultFieldNames;\n\n const canonicalizedHeaderData = relaxedHeaders(headers, fieldNames, options.skipFields);\n const dkimHeader = generateDKIMHeader(options.domainName, options.keySelector, canonicalizedHeaderData.fieldNames, hashAlgo, bodyHash);\n\n canonicalizedHeaderData.headers += 'dkim-signature:' + relaxedHeaderLine(dkimHeader);\n\n const signer = crypto.createSign(('rsa-' + hashAlgo).toUpperCase());\n signer.update(canonicalizedHeaderData.headers);\n let signature;\n try {\n signature = signer.sign(options.privateKey, 'base64');\n } catch (_E) {\n return false;\n }\n\n return dkimHeader + signature.replace(/(^.{73}|.{75}(?!\\r?\\n|\\r))/g, '$&\\r\\n ').trim();\n};\n\nmodule.exports.relaxedHeaders = relaxedHeaders;\n\nfunction generateDKIMHeader(domainName, keySelector, fieldNames, hashAlgo, bodyHash) {\n const dkim = [\n 'v=1',\n 'a=rsa-' + hashAlgo,\n 'c=relaxed/relaxed',\n 'd=' + punycode.toASCII(domainName),\n 'q=dns/txt',\n 's=' + keySelector,\n 'bh=' + bodyHash,\n 'h=' + fieldNames\n ].join('; ');\n\n return mimeFuncs.foldLines('DKIM-Signature: ' + dkim, 76) + ';\\r\\n b=';\n}\n\nfunction relaxedHeaders(headers, fieldNames, skipFields) {\n const includedFields = new Set();\n const skip = new Set();\n const headerFields = new Map();\n\n (skipFields || '')\n .toLowerCase()\n .split(':')\n .forEach(field => {\n skip.add(field.trim());\n });\n\n (fieldNames || '')\n .toLowerCase()\n .split(':')\n .filter(field => !skip.has(field.trim()))\n .forEach(field => {\n includedFields.add(field.trim());\n });\n\n for (let i = headers.length - 1; i >= 0; i--) {\n const line = headers[i];\n // only include the first value from bottom to top\n if (includedFields.has(line.key) && !headerFields.has(line.key)) {\n headerFields.set(line.key, relaxedHeaderLine(line.line));\n }\n }\n\n const headersList = [];\n const fields = [];\n includedFields.forEach(field => {\n if (headerFields.has(field)) {\n fields.push(field);\n headersList.push(field + ':' + headerFields.get(field));\n }\n });\n\n return {\n headers: headersList.join('\\r\\n') + '\\r\\n',\n fieldNames: fields.join(':')\n };\n}\n\nfunction relaxedHeaderLine(line) {\n return line\n .substr(line.indexOf(':') + 1)\n .replace(/\\r?\\n/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n","'use strict';\n\n// FIXME:\n// replace this Transform mess with a method that pipes input argument to output argument\n\nconst MessageParser = require('./message-parser');\nconst RelaxedBody = require('./relaxed-body');\nconst sign = require('./sign');\nconst { PassThrough } = require('stream');\nconst fs = require('fs');\nconst path = require('path');\nconst crypto = require('crypto');\n\nconst DKIM_ALGO = 'sha256';\nconst MAX_MESSAGE_SIZE = 2 * 1024 * 1024; // buffer messages larger than this to disk\n\n/*\n// Usage:\n\nlet dkim = new DKIM({\n domainName: 'example.com',\n keySelector: 'key-selector',\n privateKey,\n cacheDir: '/tmp'\n});\ndkim.sign(input).pipe(process.stdout);\n\n// Where inputStream is a rfc822 message (either a stream, string or Buffer)\n// and outputStream is a DKIM signed rfc822 message\n*/\n\nclass DKIMSigner {\n constructor(options, keys, input, output) {\n this.options = options || {};\n this.keys = keys;\n\n this.cacheTreshold = Number(this.options.cacheTreshold) || MAX_MESSAGE_SIZE;\n this.hashAlgo = this.options.hashAlgo || DKIM_ALGO;\n\n this.cacheDir = this.options.cacheDir || false;\n\n this.chunks = [];\n this.chunklen = 0;\n this.readPos = 0;\n this.cachePath = this.cacheDir\n ? path.join(this.cacheDir, 'message.' + Date.now() + '-' + crypto.randomBytes(14).toString('hex'))\n : false;\n this.cache = false;\n\n this.headers = false;\n this.bodyHash = false;\n this.parser = false;\n this.relaxedBody = false;\n\n this.input = input;\n this.output = output;\n this.output.usingCache = false;\n\n this.hasErrored = false;\n\n this.input.on('error', err => {\n this.hasErrored = true;\n this.cleanup();\n output.emit('error', err);\n });\n }\n\n cleanup() {\n if (!this.cache || !this.cachePath) {\n return;\n }\n fs.unlink(this.cachePath, () => false);\n }\n\n createReadCache() {\n // pipe remainings to cache file\n this.cache = fs.createReadStream(this.cachePath);\n this.cache.once('error', err => {\n this.cleanup();\n this.output.emit('error', err);\n });\n this.cache.once('close', () => {\n this.cleanup();\n });\n this.cache.pipe(this.output);\n }\n\n sendNextChunk() {\n if (this.hasErrored) {\n return;\n }\n\n if (this.readPos >= this.chunks.length) {\n if (!this.cache) {\n return this.output.end();\n }\n return this.createReadCache();\n }\n const chunk = this.chunks[this.readPos++];\n if (this.output.write(chunk) === false) {\n return this.output.once('drain', () => {\n this.sendNextChunk();\n });\n }\n setImmediate(() => this.sendNextChunk());\n }\n\n sendSignedOutput() {\n let keyPos = 0;\n const signNextKey = () => {\n if (keyPos >= this.keys.length) {\n this.output.write(this.parser.rawHeaders);\n return setImmediate(() => this.sendNextChunk());\n }\n const key = this.keys[keyPos++];\n const dkimField = sign(this.headers, this.hashAlgo, this.bodyHash, {\n domainName: key.domainName,\n keySelector: key.keySelector,\n privateKey: key.privateKey,\n headerFieldNames: this.options.headerFieldNames,\n skipFields: this.options.skipFields\n });\n if (dkimField) {\n this.output.write(Buffer.from(dkimField + '\\r\\n'));\n }\n return setImmediate(signNextKey);\n };\n\n if (this.bodyHash && this.headers) {\n return signNextKey();\n }\n\n this.output.write(this.parser.rawHeaders);\n this.sendNextChunk();\n }\n\n createWriteCache() {\n this.output.usingCache = true;\n // pipe remainings to cache file\n this.cache = fs.createWriteStream(this.cachePath);\n this.cache.once('error', err => {\n this.cleanup();\n // drain input\n this.relaxedBody.unpipe(this.cache);\n this.relaxedBody.on('readable', () => {\n while (this.relaxedBody.read() !== null) {\n // do nothing\n }\n });\n this.hasErrored = true;\n // emit error\n this.output.emit('error', err);\n });\n this.cache.once('close', () => {\n this.sendSignedOutput();\n });\n this.relaxedBody.removeAllListeners('readable');\n this.relaxedBody.pipe(this.cache);\n }\n\n signStream() {\n this.parser = new MessageParser();\n this.relaxedBody = new RelaxedBody({\n hashAlgo: this.hashAlgo\n });\n\n this.parser.on('headers', value => {\n this.headers = value;\n });\n\n this.relaxedBody.on('hash', value => {\n this.bodyHash = value;\n });\n\n this.relaxedBody.on('readable', () => {\n let chunk;\n if (this.cache) {\n return;\n }\n while ((chunk = this.relaxedBody.read()) !== null) {\n this.chunks.push(chunk);\n this.chunklen += chunk.length;\n if (this.chunklen >= this.cacheTreshold && this.cachePath) {\n return this.createWriteCache();\n }\n }\n });\n\n this.relaxedBody.on('end', () => {\n if (this.cache) {\n return;\n }\n this.sendSignedOutput();\n });\n\n this.parser.pipe(this.relaxedBody);\n setImmediate(() => this.input.pipe(this.parser));\n }\n}\n\nclass DKIM {\n constructor(options) {\n this.options = options || {};\n this.keys = [].concat(\n this.options.keys || {\n domainName: options.domainName,\n keySelector: options.keySelector,\n privateKey: options.privateKey\n }\n );\n }\n\n sign(input, extraOptions) {\n const output = new PassThrough();\n let inputStream = input;\n let writeValue = false;\n\n if (Buffer.isBuffer(input)) {\n writeValue = input;\n inputStream = new PassThrough();\n } else if (typeof input === 'string') {\n writeValue = Buffer.from(input);\n inputStream = new PassThrough();\n }\n\n let options = this.options;\n if (extraOptions && Object.keys(extraOptions).length) {\n options = Object.assign({}, extraOptions, this.options);\n }\n\n const signer = new DKIMSigner(options, this.keys, inputStream, output);\n setImmediate(() => {\n signer.signStream();\n if (writeValue) {\n setImmediate(() => {\n inputStream.end(writeValue);\n });\n }\n });\n\n return output;\n }\n}\n\nmodule.exports = DKIM;\n","'use strict';\n\n/**\n * Minimal HTTP/S proxy client\n */\n\nconst net = require('net');\nconst tls = require('tls');\nconst urllib = require('url');\nconst errors = require('../errors');\n\n/**\n * Establishes proxied connection to destinationPort\n *\n * httpProxyClient(\"http://localhost:3128/\", 80, \"google.com\", function(err, socket){\n * socket.write(\"GET / HTTP/1.0\\r\\n\\r\\n\");\n * });\n *\n * @param {String} proxyUrl proxy configuration, etg \"http://proxy.host:3128/\"\n * @param {Number} destinationPort Port to open in destination host\n * @param {String} destinationHost Destination hostname\n * @param {Function} callback Callback to run with the rocket object once connection is established\n */\nfunction httpProxyClient(proxyUrl, destinationPort, destinationHost, callback) {\n const proxy = urllib.parse(proxyUrl);\n\n const options = {\n host: proxy.hostname,\n port: Number(proxy.port) ? Number(proxy.port) : proxy.protocol === 'https:' ? 443 : 80\n };\n\n let connect;\n if (proxy.protocol === 'https:') {\n // we can use untrusted proxies as long as we verify actual SMTP certificates\n options.rejectUnauthorized = false;\n connect = tls.connect.bind(tls);\n } else {\n connect = net.connect.bind(net);\n }\n\n let socket;\n\n // Error harness for initial connection. Once connection is established, the responsibility\n // to handle errors is passed to whoever uses this socket\n let finished = false;\n const tempSocketErr = err => {\n if (finished) {\n return;\n }\n finished = true;\n try {\n socket.destroy();\n } catch (_E) {\n // ignore\n }\n callback(err);\n };\n\n const timeoutErr = () => {\n const err = new Error('Proxy socket timed out');\n err.code = 'ETIMEDOUT';\n tempSocketErr(err);\n };\n\n socket = connect(options, () => {\n if (finished) {\n return;\n }\n\n const reqHeaders = {\n Host: destinationHost + ':' + destinationPort,\n Connection: 'close'\n };\n if (proxy.auth) {\n reqHeaders['Proxy-Authorization'] = 'Basic ' + Buffer.from(proxy.auth).toString('base64');\n }\n\n socket.write(\n // HTTP method\n 'CONNECT ' +\n destinationHost +\n ':' +\n destinationPort +\n ' HTTP/1.1\\r\\n' +\n // HTTP request headers\n Object.keys(reqHeaders)\n .map(key => key + ': ' + reqHeaders[key])\n .join('\\r\\n') +\n // End request\n '\\r\\n\\r\\n'\n );\n\n let headers = '';\n const onSocketData = chunk => {\n let match;\n let remainder;\n\n if (finished) {\n return;\n }\n\n headers += chunk.toString('binary');\n if ((match = headers.match(/\\r\\n\\r\\n/))) {\n socket.removeListener('data', onSocketData);\n\n remainder = headers.substr(match.index + match[0].length);\n headers = headers.substr(0, match.index);\n if (remainder) {\n socket.unshift(Buffer.from(remainder, 'binary'));\n }\n\n // proxy connection is now established\n finished = true;\n\n // check response code\n match = headers.match(/^HTTP\\/\\d+\\.\\d+ (\\d+)/i);\n if (!match || (match[1] || '').charAt(0) !== '2') {\n try {\n socket.destroy();\n } catch (_E) {\n // ignore\n }\n const err = new Error('Invalid response from proxy' + ((match && ': ' + match[1]) || ''));\n err.code = errors.EPROXY;\n return callback(err);\n }\n\n socket.removeListener('error', tempSocketErr);\n socket.removeListener('timeout', timeoutErr);\n socket.setTimeout(0);\n\n return callback(null, socket);\n }\n };\n socket.on('data', onSocketData);\n });\n\n socket.setTimeout(httpProxyClient.timeout || 30 * 1000);\n socket.on('timeout', timeoutErr);\n\n socket.once('error', tempSocketErr);\n}\n\nmodule.exports = httpProxyClient;\n","'use strict';\n\nconst shared = require('../shared');\nconst MimeNode = require('../mime-node');\nconst mimeFuncs = require('../mime-funcs');\n\nclass MailMessage {\n constructor(mailer, data) {\n this.mailer = mailer;\n this.data = {};\n this.message = null;\n\n data = data || {};\n const options = mailer.options || {};\n const defaults = mailer._defaults || {};\n\n Object.assign(this.data, data);\n\n this.data.headers = this.data.headers || {};\n\n // apply defaults\n Object.keys(defaults).forEach(key => {\n if (!(key in this.data)) {\n this.data[key] = defaults[key];\n } else if (key === 'headers') {\n // headers is a special case. Allow setting individual default headers\n Object.keys(defaults.headers).forEach(key => {\n if (!(key in this.data.headers)) {\n this.data.headers[key] = defaults.headers[key];\n }\n });\n }\n });\n\n // force specific keys from transporter options\n ['disableFileAccess', 'disableUrlAccess', 'normalizeHeaderKey'].forEach(key => {\n if (key in options) {\n this.data[key] = options[key];\n }\n });\n }\n\n resolveContent(...args) {\n return shared.resolveContent(...args);\n }\n\n resolveAll(callback) {\n const keys = [\n [this.data, 'html'],\n [this.data, 'text'],\n [this.data, 'watchHtml'],\n [this.data, 'amp'],\n [this.data, 'icalEvent']\n ];\n\n if (this.data.alternatives && this.data.alternatives.length) {\n this.data.alternatives.forEach((alternative, i) => {\n keys.push([this.data.alternatives, i]);\n });\n }\n\n if (this.data.attachments && this.data.attachments.length) {\n this.data.attachments.forEach((attachment, i) => {\n if (!attachment.filename) {\n attachment.filename =\n (attachment.path || attachment.href || '').split('/').pop().split('?').shift() || 'attachment-' + (i + 1);\n if (attachment.filename.indexOf('.') < 0) {\n attachment.filename += '.' + mimeFuncs.detectExtension(attachment.contentType);\n }\n }\n\n if (!attachment.contentType) {\n attachment.contentType = mimeFuncs.detectMimeType(attachment.filename || attachment.path || attachment.href || 'bin');\n }\n\n keys.push([this.data.attachments, i]);\n });\n }\n\n const mimeNode = new MimeNode();\n\n const addressKeys = ['from', 'to', 'cc', 'bcc', 'sender', 'replyTo'];\n\n addressKeys.forEach(address => {\n let value;\n if (this.message) {\n value = [].concat(mimeNode._parseAddresses(this.message.getHeader(address === 'replyTo' ? 'reply-to' : address)) || []);\n } else if (this.data[address]) {\n value = [].concat(mimeNode._parseAddresses(this.data[address]) || []);\n }\n if (value && value.length) {\n this.data[address] = value;\n } else if (address in this.data) {\n this.data[address] = null;\n }\n });\n\n const singleKeys = ['from', 'sender'];\n singleKeys.forEach(address => {\n if (this.data[address]) {\n this.data[address] = this.data[address].shift();\n }\n });\n\n let pos = 0;\n const resolveNext = () => {\n if (pos >= keys.length) {\n return callback(null, this.data);\n }\n const args = keys[pos++];\n if (!args[0] || !args[0][args[1]]) {\n return resolveNext();\n }\n shared.resolveContent(...args, (err, value) => {\n if (err) {\n return callback(err);\n }\n\n const node = {\n content: value\n };\n if (args[0][args[1]] && typeof args[0][args[1]] === 'object' && !Buffer.isBuffer(args[0][args[1]])) {\n Object.keys(args[0][args[1]]).forEach(key => {\n if (!(key in node) && !['content', 'path', 'href', 'raw'].includes(key)) {\n node[key] = args[0][args[1]][key];\n }\n });\n }\n\n args[0][args[1]] = node;\n resolveNext();\n });\n };\n\n setImmediate(() => resolveNext());\n }\n\n normalize(callback) {\n const envelope = this.data.envelope || this.message.getEnvelope();\n const messageId = this.message.messageId();\n\n this.resolveAll((err, data) => {\n if (err) {\n return callback(err);\n }\n\n data.envelope = envelope;\n data.messageId = messageId;\n\n ['html', 'text', 'watchHtml', 'amp'].forEach(key => {\n if (data[key] && data[key].content) {\n if (typeof data[key].content === 'string') {\n data[key] = data[key].content;\n } else if (Buffer.isBuffer(data[key].content)) {\n data[key] = data[key].content.toString();\n }\n }\n });\n\n if (data.icalEvent && Buffer.isBuffer(data.icalEvent.content)) {\n data.icalEvent.content = data.icalEvent.content.toString('base64');\n data.icalEvent.encoding = 'base64';\n }\n\n if (data.alternatives && data.alternatives.length) {\n data.alternatives.forEach(alternative => {\n if (alternative && alternative.content && Buffer.isBuffer(alternative.content)) {\n alternative.content = alternative.content.toString('base64');\n alternative.encoding = 'base64';\n }\n });\n }\n\n if (data.attachments && data.attachments.length) {\n data.attachments.forEach(attachment => {\n if (attachment && attachment.content && Buffer.isBuffer(attachment.content)) {\n attachment.content = attachment.content.toString('base64');\n attachment.encoding = 'base64';\n }\n });\n }\n\n data.normalizedHeaders = {};\n Object.keys(data.headers || {}).forEach(key => {\n let value = [].concat(data.headers[key] || []).shift();\n value = (value && value.value) || value;\n if (value) {\n if (['references', 'in-reply-to', 'message-id', 'content-id'].includes(key)) {\n value = this.message._encodeHeaderValue(key, value);\n }\n data.normalizedHeaders[key] = value;\n }\n });\n\n if (data.list && typeof data.list === 'object') {\n const listHeaders = this._getListHeaders(data.list);\n listHeaders.forEach(entry => {\n data.normalizedHeaders[entry.key] = entry.value.map(val => (val && val.value) || val).join(', ');\n });\n }\n\n if (data.references) {\n data.normalizedHeaders.references = this.message._encodeHeaderValue('references', data.references);\n }\n\n if (data.inReplyTo) {\n data.normalizedHeaders['in-reply-to'] = this.message._encodeHeaderValue('in-reply-to', data.inReplyTo);\n }\n\n return callback(null, data);\n });\n }\n\n setMailerHeader() {\n if (!this.message || !this.data.xMailer) {\n return;\n }\n this.message.setHeader('X-Mailer', this.data.xMailer);\n }\n\n setPriorityHeaders() {\n if (!this.message || !this.data.priority) {\n return;\n }\n switch ((this.data.priority || '').toString().toLowerCase()) {\n case 'high':\n this.message.setHeader('X-Priority', '1 (Highest)');\n this.message.setHeader('X-MSMail-Priority', 'High');\n this.message.setHeader('Importance', 'High');\n break;\n case 'low':\n this.message.setHeader('X-Priority', '5 (Lowest)');\n this.message.setHeader('X-MSMail-Priority', 'Low');\n this.message.setHeader('Importance', 'Low');\n break;\n default:\n // do not add anything, since all messages are 'Normal' by default\n }\n }\n\n setListHeaders() {\n if (!this.message || !this.data.list || typeof this.data.list !== 'object') {\n return;\n }\n // add optional List-* headers\n this._getListHeaders(this.data.list).forEach(listHeader => {\n listHeader.value.forEach(value => {\n this.message.addHeader(listHeader.key, value);\n });\n });\n }\n\n _getListHeaders(listData) {\n // make sure an url looks like <protocol:url>\n return Object.keys(listData).map(key => ({\n key: 'list-' + key.toLowerCase().trim(),\n value: [].concat(listData[key] || []).map(value => ({\n prepared: true,\n foldLines: true,\n value: []\n .concat(value || [])\n .map(value => {\n if (typeof value === 'string') {\n value = {\n url: value\n };\n }\n\n if (value && value.url) {\n if (key.toLowerCase().trim() === 'id') {\n // List-ID: \"comment\" <domain>\n let comment = value.comment || '';\n if (mimeFuncs.isPlainText(comment)) {\n comment = '\"' + comment + '\"';\n } else {\n comment = mimeFuncs.encodeWord(comment);\n }\n\n return (value.comment ? comment + ' ' : '') + this._formatListUrl(value.url).replace(/^<[^:]+\\/{,2}/, '');\n }\n\n // List-*: <http://domain> (comment)\n let comment = value.comment || '';\n if (!mimeFuncs.isPlainText(comment)) {\n comment = mimeFuncs.encodeWord(comment);\n }\n\n return this._formatListUrl(value.url) + (value.comment ? ' (' + comment + ')' : '');\n }\n\n return '';\n })\n .filter(value => value)\n .join(', ')\n }))\n }));\n }\n\n _formatListUrl(url) {\n url = url.replace(/[\\s<]+|[\\s>]+/g, '');\n if (/^(https?|mailto|ftp):/.test(url)) {\n return '<' + url + '>';\n }\n if (/^[^@]+@[^@]+$/.test(url)) {\n return '<mailto:' + url + '>';\n }\n\n return '<http://' + url + '>';\n }\n}\n\nmodule.exports = MailMessage;\n","'use strict';\n\nconst EventEmitter = require('events');\nconst shared = require('../shared');\nconst mimeTypes = require('../mime-funcs/mime-types');\nconst MailComposer = require('../mail-composer');\nconst DKIM = require('../dkim');\nconst httpProxyClient = require('../smtp-connection/http-proxy-client');\nconst errors = require('../errors');\nconst util = require('util');\nconst urllib = require('url');\nconst packageData = require('../../package.json');\nconst MailMessage = require('./mail-message');\nconst net = require('net');\nconst dns = require('dns');\nconst crypto = require('crypto');\n\n/**\n * Creates an object for exposing the Mail API\n *\n * @constructor\n * @param {Object} transporter Transport object instance to pass the mails to\n */\nclass Mail extends EventEmitter {\n constructor(transporter, options, defaults) {\n super();\n\n this.options = options || {};\n this._defaults = defaults || {};\n\n this._defaultPlugins = {\n compile: [(...args) => this._convertDataImages(...args)],\n stream: []\n };\n\n this._userPlugins = {\n compile: [],\n stream: []\n };\n\n this.meta = new Map();\n\n this.dkim = this.options.dkim ? new DKIM(this.options.dkim) : false;\n\n this.transporter = transporter;\n this.transporter.mailer = this;\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'mail'\n });\n\n this.logger.debug(\n {\n tnx: 'create'\n },\n 'Creating transport: %s',\n this.getVersionString()\n );\n\n // setup emit handlers for the transporter\n if (typeof this.transporter.on === 'function') {\n // deprecated log interface\n this.transporter.on('log', log => {\n this.logger.debug(\n {\n tnx: 'transport'\n },\n '%s: %s',\n log.type,\n log.message\n );\n });\n\n // transporter errors\n this.transporter.on('error', err => {\n this.logger.error(\n {\n err,\n tnx: 'transport'\n },\n 'Transport Error: %s',\n err.message\n );\n this.emit('error', err);\n });\n\n // indicates if the sender has became idle\n this.transporter.on('idle', (...args) => {\n this.emit('idle', ...args);\n });\n\n // indicates if the sender has became idle and all connections are terminated\n this.transporter.on('clear', (...args) => {\n this.emit('clear', ...args);\n });\n }\n\n /**\n * Optional methods passed to the underlying transport object\n */\n ['close', 'isIdle', 'verify'].forEach(method => {\n this[method] = (...args) => {\n if (typeof this.transporter[method] === 'function') {\n if (method === 'verify' && typeof this.getSocket === 'function') {\n this.transporter.getSocket = this.getSocket;\n this.getSocket = false;\n }\n return this.transporter[method](...args);\n }\n\n this.logger.warn(\n {\n tnx: 'transport',\n methodName: method\n },\n 'Non existing method %s called for transport',\n method\n );\n return false;\n };\n });\n\n // setup proxy handling\n if (this.options.proxy && typeof this.options.proxy === 'string') {\n this.setupProxy(this.options.proxy);\n }\n }\n\n use(step, plugin) {\n step = (step || '').toString();\n if (!this._userPlugins.hasOwnProperty(step)) {\n this._userPlugins[step] = [plugin];\n } else {\n this._userPlugins[step].push(plugin);\n }\n\n return this;\n }\n\n /**\n * Sends an email using the preselected transport object\n *\n * @param {Object} data E-data description\n * @param {Function?} callback Callback to run once the sending succeeded or failed\n */\n sendMail(data, callback = null) {\n let promise;\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = shared.callbackPromise(resolve, reject);\n });\n }\n\n if (typeof this.getSocket === 'function') {\n this.transporter.getSocket = this.getSocket;\n this.getSocket = false;\n }\n\n const mail = new MailMessage(this, data);\n\n this.logger.debug(\n {\n tnx: 'transport',\n name: this.transporter.name,\n version: this.transporter.version,\n action: 'send'\n },\n 'Sending mail using %s/%s',\n this.transporter.name,\n this.transporter.version\n );\n\n this._processPlugins('compile', mail, err => {\n if (err) {\n this.logger.error(\n {\n err,\n tnx: 'plugin',\n action: 'compile'\n },\n 'PluginCompile Error: %s',\n err.message\n );\n return callback(err);\n }\n\n mail.message = new MailComposer(mail.data).compile();\n\n mail.setMailerHeader();\n mail.setPriorityHeaders();\n mail.setListHeaders();\n\n this._processPlugins('stream', mail, err => {\n if (err) {\n this.logger.error(\n {\n err,\n tnx: 'plugin',\n action: 'stream'\n },\n 'PluginStream Error: %s',\n err.message\n );\n return callback(err);\n }\n\n if (mail.data.dkim || this.dkim) {\n mail.message.processFunc(input => {\n const dkim = mail.data.dkim ? new DKIM(mail.data.dkim) : this.dkim;\n this.logger.debug(\n {\n tnx: 'DKIM',\n messageId: mail.message.messageId(),\n dkimDomains: dkim.keys.map(key => key.keySelector + '.' + key.domainName).join(', ')\n },\n 'Signing outgoing message with %s keys',\n dkim.keys.length\n );\n return dkim.sign(input, mail.data._dkim);\n });\n }\n\n this.transporter.send(mail, (...args) => {\n if (args[0]) {\n this.logger.error(\n {\n err: args[0],\n tnx: 'transport',\n action: 'send'\n },\n 'Send Error: %s',\n args[0].message\n );\n }\n callback(...args);\n });\n });\n });\n\n return promise;\n }\n\n getVersionString() {\n return util.format(\n '%s (%s; +%s; %s/%s)',\n packageData.name,\n packageData.version,\n packageData.homepage,\n this.transporter.name,\n this.transporter.version\n );\n }\n\n _processPlugins(step, mail, callback) {\n step = (step || '').toString();\n\n if (!this._userPlugins.hasOwnProperty(step)) {\n return callback();\n }\n\n const userPlugins = this._userPlugins[step] || [];\n const defaultPlugins = this._defaultPlugins[step] || [];\n\n if (userPlugins.length) {\n this.logger.debug(\n {\n tnx: 'transaction',\n pluginCount: userPlugins.length,\n step\n },\n 'Using %s plugins for %s',\n userPlugins.length,\n step\n );\n }\n\n if (userPlugins.length + defaultPlugins.length === 0) {\n return callback();\n }\n\n let pos = 0;\n let block = 'default';\n const processPlugins = () => {\n let curplugins = block === 'default' ? defaultPlugins : userPlugins;\n if (pos >= curplugins.length) {\n if (block === 'default' && userPlugins.length) {\n block = 'user';\n pos = 0;\n curplugins = userPlugins;\n } else {\n return callback();\n }\n }\n const plugin = curplugins[pos++];\n plugin(mail, err => {\n if (err) {\n return callback(err);\n }\n processPlugins();\n });\n };\n\n processPlugins();\n }\n\n /**\n * Sets up proxy handler for a Nodemailer object\n *\n * @param {String} proxyUrl Proxy configuration url\n */\n setupProxy(proxyUrl) {\n const proxy = urllib.parse(proxyUrl);\n\n // setup socket handler for the mailer object\n this.getSocket = (options, callback) => {\n const protocol = proxy.protocol.replace(/:$/, '').toLowerCase();\n\n if (this.meta.has('proxy_handler_' + protocol)) {\n return this.meta.get('proxy_handler_' + protocol)(proxy, options, callback);\n }\n\n switch (protocol) {\n // Connect using a HTTP CONNECT method\n case 'http':\n case 'https':\n httpProxyClient(proxy.href, options.port, options.host, (err, socket) => {\n if (err) {\n return callback(err);\n }\n return callback(null, {\n connection: socket\n });\n });\n return;\n case 'socks':\n case 'socks5':\n case 'socks4':\n case 'socks4a': {\n if (!this.meta.has('proxy_socks_module')) {\n let err = new Error('Socks module not loaded');\n err.code = errors.EPROXY;\n return callback(err);\n }\n const connect = ipaddress => {\n const proxyV2 = !!this.meta.get('proxy_socks_module').SocksClient;\n const socksClient = proxyV2 ? this.meta.get('proxy_socks_module').SocksClient : this.meta.get('proxy_socks_module');\n const proxyType = Number(proxy.protocol.replace(/\\D/g, '')) || 5;\n const connectionOpts = {\n proxy: {\n ipaddress,\n port: Number(proxy.port),\n type: proxyType\n },\n [proxyV2 ? 'destination' : 'target']: {\n host: options.host,\n port: options.port\n },\n command: 'connect'\n };\n\n if (proxy.auth) {\n const username = decodeURIComponent(proxy.auth.split(':').shift());\n const password = decodeURIComponent(proxy.auth.split(':').pop());\n if (proxyV2) {\n connectionOpts.proxy.userId = username;\n connectionOpts.proxy.password = password;\n } else if (proxyType === 4) {\n connectionOpts.userid = username;\n } else {\n connectionOpts.authentication = {\n username,\n password\n };\n }\n }\n\n socksClient.createConnection(connectionOpts, (err, info) => {\n if (err) {\n return callback(err);\n }\n return callback(null, {\n connection: info.socket || info\n });\n });\n };\n\n if (net.isIP(proxy.hostname)) {\n return connect(proxy.hostname);\n }\n\n return dns.resolve(proxy.hostname, (err, address) => {\n if (err) {\n return callback(err);\n }\n connect(Array.isArray(address) ? address[0] : address);\n });\n }\n }\n let err = new Error('Unknown proxy configuration');\n err.code = errors.EPROXY;\n callback(err);\n };\n }\n\n _convertDataImages(mail, callback) {\n if ((!this.options.attachDataUrls && !mail.data.attachDataUrls) || !mail.data.html) {\n return callback();\n }\n mail.resolveContent(mail.data, 'html', (err, html) => {\n if (err) {\n return callback(err);\n }\n let cidCounter = 0;\n html = (html || '')\n .toString()\n .replace(/(<img\\b[^<>]{0,1024} src\\s{0,20}=[\\s\"']{0,20})(data:([^;]+);[^\"'>\\s]+)/gi, (match, prefix, dataUri, mimeType) => {\n const cid = crypto.randomBytes(10).toString('hex') + '@localhost';\n if (!mail.data.attachments) {\n mail.data.attachments = [];\n }\n if (!Array.isArray(mail.data.attachments)) {\n mail.data.attachments = [].concat(mail.data.attachments || []);\n }\n mail.data.attachments.push({\n path: dataUri,\n cid,\n filename: 'image-' + ++cidCounter + '.' + mimeTypes.detectExtension(mimeType)\n });\n return prefix + 'cid:' + cid;\n });\n mail.data.html = html;\n callback();\n });\n }\n\n set(key, value) {\n return this.meta.set(key, value);\n }\n\n get(key) {\n return this.meta.get(key);\n }\n}\n\nmodule.exports = Mail;\n","'use strict';\n\nconst { Transform } = require('stream');\n\n/**\n * Escapes dots in the beginning of lines. Ends the stream with <CR><LF>.<CR><LF>\n * Also makes sure that only <CR><LF> sequences are used for linebreaks\n *\n * @param {Object} options Stream options\n */\nclass DataStream extends Transform {\n constructor(options) {\n super(options);\n this.options = options || {};\n\n this.inByteCount = 0;\n this.outByteCount = 0;\n this.lastByte = false;\n }\n\n /**\n * Escapes dots\n */\n _transform(chunk, encoding, done) {\n const chunks = [];\n let chunklen = 0;\n let i,\n len,\n lastPos = 0;\n let buf;\n\n if (!chunk || !chunk.length) {\n return done();\n }\n\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk);\n }\n\n this.inByteCount += chunk.length;\n\n for (i = 0, len = chunk.length; i < len; i++) {\n if (chunk[i] === 0x2e) {\n // .\n if ((i && chunk[i - 1] === 0x0a) || (!i && (!this.lastByte || this.lastByte === 0x0a))) {\n buf = chunk.slice(lastPos, i + 1);\n chunks.push(buf);\n chunks.push(Buffer.from('.'));\n chunklen += buf.length + 1;\n lastPos = i + 1;\n }\n } else if (chunk[i] === 0x0a) {\n // \\n\n if ((i && chunk[i - 1] !== 0x0d) || (!i && this.lastByte !== 0x0d)) {\n if (i > lastPos) {\n buf = chunk.slice(lastPos, i);\n chunks.push(buf);\n chunklen += buf.length + 2;\n } else {\n chunklen += 2;\n }\n chunks.push(Buffer.from('\\r\\n'));\n lastPos = i + 1;\n }\n }\n }\n\n if (chunklen) {\n // add last piece\n if (lastPos < chunk.length) {\n buf = chunk.slice(lastPos);\n chunks.push(buf);\n chunklen += buf.length;\n }\n\n this.outByteCount += chunklen;\n this.push(Buffer.concat(chunks, chunklen));\n } else {\n this.outByteCount += chunk.length;\n this.push(chunk);\n }\n\n this.lastByte = chunk[chunk.length - 1];\n done();\n }\n\n /**\n * Finalizes the stream with a dot on a single line\n */\n _flush(done) {\n let buf;\n if (this.lastByte === 0x0a) {\n buf = Buffer.from('.\\r\\n');\n } else if (this.lastByte === 0x0d) {\n buf = Buffer.from('\\n.\\r\\n');\n } else {\n buf = Buffer.from('\\r\\n.\\r\\n');\n }\n this.outByteCount += buf.length;\n this.push(buf);\n done();\n }\n}\n\nmodule.exports = DataStream;\n","'use strict';\n\nconst packageInfo = require('../../package.json');\nconst { EventEmitter } = require('events');\nconst net = require('net');\nconst tls = require('tls');\nconst os = require('os');\nconst crypto = require('crypto');\nconst DataStream = require('./data-stream');\nconst { PassThrough } = require('stream');\nconst shared = require('../shared');\n\n// default timeout values in ms\nconst CONNECTION_TIMEOUT = 2 * 60 * 1000; // how much to wait for the connection to be established\nconst SOCKET_TIMEOUT = 10 * 60 * 1000; // how much to wait for socket inactivity before disconnecting the client\nconst GREETING_TIMEOUT = 30 * 1000; // how much to wait after connection is established but SMTP greeting is not receieved\nconst DNS_TIMEOUT = 30 * 1000; // how much to wait for resolveHostname\nconst TEARDOWN_NOOP = () => {}; // reusable no-op handler for absorbing errors during socket teardown\n\n/**\n * Re-interpret a server response stored in fake 8-bit byte-container form\n * (the result of chunk.toString('binary') in _onData) as UTF-8.\n *\n * Server reply text has no formally defined charset (RFC 5321 §4.2.1), but\n * modern MTAs commonly use UTF-8. The byte-container plumbing in _onData is\n * required to reassemble multi-byte sequences split across socket chunks;\n * this helper performs the actual decode at the line boundary, falling back\n * to the byte-container form when the bytes are not valid UTF-8 so that\n * legacy 8-bit replies are still recoverable byte-for-byte.\n */\nfunction decodeServerResponse(str) {\n if (!str) {\n return str;\n }\n const utf8 = Buffer.from(str, 'binary').toString('utf8');\n // The input is a byte container (each char is in U+0000..U+00FF) so it can never\n // already contain U+FFFD; any \\uFFFD in the result was inserted by Node's UTF-8\n // decoder for invalid bytes, which means we should return the original bytes intact.\n return utf8.includes('\\uFFFD') ? str : utf8;\n}\n\n/**\n * Generates a SMTP connection object\n *\n * Optional options object takes the following possible properties:\n *\n * * **port** - is the port to connect to (defaults to 587 or 465)\n * * **host** - is the hostname or IP address to connect to (defaults to 'localhost')\n * * **secure** - use SSL\n * * **ignoreTLS** - ignore server support for STARTTLS\n * * **requireTLS** - forces the client to use STARTTLS\n * * **name** - the name of the client server\n * * **localAddress** - outbound address to bind to (see: http://nodejs.org/api/net.html#net_net_connect_options_connectionlistener)\n * * **greetingTimeout** - Time to wait in ms until greeting message is received from the server (defaults to 10000)\n * * **connectionTimeout** - how many milliseconds to wait for the connection to establish\n * * **socketTimeout** - Time of inactivity until the connection is closed (defaults to 1 hour)\n * * **dnsTimeout** - Time to wait in ms for the DNS requests to be resolved (defaults to 30 seconds)\n * * **lmtp** - if true, uses LMTP instead of SMTP protocol\n * * **logger** - bunyan compatible logger interface\n * * **debug** - if true pass SMTP traffic to the logger\n * * **tls** - options for createCredentials\n * * **socket** - existing socket to use instead of creating a new one (see: http://nodejs.org/api/net.html#net_class_net_socket)\n * * **secured** - boolean indicates that the provided socket has already been upgraded to tls\n *\n * @constructor\n * @namespace SMTP Client module\n * @param {Object} [options] Option properties\n */\nclass SMTPConnection extends EventEmitter {\n constructor(options) {\n super(options);\n\n this.id = crypto.randomBytes(8).toString('base64').replace(/\\W/g, '');\n this.stage = 'init';\n\n this.options = options || {};\n\n this.secureConnection = !!this.options.secure;\n this.alreadySecured = !!this.options.secured;\n\n this.port = Number(this.options.port) || (this.secureConnection ? 465 : 587);\n this.host = this.options.host || 'localhost';\n\n this.servername = this.options.servername ? this.options.servername : !net.isIP(this.host) ? this.host : false;\n\n this.allowInternalNetworkInterfaces = this.options.allowInternalNetworkInterfaces || false;\n\n if (typeof this.options.secure === 'undefined' && this.port === 465) {\n // if secure option is not set but port is 465, then default to secure\n this.secureConnection = true;\n }\n\n this.name = (this.options.name || this._getHostname()).toString().replace(/[\\r\\n]+/g, '');\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'smtp-connection',\n sid: this.id\n });\n\n this.customAuth = new Map();\n for (const key of Object.keys(this.options.customAuth || {})) {\n const mapKey = (key || '').toString().trim().toUpperCase();\n if (mapKey) {\n this.customAuth.set(mapKey, this.options.customAuth[key]);\n }\n }\n\n /**\n * Expose version nr, just for the reference\n * @type {String}\n */\n this.version = packageInfo.version;\n\n /**\n * If true, then the user is authenticated\n * @type {Boolean}\n */\n this.authenticated = false;\n\n /**\n * If set to true, this instance is no longer active\n * @private\n */\n this.destroyed = false;\n\n /**\n * Defines if the current connection is secure or not. If not,\n * STARTTLS can be used if available\n * @private\n */\n this.secure = !!this.secureConnection;\n\n /**\n * Store incomplete messages coming from the server\n * @private\n */\n this._remainder = '';\n\n /**\n * Unprocessed responses from the server\n * @type {Array}\n */\n this._responseQueue = [];\n\n this.lastServerResponse = false;\n\n /**\n * The socket connecting to the server\n * @public\n */\n this._socket = false;\n\n /**\n * Lists supported auth mechanisms\n * @private\n */\n this._supportedAuth = [];\n\n /**\n * Set to true, if EHLO response includes \"AUTH\".\n * If false then authentication is not tried\n */\n this.allowsAuth = false;\n\n /**\n * Includes current envelope (from, to)\n * @private\n */\n this._envelope = false;\n\n /**\n * Lists supported extensions\n * @private\n */\n this._supportedExtensions = [];\n\n /**\n * Defines the maximum allowed size for a single message\n * @private\n */\n this._maxAllowedSize = 0;\n\n /**\n * Function queue to run if a data chunk comes from the server\n * @private\n */\n this._responseActions = [];\n this._recipientQueue = [];\n\n /**\n * Timeout variable for waiting the greeting\n * @private\n */\n this._greetingTimeout = false;\n\n /**\n * Timeout variable for waiting the connection to start\n * @private\n */\n this._connectionTimeout = false;\n\n /**\n * If the socket is deemed already closed\n * @private\n */\n this._destroyed = false;\n\n /**\n * If the socket is already being closed\n * @private\n */\n this._closing = false;\n\n /**\n * Callbacks for socket's listeners\n */\n this._onSocketData = chunk => this._onData(chunk);\n this._onSocketError = error => this._onError(error, 'ESOCKET', false, 'CONN');\n this._onSocketClose = () => this._onClose();\n this._onSocketEnd = () => this._onEnd();\n this._onSocketTimeout = () => this._onTimeout();\n\n /**\n * Connection-phase error handler (supports fallback to alternative addresses)\n */\n this._onConnectionSocketError = err => this._onConnectionError(err, 'ESOCKET');\n\n /**\n * Connection attempt counter for fallback race condition protection\n * @private\n */\n this._connectionAttemptId = 0;\n }\n\n /**\n * Creates a connection to a SMTP server and sets up connection\n * listener\n */\n connect(connectCallback) {\n if (typeof connectCallback === 'function') {\n this.once('connect', () => {\n this.logger.debug(\n {\n tnx: 'smtp'\n },\n 'SMTP handshake finished'\n );\n connectCallback();\n });\n\n const isDestroyedMessage = this._isDestroyedMessage('connect');\n if (isDestroyedMessage) {\n return connectCallback(this._formatError(isDestroyedMessage, 'ECONNECTION', false, 'CONN'));\n }\n }\n\n let opts = {\n port: this.port,\n host: this.host,\n allowInternalNetworkInterfaces: this.allowInternalNetworkInterfaces,\n timeout: this.options.dnsTimeout || DNS_TIMEOUT\n };\n\n if (this.options.localAddress) {\n opts.localAddress = this.options.localAddress;\n }\n\n if (this.options.connection) {\n // connection is already opened\n this._socket = this.options.connection;\n this._setupConnectionHandlers();\n\n if (this.secureConnection && !this.alreadySecured) {\n setImmediate(() =>\n this._upgradeConnection(err => {\n if (err) {\n this._onError(new Error('Error initiating TLS - ' + (err.message || err)), 'ETLS', false, 'CONN');\n return;\n }\n this._onConnect();\n })\n );\n } else {\n setImmediate(() => this._onConnect());\n }\n return;\n } else if (this.options.socket) {\n // socket object is set up but not yet connected\n this._socket = this.options.socket;\n return this._resolveAndConnect(opts, _resolved => {\n try {\n this._socket.connect(this.port, this.host, () => {\n this._socket.setKeepAlive(true);\n this._onConnect();\n });\n this._setupConnectionHandlers();\n } catch (E) {\n return setImmediate(() => this._onError(E, 'ECONNECTION', false, 'CONN'));\n }\n });\n } else {\n if (this.secureConnection) {\n Object.assign(opts, this.options.tls || {});\n\n // ensure servername for SNI\n if (this.servername && !opts.servername) {\n opts.servername = this.servername;\n }\n }\n\n return this._resolveAndConnect(opts, resolved => {\n // Store fallback addresses for retry on connection failure\n this._fallbackAddresses = (resolved._addresses || []).filter(addr => addr !== opts.host);\n this._connectOpts = Object.assign({}, opts);\n\n this._connectToHost(opts, this.secureConnection);\n });\n }\n }\n\n /**\n * Resolves the hostname and applies resolved values to opts,\n * then calls the provided callback with the resolved data\n *\n * @param {Object} opts Connection options (modified in place)\n * @param {Function} callback Called with resolved data on success\n */\n _resolveAndConnect(opts, callback) {\n return shared.resolveHostname(opts, (err, resolved) => {\n if (err) {\n return setImmediate(() => this._onError(err, 'EDNS', false, 'CONN'));\n }\n this.logger.debug(\n {\n tnx: 'dns',\n source: opts.host,\n resolved: resolved.host,\n cached: !!resolved.cached\n },\n 'Resolved %s as %s [cache %s]',\n opts.host,\n resolved.host,\n resolved.cached ? 'hit' : 'miss'\n );\n for (const key of Object.keys(resolved)) {\n if (key.charAt(0) !== '_' && resolved[key]) {\n opts[key] = resolved[key];\n }\n }\n callback(resolved);\n });\n }\n\n /**\n * Attempts to connect to the specified host address\n *\n * @param {Object} opts Connection options\n * @param {Boolean} secure Whether to use TLS\n */\n _connectToHost(opts, secure) {\n this._connectionAttemptId++;\n const currentAttemptId = this._connectionAttemptId;\n\n const connectFn = secure ? tls.connect : net.connect;\n try {\n this._socket = connectFn(opts, () => {\n // Ignore callback if this is a stale connection attempt\n if (this._connectionAttemptId !== currentAttemptId) {\n return;\n }\n this._socket.setKeepAlive(true);\n this._onConnect();\n });\n this._setupConnectionHandlers();\n } catch (E) {\n return setImmediate(() => this._onError(E, 'ECONNECTION', false, 'CONN'));\n }\n }\n\n /**\n * Sets up connection timeout and error handlers\n */\n _setupConnectionHandlers() {\n this._connectionTimeout = setTimeout(() => {\n this._onConnectionError('Connection timeout', 'ETIMEDOUT');\n }, this.options.connectionTimeout || CONNECTION_TIMEOUT);\n\n this._socket.on('error', this._onConnectionSocketError);\n }\n\n /**\n * Handles connection errors with fallback to alternative addresses\n *\n * @param {Error|String} err Error object or message\n * @param {String} code Error code\n */\n _onConnectionError(err, code) {\n clearTimeout(this._connectionTimeout);\n\n // Check if we have fallback addresses to try\n const canFallback = this._fallbackAddresses && this._fallbackAddresses.length && this.stage === 'init' && !this._destroyed;\n\n if (!canFallback) {\n // No more fallback addresses, report the error\n this._onError(err, code, false, 'CONN');\n return;\n }\n\n const nextHost = this._fallbackAddresses.shift();\n\n this.logger.info(\n {\n tnx: 'network',\n failedHost: this._connectOpts.host,\n nextHost,\n error: err.message || err\n },\n 'Connection to %s failed, trying %s',\n this._connectOpts.host,\n nextHost\n );\n\n // Clean up current socket\n if (this._socket) {\n try {\n this._socket.removeListener('error', this._onConnectionSocketError);\n this._socket.destroy();\n } catch (_E) {\n // ignore\n }\n this._socket = null;\n }\n\n // Update host and retry\n this._connectOpts.host = nextHost;\n this._connectToHost(this._connectOpts, this.secureConnection);\n }\n\n /**\n * Sends QUIT\n */\n quit() {\n this._sendCommand('QUIT');\n this._responseActions.push(this.close);\n }\n\n /**\n * Closes the connection to the server\n */\n close() {\n clearTimeout(this._connectionTimeout);\n clearTimeout(this._greetingTimeout);\n this._responseActions = [];\n\n // allow to run this function only once\n if (this._closing) {\n return;\n }\n this._closing = true;\n\n const closeMethod = this.stage === 'init' ? 'destroy' : 'end';\n\n this.logger.debug(\n {\n tnx: 'smtp'\n },\n 'Closing connection to the server using \"%s\"',\n closeMethod\n );\n\n const socket = (this._socket && this._socket.socket) || this._socket;\n\n if (socket && !socket.destroyed) {\n try {\n // Clear socket timeout to prevent timer leaks\n socket.setTimeout(0);\n // Remove all listeners to allow proper garbage collection\n socket.removeListener('data', this._onSocketData);\n socket.removeListener('timeout', this._onSocketTimeout);\n socket.removeListener('close', this._onSocketClose);\n socket.removeListener('end', this._onSocketEnd);\n socket.removeListener('error', this._onSocketError);\n socket.removeListener('error', this._onConnectionSocketError);\n // Absorb errors that may fire during socket teardown (e.g. server\n // sending cleartext after TLS shutdown triggers ERR_SSL_BAD_RECORD_TYPE)\n socket.on('error', TEARDOWN_NOOP);\n socket[closeMethod]();\n } catch (_E) {\n // just ignore\n }\n }\n\n this._destroy();\n }\n\n /**\n * Authenticate user\n */\n login(authData, callback) {\n const isDestroyedMessage = this._isDestroyedMessage('login');\n if (isDestroyedMessage) {\n return callback(this._formatError(isDestroyedMessage, 'ECONNECTION', false, 'API'));\n }\n\n this._auth = authData || {};\n // Select SASL authentication method\n this._authMethod = (this._auth.method || '').toString().trim().toUpperCase() || false;\n\n if (!this._authMethod && this._auth.oauth2 && !this._auth.credentials) {\n this._authMethod = 'XOAUTH2';\n } else if (!this._authMethod || (this._authMethod === 'XOAUTH2' && !this._auth.oauth2)) {\n // use first supported\n this._authMethod = (this._supportedAuth[0] || 'PLAIN').toUpperCase().trim();\n }\n\n if (this._authMethod !== 'XOAUTH2' && (!this._auth.credentials || !this._auth.credentials.user || !this._auth.credentials.pass)) {\n if ((this._auth.user && this._auth.pass) || this.customAuth.has(this._authMethod)) {\n this._auth.credentials = {\n user: this._auth.user,\n pass: this._auth.pass,\n options: this._auth.options\n };\n } else {\n return callback(this._formatError('Missing credentials for \"' + this._authMethod + '\"', 'EAUTH', false, 'API'));\n }\n }\n\n if (this.customAuth.has(this._authMethod)) {\n const handler = this.customAuth.get(this._authMethod);\n let lastResponse;\n let returned = false;\n\n const resolve = () => {\n if (returned) {\n return;\n }\n returned = true;\n this.logger.info(\n {\n tnx: 'smtp',\n username: this._auth.user,\n action: 'authenticated',\n method: this._authMethod\n },\n 'User %s authenticated',\n JSON.stringify(this._auth.user)\n );\n this.authenticated = true;\n callback(null, true);\n };\n\n const reject = err => {\n if (returned) {\n return;\n }\n returned = true;\n callback(this._formatError(err, 'EAUTH', lastResponse, 'AUTH ' + this._authMethod));\n };\n\n const handlerResponse = handler({\n auth: this._auth,\n method: this._authMethod,\n\n extensions: [].concat(this._supportedExtensions),\n authMethods: [].concat(this._supportedAuth),\n maxAllowedSize: this._maxAllowedSize || false,\n\n sendCommand: (cmd, done) => {\n let promise;\n\n if (!done) {\n promise = new Promise((resolve, reject) => {\n done = shared.callbackPromise(resolve, reject);\n });\n }\n\n this._responseActions.push(str => {\n lastResponse = str;\n\n let codes = str.match(/^(\\d+)(?:\\s(\\d+\\.\\d+\\.\\d+))?\\s/);\n let data = {\n command: cmd,\n response: str\n };\n if (codes) {\n data.status = Number(codes[1]) || 0;\n if (codes[2]) {\n data.code = codes[2];\n }\n data.text = str.substr(codes[0].length);\n } else {\n data.text = str;\n data.status = 0; // just in case we need to perform numeric comparisons\n }\n done(null, data);\n });\n setImmediate(() => this._sendCommand(cmd));\n\n return promise;\n },\n\n resolve,\n reject\n });\n\n if (handlerResponse && typeof handlerResponse.catch === 'function') {\n // a promise was returned\n handlerResponse.then(resolve).catch(reject);\n }\n\n return;\n }\n\n switch (this._authMethod) {\n case 'XOAUTH2':\n this._handleXOauth2Token(false, callback);\n return;\n case 'LOGIN':\n this._responseActions.push(str => {\n this._actionAUTH_LOGIN_USER(str, callback);\n });\n this._sendCommand('AUTH LOGIN');\n return;\n case 'PLAIN':\n this._responseActions.push(str => {\n this._actionAUTHComplete(str, callback);\n });\n this._sendCommand(\n 'AUTH PLAIN ' +\n Buffer.from(\n //this._auth.user+'\\u0000'+\n '\\u0000' + // skip authorization identity as it causes problems with some servers\n this._auth.credentials.user +\n '\\u0000' +\n this._auth.credentials.pass,\n 'utf-8'\n ).toString('base64'),\n // log entry without passwords\n 'AUTH PLAIN ' +\n Buffer.from(\n //this._auth.user+'\\u0000'+\n '\\u0000' + // skip authorization identity as it causes problems with some servers\n this._auth.credentials.user +\n '\\u0000' +\n '/* secret */',\n 'utf-8'\n ).toString('base64')\n );\n return;\n case 'CRAM-MD5':\n this._responseActions.push(str => {\n this._actionAUTH_CRAM_MD5(str, callback);\n });\n this._sendCommand('AUTH CRAM-MD5');\n return;\n }\n\n return callback(this._formatError('Unknown authentication method \"' + this._authMethod + '\"', 'EAUTH', false, 'API'));\n }\n\n /**\n * Sends a message\n *\n * @param {Object} envelope Envelope object, {from: addr, to: [addr]}\n * @param {Object} message String, Buffer or a Stream\n * @param {Function} callback Callback to return once sending is completed\n */\n send(envelope, message, done) {\n if (!message) {\n return done(this._formatError('Empty message', 'EMESSAGE', false, 'API'));\n }\n\n const isDestroyedMessage = this._isDestroyedMessage('send message');\n if (isDestroyedMessage) {\n return done(this._formatError(isDestroyedMessage, 'ECONNECTION', false, 'API'));\n }\n\n // reject larger messages than allowed\n if (this._maxAllowedSize && envelope.size > this._maxAllowedSize) {\n return setImmediate(() => {\n done(this._formatError('Message size larger than allowed ' + this._maxAllowedSize, 'EMESSAGE', false, 'MAIL FROM'));\n });\n }\n\n // ensure that callback is only called once\n let returned = false;\n const callback = function () {\n if (returned) {\n return;\n }\n returned = true;\n\n done(...arguments);\n };\n\n if (typeof message.on === 'function') {\n message.on('error', err => callback(this._formatError(err, 'ESTREAM', false, 'API')));\n }\n\n const startTime = Date.now();\n this._setEnvelope(envelope, (err, info) => {\n if (err) {\n // create passthrough stream to consume to prevent OOM\n const stream = new PassThrough();\n if (typeof message.pipe === 'function') {\n message.pipe(stream);\n } else {\n stream.write(message);\n stream.end();\n }\n\n return callback(err);\n }\n const envelopeTime = Date.now();\n const stream = this._createSendStream((err, str) => {\n if (err) {\n return callback(err);\n }\n\n info.envelopeTime = envelopeTime - startTime;\n info.messageTime = Date.now() - envelopeTime;\n info.messageSize = stream.outByteCount;\n info.response = str;\n\n return callback(null, info);\n });\n if (typeof message.pipe === 'function') {\n message.pipe(stream);\n } else {\n stream.write(message);\n stream.end();\n }\n });\n }\n\n /**\n * Resets connection state\n *\n * @param {Function} callback Callback to return once connection is reset\n */\n reset(callback) {\n this._sendCommand('RSET');\n this._responseActions.push(str => {\n if (str.charAt(0) !== '2') {\n return callback(this._formatError('Could not reset session state. response=' + str, 'EPROTOCOL', str, 'RSET'));\n }\n this._envelope = false;\n return callback(null, true);\n });\n }\n\n /**\n * Connection listener that is run when the connection to\n * the server is opened\n *\n * @event\n */\n _onConnect() {\n clearTimeout(this._connectionTimeout);\n\n this.logger.info(\n {\n tnx: 'network',\n localAddress: this._socket.localAddress,\n localPort: this._socket.localPort,\n remoteAddress: this._socket.remoteAddress,\n remotePort: this._socket.remotePort\n },\n '%s established to %s:%s',\n this.secure ? 'Secure connection' : 'Connection',\n this._socket.remoteAddress,\n this._socket.remotePort\n );\n\n if (this._destroyed) {\n // Connection was established after we already had canceled it\n this.close();\n return;\n }\n\n this.stage = 'connected';\n\n // clear existing listeners for the socket\n this._socket.removeListener('data', this._onSocketData);\n this._socket.removeListener('timeout', this._onSocketTimeout);\n this._socket.removeListener('close', this._onSocketClose);\n this._socket.removeListener('end', this._onSocketEnd);\n // Switch from connection-phase error handler to normal error handler\n this._socket.removeListener('error', this._onConnectionSocketError);\n\n this._socket.on('error', this._onSocketError);\n this._socket.on('data', this._onSocketData);\n this._socket.once('close', this._onSocketClose);\n this._socket.once('end', this._onSocketEnd);\n\n this._socket.setTimeout(this.options.socketTimeout || SOCKET_TIMEOUT);\n this._socket.on('timeout', this._onSocketTimeout);\n\n this._greetingTimeout = setTimeout(() => {\n // if still waiting for greeting, give up\n if (this._socket && !this._destroyed && this._responseActions[0] === this._actionGreeting) {\n this._onError('Greeting never received', 'ETIMEDOUT', false, 'CONN');\n }\n }, this.options.greetingTimeout || GREETING_TIMEOUT);\n\n this._responseActions.push(this._actionGreeting);\n\n // we have a 'data' listener set up so resume socket if it was paused\n this._socket.resume();\n }\n\n /**\n * 'data' listener for data coming from the server\n *\n * @event\n * @param {Buffer} chunk Data chunk coming from the server\n */\n _onData(chunk) {\n if (this._destroyed || !chunk || !chunk.length) {\n return;\n }\n\n let data = (chunk || '').toString('binary');\n let lines = (this._remainder + data).split(/\\r?\\n/);\n let lastline;\n\n this._remainder = lines.pop();\n\n for (let i = 0, len = lines.length; i < len; i++) {\n if (this._responseQueue.length) {\n lastline = this._responseQueue[this._responseQueue.length - 1];\n if (/^\\d+-/.test(lastline.split('\\n').pop())) {\n this._responseQueue[this._responseQueue.length - 1] += '\\n' + lines[i];\n continue;\n }\n }\n this._responseQueue.push(lines[i]);\n }\n\n if (this._responseQueue.length) {\n lastline = this._responseQueue[this._responseQueue.length - 1];\n if (/^\\d+-/.test(lastline.split('\\n').pop())) {\n return;\n }\n }\n\n this._processResponse();\n }\n\n /**\n * 'error' listener for the socket\n *\n * @event\n * @param {Error} err Error object\n * @param {String} type Error name\n */\n _onError(err, type, data, command) {\n clearTimeout(this._connectionTimeout);\n clearTimeout(this._greetingTimeout);\n\n if (this._destroyed) {\n // just ignore, already closed\n // this might happen when a socket is canceled because of reached timeout\n // but the socket timeout error itself receives only after\n return;\n }\n\n err = this._formatError(err, type, data, command);\n\n const transientCodes = ['ETIMEDOUT', 'ESOCKET', 'ECONNECTION'];\n if (transientCodes.includes(err.code)) {\n this.logger.warn(data, err.message);\n } else {\n this.logger.error(data, err.message);\n }\n\n this.emit('error', err);\n this.close();\n }\n\n _formatError(message, type, response, command) {\n let err;\n\n if (/Error\\]$/i.test(Object.prototype.toString.call(message))) {\n err = message;\n } else {\n err = new Error(message);\n }\n\n if (type && type !== 'Error') {\n err.code = type;\n }\n\n if (response) {\n err.response = response;\n err.message += ': ' + response;\n }\n\n const responseCode = (typeof response === 'string' && Number((response.match(/^\\d+/) || [])[0])) || false;\n if (responseCode) {\n err.responseCode = responseCode;\n }\n\n if (command) {\n err.command = command;\n }\n\n return err;\n }\n\n /**\n * 'close' listener for the socket\n *\n * @event\n */\n _onClose() {\n let serverResponse = false;\n\n if (this._remainder && this._remainder.trim()) {\n this.lastServerResponse = serverResponse = decodeServerResponse(this._remainder.trim());\n if (this.options.debug || this.options.transactionLog) {\n this.logger.debug(\n {\n tnx: 'server'\n },\n serverResponse\n );\n }\n }\n\n this.logger.info(\n {\n tnx: 'network'\n },\n 'Connection closed'\n );\n\n if (this.upgrading && !this._destroyed) {\n return this._onError(new Error('Connection closed unexpectedly'), 'ETLS', serverResponse, 'CONN');\n } else if (![this._actionGreeting, this.close].includes(this._responseActions[0]) && !this._destroyed) {\n return this._onError(new Error('Connection closed unexpectedly'), 'ECONNECTION', serverResponse, 'CONN');\n } else if (/^[45]\\d{2}\\b/.test(serverResponse)) {\n return this._onError(new Error('Connection closed unexpectedly'), 'ECONNECTION', serverResponse, 'CONN');\n }\n\n this._destroy();\n }\n\n /**\n * 'end' listener for the socket\n *\n * @event\n */\n _onEnd() {\n if (this._socket && !this._socket.destroyed) {\n this._socket.destroy();\n }\n }\n\n /**\n * 'timeout' listener for the socket\n *\n * @event\n */\n _onTimeout() {\n return this._onError(new Error('Timeout'), 'ETIMEDOUT', false, 'CONN');\n }\n\n /**\n * Destroys the client, emits 'end'\n */\n _destroy() {\n if (this._destroyed) {\n return;\n }\n this._destroyed = true;\n this.emit('end');\n }\n\n /**\n * Upgrades the connection to TLS\n *\n * @param {Function} callback Callback function to run when the connection\n * has been secured\n */\n _upgradeConnection(callback) {\n // do not remove all listeners or it breaks node v0.10 as there's\n // apparently a 'finish' event set that would be cleared as well\n\n // we can safely keep 'error', 'end', 'close' etc. events\n this._socket.removeListener('data', this._onSocketData); // incoming data is going to be gibberish from this point onwards\n this._socket.removeListener('timeout', this._onSocketTimeout); // timeout will be re-set for the new socket object\n\n const socketPlain = this._socket;\n const opts = Object.assign(\n {\n socket: this._socket,\n host: this.host\n },\n this.options.tls || {}\n );\n\n // ensure servername for SNI\n if (this.servername && !opts.servername) {\n opts.servername = this.servername;\n }\n\n this.upgrading = true;\n // tls.connect is not an asynchronous function however it may still throw errors and requires to be wrapped with try/catch\n try {\n this._socket = tls.connect(opts, () => {\n this.secure = true;\n this.upgrading = false;\n this._socket.on('data', this._onSocketData);\n\n // Remove all listeners from the plain socket to allow proper garbage collection\n socketPlain.removeListener('close', this._onSocketClose);\n socketPlain.removeListener('end', this._onSocketEnd);\n socketPlain.removeListener('error', this._onSocketError);\n\n return callback(null, true);\n });\n } catch (err) {\n return callback(err);\n }\n\n this._socket.on('error', this._onSocketError);\n this._socket.once('close', this._onSocketClose);\n this._socket.once('end', this._onSocketEnd);\n\n this._socket.setTimeout(this.options.socketTimeout || SOCKET_TIMEOUT); // 10 min.\n this._socket.on('timeout', this._onSocketTimeout);\n\n // resume in case the socket was paused\n socketPlain.resume();\n }\n\n /**\n * Processes queued responses from the server\n *\n * @param {Boolean} force If true, ignores _processing flag\n */\n _processResponse() {\n if (!this._responseQueue.length) {\n return false;\n }\n\n let str = (this.lastServerResponse = decodeServerResponse((this._responseQueue.shift() || '').toString()));\n\n if (/^\\d+-/.test(str.split('\\n').pop())) {\n // keep waiting for the final part of multiline response\n return;\n }\n\n if (this.options.debug || this.options.transactionLog) {\n this.logger.debug(\n {\n tnx: 'server'\n },\n str.replace(/\\r?\\n$/, '')\n );\n }\n\n if (!str.trim()) {\n // skip unexpected empty lines\n setImmediate(() => this._processResponse());\n }\n\n const action = this._responseActions.shift();\n\n if (typeof action === 'function') {\n action.call(this, str);\n setImmediate(() => this._processResponse());\n } else {\n return this._onError(new Error('Unexpected Response'), 'EPROTOCOL', str, 'CONN');\n }\n }\n\n /**\n * Send a command to the server, append \\r\\n\n *\n * @param {String} str String to be sent to the server\n * @param {String} logStr Optional string to be used for logging instead of the actual string\n */\n _sendCommand(str, logStr) {\n if (this._destroyed) {\n // Connection already closed, can't send any more data\n return;\n }\n\n if (this._socket.destroyed) {\n return this.close();\n }\n\n if (this.options.debug || this.options.transactionLog) {\n this.logger.debug(\n {\n tnx: 'client'\n },\n (logStr || str || '').toString().replace(/\\r?\\n$/, '')\n );\n }\n\n this._socket.write(Buffer.from(str + '\\r\\n', 'utf-8'));\n }\n\n /**\n * Initiates a new message by submitting envelope data, starting with\n * MAIL FROM: command\n *\n * @param {Object} envelope Envelope object in the form of\n * {from:'...', to:['...']}\n * or\n * {from:{address:'...',name:'...'}, to:[address:'...',name:'...']}\n */\n _setEnvelope(envelope, callback) {\n const args = [];\n let useSmtpUtf8 = false;\n\n this._envelope = envelope || {};\n this._envelope.from = ((this._envelope.from && this._envelope.from.address) || this._envelope.from || '').toString().trim();\n\n this._envelope.to = [].concat(this._envelope.to || []).map(to => ((to && to.address) || to || '').toString().trim());\n\n if (!this._envelope.to.length) {\n return callback(this._formatError('No recipients defined', 'EENVELOPE', false, 'API'));\n }\n\n if (this._envelope.from && /[\\r\\n<>]/.test(this._envelope.from)) {\n return callback(this._formatError('Invalid sender ' + JSON.stringify(this._envelope.from), 'EENVELOPE', false, 'API'));\n }\n\n // check if the sender address uses only ASCII characters,\n // otherwise require usage of SMTPUTF8 extension\n if (/[\\x80-\\uFFFF]/.test(this._envelope.from)) {\n useSmtpUtf8 = true;\n }\n\n for (let i = 0, len = this._envelope.to.length; i < len; i++) {\n if (!this._envelope.to[i] || /[\\r\\n<>]/.test(this._envelope.to[i])) {\n return callback(this._formatError('Invalid recipient ' + JSON.stringify(this._envelope.to[i]), 'EENVELOPE', false, 'API'));\n }\n\n // check if the recipients addresses use only ASCII characters,\n // otherwise require usage of SMTPUTF8 extension\n if (/[\\x80-\\uFFFF]/.test(this._envelope.to[i])) {\n useSmtpUtf8 = true;\n }\n }\n\n // clone the recipients array for latter manipulation\n this._envelope.rcptQueue = [].concat(this._envelope.to || []);\n this._envelope.rejected = [];\n this._envelope.rejectedErrors = [];\n this._envelope.accepted = [];\n\n if (this._envelope.dsn) {\n try {\n this._envelope.dsn = this._setDsnEnvelope(this._envelope.dsn);\n } catch (err) {\n return callback(this._formatError('Invalid DSN ' + err.message, 'EENVELOPE', false, 'API'));\n }\n }\n\n this._responseActions.push(str => {\n this._actionMAIL(str, callback);\n });\n\n // If the server supports SMTPUTF8 and the envelope includes an internationalized\n // email address then append SMTPUTF8 keyword to the MAIL FROM command\n if (useSmtpUtf8 && this._supportedExtensions.includes('SMTPUTF8')) {\n args.push('SMTPUTF8');\n this._usingSmtpUtf8 = true;\n }\n\n // If the server supports 8BITMIME and the message might contain non-ascii bytes\n // then append the 8BITMIME keyword to the MAIL FROM command\n if (this._envelope.use8BitMime && this._supportedExtensions.includes('8BITMIME')) {\n args.push('BODY=8BITMIME');\n this._using8BitMime = true;\n }\n\n if (this._envelope.size && this._supportedExtensions.includes('SIZE')) {\n const sizeValue = Number(this._envelope.size) || 0;\n if (sizeValue > 0) {\n args.push('SIZE=' + sizeValue);\n }\n }\n\n // If the server supports DSN and the envelope includes an DSN prop\n // then append DSN params to the MAIL FROM command\n if (this._envelope.dsn && this._supportedExtensions.includes('DSN')) {\n if (this._envelope.dsn.ret) {\n args.push('RET=' + shared.encodeXText(this._envelope.dsn.ret));\n }\n if (this._envelope.dsn.envid) {\n args.push('ENVID=' + shared.encodeXText(this._envelope.dsn.envid));\n }\n }\n\n // RFC 8689: If the envelope requests REQUIRETLS extension\n // then append REQUIRETLS keyword to the MAIL FROM command\n // Note: REQUIRETLS can only be used over TLS connections and requires server support\n if (this._envelope.requireTLSExtensionEnabled) {\n if (!this.secure) {\n return callback(\n this._formatError('REQUIRETLS can only be used over TLS connections (RFC 8689)', 'EREQUIRETLS', false, 'MAIL FROM')\n );\n }\n if (!this._supportedExtensions.includes('REQUIRETLS')) {\n return callback(\n this._formatError('Server does not support REQUIRETLS extension (RFC 8689)', 'EREQUIRETLS', false, 'MAIL FROM')\n );\n }\n args.push('REQUIRETLS');\n }\n\n this._sendCommand('MAIL FROM:<' + this._envelope.from + '>' + (args.length ? ' ' + args.join(' ') : ''));\n }\n\n _setDsnEnvelope(params) {\n let ret = (params.ret || params.return || '').toString().toUpperCase() || null;\n if (ret) {\n switch (ret) {\n case 'HDRS':\n case 'HEADERS':\n ret = 'HDRS';\n break;\n case 'FULL':\n case 'BODY':\n ret = 'FULL';\n break;\n }\n }\n\n if (ret && !['FULL', 'HDRS'].includes(ret)) {\n throw new Error('ret: ' + JSON.stringify(ret));\n }\n\n const envid = (params.envid || params.id || '').toString() || null;\n\n let notify = params.notify || null;\n if (notify) {\n if (typeof notify === 'string') {\n notify = notify.split(',');\n }\n notify = notify.map(n => n.trim().toUpperCase());\n const validNotify = ['NEVER', 'SUCCESS', 'FAILURE', 'DELAY'];\n const invalidNotify = notify.filter(n => !validNotify.includes(n));\n if (invalidNotify.length || (notify.length > 1 && notify.includes('NEVER'))) {\n throw new Error('notify: ' + JSON.stringify(notify.join(',')));\n }\n notify = notify.join(',');\n }\n\n let orcpt = (params.recipient || params.orcpt || '').toString() || null;\n if (orcpt && orcpt.indexOf(';') < 0) {\n orcpt = 'rfc822;' + orcpt;\n }\n\n return {\n ret,\n envid,\n notify,\n orcpt\n };\n }\n\n _getDsnRcptToArgs() {\n const args = [];\n // If the server supports DSN and the envelope includes an DSN prop\n // then append DSN params to the RCPT TO command\n if (this._envelope.dsn && this._supportedExtensions.includes('DSN')) {\n if (this._envelope.dsn.notify) {\n args.push('NOTIFY=' + shared.encodeXText(this._envelope.dsn.notify));\n }\n if (this._envelope.dsn.orcpt) {\n args.push('ORCPT=' + shared.encodeXText(this._envelope.dsn.orcpt));\n }\n }\n return args.length ? ' ' + args.join(' ') : '';\n }\n\n _createSendStream(callback) {\n const dataStream = new DataStream();\n\n if (this.options.lmtp) {\n this._envelope.accepted.forEach((recipient, i) => {\n const final = i === this._envelope.accepted.length - 1;\n this._responseActions.push(str => {\n this._actionLMTPStream(recipient, final, str, callback);\n });\n });\n } else {\n this._responseActions.push(str => {\n this._actionSMTPStream(str, callback);\n });\n }\n\n dataStream.pipe(this._socket, {\n end: false\n });\n\n if (this.options.debug) {\n const logStream = new PassThrough();\n logStream.on('readable', () => {\n let chunk;\n while ((chunk = logStream.read())) {\n this.logger.debug(\n {\n tnx: 'message'\n },\n chunk.toString('binary').replace(/\\r?\\n$/, '')\n );\n }\n });\n dataStream.pipe(logStream);\n }\n\n dataStream.once('end', () => {\n this.logger.info(\n {\n tnx: 'message',\n inByteCount: dataStream.inByteCount,\n outByteCount: dataStream.outByteCount\n },\n '<%s bytes encoded mime message (source size %s bytes)>',\n dataStream.outByteCount,\n dataStream.inByteCount\n );\n });\n\n return dataStream;\n }\n\n /** ACTIONS **/\n\n /**\n * Will be run after the connection is created and the server sends\n * a greeting. If the incoming message starts with 220 initiate\n * SMTP session by sending EHLO command\n *\n * @param {String} str Message from the server\n */\n _actionGreeting(str) {\n clearTimeout(this._greetingTimeout);\n\n if (str.substr(0, 3) !== '220') {\n this._onError(new Error('Invalid greeting. response=' + str), 'EPROTOCOL', str, 'CONN');\n return;\n }\n\n if (this.options.lmtp) {\n this._responseActions.push(this._actionLHLO);\n this._sendCommand('LHLO ' + this.name);\n } else {\n this._responseActions.push(this._actionEHLO);\n this._sendCommand('EHLO ' + this.name);\n }\n }\n\n /**\n * Handles server response for LHLO command. If it yielded in\n * error, emit 'error', otherwise treat this as an EHLO response\n *\n * @param {String} str Message from the server\n */\n _actionLHLO(str) {\n if (str.charAt(0) !== '2') {\n this._onError(new Error('Invalid LHLO. response=' + str), 'EPROTOCOL', str, 'LHLO');\n return;\n }\n\n this._actionEHLO(str);\n }\n\n /**\n * Handles server response for EHLO command. If it yielded in\n * error, try HELO instead, otherwise initiate TLS negotiation\n * if STARTTLS is supported by the server or move into the\n * authentication phase.\n *\n * @param {String} str Message from the server\n */\n _actionEHLO(str) {\n let match;\n\n if (str.substr(0, 3) === '421') {\n this._onError(new Error('Server terminates connection. response=' + str), 'ECONNECTION', str, 'EHLO');\n return;\n }\n\n if (str.charAt(0) !== '2') {\n if (this.options.requireTLS) {\n this._onError(\n new Error('EHLO failed but HELO does not support required STARTTLS. response=' + str),\n 'ECONNECTION',\n str,\n 'EHLO'\n );\n return;\n }\n\n // Try HELO instead\n this._responseActions.push(this._actionHELO);\n this._sendCommand('HELO ' + this.name);\n return;\n }\n\n this._ehloLines = str\n .split(/\\r?\\n/)\n .map(line => line.replace(/^\\d+[ -]/, '').trim())\n .filter(line => line)\n .slice(1);\n\n // Detect if the server supports STARTTLS\n if (!this.secure && !this.options.ignoreTLS && (/[ -]STARTTLS\\b/im.test(str) || this.options.requireTLS)) {\n this._sendCommand('STARTTLS');\n this._responseActions.push(this._actionSTARTTLS);\n return;\n }\n\n // Detect if the server supports SMTPUTF8\n if (/[ -]SMTPUTF8\\b/im.test(str)) {\n this._supportedExtensions.push('SMTPUTF8');\n }\n\n // Detect if the server supports DSN\n if (/[ -]DSN\\b/im.test(str)) {\n this._supportedExtensions.push('DSN');\n }\n\n // Detect if the server supports 8BITMIME\n if (/[ -]8BITMIME\\b/im.test(str)) {\n this._supportedExtensions.push('8BITMIME');\n }\n\n // Detect if the server supports REQUIRETLS (RFC 8689)\n if (/[ -]REQUIRETLS\\b/im.test(str)) {\n this._supportedExtensions.push('REQUIRETLS');\n }\n\n // Detect if the server supports PIPELINING\n if (/[ -]PIPELINING\\b/im.test(str)) {\n this._supportedExtensions.push('PIPELINING');\n }\n\n // Detect if the server supports AUTH\n if (/[ -]AUTH\\b/i.test(str)) {\n this.allowsAuth = true;\n }\n\n // Detect if the server supports PLAIN auth\n if (/[ -]AUTH(?:(\\s+|=)[^\\n]*\\s+|\\s+|=)PLAIN/i.test(str)) {\n this._supportedAuth.push('PLAIN');\n }\n\n // Detect if the server supports LOGIN auth\n if (/[ -]AUTH(?:(\\s+|=)[^\\n]*\\s+|\\s+|=)LOGIN/i.test(str)) {\n this._supportedAuth.push('LOGIN');\n }\n\n // Detect if the server supports CRAM-MD5 auth\n if (/[ -]AUTH(?:(\\s+|=)[^\\n]*\\s+|\\s+|=)CRAM-MD5/i.test(str)) {\n this._supportedAuth.push('CRAM-MD5');\n }\n\n // Detect if the server supports XOAUTH2 auth\n if (/[ -]AUTH(?:(\\s+|=)[^\\n]*\\s+|\\s+|=)XOAUTH2/i.test(str)) {\n this._supportedAuth.push('XOAUTH2');\n }\n\n // Detect if the server supports SIZE extensions (and the max allowed size)\n if ((match = str.match(/[ -]SIZE(?:[ \\t]+(\\d+))?/im))) {\n this._supportedExtensions.push('SIZE');\n this._maxAllowedSize = Number(match[1]) || 0;\n }\n\n this.emit('connect');\n }\n\n /**\n * Handles server response for HELO command. If it yielded in\n * error, emit 'error', otherwise move into the authentication phase.\n *\n * @param {String} str Message from the server\n */\n _actionHELO(str) {\n if (str.charAt(0) !== '2') {\n this._onError(new Error('Invalid HELO. response=' + str), 'EPROTOCOL', str, 'HELO');\n return;\n }\n\n // assume that authentication is enabled (most probably is not though)\n this.allowsAuth = true;\n\n this.emit('connect');\n }\n\n /**\n * Handles server response for STARTTLS command. If there's an error\n * try HELO instead, otherwise initiate TLS upgrade. If the upgrade\n * succeedes restart the EHLO\n *\n * @param {String} str Message from the server\n */\n _actionSTARTTLS(str) {\n if (str.charAt(0) !== '2') {\n if (this.options.opportunisticTLS) {\n this.logger.info(\n {\n tnx: 'smtp'\n },\n 'Failed STARTTLS upgrade, continuing unencrypted'\n );\n return this.emit('connect');\n }\n this._onError(new Error('Error upgrading connection with STARTTLS'), 'ETLS', str, 'STARTTLS');\n return;\n }\n\n this._upgradeConnection((err, secured) => {\n if (err) {\n this._onError(new Error('Error initiating TLS - ' + (err.message || err)), 'ETLS', false, 'STARTTLS');\n return;\n }\n\n this.logger.info(\n {\n tnx: 'smtp'\n },\n 'Connection upgraded with STARTTLS'\n );\n\n if (secured) {\n // restart session\n if (this.options.lmtp) {\n this._responseActions.push(this._actionLHLO);\n this._sendCommand('LHLO ' + this.name);\n } else {\n this._responseActions.push(this._actionEHLO);\n this._sendCommand('EHLO ' + this.name);\n }\n } else {\n this.emit('connect');\n }\n });\n }\n\n /**\n * Handle the response for AUTH LOGIN command. We are expecting\n * '334 VXNlcm5hbWU6' (base64 for 'Username:'). Data to be sent as\n * response needs to be base64 encoded username. We do not need\n * exact match but settle with 334 response in general as some\n * hosts invalidly use a longer message than VXNlcm5hbWU6\n *\n * @param {String} str Message from the server\n */\n _actionAUTH_LOGIN_USER(str, callback) {\n if (!/^334[ -]/.test(str)) {\n // expecting '334 VXNlcm5hbWU6'\n callback(this._formatError('Invalid login sequence while waiting for \"334 VXNlcm5hbWU6\"', 'EAUTH', str, 'AUTH LOGIN'));\n return;\n }\n\n this._responseActions.push(str => {\n this._actionAUTH_LOGIN_PASS(str, callback);\n });\n\n this._sendCommand(Buffer.from(this._auth.credentials.user + '', 'utf-8').toString('base64'));\n }\n\n /**\n * Handle the response for AUTH CRAM-MD5 command. We are expecting\n * '334 <challenge string>'. Data to be sent as response needs to be\n * base64 decoded challenge string, MD5 hashed using the password as\n * a HMAC key, prefixed by the username and a space, and finally all\n * base64 encoded again.\n *\n * @param {String} str Message from the server\n */\n _actionAUTH_CRAM_MD5(str, callback) {\n const challengeMatch = str.match(/^334\\s+(.+)$/);\n\n if (!challengeMatch) {\n return callback(\n this._formatError('Invalid login sequence while waiting for server challenge string', 'EAUTH', str, 'AUTH CRAM-MD5')\n );\n }\n\n // Decode from base64\n const base64decoded = Buffer.from(challengeMatch[1], 'base64').toString('ascii');\n const hmacMD5 = crypto.createHmac('md5', this._auth.credentials.pass);\n\n hmacMD5.update(base64decoded);\n\n const prepended = this._auth.credentials.user + ' ' + hmacMD5.digest('hex');\n\n this._responseActions.push(str => {\n this._actionAUTH_CRAM_MD5_PASS(str, callback);\n });\n\n this._sendCommand(\n Buffer.from(prepended).toString('base64'),\n // hidden hash for logs\n Buffer.from(this._auth.credentials.user + ' /* secret */').toString('base64')\n );\n }\n\n /**\n * Handles the response to CRAM-MD5 authentication, if there's no error,\n * the user can be considered logged in. Start waiting for a message to send\n *\n * @param {String} str Message from the server\n */\n _actionAUTH_CRAM_MD5_PASS(str, callback) {\n if (!str.match(/^235\\s+/)) {\n return callback(this._formatError('Invalid login sequence while waiting for \"235\"', 'EAUTH', str, 'AUTH CRAM-MD5'));\n }\n\n this.logger.info(\n {\n tnx: 'smtp',\n username: this._auth.user,\n action: 'authenticated',\n method: this._authMethod\n },\n 'User %s authenticated',\n JSON.stringify(this._auth.user)\n );\n this.authenticated = true;\n callback(null, true);\n }\n\n /**\n * Handle the response for AUTH LOGIN command. We are expecting\n * '334 UGFzc3dvcmQ6' (base64 for 'Password:'). Data to be sent as\n * response needs to be base64 encoded password.\n *\n * @param {String} str Message from the server\n */\n _actionAUTH_LOGIN_PASS(str, callback) {\n if (!/^334[ -]/.test(str)) {\n // expecting '334 UGFzc3dvcmQ6'\n return callback(this._formatError('Invalid login sequence while waiting for \"334 UGFzc3dvcmQ6\"', 'EAUTH', str, 'AUTH LOGIN'));\n }\n\n this._responseActions.push(str => {\n this._actionAUTHComplete(str, callback);\n });\n\n this._sendCommand(\n Buffer.from((this._auth.credentials.pass || '').toString(), 'utf-8').toString('base64'),\n // Hidden pass for logs\n Buffer.from('/* secret */', 'utf-8').toString('base64')\n );\n }\n\n /**\n * Handles the response for authentication, if there's no error,\n * the user can be considered logged in. Start waiting for a message to send\n *\n * @param {String} str Message from the server\n */\n _actionAUTHComplete(str, isRetry, callback) {\n if (!callback && typeof isRetry === 'function') {\n callback = isRetry;\n isRetry = false;\n }\n\n if (str.substr(0, 3) === '334') {\n this._responseActions.push(str => {\n if (isRetry || this._authMethod !== 'XOAUTH2') {\n this._actionAUTHComplete(str, true, callback);\n } else {\n // fetch a new OAuth2 access token\n setImmediate(() => this._handleXOauth2Token(true, callback));\n }\n });\n this._sendCommand('');\n return;\n }\n\n if (str.charAt(0) !== '2') {\n this.logger.info(\n {\n tnx: 'smtp',\n username: this._auth.user,\n action: 'authfail',\n method: this._authMethod\n },\n 'User %s failed to authenticate',\n JSON.stringify(this._auth.user)\n );\n return callback(this._formatError('Invalid login', 'EAUTH', str, 'AUTH ' + this._authMethod));\n }\n\n this.logger.info(\n {\n tnx: 'smtp',\n username: this._auth.user,\n action: 'authenticated',\n method: this._authMethod\n },\n 'User %s authenticated',\n JSON.stringify(this._auth.user)\n );\n this.authenticated = true;\n callback(null, true);\n }\n\n /**\n * Handle response for a MAIL FROM: command\n *\n * @param {String} str Message from the server\n */\n _actionMAIL(str, callback) {\n if (Number(str.charAt(0)) !== 2) {\n const message =\n this._usingSmtpUtf8 && /^550 /.test(str) && /[\\x80-\\uFFFF]/.test(this._envelope.from)\n ? 'Internationalized mailbox name not allowed'\n : 'Mail command failed';\n return callback(this._formatError(message, 'EENVELOPE', str, 'MAIL FROM'));\n }\n\n if (!this._envelope.rcptQueue.length) {\n return callback(this._formatError(\"Can't send mail - no recipients defined\", 'EENVELOPE', false, 'API'));\n }\n\n this._recipientQueue = [];\n const usePipelining = this._supportedExtensions.includes('PIPELINING');\n\n do {\n const curRecipient = this._envelope.rcptQueue.shift();\n this._recipientQueue.push(curRecipient);\n this._responseActions.push(str => {\n this._actionRCPT(str, callback);\n });\n this._sendCommand('RCPT TO:<' + curRecipient + '>' + this._getDsnRcptToArgs());\n } while (usePipelining && this._envelope.rcptQueue.length);\n }\n\n /**\n * Handle response for a RCPT TO: command\n *\n * @param {String} str Message from the server\n */\n _actionRCPT(str, callback) {\n let err;\n const curRecipient = this._recipientQueue.shift();\n if (Number(str.charAt(0)) !== 2) {\n // this is a soft error\n const message =\n this._usingSmtpUtf8 && /^553 /.test(str) && /[\\x80-\\uFFFF]/.test(curRecipient)\n ? 'Internationalized mailbox name not allowed'\n : 'Recipient command failed';\n this._envelope.rejected.push(curRecipient);\n // store error for the failed recipient\n err = this._formatError(message, 'EENVELOPE', str, 'RCPT TO');\n err.recipient = curRecipient;\n this._envelope.rejectedErrors.push(err);\n } else {\n this._envelope.accepted.push(curRecipient);\n }\n\n if (!this._envelope.rcptQueue.length && !this._recipientQueue.length) {\n if (this._envelope.rejected.length < this._envelope.to.length) {\n this._responseActions.push(str => {\n this._actionDATA(str, callback);\n });\n this._sendCommand('DATA');\n } else {\n err = this._formatError(\"Can't send mail - all recipients were rejected\", 'EENVELOPE', str, 'RCPT TO');\n err.rejected = this._envelope.rejected;\n err.rejectedErrors = this._envelope.rejectedErrors;\n return callback(err);\n }\n } else if (this._envelope.rcptQueue.length) {\n const nextRecipient = this._envelope.rcptQueue.shift();\n this._recipientQueue.push(nextRecipient);\n this._responseActions.push(str => {\n this._actionRCPT(str, callback);\n });\n this._sendCommand('RCPT TO:<' + nextRecipient + '>' + this._getDsnRcptToArgs());\n }\n }\n\n /**\n * Handle response for a DATA command\n *\n * @param {String} str Message from the server\n */\n _actionDATA(str, callback) {\n // response should be 354 but according to this issue https://github.com/eleith/emailjs/issues/24\n // some servers might use 250 instead, so lets check for 2 or 3 as the first digit\n if (!/^[23]/.test(str)) {\n return callback(this._formatError('Data command failed', 'EENVELOPE', str, 'DATA'));\n }\n\n const response = {\n accepted: this._envelope.accepted,\n rejected: this._envelope.rejected\n };\n\n if (this._ehloLines && this._ehloLines.length) {\n response.ehlo = this._ehloLines;\n }\n\n if (this._envelope.rejectedErrors.length) {\n response.rejectedErrors = this._envelope.rejectedErrors;\n }\n\n callback(null, response);\n }\n\n /**\n * Handle response for a DATA stream when using SMTP\n * We expect a single response that defines if the sending succeeded or failed\n *\n * @param {String} str Message from the server\n */\n _actionSMTPStream(str, callback) {\n if (Number(str.charAt(0)) !== 2) {\n return callback(this._formatError('Message failed', 'EMESSAGE', str, 'DATA'));\n }\n return callback(null, str);\n }\n\n /**\n * Handle response for a DATA stream\n * We expect a separate response for every recipient. All recipients can either\n * succeed or fail separately\n *\n * @param {String} recipient The recipient this response applies to\n * @param {Boolean} final Is this the final recipient?\n * @param {String} str Message from the server\n */\n _actionLMTPStream(recipient, final, str, callback) {\n let err;\n if (Number(str.charAt(0)) !== 2) {\n // Message failed\n err = this._formatError('Message failed for recipient ' + recipient, 'EMESSAGE', str, 'DATA');\n err.recipient = recipient;\n this._envelope.rejected.push(recipient);\n this._envelope.rejectedErrors.push(err);\n for (let i = 0, len = this._envelope.accepted.length; i < len; i++) {\n if (this._envelope.accepted[i] === recipient) {\n this._envelope.accepted.splice(i, 1);\n }\n }\n }\n if (final) {\n return callback(null, str);\n }\n }\n\n _handleXOauth2Token(isRetry, callback) {\n this._auth.oauth2.getToken(isRetry, (err, accessToken) => {\n if (err) {\n this.logger.info(\n {\n tnx: 'smtp',\n username: this._auth.user,\n action: 'authfail',\n method: this._authMethod\n },\n 'User %s failed to authenticate',\n JSON.stringify(this._auth.user)\n );\n return callback(this._formatError(err, 'EAUTH', false, 'AUTH XOAUTH2'));\n }\n this._responseActions.push(str => {\n this._actionAUTHComplete(str, isRetry, callback);\n });\n this._sendCommand(\n 'AUTH XOAUTH2 ' + this._auth.oauth2.buildXOAuth2Token(accessToken),\n // Hidden for logs\n 'AUTH XOAUTH2 ' + this._auth.oauth2.buildXOAuth2Token('/* secret */')\n );\n });\n }\n\n /**\n *\n * @param {string} command\n * @private\n */\n _isDestroyedMessage(command) {\n if (this._destroyed) {\n return 'Cannot ' + command + ' - smtp connection is already destroyed.';\n }\n\n if (this._socket) {\n if (this._socket.destroyed) {\n return 'Cannot ' + command + ' - smtp connection socket is already destroyed.';\n }\n\n if (!this._socket.writable) {\n return 'Cannot ' + command + ' - smtp connection socket is already half-closed.';\n }\n }\n }\n\n _getHostname() {\n // defaul hostname is machine hostname or [IP]\n let defaultHostname;\n try {\n defaultHostname = os.hostname() || '';\n } catch (_err) {\n // fails on windows 7\n defaultHostname = 'localhost';\n }\n\n // ignore if not FQDN\n if (!defaultHostname || defaultHostname.indexOf('.') < 0) {\n defaultHostname = '[127.0.0.1]';\n }\n\n // IP should be enclosed in []\n if (defaultHostname.match(/^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/)) {\n defaultHostname = '[' + defaultHostname + ']';\n }\n\n return defaultHostname;\n }\n}\n\nmodule.exports = SMTPConnection;\n","'use strict';\n\nconst { Stream } = require('stream');\nconst nmfetch = require('../fetch');\nconst crypto = require('crypto');\nconst shared = require('../shared');\nconst errors = require('../errors');\n\n/**\n * XOAUTH2 access_token generator for Gmail.\n * Create client ID for web applications in Google API console to use it.\n * See Offline Access for receiving the needed refreshToken for an user\n * https://developers.google.com/accounts/docs/OAuth2WebServer#offline\n *\n * Usage for generating access tokens with a custom method using provisionCallback:\n * provisionCallback(user, renew, callback)\n * * user is the username to get the token for\n * * renew is a boolean that if true indicates that existing token failed and needs to be renewed\n * * callback is the callback to run with (error, accessToken [, expires])\n * * accessToken is a string\n * * expires is an optional expire time in milliseconds\n * If provisionCallback is used, then Nodemailer does not try to attempt generating the token by itself\n *\n * @constructor\n * @param {Object} options Client information for token generation\n * @param {String} options.user User e-mail address\n * @param {String} options.clientId Client ID value\n * @param {String} options.clientSecret Client secret value\n * @param {String} options.refreshToken Refresh token for an user\n * @param {String} options.accessUrl Endpoint for token generation, defaults to 'https://accounts.google.com/o/oauth2/token'\n * @param {String} options.accessToken An existing valid accessToken\n * @param {String} options.privateKey Private key for JSW\n * @param {Number} options.expires Optional Access Token expire time in ms\n * @param {Number} options.timeout Optional TTL for Access Token in seconds\n * @param {Function} options.provisionCallback Function to run when a new access token is required\n */\nclass XOAuth2 extends Stream {\n constructor(options, logger) {\n super();\n\n this.options = options || {};\n\n if (options && options.serviceClient) {\n if (!options.privateKey || !options.user) {\n const err = new Error('Options \"privateKey\" and \"user\" are required for service account!');\n err.code = errors.EOAUTH2;\n setImmediate(() => this.emit('error', err));\n return;\n }\n\n const serviceRequestTimeout = Math.min(Math.max(Number(this.options.serviceRequestTimeout) || 0, 0), 3600);\n this.options.serviceRequestTimeout = serviceRequestTimeout || 5 * 60;\n }\n\n this.logger = shared.getLogger(\n {\n logger\n },\n {\n component: this.options.component || 'OAuth2'\n }\n );\n\n this.provisionCallback = typeof this.options.provisionCallback === 'function' ? this.options.provisionCallback : false;\n\n this.options.accessUrl = this.options.accessUrl || 'https://accounts.google.com/o/oauth2/token';\n this.options.customHeaders = this.options.customHeaders || {};\n this.options.customParams = this.options.customParams || {};\n\n this.accessToken = this.options.accessToken || false;\n\n if (this.options.expires && Number(this.options.expires)) {\n this.expires = this.options.expires;\n } else {\n const timeout = Math.max(Number(this.options.timeout) || 0, 0);\n this.expires = (timeout && Date.now() + timeout * 1000) || 0;\n }\n\n this.renewing = false; // Track if renewal is in progress\n this.renewalQueue = []; // Queue for pending requests during renewal\n }\n\n /**\n * Returns or generates (if previous has expired) a XOAuth2 token\n *\n * @param {Boolean} renew If false then use cached access token (if available)\n * @param {Function} callback Callback function with error object and token string\n */\n getToken(renew, callback) {\n if (!renew && this.accessToken && (!this.expires || this.expires > Date.now())) {\n this.logger.debug(\n {\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'reuse'\n },\n 'Reusing existing access token for %s',\n this.options.user\n );\n return callback(null, this.accessToken);\n }\n\n // check if it is possible to renew, if not, return the current token or error\n if (!this.provisionCallback && !this.options.refreshToken && !this.options.serviceClient) {\n if (this.accessToken) {\n this.logger.debug(\n {\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'reuse'\n },\n 'Reusing existing access token (no refresh capability) for %s',\n this.options.user\n );\n return callback(null, this.accessToken);\n }\n this.logger.error(\n {\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'renew'\n },\n 'Cannot renew access token for %s: No refresh mechanism available',\n this.options.user\n );\n const err = new Error(\"Can't create new access token for user\");\n err.code = errors.EOAUTH2;\n return callback(err);\n }\n\n // If renewal already in progress, queue this request instead of starting another\n if (this.renewing) {\n return this.renewalQueue.push({ renew, callback });\n }\n\n this.renewing = true;\n\n // Handles token renewal completion - processes queued requests and cleans up\n const generateCallback = (err, accessToken) => {\n this.renewalQueue.forEach(item => item.callback(err, accessToken));\n this.renewalQueue = [];\n this.renewing = false;\n\n if (err) {\n this.logger.error(\n {\n err,\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'renew'\n },\n 'Failed generating new Access Token for %s',\n this.options.user\n );\n } else {\n this.logger.info(\n {\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'renew'\n },\n 'Generated new Access Token for %s',\n this.options.user\n );\n }\n // Complete original request\n callback(err, accessToken);\n };\n\n if (this.provisionCallback) {\n this.provisionCallback(this.options.user, !!renew, (err, accessToken, expires) => {\n if (!err && accessToken) {\n this.accessToken = accessToken;\n this.expires = expires || 0;\n }\n generateCallback(err, accessToken);\n });\n } else {\n this.generateToken(generateCallback);\n }\n }\n\n /**\n * Updates token values\n *\n * @param {String} accessToken New access token\n * @param {Number} timeout Access token lifetime in seconds\n *\n * Emits 'token': { user: User email-address, accessToken: the new accessToken, timeout: TTL in seconds}\n */\n updateToken(accessToken, timeout) {\n this.accessToken = accessToken;\n timeout = Math.max(Number(timeout) || 0, 0);\n this.expires = (timeout && Date.now() + timeout * 1000) || 0;\n\n this.emit('token', {\n user: this.options.user,\n accessToken: accessToken || '',\n expires: this.expires\n });\n }\n\n /**\n * Generates a new XOAuth2 token with the credentials provided at initialization\n *\n * @param {Function} callback Callback function with error object and token string\n */\n generateToken(callback) {\n let urlOptions;\n let loggedUrlOptions;\n if (this.options.serviceClient) {\n // service account - https://developers.google.com/identity/protocols/OAuth2ServiceAccount\n const iat = Math.floor(Date.now() / 1000); // unix time\n const tokenData = {\n iss: this.options.serviceClient,\n scope: this.options.scope || 'https://mail.google.com/',\n sub: this.options.user,\n aud: this.options.accessUrl,\n iat,\n exp: iat + this.options.serviceRequestTimeout\n };\n let token;\n try {\n token = this.jwtSignRS256(tokenData);\n } catch (_err) {\n const err = new Error(\"Can't generate token. Check your auth options\");\n err.code = errors.EOAUTH2;\n return callback(err);\n }\n\n urlOptions = {\n grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',\n assertion: token\n };\n\n loggedUrlOptions = {\n grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',\n assertion: tokenData\n };\n } else {\n if (!this.options.refreshToken) {\n const err = new Error(\"Can't create new access token for user\");\n err.code = errors.EOAUTH2;\n return callback(err);\n }\n\n // web app - https://developers.google.com/identity/protocols/OAuth2WebServer\n urlOptions = {\n client_id: this.options.clientId || '',\n client_secret: this.options.clientSecret || '',\n refresh_token: this.options.refreshToken,\n grant_type: 'refresh_token'\n };\n\n loggedUrlOptions = {\n client_id: this.options.clientId || '',\n client_secret: (this.options.clientSecret || '').substr(0, 6) + '...',\n refresh_token: (this.options.refreshToken || '').substr(0, 6) + '...',\n grant_type: 'refresh_token'\n };\n }\n\n Object.assign(urlOptions, this.options.customParams);\n Object.assign(loggedUrlOptions, this.options.customParams);\n\n this.logger.debug(\n {\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'generate'\n },\n 'Requesting token using: %s',\n JSON.stringify(loggedUrlOptions)\n );\n\n this.postRequest(this.options.accessUrl, urlOptions, this.options, (error, body) => {\n let data;\n\n if (error) {\n return callback(error);\n }\n\n try {\n data = JSON.parse(body.toString());\n } catch (E) {\n return callback(E);\n }\n\n if (!data || typeof data !== 'object') {\n this.logger.debug(\n {\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'post'\n },\n 'Response: %s',\n (body || '').toString()\n );\n const err = new Error('Invalid authentication response');\n err.code = errors.EOAUTH2;\n return callback(err);\n }\n\n const logData = Object.assign({}, data);\n if (logData.access_token) {\n logData.access_token = (logData.access_token || '').toString().substr(0, 6) + '...';\n }\n\n this.logger.debug(\n {\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'post'\n },\n 'Response: %s',\n JSON.stringify(logData)\n );\n\n if (data.error) {\n // Error Response : https://tools.ietf.org/html/rfc6749#section-5.2\n let errorMessage = data.error;\n if (data.error_description) {\n errorMessage += ': ' + data.error_description;\n }\n if (data.error_uri) {\n errorMessage += ' (' + data.error_uri + ')';\n }\n const err = new Error(errorMessage);\n err.code = errors.EOAUTH2;\n return callback(err);\n }\n\n if (data.access_token) {\n this.updateToken(data.access_token, data.expires_in);\n return callback(null, this.accessToken);\n }\n\n const err = new Error('No access token');\n err.code = errors.EOAUTH2;\n return callback(err);\n });\n }\n\n /**\n * Converts an access_token and user id into a base64 encoded XOAuth2 token\n *\n * @param {String} [accessToken] Access token string\n * @return {String} Base64 encoded token for IMAP or SMTP login\n */\n buildXOAuth2Token(accessToken) {\n const authData = ['user=' + (this.options.user || ''), 'auth=Bearer ' + (accessToken || this.accessToken), '', ''];\n return Buffer.from(authData.join('\\x01'), 'utf-8').toString('base64');\n }\n\n /**\n * Custom POST request handler.\n * This is only needed to keep paths short in Windows – usually this module\n * is a dependency of a dependency and if it tries to require something\n * like the request module the paths get way too long to handle for Windows.\n * As we do only a simple POST request we do not actually require complicated\n * logic support (no redirects, no nothing) anyway.\n *\n * @param {String} url Url to POST to\n * @param {String|Buffer} payload Payload to POST\n * @param {Function} callback Callback function with (err, buff)\n */\n postRequest(url, payload, params, callback) {\n let returned = false;\n\n const chunks = [];\n let chunklen = 0;\n\n const req = nmfetch(url, {\n method: 'post',\n headers: params.customHeaders,\n body: payload,\n allowErrorResponse: true\n });\n\n req.on('readable', () => {\n let chunk;\n while ((chunk = req.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n\n req.once('error', err => {\n if (returned) {\n return;\n }\n returned = true;\n return callback(err);\n });\n\n req.once('end', () => {\n if (returned) {\n return;\n }\n returned = true;\n return callback(null, Buffer.concat(chunks, chunklen));\n });\n }\n\n /**\n * Encodes a buffer or a string into Base64url format\n *\n * @param {Buffer|String} data The data to convert\n * @return {String} The encoded string\n */\n toBase64URL(data) {\n if (typeof data === 'string') {\n data = Buffer.from(data);\n }\n\n return data\n .toString('base64')\n .replace(/[=]+/g, '') // remove '='s\n .replace(/\\+/g, '-') // '+' → '-'\n .replace(/\\//g, '_'); // '/' → '_'\n }\n\n /**\n * Creates a JSON Web Token signed with RS256 (SHA256 + RSA)\n *\n * @param {Object} payload The payload to include in the generated token\n * @return {String} The generated and signed token\n */\n jwtSignRS256(payload) {\n payload = ['{\"alg\":\"RS256\",\"typ\":\"JWT\"}', JSON.stringify(payload)].map(val => this.toBase64URL(val)).join('.');\n const signature = crypto.createSign('RSA-SHA256').update(payload).sign(this.options.privateKey);\n return payload + '.' + this.toBase64URL(signature);\n }\n}\n\nmodule.exports = XOAuth2;\n","'use strict';\n\nconst SMTPConnection = require('../smtp-connection');\nconst assign = require('../shared').assign;\nconst XOAuth2 = require('../xoauth2');\nconst errors = require('../errors');\nconst EventEmitter = require('events');\n\n/**\n * Creates an element for the pool\n *\n * @constructor\n * @param {Object} options SMTPPool instance\n */\nclass PoolResource extends EventEmitter {\n constructor(pool) {\n super();\n\n this.pool = pool;\n this.options = pool.options;\n this.logger = this.pool.logger;\n\n if (this.options.auth) {\n switch ((this.options.auth.type || '').toString().toUpperCase()) {\n case 'OAUTH2': {\n const oauth2 = new XOAuth2(this.options.auth, this.logger);\n oauth2.provisionCallback =\n (this.pool.mailer && this.pool.mailer.get('oauth2_provision_cb')) || oauth2.provisionCallback;\n this.auth = {\n type: 'OAUTH2',\n user: this.options.auth.user,\n oauth2,\n method: 'XOAUTH2'\n };\n oauth2.on('token', token => this.pool.mailer.emit('token', token));\n oauth2.on('error', err => this.emit('error', err));\n break;\n }\n default:\n if (!this.options.auth.user && !this.options.auth.pass) {\n break;\n }\n this.auth = {\n type: (this.options.auth.type || '').toString().toUpperCase() || 'LOGIN',\n user: this.options.auth.user,\n credentials: {\n user: this.options.auth.user || '',\n pass: this.options.auth.pass,\n options: this.options.auth.options\n },\n method: (this.options.auth.method || '').trim().toUpperCase() || this.options.authMethod || false\n };\n }\n }\n\n this._connection = false;\n this._connected = false;\n\n this.messages = 0;\n this.available = true;\n }\n\n /**\n * Initiates a connection to the SMTP server\n *\n * @param {Function} callback Callback function to run once the connection is established or failed\n */\n connect(callback) {\n this.pool.getSocket(this.options, (err, socketOptions) => {\n if (err) {\n return callback(err);\n }\n\n let returned = false;\n let options = this.options;\n if (socketOptions && socketOptions.connection) {\n this.logger.info(\n {\n tnx: 'proxy',\n remoteAddress: socketOptions.connection.remoteAddress,\n remotePort: socketOptions.connection.remotePort,\n destHost: options.host || '',\n destPort: options.port || '',\n action: 'connected'\n },\n 'Using proxied socket from %s:%s to %s:%s',\n socketOptions.connection.remoteAddress,\n socketOptions.connection.remotePort,\n options.host || '',\n options.port || ''\n );\n\n options = Object.assign(assign(false, options), socketOptions);\n }\n\n this.connection = new SMTPConnection(options);\n\n this.connection.once('error', err => {\n this.emit('error', err);\n if (returned) {\n return;\n }\n returned = true;\n return callback(err);\n });\n\n this.connection.once('end', () => {\n this.close();\n if (returned) {\n return;\n }\n returned = true;\n\n const timer = setTimeout(() => {\n if (returned) {\n return;\n }\n // still have not returned, this means we have an unexpected connection close\n const err = new Error('Unexpected socket close');\n if (this.connection && this.connection._socket && this.connection._socket.upgrading) {\n // starttls connection errors\n err.code = errors.ETLS;\n }\n callback(err);\n }, 1000);\n\n try {\n timer.unref();\n } catch (_E) {\n // Ignore. Happens on envs with non-node timer implementation\n }\n });\n\n this.connection.connect(() => {\n if (returned) {\n return;\n }\n\n if (this.auth && (this.connection.allowsAuth || options.forceAuth)) {\n this.connection.login(this.auth, err => {\n if (returned) {\n return;\n }\n returned = true;\n\n if (err) {\n this.connection.close();\n this.emit('error', err);\n return callback(err);\n }\n\n this._connected = true;\n callback(null, true);\n });\n } else {\n returned = true;\n this._connected = true;\n return callback(null, true);\n }\n });\n });\n }\n\n /**\n * Sends an e-mail to be sent using the selected settings\n *\n * @param {Object} mail Mail object\n * @param {Function} callback Callback function\n */\n send(mail, callback) {\n if (!this._connected) {\n return this.connect(err => {\n if (err) {\n return callback(err);\n }\n return this.send(mail, callback);\n });\n }\n\n const envelope = mail.message.getEnvelope();\n const messageId = mail.message.messageId();\n\n const recipients = [].concat(envelope.to || []);\n if (recipients.length > 3) {\n recipients.push('...and ' + recipients.splice(2).length + ' more');\n }\n this.logger.info(\n {\n tnx: 'send',\n messageId,\n cid: this.id\n },\n 'Sending message %s using #%s to <%s>',\n messageId,\n this.id,\n recipients.join(', ')\n );\n\n if (mail.data.dsn) {\n envelope.dsn = mail.data.dsn;\n }\n\n // RFC 8689: Pass requireTLSExtensionEnabled to envelope for MAIL FROM parameter\n if (mail.data.requireTLSExtensionEnabled) {\n envelope.requireTLSExtensionEnabled = mail.data.requireTLSExtensionEnabled;\n }\n\n this.connection.send(envelope, mail.message.createReadStream(), (err, info) => {\n this.messages++;\n\n if (err) {\n this.connection.close();\n this.emit('error', err);\n return callback(err);\n }\n\n info.envelope = {\n from: envelope.from,\n to: envelope.to\n };\n info.messageId = messageId;\n\n setImmediate(() => {\n if (this.messages >= this.options.maxMessages) {\n const err = new Error('Resource exhausted');\n err.code = errors.EMAXLIMIT;\n this.connection.close();\n this.emit('error', err);\n } else {\n this.pool._checkRateLimit(() => {\n this.available = true;\n this.emit('available');\n });\n }\n });\n\n callback(null, info);\n });\n }\n\n /**\n * Closes the connection\n */\n close() {\n this._connected = false;\n if (this.auth && this.auth.oauth2) {\n this.auth.oauth2.removeAllListeners();\n }\n if (this.connection) {\n this.connection.close();\n }\n this.emit('close');\n }\n}\n\nmodule.exports = PoolResource;\n","","'use strict';\n\nconst services = require('./services.json');\nconst normalized = {};\n\nObject.keys(services).forEach(key => {\n const service = services[key];\n const normalizedService = normalizeService(service);\n\n normalized[normalizeKey(key)] = normalizedService;\n\n [].concat(service.aliases || []).forEach(alias => {\n normalized[normalizeKey(alias)] = normalizedService;\n });\n\n [].concat(service.domains || []).forEach(domain => {\n normalized[normalizeKey(domain)] = normalizedService;\n });\n});\n\nfunction normalizeKey(key) {\n return key.replace(/[^a-zA-Z0-9.-]/g, '').toLowerCase();\n}\n\nfunction normalizeService(service) {\n const response = {};\n\n Object.keys(service).forEach(key => {\n if (!['domains', 'aliases'].includes(key)) {\n response[key] = service[key];\n }\n });\n\n return response;\n}\n\n/**\n * Resolves SMTP config for given key. Key can be a name (like 'Gmail'), alias (like 'Google Mail') or\n * an email address (like 'test@googlemail.com').\n *\n * @param {String} key [description]\n * @returns {Object} SMTP config or false if not found\n */\nmodule.exports = function (key) {\n key = normalizeKey(key.split('@').pop());\n return normalized[key] || false;\n};\n","'use strict';\n\nconst EventEmitter = require('events');\nconst PoolResource = require('./pool-resource');\nconst SMTPConnection = require('../smtp-connection');\nconst wellKnown = require('../well-known');\nconst shared = require('../shared');\nconst errors = require('../errors');\nconst packageData = require('../../package.json');\n\n/**\n * Creates a SMTP pool transport object for Nodemailer\n *\n * @constructor\n * @param {Object} options SMTP Connection options\n */\nclass SMTPPool extends EventEmitter {\n constructor(options) {\n super();\n\n options = options || {};\n if (typeof options === 'string') {\n options = {\n url: options\n };\n }\n\n let urlData;\n let service = options.service;\n\n if (typeof options.getSocket === 'function') {\n this.getSocket = options.getSocket;\n }\n\n if (options.url) {\n urlData = shared.parseConnectionUrl(options.url);\n service = service || urlData.service;\n }\n\n this.options = shared.assign(\n false, // create new object\n options, // regular options\n urlData, // url options\n service && wellKnown(service) // wellknown options\n );\n\n this.options.maxConnections = this.options.maxConnections || 5;\n this.options.maxMessages = this.options.maxMessages || 100;\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'smtp-pool'\n });\n\n this.name = 'SMTP (pool)';\n this.version = packageData.version + '[client:' + packageData.version + ']';\n\n this._rateLimit = {\n counter: 0,\n timeout: null,\n waiting: [],\n checkpoint: false,\n delta: Number(this.options.rateDelta) || 1000,\n limit: Number(this.options.rateLimit) || 0\n };\n this._closed = false;\n this._queue = [];\n this._connections = [];\n this._connectionCounter = 0;\n\n this.idling = true;\n\n setImmediate(() => {\n if (this.idling) {\n this.emit('idle');\n }\n });\n }\n\n /**\n * Placeholder function for creating proxy sockets. This method immediatelly returns\n * without a socket\n *\n * @param {Object} options Connection options\n * @param {Function} callback Callback function to run with the socket keys\n */\n getSocket(options, callback) {\n // return immediatelly\n return setImmediate(() => callback(null, false));\n }\n\n /**\n * Queues an e-mail to be sent using the selected settings\n *\n * @param {Object} mail Mail object\n * @param {Function} callback Callback function\n */\n send(mail, callback) {\n if (this._closed) {\n return false;\n }\n\n this._queue.push({\n mail,\n requeueAttempts: 0,\n callback\n });\n\n if (this.idling && this._queue.length >= this.options.maxConnections) {\n this.idling = false;\n }\n\n setImmediate(() => this._processMessages());\n\n return true;\n }\n\n /**\n * Closes all connections in the pool. If there is a message being sent, the connection\n * is closed later\n */\n close() {\n let connection;\n const len = this._connections.length;\n this._closed = true;\n\n // clear rate limit timer if it exists\n clearTimeout(this._rateLimit.timeout);\n\n if (!len && !this._queue.length) {\n return;\n }\n\n // remove all available connections\n for (let i = len - 1; i >= 0; i--) {\n if (this._connections[i] && this._connections[i].available) {\n connection = this._connections[i];\n connection.close();\n this.logger.info(\n {\n tnx: 'connection',\n cid: connection.id,\n action: 'removed'\n },\n 'Connection #%s removed',\n connection.id\n );\n }\n }\n\n if (len && !this._connections.length) {\n this.logger.debug(\n {\n tnx: 'connection'\n },\n 'All connections removed'\n );\n }\n\n if (!this._queue.length) {\n return;\n }\n\n // make sure that entire queue would be cleaned\n const invokeCallbacks = () => {\n if (!this._queue.length) {\n this.logger.debug(\n {\n tnx: 'connection'\n },\n 'Pending queue entries cleared'\n );\n return;\n }\n const entry = this._queue.shift();\n if (entry && typeof entry.callback === 'function') {\n try {\n entry.callback(new Error('Connection pool was closed'));\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'callback',\n cid: connection.id\n },\n 'Callback error for #%s: %s',\n connection.id,\n E.message\n );\n }\n }\n setImmediate(invokeCallbacks);\n };\n setImmediate(invokeCallbacks);\n }\n\n /**\n * Check the queue and available connections. If there is a message to be sent and there is\n * an available connection, then use this connection to send the mail\n */\n _processMessages() {\n // do nothing if already closed\n if (this._closed) {\n return;\n }\n\n // do nothing if queue is empty\n if (!this._queue.length) {\n if (!this.idling) {\n // no pending jobs\n this.idling = true;\n this.emit('idle');\n }\n return;\n }\n\n // find first available connection\n let connection = this._connections.find(c => c.available);\n\n if (!connection && this._connections.length < this.options.maxConnections) {\n connection = this._createConnection();\n }\n\n if (!connection) {\n // no more free connection slots available\n this.idling = false;\n return;\n }\n\n // check if there is free space in the processing queue\n if (!this.idling && this._queue.length < this.options.maxConnections) {\n this.idling = true;\n this.emit('idle');\n }\n\n const entry = (connection.queueEntry = this._queue.shift());\n entry.messageId = (connection.queueEntry.mail.message.getHeader('message-id') || '').replace(/[<>\\s]/g, '');\n\n connection.available = false;\n\n this.logger.debug(\n {\n tnx: 'pool',\n cid: connection.id,\n messageId: entry.messageId,\n action: 'assign'\n },\n 'Assigned message <%s> to #%s (%s)',\n entry.messageId,\n connection.id,\n connection.messages + 1\n );\n\n if (this._rateLimit.limit) {\n this._rateLimit.counter++;\n if (!this._rateLimit.checkpoint) {\n this._rateLimit.checkpoint = Date.now();\n }\n }\n\n connection.send(entry.mail, (err, info) => {\n // only process callback if current handler is not changed\n if (entry === connection.queueEntry) {\n try {\n entry.callback(err, info);\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'callback',\n cid: connection.id\n },\n 'Callback error for #%s: %s',\n connection.id,\n E.message\n );\n }\n connection.queueEntry = false;\n }\n });\n }\n\n /**\n * Creates a new pool resource\n */\n _createConnection() {\n const connection = new PoolResource(this);\n\n connection.id = ++this._connectionCounter;\n\n this.logger.info(\n {\n tnx: 'pool',\n cid: connection.id,\n action: 'conection'\n },\n 'Created new pool resource #%s',\n connection.id\n );\n\n // resource comes available\n connection.on('available', () => {\n this.logger.debug(\n {\n tnx: 'connection',\n cid: connection.id,\n action: 'available'\n },\n 'Connection #%s became available',\n connection.id\n );\n\n if (this._closed) {\n // if already closed run close() that will remove this connections from connections list\n this.close();\n } else {\n // check if there's anything else to send\n this._processMessages();\n }\n });\n\n // resource is terminated with an error\n connection.once('error', err => {\n if (err.code !== errors.EMAXLIMIT) {\n this.logger.warn(\n {\n err,\n tnx: 'pool',\n cid: connection.id\n },\n 'Pool Error for #%s: %s',\n connection.id,\n err.message\n );\n } else {\n this.logger.debug(\n {\n tnx: 'pool',\n cid: connection.id,\n action: 'maxlimit'\n },\n 'Max messages limit exchausted for #%s',\n connection.id\n );\n }\n\n if (connection.queueEntry) {\n try {\n connection.queueEntry.callback(err);\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'callback',\n cid: connection.id\n },\n 'Callback error for #%s: %s',\n connection.id,\n E.message\n );\n }\n connection.queueEntry = false;\n }\n\n // remove the erroneus connection from connections list\n this._removeConnection(connection);\n\n this._continueProcessing();\n });\n\n connection.once('close', () => {\n this.logger.info(\n {\n tnx: 'connection',\n cid: connection.id,\n action: 'closed'\n },\n 'Connection #%s was closed',\n connection.id\n );\n\n this._removeConnection(connection);\n\n if (connection.queueEntry) {\n // If the connection closed when sending, add the message to the queue again\n // if max number of requeues is not reached yet\n // Note that we must wait a bit.. because the callback of the 'error' handler might be called\n // in the next event loop\n setTimeout(() => {\n if (connection.queueEntry) {\n if (this._shouldRequeuOnConnectionClose(connection.queueEntry)) {\n this._requeueEntryOnConnectionClose(connection);\n } else {\n this._failDeliveryOnConnectionClose(connection);\n }\n }\n this._continueProcessing();\n }, 50);\n } else {\n if (!this._closed && this.idling && !this._connections.length) {\n this.emit('clear');\n }\n\n this._continueProcessing();\n }\n });\n\n this._connections.push(connection);\n\n return connection;\n }\n\n _shouldRequeuOnConnectionClose(queueEntry) {\n if (this.options.maxRequeues === undefined || this.options.maxRequeues < 0) {\n return true;\n }\n\n return queueEntry.requeueAttempts < this.options.maxRequeues;\n }\n\n _failDeliveryOnConnectionClose(connection) {\n if (connection.queueEntry && connection.queueEntry.callback) {\n try {\n connection.queueEntry.callback(new Error('Reached maximum number of retries after connection was closed'));\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'callback',\n messageId: connection.queueEntry.messageId,\n cid: connection.id\n },\n 'Callback error for #%s: %s',\n connection.id,\n E.message\n );\n }\n connection.queueEntry = false;\n }\n }\n\n _requeueEntryOnConnectionClose(connection) {\n connection.queueEntry.requeueAttempts += 1;\n this.logger.debug(\n {\n tnx: 'pool',\n cid: connection.id,\n messageId: connection.queueEntry.messageId,\n action: 'requeue'\n },\n 'Re-queued message <%s> for #%s. Attempt: #%s',\n connection.queueEntry.messageId,\n connection.id,\n connection.queueEntry.requeueAttempts\n );\n this._queue.unshift(connection.queueEntry);\n connection.queueEntry = false;\n }\n\n /**\n * Continue to process message if the pool hasn't closed\n */\n _continueProcessing() {\n if (this._closed) {\n this.close();\n } else {\n setTimeout(() => this._processMessages(), 100);\n }\n }\n\n /**\n * Remove resource from pool\n *\n * @param {Object} connection The PoolResource to remove\n */\n _removeConnection(connection) {\n const index = this._connections.indexOf(connection);\n\n if (index !== -1) {\n this._connections.splice(index, 1);\n }\n }\n\n /**\n * Checks if connections have hit current rate limit and if so, queues the availability callback\n *\n * @param {Function} callback Callback function to run once rate limiter has been cleared\n */\n _checkRateLimit(callback) {\n if (!this._rateLimit.limit) {\n return callback();\n }\n\n const now = Date.now();\n\n if (this._rateLimit.counter < this._rateLimit.limit) {\n return callback();\n }\n\n this._rateLimit.waiting.push(callback);\n\n if (this._rateLimit.checkpoint <= now - this._rateLimit.delta) {\n return this._clearRateLimit();\n }\n\n if (!this._rateLimit.timeout) {\n this._rateLimit.timeout = setTimeout(() => this._clearRateLimit(), this._rateLimit.delta - (now - this._rateLimit.checkpoint));\n this._rateLimit.checkpoint = now;\n }\n }\n\n /**\n * Clears current rate limit limitation and runs paused callback\n */\n _clearRateLimit() {\n clearTimeout(this._rateLimit.timeout);\n this._rateLimit.timeout = null;\n this._rateLimit.counter = 0;\n this._rateLimit.checkpoint = false;\n\n // resume all paused connections\n while (this._rateLimit.waiting.length) {\n const cb = this._rateLimit.waiting.shift();\n setImmediate(cb);\n }\n }\n\n /**\n * Returns true if there are free slots in the queue\n */\n isIdle() {\n return this.idling;\n }\n\n /**\n * Verifies SMTP configuration\n *\n * @param {Function} callback Callback function\n */\n verify(callback) {\n let promise;\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = shared.callbackPromise(resolve, reject);\n });\n }\n\n const auth = new PoolResource(this).auth;\n\n this.getSocket(this.options, (err, socketOptions) => {\n if (err) {\n return callback(err);\n }\n\n let options = this.options;\n if (socketOptions && socketOptions.connection) {\n this.logger.info(\n {\n tnx: 'proxy',\n remoteAddress: socketOptions.connection.remoteAddress,\n remotePort: socketOptions.connection.remotePort,\n destHost: options.host || '',\n destPort: options.port || '',\n action: 'connected'\n },\n 'Using proxied socket from %s:%s to %s:%s',\n socketOptions.connection.remoteAddress,\n socketOptions.connection.remotePort,\n options.host || '',\n options.port || ''\n );\n options = Object.assign(shared.assign(false, options), socketOptions);\n }\n\n const connection = new SMTPConnection(options);\n let returned = false;\n\n connection.once('error', err => {\n if (returned) {\n return;\n }\n returned = true;\n connection.close();\n return callback(err);\n });\n\n connection.once('end', () => {\n if (returned) {\n return;\n }\n returned = true;\n return callback(new Error('Connection closed'));\n });\n\n const finalize = () => {\n if (returned) {\n return;\n }\n returned = true;\n connection.quit();\n return callback(null, true);\n };\n\n connection.connect(() => {\n if (returned) {\n return;\n }\n\n if (auth && (connection.allowsAuth || options.forceAuth)) {\n connection.login(auth, err => {\n if (returned) {\n return;\n }\n\n if (err) {\n returned = true;\n connection.close();\n return callback(err);\n }\n\n finalize();\n });\n } else if (!auth && connection.allowsAuth && options.forceAuth) {\n const err = new Error('Authentication info was not provided');\n err.code = errors.ENOAUTH;\n\n returned = true;\n connection.close();\n return callback(err);\n } else {\n finalize();\n }\n });\n });\n\n return promise;\n }\n}\n\n// expose to the world\nmodule.exports = SMTPPool;\n","'use strict';\n\nconst EventEmitter = require('events');\nconst SMTPConnection = require('../smtp-connection');\nconst wellKnown = require('../well-known');\nconst shared = require('../shared');\nconst XOAuth2 = require('../xoauth2');\nconst errors = require('../errors');\nconst packageData = require('../../package.json');\n\n/**\n * Creates a SMTP transport object for Nodemailer\n *\n * @constructor\n * @param {Object} options Connection options\n */\nclass SMTPTransport extends EventEmitter {\n constructor(options) {\n super();\n\n options = options || {};\n\n if (typeof options === 'string') {\n options = {\n url: options\n };\n }\n\n let urlData;\n let service = options.service;\n\n if (typeof options.getSocket === 'function') {\n this.getSocket = options.getSocket;\n }\n\n if (options.url) {\n urlData = shared.parseConnectionUrl(options.url);\n service = service || urlData.service;\n }\n\n this.options = shared.assign(\n false, // create new object\n options, // regular options\n urlData, // url options\n service && wellKnown(service) // wellknown options\n );\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'smtp-transport'\n });\n\n this.name = 'SMTP';\n this.version = packageData.version + '[client:' + packageData.version + ']';\n\n if (this.options.auth) {\n this.auth = this.getAuth({});\n }\n }\n\n /**\n * Placeholder function for creating proxy sockets. This method immediatelly returns\n * without a socket\n *\n * @param {Object} options Connection options\n * @param {Function} callback Callback function to run with the socket keys\n */\n getSocket(options, callback) {\n // return immediatelly\n return setImmediate(() => callback(null, false));\n }\n\n getAuth(authOpts) {\n if (!authOpts) {\n return this.auth;\n }\n\n const authData = Object.assign(\n {},\n this.options.auth && typeof this.options.auth === 'object' ? this.options.auth : {},\n authOpts && typeof authOpts === 'object' ? authOpts : {}\n );\n\n if (Object.keys(authData).length === 0) {\n return false;\n }\n\n switch ((authData.type || '').toString().toUpperCase()) {\n case 'OAUTH2': {\n if (!authData.service && !authData.user) {\n return false;\n }\n const oauth2 = new XOAuth2(authData, this.logger);\n oauth2.provisionCallback = (this.mailer && this.mailer.get('oauth2_provision_cb')) || oauth2.provisionCallback;\n oauth2.on('token', token => this.mailer.emit('token', token));\n oauth2.on('error', err => this.emit('error', err));\n return {\n type: 'OAUTH2',\n user: authData.user,\n oauth2,\n method: 'XOAUTH2'\n };\n }\n default:\n return {\n type: (authData.type || '').toString().toUpperCase() || 'LOGIN',\n user: authData.user,\n credentials: {\n user: authData.user || '',\n pass: authData.pass,\n options: authData.options\n },\n method: (authData.method || '').trim().toUpperCase() || this.options.authMethod || false\n };\n }\n }\n\n /**\n * Sends an e-mail using the selected settings\n *\n * @param {Object} mail Mail object\n * @param {Function} callback Callback function\n */\n send(mail, callback) {\n this.getSocket(this.options, (err, socketOptions) => {\n if (err) {\n return callback(err);\n }\n\n let returned = false;\n let options = this.options;\n if (socketOptions && socketOptions.connection) {\n this.logger.info(\n {\n tnx: 'proxy',\n remoteAddress: socketOptions.connection.remoteAddress,\n remotePort: socketOptions.connection.remotePort,\n destHost: options.host || '',\n destPort: options.port || '',\n action: 'connected'\n },\n 'Using proxied socket from %s:%s to %s:%s',\n socketOptions.connection.remoteAddress,\n socketOptions.connection.remotePort,\n options.host || '',\n options.port || ''\n );\n\n // only copy options if we need to modify it\n options = Object.assign(shared.assign(false, options), socketOptions);\n }\n\n const connection = new SMTPConnection(options);\n\n connection.once('error', err => {\n if (returned) {\n return;\n }\n returned = true;\n connection.close();\n return callback(err);\n });\n\n connection.once('end', () => {\n if (returned) {\n return;\n }\n\n const timer = setTimeout(() => {\n if (returned) {\n return;\n }\n returned = true;\n // still have not returned, this means we have an unexpected connection close\n const err = new Error('Unexpected socket close');\n if (connection && connection._socket && connection._socket.upgrading) {\n // starttls connection errors\n err.code = errors.ETLS;\n }\n callback(err);\n }, 1000);\n\n try {\n timer.unref();\n } catch (_E) {\n // Ignore. Happens on envs with non-node timer implementation\n }\n });\n\n const sendMessage = () => {\n const envelope = mail.message.getEnvelope();\n const messageId = mail.message.messageId();\n\n const recipients = [].concat(envelope.to || []);\n if (recipients.length > 3) {\n recipients.push('...and ' + recipients.splice(2).length + ' more');\n }\n\n if (mail.data.dsn) {\n envelope.dsn = mail.data.dsn;\n }\n\n // RFC 8689: Pass requireTLSExtensionEnabled to envelope for MAIL FROM parameter\n if (mail.data.requireTLSExtensionEnabled) {\n envelope.requireTLSExtensionEnabled = mail.data.requireTLSExtensionEnabled;\n }\n\n this.logger.info(\n {\n tnx: 'send',\n messageId\n },\n 'Sending message %s to <%s>',\n messageId,\n recipients.join(', ')\n );\n\n connection.send(envelope, mail.message.createReadStream(), (err, info) => {\n returned = true;\n connection.close();\n if (err) {\n this.logger.error(\n {\n err,\n tnx: 'send'\n },\n 'Send error for %s: %s',\n messageId,\n err.message\n );\n return callback(err);\n }\n info.envelope = {\n from: envelope.from,\n to: envelope.to\n };\n info.messageId = messageId;\n try {\n return callback(null, info);\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'callback'\n },\n 'Callback error for %s: %s',\n messageId,\n E.message\n );\n }\n });\n };\n\n connection.connect(() => {\n if (returned) {\n return;\n }\n\n const auth = this.getAuth(mail.data.auth);\n\n if (auth && (connection.allowsAuth || options.forceAuth)) {\n connection.login(auth, err => {\n if (auth && auth !== this.auth && auth.oauth2) {\n auth.oauth2.removeAllListeners();\n }\n if (returned) {\n return;\n }\n\n if (err) {\n returned = true;\n connection.close();\n return callback(err);\n }\n\n sendMessage();\n });\n } else {\n sendMessage();\n }\n });\n });\n }\n\n /**\n * Verifies SMTP configuration\n *\n * @param {Function} callback Callback function\n */\n verify(callback) {\n let promise;\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = shared.callbackPromise(resolve, reject);\n });\n }\n\n this.getSocket(this.options, (err, socketOptions) => {\n if (err) {\n return callback(err);\n }\n\n let options = this.options;\n if (socketOptions && socketOptions.connection) {\n this.logger.info(\n {\n tnx: 'proxy',\n remoteAddress: socketOptions.connection.remoteAddress,\n remotePort: socketOptions.connection.remotePort,\n destHost: options.host || '',\n destPort: options.port || '',\n action: 'connected'\n },\n 'Using proxied socket from %s:%s to %s:%s',\n socketOptions.connection.remoteAddress,\n socketOptions.connection.remotePort,\n options.host || '',\n options.port || ''\n );\n\n options = Object.assign(shared.assign(false, options), socketOptions);\n }\n\n const connection = new SMTPConnection(options);\n let returned = false;\n\n connection.once('error', err => {\n if (returned) {\n return;\n }\n returned = true;\n connection.close();\n return callback(err);\n });\n\n connection.once('end', () => {\n if (returned) {\n return;\n }\n returned = true;\n return callback(new Error('Connection closed'));\n });\n\n const finalize = () => {\n if (returned) {\n return;\n }\n returned = true;\n connection.quit();\n return callback(null, true);\n };\n\n connection.connect(() => {\n if (returned) {\n return;\n }\n\n const authData = this.getAuth({});\n\n if (authData && (connection.allowsAuth || options.forceAuth)) {\n connection.login(authData, err => {\n if (returned) {\n return;\n }\n\n if (err) {\n returned = true;\n connection.close();\n return callback(err);\n }\n\n finalize();\n });\n } else if (!authData && connection.allowsAuth && options.forceAuth) {\n const err = new Error('Authentication info was not provided');\n err.code = errors.ENOAUTH;\n\n returned = true;\n connection.close();\n return callback(err);\n } else {\n finalize();\n }\n });\n });\n\n return promise;\n }\n\n /**\n * Releases resources\n */\n close() {\n if (this.auth && this.auth.oauth2) {\n this.auth.oauth2.removeAllListeners();\n }\n this.emit('close');\n }\n}\n\n// expose to the world\nmodule.exports = SMTPTransport;\n","'use strict';\n\nconst { spawn } = require('child_process');\nconst packageData = require('../../package.json');\nconst shared = require('../shared');\nconst errors = require('../errors');\n\n/**\n * Generates a Transport object for Sendmail\n *\n * Possible options can be the following:\n *\n * * **path** optional path to sendmail binary\n * * **newline** either 'windows' or 'unix'\n * * **args** an array of arguments for the sendmail binary\n *\n * @constructor\n * @param {Object} optional config parameter for Sendmail\n */\nclass SendmailTransport {\n constructor(options) {\n options = options || {};\n\n // use a reference to spawn for mocking purposes\n this._spawn = spawn;\n\n this.options = options;\n\n this.name = 'Sendmail';\n this.version = packageData.version;\n\n this.path = 'sendmail';\n this.args = false;\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'sendmail'\n });\n\n if (typeof options === 'string') {\n this.path = options;\n } else if (typeof options === 'object') {\n if (options.path) {\n this.path = options.path;\n }\n if (Array.isArray(options.args)) {\n this.args = options.args;\n }\n }\n }\n\n /**\n * <p>Compiles a mailcomposer message and forwards it to handler that sends it.</p>\n *\n * @param {Object} emailMessage MailComposer object\n * @param {Function} callback Callback function to run when the sending is completed\n */\n send(mail, done) {\n // Sendmail strips this header line by itself\n mail.message.keepBcc = true;\n\n const envelope = mail.data.envelope || mail.message.getEnvelope();\n const messageId = mail.message.messageId();\n let returned;\n\n const hasInvalidAddresses = []\n .concat(envelope.from || [])\n .concat(envelope.to || [])\n .some(addr => /^-/.test(addr));\n if (hasInvalidAddresses) {\n const err = new Error('Can not send mail. Invalid envelope addresses.');\n err.code = errors.ESENDMAIL;\n return done(err);\n }\n\n // force -i to keep single dots\n const args = this.args\n ? ['-i'].concat(this.args).concat(envelope.to)\n : ['-i'].concat(envelope.from ? ['-f', envelope.from] : []).concat(envelope.to);\n\n const callback = err => {\n if (returned) {\n // ignore any additional responses, already done\n return;\n }\n returned = true;\n if (typeof done === 'function') {\n if (err) {\n return done(err);\n }\n return done(null, {\n envelope,\n messageId,\n response: 'Messages queued for delivery'\n });\n }\n };\n\n let sendmail;\n try {\n sendmail = this._spawn(this.path, args);\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'spawn',\n messageId\n },\n 'Error occurred while spawning sendmail. %s',\n E.message\n );\n return callback(E);\n }\n\n if (sendmail) {\n sendmail.on('error', err => {\n this.logger.error(\n {\n err,\n tnx: 'spawn',\n messageId\n },\n 'Error occurred when sending message %s. %s',\n messageId,\n err.message\n );\n callback(err);\n });\n\n sendmail.once('exit', code => {\n if (!code) {\n return callback();\n }\n const err = new Error(\n code === 127 ? 'Sendmail command not found, process exited with code ' + code : 'Sendmail exited with code ' + code\n );\n err.code = errors.ESENDMAIL;\n\n this.logger.error(\n {\n err,\n tnx: 'stdin',\n messageId\n },\n 'Error sending message %s to sendmail. %s',\n messageId,\n err.message\n );\n callback(err);\n });\n sendmail.once('close', callback);\n\n sendmail.stdin.on('error', err => {\n this.logger.error(\n {\n err,\n tnx: 'stdin',\n messageId\n },\n 'Error occurred when piping message %s to sendmail. %s',\n messageId,\n err.message\n );\n callback(err);\n });\n\n const recipients = [].concat(envelope.to || []);\n if (recipients.length > 3) {\n recipients.push('...and ' + recipients.splice(2).length + ' more');\n }\n this.logger.info(\n {\n tnx: 'send',\n messageId\n },\n 'Sending message %s to <%s>',\n messageId,\n recipients.join(', ')\n );\n\n const sourceStream = mail.message.createReadStream();\n sourceStream.once('error', err => {\n this.logger.error(\n {\n err,\n tnx: 'stdin',\n messageId\n },\n 'Error occurred when generating message %s. %s',\n messageId,\n err.message\n );\n sendmail.kill('SIGINT'); // do not deliver the message\n callback(err);\n });\n\n sourceStream.pipe(sendmail.stdin);\n } else {\n const err = new Error('sendmail was not found');\n err.code = errors.ESENDMAIL;\n return callback(err);\n }\n }\n}\n\nmodule.exports = SendmailTransport;\n","'use strict';\n\nconst packageData = require('../../package.json');\nconst shared = require('../shared');\n\n/**\n * Generates a Transport object for streaming\n *\n * Possible options can be the following:\n *\n * * **buffer** if true, then returns the message as a Buffer object instead of a stream\n * * **newline** either 'windows' or 'unix'\n *\n * @constructor\n * @param {Object} optional config parameter\n */\nclass StreamTransport {\n constructor(options) {\n options = options || {};\n\n this.options = options;\n\n this.name = 'StreamTransport';\n this.version = packageData.version;\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'stream-transport'\n });\n\n this.winbreak = ['win', 'windows', 'dos', '\\r\\n'].includes((options.newline || '').toString().toLowerCase());\n }\n\n /**\n * Compiles a mailcomposer message and forwards it to handler that sends it\n *\n * @param {Object} emailMessage MailComposer object\n * @param {Function} callback Callback function to run when the sending is completed\n */\n send(mail, done) {\n // We probably need this in the output\n mail.message.keepBcc = true;\n\n const envelope = mail.data.envelope || mail.message.getEnvelope();\n const messageId = mail.message.messageId();\n\n const recipients = [].concat(envelope.to || []);\n if (recipients.length > 3) {\n recipients.push('...and ' + recipients.splice(2).length + ' more');\n }\n this.logger.info(\n {\n tnx: 'send',\n messageId\n },\n 'Sending message %s to <%s> using %s line breaks',\n messageId,\n recipients.join(', '),\n this.winbreak ? '<CR><LF>' : '<LF>'\n );\n\n setImmediate(() => {\n let stream;\n\n try {\n stream = mail.message.createReadStream();\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'send',\n messageId\n },\n 'Creating send stream failed for %s. %s',\n messageId,\n E.message\n );\n return done(E);\n }\n\n if (!this.options.buffer) {\n stream.once('error', err => {\n this.logger.error(\n {\n err,\n tnx: 'send',\n messageId\n },\n 'Failed creating message for %s. %s',\n messageId,\n err.message\n );\n });\n return done(null, {\n envelope,\n messageId,\n message: stream\n });\n }\n\n const chunks = [];\n let chunklen = 0;\n stream.on('readable', () => {\n let chunk;\n while ((chunk = stream.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n\n stream.once('error', err => {\n this.logger.error(\n {\n err,\n tnx: 'send',\n messageId\n },\n 'Failed creating message for %s. %s',\n messageId,\n err.message\n );\n return done(err);\n });\n\n stream.on('end', () =>\n done(null, {\n envelope,\n messageId,\n message: Buffer.concat(chunks, chunklen)\n })\n );\n });\n }\n}\n\nmodule.exports = StreamTransport;\n","'use strict';\n\nconst packageData = require('../../package.json');\nconst shared = require('../shared');\n\n/**\n * Generates a Transport object to generate JSON output\n *\n * @constructor\n * @param {Object} optional config parameter\n */\nclass JSONTransport {\n constructor(options) {\n options = options || {};\n\n this.options = options;\n\n this.name = 'JSONTransport';\n this.version = packageData.version;\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'json-transport'\n });\n }\n\n /**\n * <p>Compiles a mailcomposer message and forwards it to handler that sends it.</p>\n *\n * @param {Object} emailMessage MailComposer object\n * @param {Function} callback Callback function to run when the sending is completed\n */\n send(mail, done) {\n // Sendmail strips this header line by itself\n mail.message.keepBcc = true;\n\n const envelope = mail.data.envelope || mail.message.getEnvelope();\n const messageId = mail.message.messageId();\n\n const recipients = [].concat(envelope.to || []);\n if (recipients.length > 3) {\n recipients.push('...and ' + recipients.splice(2).length + ' more');\n }\n this.logger.info(\n {\n tnx: 'send',\n messageId\n },\n 'Composing JSON structure of %s to <%s>',\n messageId,\n recipients.join(', ')\n );\n\n setImmediate(() => {\n mail.normalize((err, data) => {\n if (err) {\n this.logger.error(\n {\n err,\n tnx: 'send',\n messageId\n },\n 'Failed building JSON structure for %s. %s',\n messageId,\n err.message\n );\n return done(err);\n }\n\n delete data.envelope;\n delete data.normalizedHeaders;\n\n return done(null, {\n envelope,\n messageId,\n message: this.options.skipEncoding ? data : JSON.stringify(data)\n });\n });\n });\n }\n}\n\nmodule.exports = JSONTransport;\n","'use strict';\n\nconst EventEmitter = require('events');\nconst packageData = require('../../package.json');\nconst shared = require('../shared');\nconst LeWindows = require('../mime-node/le-windows');\nconst MimeNode = require('../mime-node');\n\n/**\n * Generates a Transport object for AWS SES\n *\n * @constructor\n * @param {Object} optional config parameter\n */\nclass SESTransport extends EventEmitter {\n constructor(options) {\n super();\n options = options || {};\n\n this.options = options;\n this.ses = this.options.SES;\n\n this.name = 'SESTransport';\n this.version = packageData.version;\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'ses-transport'\n });\n }\n\n getRegion(cb) {\n if (this.ses.sesClient.config && typeof this.ses.sesClient.config.region === 'function') {\n // promise\n return this.ses.sesClient.config\n .region()\n .then(region => cb(null, region))\n .catch(err => cb(err));\n }\n return cb(null, false);\n }\n\n /**\n * Compiles a mailcomposer message and forwards it to SES\n *\n * @param {Object} emailMessage MailComposer object\n * @param {Function} callback Callback function to run when the sending is completed\n */\n send(mail, callback) {\n let fromHeader = mail.message._headers.find(header => /^from$/i.test(header.key));\n if (fromHeader) {\n const mimeNode = new MimeNode('text/plain');\n fromHeader = mimeNode._convertAddresses(mimeNode._parseAddresses(fromHeader.value));\n }\n\n const envelope = mail.data.envelope || mail.message.getEnvelope();\n const messageId = mail.message.messageId();\n\n const recipients = [].concat(envelope.to || []);\n if (recipients.length > 3) {\n recipients.push('...and ' + recipients.splice(2).length + ' more');\n }\n this.logger.info(\n {\n tnx: 'send',\n messageId\n },\n 'Sending message %s to <%s>',\n messageId,\n recipients.join(', ')\n );\n\n const getRawMessage = next => {\n // do not use Message-ID and Date in DKIM signature\n if (!mail.data._dkim) {\n mail.data._dkim = {};\n }\n if (mail.data._dkim.skipFields && typeof mail.data._dkim.skipFields === 'string') {\n mail.data._dkim.skipFields += ':date:message-id';\n } else {\n mail.data._dkim.skipFields = 'date:message-id';\n }\n\n const sourceStream = mail.message.createReadStream();\n const stream = sourceStream.pipe(new LeWindows());\n const chunks = [];\n let chunklen = 0;\n\n stream.on('readable', () => {\n let chunk;\n while ((chunk = stream.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n\n sourceStream.once('error', err => stream.emit('error', err));\n\n stream.once('error', err => next(err));\n\n stream.once('end', () => next(null, Buffer.concat(chunks, chunklen)));\n };\n\n setImmediate(() =>\n getRawMessage((err, raw) => {\n if (err) {\n this.logger.error(\n {\n err,\n tnx: 'send',\n messageId\n },\n 'Failed creating message for %s. %s',\n messageId,\n err.message\n );\n return callback(err);\n }\n\n const sesMessage = Object.assign(\n {\n Content: {\n Raw: {\n // required\n Data: raw // required\n }\n },\n FromEmailAddress: fromHeader || envelope.from,\n Destination: {\n ToAddresses: envelope.to\n }\n },\n mail.data.ses || {}\n );\n\n this.getRegion((err, region) => {\n if (err || !region) {\n region = 'us-east-1';\n }\n\n const command = new this.ses.SendEmailCommand(sesMessage);\n const sendPromise = this.ses.sesClient.send(command);\n\n sendPromise\n .then(data => {\n if (region === 'us-east-1') {\n region = 'email';\n }\n\n callback(null, {\n envelope: {\n from: envelope.from,\n to: envelope.to\n },\n messageId: '<' + data.MessageId + (!/@/.test(data.MessageId) ? '@' + region + '.amazonses.com' : '') + '>',\n response: data.MessageId,\n raw\n });\n })\n .catch(err => {\n this.logger.error(\n {\n err,\n tnx: 'send'\n },\n 'Send error for %s: %s',\n messageId,\n err.message\n );\n callback(err);\n });\n });\n })\n );\n }\n\n /**\n * Verifies SES configuration\n *\n * @param {Function} callback Callback function\n */\n verify(callback) {\n let promise;\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = shared.callbackPromise(resolve, reject);\n });\n }\n\n const cb = err => {\n if (err && !['InvalidParameterValue', 'MessageRejected'].includes(err.code || err.Code || err.name)) {\n return callback(err);\n }\n return callback(null, true);\n };\n\n const sesMessage = {\n Content: {\n Raw: {\n Data: Buffer.from('From: <invalid@invalid>\\r\\nTo: <invalid@invalid>\\r\\n Subject: Invalid\\r\\n\\r\\nInvalid')\n }\n },\n FromEmailAddress: 'invalid@invalid',\n Destination: {\n ToAddresses: ['invalid@invalid']\n }\n };\n\n this.getRegion((err, region) => {\n if (err || !region) {\n region = 'us-east-1';\n }\n\n const command = new this.ses.SendEmailCommand(sesMessage);\n const sendPromise = this.ses.sesClient.send(command);\n\n sendPromise.then(data => cb(null, data)).catch(err => cb(err));\n });\n\n return promise;\n }\n}\n\nmodule.exports = SESTransport;\n","'use strict';\n\nconst Mailer = require('./mailer');\nconst shared = require('./shared');\nconst SMTPPool = require('./smtp-pool');\nconst SMTPTransport = require('./smtp-transport');\nconst SendmailTransport = require('./sendmail-transport');\nconst StreamTransport = require('./stream-transport');\nconst JSONTransport = require('./json-transport');\nconst SESTransport = require('./ses-transport');\nconst errors = require('./errors');\nconst nmfetch = require('./fetch');\nconst packageData = require('../package.json');\n\nconst ETHEREAL_API = (process.env.ETHEREAL_API || 'https://api.nodemailer.com').replace(/\\/+$/, '');\nconst ETHEREAL_WEB = (process.env.ETHEREAL_WEB || 'https://ethereal.email').replace(/\\/+$/, '');\nconst ETHEREAL_API_KEY = (process.env.ETHEREAL_API_KEY || '').replace(/\\s*/g, '') || null;\nconst ETHEREAL_CACHE = ['true', 'yes', 'y', '1'].includes((process.env.ETHEREAL_CACHE || 'yes').toString().trim().toLowerCase());\n\nlet testAccount = false;\n\nmodule.exports.createTransport = function (transporter, defaults) {\n let options;\n\n if (\n // provided transporter is a configuration object, not transporter plugin\n (typeof transporter === 'object' && typeof transporter.send !== 'function') ||\n // provided transporter looks like a connection url\n (typeof transporter === 'string' && /^(smtps?|direct):/i.test(transporter))\n ) {\n const urlConfig = typeof transporter === 'string' ? transporter : transporter.url;\n if (urlConfig) {\n // parse a configuration URL into configuration options\n options = shared.parseConnectionUrl(urlConfig);\n } else {\n options = transporter;\n }\n\n if (options.pool) {\n transporter = new SMTPPool(options);\n } else if (options.sendmail) {\n transporter = new SendmailTransport(options);\n } else if (options.streamTransport) {\n transporter = new StreamTransport(options);\n } else if (options.jsonTransport) {\n transporter = new JSONTransport(options);\n } else if (options.SES) {\n if (options.SES.ses && options.SES.aws) {\n const error = new Error(\n 'Using legacy SES configuration, expecting @aws-sdk/client-sesv2, see https://nodemailer.com/transports/ses/'\n );\n error.code = errors.ECONFIG;\n throw error;\n }\n transporter = new SESTransport(options);\n } else {\n transporter = new SMTPTransport(options);\n }\n }\n\n return new Mailer(transporter, options, defaults);\n};\n\nmodule.exports.createTestAccount = function (apiUrl, callback) {\n let promise;\n\n if (!callback && typeof apiUrl === 'function') {\n callback = apiUrl;\n apiUrl = false;\n }\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = shared.callbackPromise(resolve, reject);\n });\n }\n\n if (ETHEREAL_CACHE && testAccount) {\n setImmediate(() => callback(null, testAccount));\n return promise;\n }\n\n apiUrl = apiUrl || ETHEREAL_API;\n\n const chunks = [];\n let chunklen = 0;\n\n const requestHeaders = {};\n const requestBody = {\n requestor: packageData.name,\n version: packageData.version\n };\n\n if (ETHEREAL_API_KEY) {\n requestHeaders.Authorization = 'Bearer ' + ETHEREAL_API_KEY;\n }\n\n const req = nmfetch(apiUrl + '/user', {\n contentType: 'application/json',\n method: 'POST',\n headers: requestHeaders,\n body: Buffer.from(JSON.stringify(requestBody))\n });\n\n req.on('readable', () => {\n let chunk;\n while ((chunk = req.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n\n req.once('error', err => callback(err));\n\n req.once('end', () => {\n const res = Buffer.concat(chunks, chunklen);\n let data;\n try {\n data = JSON.parse(res.toString());\n } catch (E) {\n return callback(E);\n }\n if (data.status !== 'success' || data.error) {\n return callback(new Error(data.error || 'Request failed'));\n }\n delete data.status;\n testAccount = data;\n callback(null, testAccount);\n });\n\n return promise;\n};\n\nmodule.exports.getTestMessageUrl = function (info) {\n if (!info || !info.response) {\n return false;\n }\n\n const infoProps = new Map();\n info.response.replace(/\\[([^\\]]+)\\]$/, (m, props) => {\n props.replace(/\\b([A-Z0-9]+)=([^\\s]+)/g, (m, key, value) => {\n infoProps.set(key, value);\n });\n });\n\n if (infoProps.has('STATUS') && infoProps.has('MSGID')) {\n return (testAccount.web || ETHEREAL_WEB) + '/message/' + infoProps.get('MSGID');\n }\n\n return false;\n};\n","import { $atom, $env, $hook, $state, type Static, t } from \"alepha\";\nimport {\n EmailError,\n type EmailProvider,\n type EmailSendOptions,\n} from \"alepha/email\";\nimport { $logger } from \"alepha/logger\";\nimport type { Transporter } from \"nodemailer\";\nimport nodemailer from \"nodemailer\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Environment variables for nodemailer configuration\n */\nconst envSchema = t.object({\n EMAIL_HOST: t.optional(\n t.text({\n description: \"SMTP server host\",\n }),\n ),\n EMAIL_PORT: t.number({\n default: 587,\n description: \"SMTP server port\",\n }),\n EMAIL_USER: t.optional(\n t.text({\n description: \"SMTP authentication username\",\n }),\n ),\n EMAIL_PASS: t.optional(\n t.text({\n description: \"SMTP authentication password\",\n }),\n ),\n EMAIL_FROM: t.optional(\n t.text({\n description: \"Default from email address\",\n }),\n ),\n EMAIL_SECURE: t.boolean({\n default: false,\n description: \"Use secure connection (TLS)\",\n }),\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Nodemailer connection pooling and rate limiting options\n */\nexport const nodemailerEmailOptions = $atom({\n name: \"alepha.email.nodemailer.options\",\n schema: t.object({\n pool: t.optional(\n t.boolean({\n description: \"Enable connection pooling\",\n }),\n ),\n maxConnections: t.optional(\n t.number({\n description: \"Maximum number of connections in pool\",\n }),\n ),\n maxMessages: t.optional(\n t.number({\n description: \"Maximum messages per connection\",\n }),\n ),\n rateDelta: t.optional(\n t.number({\n description: \"Time in milliseconds between message sends\",\n }),\n ),\n rateLimit: t.optional(\n t.number({\n description: \"Maximum number of messages per rateDelta\",\n }),\n ),\n }),\n default: {},\n});\n\nexport type NodemailerEmailProviderOptions = Static<\n typeof nodemailerEmailOptions.schema\n>;\n\ndeclare module \"alepha\" {\n interface State {\n [nodemailerEmailOptions.key]: NodemailerEmailProviderOptions;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Email provider using Nodemailer for SMTP transport.\n *\n * Configuration is provided via environment variables:\n * - EMAIL_HOST: SMTP server host\n * - EMAIL_PORT: SMTP server port (default: 587)\n * - EMAIL_USER: SMTP authentication username\n * - EMAIL_PASS: SMTP authentication password\n * - EMAIL_FROM: Default from email address\n * - EMAIL_SECURE: Use secure connection (default: false)\n *\n * Advanced pooling/rate limiting options can be configured via atom:\n * @see {@link nodemailerEmailOptions}\n *\n * @example\n * ```typescript\n * // Configure via environment variables\n * // EMAIL_HOST=smtp.example.com\n * // EMAIL_PORT=587\n * // EMAIL_USER=user@example.com\n * // EMAIL_PASS=secret\n * // EMAIL_FROM=noreply@example.com\n *\n * // Optionally configure pooling via atom\n * alepha.state.set(nodemailerEmailOptions.key, {\n * pool: true,\n * maxConnections: 5,\n * rateLimit: 10,\n * });\n * ```\n */\nexport class NodemailerEmailProvider implements EmailProvider {\n protected readonly env = $env(envSchema);\n protected readonly log = $logger();\n protected readonly options = $state(nodemailerEmailOptions);\n protected transporter: Transporter | null = null;\n\n protected get host(): string {\n const host = this.env.EMAIL_HOST;\n if (!host) {\n throw new EmailError(\n \"Email host not configured. Set EMAIL_HOST env var.\",\n );\n }\n return host;\n }\n\n protected get port(): number {\n return this.env.EMAIL_PORT;\n }\n\n protected get secure(): boolean {\n return this.env.EMAIL_SECURE;\n }\n\n protected get user(): string | undefined {\n return this.env.EMAIL_USER;\n }\n\n protected get pass(): string | undefined {\n return this.env.EMAIL_PASS;\n }\n\n protected get fromAddress(): string {\n const from = this.env.EMAIL_FROM;\n if (!from) {\n throw new EmailError(\n \"Email from address not configured. Set EMAIL_FROM env var.\",\n );\n }\n return from;\n }\n\n protected getTransporter(): Transporter {\n if (!this.transporter) {\n this.transporter = this.createTransporter();\n }\n return this.transporter;\n }\n\n public async send(options: EmailSendOptions): Promise<void> {\n const { to, subject, body } = options;\n this.log.debug(\"Sending email via Nodemailer\", { to, subject });\n\n try {\n const result = await this.getTransporter().sendMail({\n from: this.fromAddress,\n to,\n subject,\n html: body,\n });\n\n this.log.info(\"Email sent successfully\", {\n to,\n subject,\n messageId: result.messageId,\n response: result.response,\n });\n } catch (error) {\n const message = `Failed to send email via Nodemailer: ${error instanceof Error ? error.message : String(error)}`;\n this.log.error(message, { to, subject });\n throw new EmailError(message, error instanceof Error ? error : undefined);\n }\n }\n\n protected createTransporter(): Transporter {\n const transporterConfig = {\n host: this.host,\n port: this.port,\n secure: this.secure,\n auth:\n this.user && this.pass\n ? {\n user: this.user,\n pass: this.pass,\n }\n : undefined,\n pool: this.options.pool,\n maxConnections: this.options.maxConnections,\n maxMessages: this.options.maxMessages,\n rateDelta: this.options.rateDelta,\n rateLimit: this.options.rateLimit,\n };\n\n this.log.debug(\"Creating Nodemailer transporter\", {\n host: transporterConfig.host,\n port: transporterConfig.port,\n secure: transporterConfig.secure,\n user: transporterConfig.auth?.user,\n pool: transporterConfig.pool,\n });\n\n return nodemailer.createTransport(transporterConfig);\n }\n\n /**\n * Verify the connection to the email server.\n */\n public async verify(): Promise<boolean> {\n try {\n await this.getTransporter().verify();\n this.log.info(\"Email server connection verified\");\n return true;\n } catch (error) {\n this.log.error(\"Email server connection failed\", { error });\n return false;\n }\n }\n\n /**\n * Close the transporter connection.\n */\n public close(): void {\n if (this.transporter) {\n this.transporter.close();\n this.transporter = null;\n }\n }\n\n protected readonly onStart = $hook({\n on: \"start\",\n handler: () => this.verify(),\n });\n\n protected readonly onStop = $hook({\n on: \"stop\",\n handler: () => this.close(),\n });\n}\n","import { $module, type Alepha } from \"alepha\";\nimport { AlephaEmail, EmailProvider } from \"alepha/email\";\nimport { NodemailerEmailProvider } from \"./providers/NodemailerEmailProvider.ts\";\n\n// Exports\nexport * from \"./providers/NodemailerEmailProvider.ts\";\n\n/**\n * Plugin for Alepha Email that provides SMTP capabilities via Nodemailer.\n *\n * @see {@link NodemailerEmailProvider}\n * @module alepha.email.smtp\n */\nexport const AlephaEmailSmtp = $module({\n name: \"alepha.email.smtp\",\n services: [NodemailerEmailProvider],\n imports: [AlephaEmail],\n register: (alepha: Alepha) =>\n alepha.with({\n optional: true,\n provide: EmailProvider,\n use: NodemailerEmailProvider,\n }),\n});\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["urllib","urllib","net","PassThrough","urllib","util","fs","dns","net","os","path","Transform","Transform","Transform","Transform","Transform","crypto","fs","formattedHeaders","PassThrough","Transform","crypto","Transform","crypto","crypto","PassThrough","net","tls","urllib","EventEmitter","net","crypto","crypto","EventEmitter","EventEmitter","EventEmitter","EventEmitter","nodemailer"],"sources":["../../../../../node_modules/nodemailer/lib/fetch/cookies.js","../../../../../node_modules/nodemailer/package.json","../../../../../node_modules/nodemailer/lib/errors.js","../../../../../node_modules/nodemailer/lib/fetch/index.js","../../../../../node_modules/nodemailer/lib/shared/index.js","../../../../../node_modules/nodemailer/lib/mime-funcs/mime-types.js","../../../../../node_modules/nodemailer/lib/punycode/index.js","../../../../../node_modules/nodemailer/lib/base64/index.js","../../../../../node_modules/nodemailer/lib/qp/index.js","../../../../../node_modules/nodemailer/lib/mime-funcs/index.js","../../../../../node_modules/nodemailer/lib/addressparser/index.js","../../../../../node_modules/nodemailer/lib/mime-node/last-newline.js","../../../../../node_modules/nodemailer/lib/mime-node/le-windows.js","../../../../../node_modules/nodemailer/lib/mime-node/le-unix.js","../../../../../node_modules/nodemailer/lib/mime-node/index.js","../../../../../node_modules/nodemailer/lib/mail-composer/index.js","../../../../../node_modules/nodemailer/lib/dkim/message-parser.js","../../../../../node_modules/nodemailer/lib/dkim/relaxed-body.js","../../../../../node_modules/nodemailer/lib/dkim/sign.js","../../../../../node_modules/nodemailer/lib/dkim/index.js","../../../../../node_modules/nodemailer/lib/smtp-connection/http-proxy-client.js","../../../../../node_modules/nodemailer/lib/mailer/mail-message.js","../../../../../node_modules/nodemailer/lib/mailer/index.js","../../../../../node_modules/nodemailer/lib/smtp-connection/data-stream.js","../../../../../node_modules/nodemailer/lib/smtp-connection/index.js","../../../../../node_modules/nodemailer/lib/xoauth2/index.js","../../../../../node_modules/nodemailer/lib/smtp-pool/pool-resource.js","../../../../../node_modules/nodemailer/lib/well-known/services.json","../../../../../node_modules/nodemailer/lib/well-known/index.js","../../../../../node_modules/nodemailer/lib/smtp-pool/index.js","../../../../../node_modules/nodemailer/lib/smtp-transport/index.js","../../../../../node_modules/nodemailer/lib/sendmail-transport/index.js","../../../../../node_modules/nodemailer/lib/stream-transport/index.js","../../../../../node_modules/nodemailer/lib/json-transport/index.js","../../../../../node_modules/nodemailer/lib/ses-transport/index.js","../../../../../node_modules/nodemailer/lib/nodemailer.js","../../../src/email/smtp/providers/NodemailerEmailProvider.ts","../../../src/email/smtp/index.ts"],"sourcesContent":["'use strict';\n\n// module to handle cookies\n\nconst urllib = require('url');\n\nconst SESSION_TIMEOUT = 1800; // 30 min\n\n/**\n * Creates a biskviit cookie jar for managing cookie values in memory\n *\n * @constructor\n * @param {Object} [options] Optional options object\n */\nclass Cookies {\n constructor(options) {\n this.options = options || {};\n this.cookies = [];\n }\n\n /**\n * Stores a cookie string to the cookie storage\n *\n * @param {String} cookieStr Value from the 'Set-Cookie:' header\n * @param {String} url Current URL\n */\n set(cookieStr, url) {\n const urlparts = urllib.parse(url || '');\n const cookie = this.parse(cookieStr);\n let domain;\n\n if (cookie.domain) {\n domain = cookie.domain.replace(/^\\./, '');\n\n // do not allow cross origin cookies\n if (\n // can't be valid if the requested domain is shorter than current hostname\n urlparts.hostname.length < domain.length ||\n // prefix domains with dot to be sure that partial matches are not used\n ('.' + urlparts.hostname).substr(-domain.length + 1) !== '.' + domain\n ) {\n cookie.domain = urlparts.hostname;\n }\n } else {\n cookie.domain = urlparts.hostname;\n }\n\n if (!cookie.path) {\n cookie.path = this.getPath(urlparts.pathname);\n }\n\n // if no expire date, then use sessionTimeout value\n if (!cookie.expires) {\n cookie.expires = new Date(Date.now() + (Number(this.options.sessionTimeout || SESSION_TIMEOUT) || SESSION_TIMEOUT) * 1000);\n }\n\n return this.add(cookie);\n }\n\n /**\n * Returns cookie string for the 'Cookie:' header.\n *\n * @param {String} url URL to check for\n * @returns {String} Cookie header or empty string if no matches were found\n */\n get(url) {\n return this.list(url)\n .map(cookie => cookie.name + '=' + cookie.value)\n .join('; ');\n }\n\n /**\n * Lists all valied cookie objects for the specified URL\n *\n * @param {String} url URL to check for\n * @returns {Array} An array of cookie objects\n */\n list(url) {\n const result = [];\n\n for (let i = this.cookies.length - 1; i >= 0; i--) {\n const cookie = this.cookies[i];\n\n if (this.isExpired(cookie)) {\n this.cookies.splice(i, 1);\n continue;\n }\n\n if (this.match(cookie, url)) {\n result.unshift(cookie);\n }\n }\n\n return result;\n }\n\n /**\n * Parses cookie string from the 'Set-Cookie:' header\n *\n * @param {String} cookieStr String from the 'Set-Cookie:' header\n * @returns {Object} Cookie object\n */\n parse(cookieStr) {\n const cookie = {};\n\n (cookieStr || '')\n .toString()\n .split(';')\n .forEach(cookiePart => {\n const valueParts = cookiePart.split('=');\n const key = valueParts.shift().trim().toLowerCase();\n let value = valueParts.join('=').trim();\n let domain;\n\n if (!key) {\n // skip empty parts\n return;\n }\n\n switch (key) {\n case 'expires':\n value = new Date(value);\n // ignore date if can not parse it\n if (value.toString() !== 'Invalid Date') {\n cookie.expires = value;\n }\n break;\n\n case 'path':\n cookie.path = value;\n break;\n\n case 'domain':\n domain = value.toLowerCase();\n if (domain.length && domain.charAt(0) !== '.') {\n domain = '.' + domain; // ensure preceeding dot for user set domains\n }\n cookie.domain = domain;\n break;\n\n case 'max-age':\n cookie.expires = new Date(Date.now() + (Number(value) || 0) * 1000);\n break;\n\n case 'secure':\n cookie.secure = true;\n break;\n\n case 'httponly':\n cookie.httponly = true;\n break;\n\n default:\n if (!cookie.name) {\n cookie.name = key;\n cookie.value = value;\n }\n }\n });\n\n return cookie;\n }\n\n /**\n * Checks if a cookie object is valid for a specified URL\n *\n * @param {Object} cookie Cookie object\n * @param {String} url URL to check for\n * @returns {Boolean} true if cookie is valid for specifiec URL\n */\n match(cookie, url) {\n const urlparts = urllib.parse(url || '');\n\n // check if hostname matches\n // .foo.com also matches subdomains, foo.com does not\n if (\n urlparts.hostname !== cookie.domain &&\n (cookie.domain.charAt(0) !== '.' || ('.' + urlparts.hostname).substr(-cookie.domain.length) !== cookie.domain)\n ) {\n return false;\n }\n\n // check if path matches\n const path = this.getPath(urlparts.pathname);\n if (path.substr(0, cookie.path.length) !== cookie.path) {\n return false;\n }\n\n // check secure argument\n if (cookie.secure && urlparts.protocol !== 'https:') {\n return false;\n }\n\n return true;\n }\n\n /**\n * Adds (or updates/removes if needed) a cookie object to the cookie storage\n *\n * @param {Object} cookie Cookie value to be stored\n */\n add(cookie) {\n // nothing to do here\n if (!cookie || !cookie.name) {\n return false;\n }\n\n // overwrite if has same params\n for (let i = 0, len = this.cookies.length; i < len; i++) {\n if (this.compare(this.cookies[i], cookie)) {\n // check if the cookie needs to be removed instead\n if (this.isExpired(cookie)) {\n this.cookies.splice(i, 1); // remove expired/unset cookie\n return false;\n }\n\n this.cookies[i] = cookie;\n return true;\n }\n }\n\n // add as new if not already expired\n if (!this.isExpired(cookie)) {\n this.cookies.push(cookie);\n }\n\n return true;\n }\n\n /**\n * Checks if two cookie objects are the same\n *\n * @param {Object} a Cookie to check against\n * @param {Object} b Cookie to check against\n * @returns {Boolean} True, if the cookies are the same\n */\n compare(a, b) {\n return a.name === b.name && a.path === b.path && a.domain === b.domain && a.secure === b.secure && a.httponly === b.httponly;\n }\n\n /**\n * Checks if a cookie is expired\n *\n * @param {Object} cookie Cookie object to check against\n * @returns {Boolean} True, if the cookie is expired\n */\n isExpired(cookie) {\n return (cookie.expires && cookie.expires < new Date()) || !cookie.value;\n }\n\n /**\n * Returns normalized cookie path for an URL path argument\n *\n * @param {String} pathname\n * @returns {String} Normalized path\n */\n getPath(pathname) {\n let path = (pathname || '/').split('/');\n path.pop(); // remove filename part\n path = path.join('/').trim();\n\n // ensure path prefix /\n if (path.charAt(0) !== '/') {\n path = '/' + path;\n }\n\n // ensure path suffix /\n if (path.substr(-1) !== '/') {\n path += '/';\n }\n\n return path;\n }\n}\n\nmodule.exports = Cookies;\n","","'use strict';\n\n/**\n * Nodemailer Error Codes\n *\n * Centralized error code definitions for consistent error handling.\n *\n * Usage:\n * const errors = require('./errors');\n * let err = new Error('Connection closed');\n * err.code = errors.ECONNECTION;\n */\n\n/**\n * Error code descriptions for documentation and debugging\n */\nconst ERROR_CODES = {\n // Connection errors\n ECONNECTION: 'Connection closed unexpectedly',\n ETIMEDOUT: 'Connection or operation timed out',\n ESOCKET: 'Socket-level error',\n EDNS: 'DNS resolution failed',\n\n // TLS/Security errors\n ETLS: 'TLS handshake or STARTTLS failed',\n EREQUIRETLS: 'REQUIRETLS not supported by server (RFC 8689)',\n\n // Protocol errors\n EPROTOCOL: 'Invalid SMTP server response',\n EENVELOPE: 'Invalid mail envelope (sender or recipients)',\n EMESSAGE: 'Message delivery error',\n ESTREAM: 'Stream processing error',\n\n // Authentication errors\n EAUTH: 'Authentication failed',\n ENOAUTH: 'Authentication credentials not provided',\n EOAUTH2: 'OAuth2 token generation or refresh error',\n\n // Resource errors\n EMAXLIMIT: 'Pool resource limit reached (max messages per connection)',\n\n // Transport-specific errors\n ESENDMAIL: 'Sendmail command error',\n ESES: 'AWS SES transport error',\n\n // Configuration and access errors\n ECONFIG: 'Invalid configuration',\n EPROXY: 'Proxy connection error',\n EFILEACCESS: 'File access rejected (disableFileAccess is set)',\n EURLACCESS: 'URL access rejected (disableUrlAccess is set)',\n EFETCH: 'HTTP fetch error'\n};\n\n// Export error codes as string constants and the full definitions object\nmodule.exports = { ERROR_CODES };\nfor (const code of Object.keys(ERROR_CODES)) {\n module.exports[code] = code;\n}\n","'use strict';\n\nconst http = require('http');\nconst https = require('https');\nconst urllib = require('url');\nconst zlib = require('zlib');\nconst { PassThrough } = require('stream');\nconst Cookies = require('./cookies');\nconst packageData = require('../../package.json');\nconst net = require('net');\nconst errors = require('../errors');\n\nconst MAX_REDIRECTS = 5;\n\nmodule.exports = function (url, options) {\n return nmfetch(url, options);\n};\n\nmodule.exports.Cookies = Cookies;\n\nfunction nmfetch(url, options) {\n options = options || {};\n\n options.fetchRes = options.fetchRes || new PassThrough();\n options.cookies = options.cookies || new Cookies();\n options.redirects = options.redirects || 0;\n options.maxRedirects = isNaN(options.maxRedirects) ? MAX_REDIRECTS : options.maxRedirects;\n\n if (options.cookie) {\n [].concat(options.cookie || []).forEach(cookie => {\n options.cookies.set(cookie, url);\n });\n options.cookie = false;\n }\n\n const fetchRes = options.fetchRes;\n const parsed = urllib.parse(url);\n let method = (options.method || '').toString().trim().toUpperCase() || 'GET';\n let finished = false;\n let cookies;\n let body;\n\n const handler = parsed.protocol === 'https:' ? https : http;\n\n const headers = {\n 'accept-encoding': 'gzip,deflate',\n 'user-agent': 'nodemailer/' + packageData.version\n };\n\n Object.keys(options.headers || {}).forEach(key => {\n headers[key.toLowerCase().trim()] = options.headers[key];\n });\n\n if (options.userAgent) {\n headers['user-agent'] = options.userAgent;\n }\n\n if (parsed.auth) {\n headers.Authorization = 'Basic ' + Buffer.from(parsed.auth).toString('base64');\n }\n\n if ((cookies = options.cookies.get(url))) {\n headers.cookie = cookies;\n }\n\n if (options.body) {\n if (options.contentType !== false) {\n headers['Content-Type'] = options.contentType || 'application/x-www-form-urlencoded';\n }\n\n if (typeof options.body.pipe === 'function') {\n // it's a stream\n headers['Transfer-Encoding'] = 'chunked';\n body = options.body;\n body.on('error', err => {\n if (finished) {\n return;\n }\n finished = true;\n err.code = errors.EFETCH;\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n });\n } else {\n if (options.body instanceof Buffer) {\n body = options.body;\n } else if (typeof options.body === 'object') {\n try {\n // encodeURIComponent can fail on invalid input (partial emoji etc.)\n body = Buffer.from(\n Object.keys(options.body)\n .map(key => {\n const value = options.body[key].toString().trim();\n return encodeURIComponent(key) + '=' + encodeURIComponent(value);\n })\n .join('&')\n );\n } catch (E) {\n if (finished) {\n return;\n }\n finished = true;\n E.code = errors.EFETCH;\n E.sourceUrl = url;\n fetchRes.emit('error', E);\n return;\n }\n } else {\n body = Buffer.from(options.body.toString().trim());\n }\n\n headers['Content-Type'] = options.contentType || 'application/x-www-form-urlencoded';\n headers['Content-Length'] = body.length;\n }\n // if method is not provided, use POST instead of GET\n method = (options.method || '').toString().trim().toUpperCase() || 'POST';\n }\n\n let req;\n const reqOptions = {\n method,\n host: parsed.hostname,\n path: parsed.path,\n port: parsed.port ? parsed.port : parsed.protocol === 'https:' ? 443 : 80,\n headers,\n rejectUnauthorized: false,\n agent: false\n };\n\n if (options.tls) {\n Object.assign(reqOptions, options.tls);\n }\n\n if (\n parsed.protocol === 'https:' &&\n parsed.hostname &&\n parsed.hostname !== reqOptions.host &&\n !net.isIP(parsed.hostname) &&\n !reqOptions.servername\n ) {\n reqOptions.servername = parsed.hostname;\n }\n\n try {\n req = handler.request(reqOptions);\n } catch (E) {\n finished = true;\n setImmediate(() => {\n E.code = errors.EFETCH;\n E.sourceUrl = url;\n fetchRes.emit('error', E);\n });\n return fetchRes;\n }\n\n if (options.timeout) {\n req.setTimeout(options.timeout, () => {\n if (finished) {\n return;\n }\n finished = true;\n req.abort();\n const err = new Error('Request Timeout');\n err.code = errors.EFETCH;\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n });\n }\n\n req.on('error', err => {\n if (finished) {\n return;\n }\n finished = true;\n err.code = errors.EFETCH;\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n });\n\n req.on('response', res => {\n let inflate;\n\n if (finished) {\n return;\n }\n\n switch (res.headers['content-encoding']) {\n case 'gzip':\n case 'deflate':\n inflate = zlib.createUnzip();\n break;\n }\n\n if (res.headers['set-cookie']) {\n [].concat(res.headers['set-cookie'] || []).forEach(cookie => {\n options.cookies.set(cookie, url);\n });\n }\n\n if ([301, 302, 303, 307, 308].includes(res.statusCode) && res.headers.location) {\n // redirect\n options.redirects++;\n if (options.redirects > options.maxRedirects) {\n finished = true;\n const err = new Error('Maximum redirect count exceeded');\n err.code = errors.EFETCH;\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n req.abort();\n return;\n }\n // redirect does not include POST body\n options.method = 'GET';\n options.body = false;\n return nmfetch(urllib.resolve(url, res.headers.location), options);\n }\n\n fetchRes.statusCode = res.statusCode;\n fetchRes.headers = res.headers;\n\n if (res.statusCode >= 300 && !options.allowErrorResponse) {\n finished = true;\n const err = new Error('Invalid status code ' + res.statusCode);\n err.code = errors.EFETCH;\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n req.abort();\n return;\n }\n\n res.on('error', err => {\n if (finished) {\n return;\n }\n finished = true;\n err.code = errors.EFETCH;\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n req.abort();\n });\n\n if (inflate) {\n res.pipe(inflate).pipe(fetchRes);\n inflate.on('error', err => {\n if (finished) {\n return;\n }\n finished = true;\n err.code = errors.EFETCH;\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n req.abort();\n });\n } else {\n res.pipe(fetchRes);\n }\n });\n\n setImmediate(() => {\n if (body) {\n try {\n if (typeof body.pipe === 'function') {\n return body.pipe(req);\n }\n req.write(body);\n } catch (err) {\n finished = true;\n err.code = errors.EFETCH;\n err.sourceUrl = url;\n fetchRes.emit('error', err);\n return;\n }\n }\n req.end();\n });\n\n return fetchRes;\n}\n","/* eslint no-console: 0 */\n\n'use strict';\n\nconst urllib = require('url');\nconst util = require('util');\nconst fs = require('fs');\nconst nmfetch = require('../fetch');\nconst errors = require('../errors');\nconst dns = require('dns');\nconst net = require('net');\nconst os = require('os');\n\nconst DNS_TTL = 5 * 60 * 1000;\nconst CACHE_CLEANUP_INTERVAL = 30 * 1000; // Minimum 30 seconds between cleanups\nconst MAX_CACHE_SIZE = 1000; // Maximum number of entries in cache\n\nlet lastCacheCleanup = 0;\nmodule.exports._lastCacheCleanup = () => lastCacheCleanup;\nmodule.exports._resetCacheCleanup = () => {\n lastCacheCleanup = 0;\n};\n\nlet networkInterfaces;\ntry {\n networkInterfaces = os.networkInterfaces();\n} catch (_err) {\n // fails on some systems\n}\n\nmodule.exports.networkInterfaces = networkInterfaces;\n\nconst isFamilySupported = (family, allowInternal) => {\n const ifaces = module.exports.networkInterfaces;\n if (!ifaces) {\n // hope for the best\n return true;\n }\n\n return Object.keys(ifaces)\n .map(key => ifaces[key])\n .reduce((acc, val) => acc.concat(val), [])\n .filter(i => !i.internal || allowInternal)\n .some(i => i.family === 'IPv' + family || i.family === family);\n};\n\nconst resolve = (family, hostname, options, callback) => {\n options = options || {};\n\n if (!isFamilySupported(family, options.allowInternalNetworkInterfaces)) {\n return callback(null, []);\n }\n\n const dnsResolver = dns.Resolver ? new dns.Resolver(options) : dns;\n dnsResolver['resolve' + family](hostname, (err, addresses) => {\n if (err) {\n switch (err.code) {\n case dns.NODATA:\n case dns.NOTFOUND:\n case dns.NOTIMP:\n case dns.SERVFAIL:\n case dns.CONNREFUSED:\n case dns.REFUSED:\n case 'EAI_AGAIN':\n return callback(null, []);\n }\n return callback(err);\n }\n return callback(null, Array.isArray(addresses) ? addresses : [].concat(addresses || []));\n });\n};\n\nconst dnsCache = (module.exports.dnsCache = new Map());\n\nconst formatDNSValue = (value, extra) => {\n if (!value) {\n return Object.assign({}, extra || {});\n }\n\n const addresses = value.addresses || [];\n\n // Select a random address from available addresses, or null if none\n const host = addresses.length > 0 ? addresses[Math.floor(Math.random() * addresses.length)] : null;\n\n return Object.assign(\n {\n servername: value.servername,\n host,\n // Include all addresses for connection fallback support\n _addresses: addresses\n },\n extra || {}\n );\n};\n\nmodule.exports.resolveHostname = (options, callback) => {\n options = options || {};\n\n if (!options.host && options.servername) {\n options.host = options.servername;\n }\n\n if (!options.host || net.isIP(options.host)) {\n // nothing to do here\n const value = {\n addresses: [options.host],\n servername: options.servername || false\n };\n return callback(\n null,\n formatDNSValue(value, {\n cached: false\n })\n );\n }\n\n let cached;\n if (dnsCache.has(options.host)) {\n cached = dnsCache.get(options.host);\n\n // Lazy cleanup with time throttling\n const now = Date.now();\n if (now - lastCacheCleanup > CACHE_CLEANUP_INTERVAL) {\n lastCacheCleanup = now;\n\n // Clean up expired entries\n for (const [host, entry] of dnsCache.entries()) {\n if (entry.expires && entry.expires < now) {\n dnsCache.delete(host);\n }\n }\n\n // If cache is still too large, remove oldest entries\n if (dnsCache.size > MAX_CACHE_SIZE) {\n const toDelete = Math.floor(MAX_CACHE_SIZE * 0.1); // Remove 10% of entries\n const keys = Array.from(dnsCache.keys()).slice(0, toDelete);\n keys.forEach(key => dnsCache.delete(key));\n }\n }\n\n if (!cached.expires || cached.expires >= now) {\n return callback(\n null,\n formatDNSValue(cached.value, {\n cached: true\n })\n );\n }\n }\n\n // Resolve both IPv4 and IPv6 addresses for fallback support\n let ipv4Addresses = [];\n let ipv6Addresses = [];\n let ipv4Error = null;\n let ipv6Error = null;\n\n resolve(4, options.host, options, (err, addresses) => {\n if (err) {\n ipv4Error = err;\n } else {\n ipv4Addresses = addresses || [];\n }\n\n resolve(6, options.host, options, (err, addresses) => {\n if (err) {\n ipv6Error = err;\n } else {\n ipv6Addresses = addresses || [];\n }\n\n // Combine addresses: IPv4 first, then IPv6\n const allAddresses = ipv4Addresses.concat(ipv6Addresses);\n\n if (allAddresses.length) {\n const value = {\n addresses: allAddresses,\n servername: options.servername || options.host\n };\n\n dnsCache.set(options.host, {\n value,\n expires: Date.now() + (options.dnsTtl || DNS_TTL)\n });\n\n return callback(\n null,\n formatDNSValue(value, {\n cached: false\n })\n );\n }\n\n // No addresses from resolve4/resolve6, try dns.lookup as fallback\n if (ipv4Error && ipv6Error) {\n // Both resolvers had errors\n if (cached) {\n dnsCache.set(options.host, {\n value: cached.value,\n expires: Date.now() + (options.dnsTtl || DNS_TTL)\n });\n\n return callback(\n null,\n formatDNSValue(cached.value, {\n cached: true,\n error: ipv4Error\n })\n );\n }\n }\n\n try {\n dns.lookup(options.host, { all: true }, (err, addresses) => {\n if (err) {\n if (cached) {\n dnsCache.set(options.host, {\n value: cached.value,\n expires: Date.now() + (options.dnsTtl || DNS_TTL)\n });\n\n return callback(\n null,\n formatDNSValue(cached.value, {\n cached: true,\n error: err\n })\n );\n }\n return callback(err);\n }\n\n // Get all supported addresses from dns.lookup\n const supportedAddresses = addresses\n ? addresses.filter(addr => isFamilySupported(addr.family)).map(addr => addr.address)\n : [];\n\n if (addresses && addresses.length && !supportedAddresses.length) {\n // there are addresses but none can be used\n console.warn(`Failed to resolve IPv${addresses[0].family} addresses with current network`);\n }\n\n if (!supportedAddresses.length && cached) {\n // nothing was found, fallback to cached value\n return callback(\n null,\n formatDNSValue(cached.value, {\n cached: true\n })\n );\n }\n\n const value = {\n addresses: supportedAddresses.length ? supportedAddresses : [options.host],\n servername: options.servername || options.host\n };\n\n dnsCache.set(options.host, {\n value,\n expires: Date.now() + (options.dnsTtl || DNS_TTL)\n });\n\n return callback(\n null,\n formatDNSValue(value, {\n cached: false\n })\n );\n });\n } catch (lookupErr) {\n if (cached) {\n dnsCache.set(options.host, {\n value: cached.value,\n expires: Date.now() + (options.dnsTtl || DNS_TTL)\n });\n\n return callback(\n null,\n formatDNSValue(cached.value, {\n cached: true,\n error: lookupErr\n })\n );\n }\n return callback(ipv4Error || ipv6Error || lookupErr);\n }\n });\n });\n};\n/**\n * Parses connection url to a structured configuration object\n *\n * @param {String} str Connection url\n * @return {Object} Configuration object\n */\nmodule.exports.parseConnectionUrl = str => {\n str = str || '';\n const options = {};\n const url = urllib.parse(str, true);\n\n switch (url.protocol) {\n case 'smtp:':\n options.secure = false;\n break;\n case 'smtps:':\n options.secure = true;\n break;\n case 'direct:':\n options.direct = true;\n break;\n }\n\n if (!isNaN(url.port) && Number(url.port)) {\n options.port = Number(url.port);\n }\n\n if (url.hostname) {\n options.host = url.hostname;\n }\n\n if (url.auth) {\n const auth = url.auth.split(':');\n options.auth = {\n user: auth.shift(),\n pass: auth.join(':')\n };\n }\n\n Object.keys(url.query || {}).forEach(key => {\n let obj = options;\n let lKey = key;\n let value = url.query[key];\n\n if (!isNaN(value)) {\n value = Number(value);\n }\n\n switch (value) {\n case 'true':\n value = true;\n break;\n case 'false':\n value = false;\n break;\n }\n\n // tls is nested object\n if (key.indexOf('tls.') === 0) {\n lKey = key.substr(4);\n if (!options.tls) {\n options.tls = {};\n }\n obj = options.tls;\n } else if (key.indexOf('.') >= 0) {\n // ignore nested properties besides tls\n return;\n }\n\n if (!(lKey in obj)) {\n obj[lKey] = value;\n }\n });\n\n return options;\n};\n\nmodule.exports._logFunc = (logger, level, defaults, data, message, ...args) => {\n const entry = Object.assign({}, defaults || {}, data || {});\n delete entry.level;\n\n let logLevel = level;\n if (typeof logger[logLevel] !== 'function') {\n // Provided logger does not implement this level. Fall back to a\n // lower-severity handler instead of throwing.\n logLevel = ['info', 'debug', 'log', 'trace', 'warn', 'error'].find(name => typeof logger[name] === 'function');\n }\n\n if (logLevel) {\n logger[logLevel](entry, message, ...args);\n }\n};\n\n/**\n * Returns a bunyan-compatible logger interface. Uses either provided logger or\n * creates a default console logger\n *\n * @param {Object} [options] Options object that might include 'logger' value\n * @return {Object} bunyan compatible logger\n */\nmodule.exports.getLogger = (options, defaults) => {\n options = options || {};\n\n const response = {};\n const levels = ['trace', 'debug', 'info', 'warn', 'error', 'fatal'];\n\n if (!options.logger) {\n // use vanity logger\n levels.forEach(level => {\n response[level] = () => false;\n });\n return response;\n }\n\n const logger = options.logger === true ? createDefaultLogger(levels) : options.logger;\n\n levels.forEach(level => {\n response[level] = (data, message, ...args) => {\n module.exports._logFunc(logger, level, defaults, data, message, ...args);\n };\n });\n\n return response;\n};\n\n/**\n * Wrapper for creating a callback that either resolves or rejects a promise\n * based on input\n *\n * @param {Function} resolve Function to run if callback is called\n * @param {Function} reject Function to run if callback ends with an error\n */\nmodule.exports.callbackPromise = (resolve, reject) =>\n function () {\n const args = Array.from(arguments);\n const err = args.shift();\n if (err) {\n reject(err);\n } else {\n resolve(...args);\n }\n };\n\nmodule.exports.parseDataURI = uri => {\n if (typeof uri !== 'string') {\n return null;\n }\n\n // Early return for non-data URIs to avoid unnecessary processing\n if (!uri.startsWith('data:')) {\n return null;\n }\n\n // Find the first comma safely - this prevents ReDoS\n const commaPos = uri.indexOf(',');\n if (commaPos === -1) {\n return null;\n }\n\n const data = uri.substring(commaPos + 1);\n const metaStr = uri.substring('data:'.length, commaPos);\n\n let encoding;\n const metaEntries = metaStr.split(';');\n\n if (metaEntries.length > 0) {\n const lastEntry = metaEntries[metaEntries.length - 1].toLowerCase().trim();\n // Only recognize valid encoding types to prevent manipulation\n if (['base64', 'utf8', 'utf-8'].includes(lastEntry) && lastEntry.indexOf('=') === -1) {\n encoding = lastEntry;\n metaEntries.pop();\n }\n }\n\n const contentType = metaEntries.length > 0 ? metaEntries.shift() : 'application/octet-stream';\n const params = {};\n\n for (let i = 0; i < metaEntries.length; i++) {\n const entry = metaEntries[i];\n const sepPos = entry.indexOf('=');\n if (sepPos > 0) {\n // Ensure there's a key before the '='\n const key = entry.substring(0, sepPos).trim();\n const value = entry.substring(sepPos + 1).trim();\n if (key) {\n params[key] = value;\n }\n }\n }\n\n // Decode data based on encoding with proper error handling\n let bufferData;\n try {\n if (encoding === 'base64') {\n bufferData = Buffer.from(data, 'base64');\n } else {\n try {\n bufferData = Buffer.from(decodeURIComponent(data));\n } catch (_decodeError) {\n bufferData = Buffer.from(data);\n }\n }\n } catch (_bufferError) {\n bufferData = Buffer.alloc(0);\n }\n\n return {\n data: bufferData,\n encoding: encoding || null,\n contentType: contentType || 'application/octet-stream',\n params\n };\n};\n\n/**\n * Resolves a String or a Buffer value for content value. Useful if the value\n * is a Stream or a file or an URL. If the value is a Stream, overwrites\n * the stream object with the resolved value (you can't stream a value twice).\n *\n * This is useful when you want to create a plugin that needs a content value,\n * for example the `html` or `text` value as a String or a Buffer but not as\n * a file path or an URL.\n *\n * @param {Object} data An object or an Array you want to resolve an element for\n * @param {String|Number} key Property name or an Array index\n * @param {Object} [options] Optional access policy: { disableFileAccess, disableUrlAccess }\n * @param {Function} callback Callback function with (err, value)\n */\nmodule.exports.resolveContent = (data, key, options, callback) => {\n // options is optional; support the legacy resolveContent(data, key, callback) signature\n if (!callback && typeof options === 'function') {\n callback = options;\n options = false;\n }\n options = options || {};\n\n let promise;\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = module.exports.callbackPromise(resolve, reject);\n });\n }\n\n let content = (data && data[key] && data[key].content) || data[key];\n const encoding = ((typeof data[key] === 'object' && data[key].encoding) || 'utf8')\n .toString()\n .toLowerCase()\n .replace(/[-_\\s]/g, '');\n\n if (!content) {\n return callback(null, content);\n }\n\n if (typeof content === 'object') {\n if (typeof content.pipe === 'function') {\n return resolveStream(content, (err, value) => {\n if (err) {\n return callback(err);\n }\n // we can't stream twice the same content, so we need\n // to replace the stream object with the streaming result\n if (data[key].content) {\n data[key].content = value;\n } else {\n data[key] = value;\n }\n callback(null, value);\n });\n } else if (/^https?:\\/\\//i.test(content.path || content.href)) {\n if (options.disableUrlAccess) {\n return setImmediate(() => {\n const err = new Error('Url access rejected for ' + (content.path || content.href));\n err.code = errors.EURLACCESS;\n callback(err);\n });\n }\n return resolveStream(nmfetch(content.path || content.href), callback);\n } else if (/^data:/i.test(content.path || content.href)) {\n const parsedDataUri = module.exports.parseDataURI(content.path || content.href);\n\n if (!parsedDataUri || !parsedDataUri.data) {\n return callback(null, Buffer.from(0));\n }\n return callback(null, parsedDataUri.data);\n } else if (content.path) {\n if (options.disableFileAccess) {\n return setImmediate(() => {\n const err = new Error('File access rejected for ' + content.path);\n err.code = errors.EFILEACCESS;\n callback(err);\n });\n }\n return resolveStream(fs.createReadStream(content.path), callback);\n }\n }\n\n if (typeof data[key].content === 'string' && !['utf8', 'usascii', 'ascii'].includes(encoding)) {\n content = Buffer.from(data[key].content, encoding);\n }\n\n // default action, return as is\n setImmediate(() => callback(null, content));\n\n return promise;\n};\n\n/**\n * Copies properties from source objects to target objects\n */\nmodule.exports.assign = function (/* target, ... sources */) {\n const args = Array.from(arguments);\n const target = args.shift() || {};\n\n args.forEach(source => {\n Object.keys(source || {}).forEach(key => {\n if (['tls', 'auth'].includes(key) && source[key] && typeof source[key] === 'object') {\n // tls and auth are special keys that need to be enumerated separately\n // other objects are passed as is\n target[key] = Object.assign(target[key] || {}, source[key]);\n } else {\n target[key] = source[key];\n }\n });\n });\n return target;\n};\n\nmodule.exports.encodeXText = str => {\n // ! 0x21\n // + 0x2B\n // = 0x3D\n // ~ 0x7E\n if (!/[^\\x21-\\x2A\\x2C-\\x3C\\x3E-\\x7E]/.test(str)) {\n return str;\n }\n const buf = Buffer.from(str);\n let result = '';\n for (let i = 0, len = buf.length; i < len; i++) {\n const c = buf[i];\n if (c < 0x21 || c > 0x7e || c === 0x2b || c === 0x3d) {\n result += '+' + (c < 0x10 ? '0' : '') + c.toString(16).toUpperCase();\n } else {\n result += String.fromCharCode(c);\n }\n }\n return result;\n};\n\n/**\n * Streams a stream value into a Buffer\n *\n * @param {Object} stream Readable stream\n * @param {Function} callback Callback function with (err, value)\n */\nfunction resolveStream(stream, callback) {\n let responded = false;\n const chunks = [];\n let chunklen = 0;\n\n stream.on('error', err => {\n if (responded) {\n return;\n }\n\n responded = true;\n callback(err);\n });\n\n stream.on('readable', () => {\n let chunk;\n while ((chunk = stream.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n\n stream.on('end', () => {\n if (responded) {\n return;\n }\n responded = true;\n\n let value;\n\n try {\n value = Buffer.concat(chunks, chunklen);\n } catch (E) {\n return callback(E);\n }\n callback(null, value);\n });\n}\n\n/**\n * Generates a bunyan-like logger that prints to console\n *\n * @returns {Object} Bunyan logger instance\n */\nfunction createDefaultLogger(levels) {\n const levelMaxLen = levels.reduce((max, level) => Math.max(max, level.length), 0);\n const levelNames = new Map();\n\n levels.forEach(level => {\n let levelName = level.toUpperCase();\n if (levelName.length < levelMaxLen) {\n levelName += ' '.repeat(levelMaxLen - levelName.length);\n }\n levelNames.set(level, levelName);\n });\n\n const print = (level, entry, message, ...args) => {\n let prefix = '';\n if (entry) {\n if (entry.tnx === 'server') {\n prefix = 'S: ';\n } else if (entry.tnx === 'client') {\n prefix = 'C: ';\n }\n\n if (entry.sid) {\n prefix = '[' + entry.sid + '] ' + prefix;\n }\n\n if (entry.cid) {\n prefix = '[#' + entry.cid + '] ' + prefix;\n }\n }\n\n message = util.format(message, ...args);\n message.split(/\\r?\\n/).forEach(line => {\n console.log('[%s] %s %s', new Date().toISOString().substr(0, 19).replace(/T/, ' '), levelNames.get(level), prefix + line);\n });\n };\n\n const logger = {};\n levels.forEach(level => {\n logger[level] = print.bind(null, level);\n });\n\n return logger;\n}\n","/* eslint quote-props: 0 */\n\n'use strict';\n\nconst path = require('path');\n\nconst defaultMimeType = 'application/octet-stream';\nconst defaultExtension = 'bin';\n\nconst mimeTypes = new Map([\n ['application/acad', 'dwg'],\n ['application/applixware', 'aw'],\n ['application/arj', 'arj'],\n ['application/atom+xml', 'xml'],\n ['application/atomcat+xml', 'atomcat'],\n ['application/atomsvc+xml', 'atomsvc'],\n ['application/base64', ['mm', 'mme']],\n ['application/binhex', 'hqx'],\n ['application/binhex4', 'hqx'],\n ['application/book', ['book', 'boo']],\n ['application/ccxml+xml,', 'ccxml'],\n ['application/cdf', 'cdf'],\n ['application/cdmi-capability', 'cdmia'],\n ['application/cdmi-container', 'cdmic'],\n ['application/cdmi-domain', 'cdmid'],\n ['application/cdmi-object', 'cdmio'],\n ['application/cdmi-queue', 'cdmiq'],\n ['application/clariscad', 'ccad'],\n ['application/commonground', 'dp'],\n ['application/cu-seeme', 'cu'],\n ['application/davmount+xml', 'davmount'],\n ['application/drafting', 'drw'],\n ['application/dsptype', 'tsp'],\n ['application/dssc+der', 'dssc'],\n ['application/dssc+xml', 'xdssc'],\n ['application/dxf', 'dxf'],\n ['application/ecmascript', ['js', 'es']],\n ['application/emma+xml', 'emma'],\n ['application/envoy', 'evy'],\n ['application/epub+zip', 'epub'],\n ['application/excel', ['xls', 'xl', 'xla', 'xlb', 'xlc', 'xld', 'xlk', 'xll', 'xlm', 'xlt', 'xlv', 'xlw']],\n ['application/exi', 'exi'],\n ['application/font-tdpfr', 'pfr'],\n ['application/fractals', 'fif'],\n ['application/freeloader', 'frl'],\n ['application/futuresplash', 'spl'],\n ['application/geo+json', 'geojson'],\n ['application/gnutar', 'tgz'],\n ['application/groupwise', 'vew'],\n ['application/hlp', 'hlp'],\n ['application/hta', 'hta'],\n ['application/hyperstudio', 'stk'],\n ['application/i-deas', 'unv'],\n ['application/iges', ['iges', 'igs']],\n ['application/inf', 'inf'],\n ['application/internet-property-stream', 'acx'],\n ['application/ipfix', 'ipfix'],\n ['application/java', 'class'],\n ['application/java-archive', 'jar'],\n ['application/java-byte-code', 'class'],\n ['application/java-serialized-object', 'ser'],\n ['application/java-vm', 'class'],\n ['application/javascript', 'js'],\n ['application/json', 'json'],\n ['application/lha', 'lha'],\n ['application/lzx', 'lzx'],\n ['application/mac-binary', 'bin'],\n ['application/mac-binhex', 'hqx'],\n ['application/mac-binhex40', 'hqx'],\n ['application/mac-compactpro', 'cpt'],\n ['application/macbinary', 'bin'],\n ['application/mads+xml', 'mads'],\n ['application/marc', 'mrc'],\n ['application/marcxml+xml', 'mrcx'],\n ['application/mathematica', 'ma'],\n ['application/mathml+xml', 'mathml'],\n ['application/mbedlet', 'mbd'],\n ['application/mbox', 'mbox'],\n ['application/mcad', 'mcd'],\n ['application/mediaservercontrol+xml', 'mscml'],\n ['application/metalink4+xml', 'meta4'],\n ['application/mets+xml', 'mets'],\n ['application/mime', 'aps'],\n ['application/mods+xml', 'mods'],\n ['application/mp21', 'm21'],\n ['application/mp4', 'mp4'],\n ['application/mspowerpoint', ['ppt', 'pot', 'pps', 'ppz']],\n ['application/msword', ['doc', 'dot', 'w6w', 'wiz', 'word']],\n ['application/mswrite', 'wri'],\n ['application/mxf', 'mxf'],\n ['application/netmc', 'mcp'],\n ['application/octet-stream', ['*']],\n ['application/oda', 'oda'],\n ['application/oebps-package+xml', 'opf'],\n ['application/ogg', 'ogx'],\n ['application/olescript', 'axs'],\n ['application/onenote', 'onetoc'],\n ['application/patch-ops-error+xml', 'xer'],\n ['application/pdf', 'pdf'],\n ['application/pgp-encrypted', 'asc'],\n ['application/pgp-signature', 'pgp'],\n ['application/pics-rules', 'prf'],\n ['application/pkcs-12', 'p12'],\n ['application/pkcs-crl', 'crl'],\n ['application/pkcs10', 'p10'],\n ['application/pkcs7-mime', ['p7c', 'p7m']],\n ['application/pkcs7-signature', 'p7s'],\n ['application/pkcs8', 'p8'],\n ['application/pkix-attr-cert', 'ac'],\n ['application/pkix-cert', ['cer', 'crt']],\n ['application/pkix-crl', 'crl'],\n ['application/pkix-pkipath', 'pkipath'],\n ['application/pkixcmp', 'pki'],\n ['application/plain', 'text'],\n ['application/pls+xml', 'pls'],\n ['application/postscript', ['ps', 'ai', 'eps']],\n ['application/powerpoint', 'ppt'],\n ['application/pro_eng', ['part', 'prt']],\n ['application/prs.cww', 'cww'],\n ['application/pskc+xml', 'pskcxml'],\n ['application/rdf+xml', 'rdf'],\n ['application/reginfo+xml', 'rif'],\n ['application/relax-ng-compact-syntax', 'rnc'],\n ['application/resource-lists+xml', 'rl'],\n ['application/resource-lists-diff+xml', 'rld'],\n ['application/ringing-tones', 'rng'],\n ['application/rls-services+xml', 'rs'],\n ['application/rsd+xml', 'rsd'],\n ['application/rss+xml', 'xml'],\n ['application/rtf', ['rtf', 'rtx']],\n ['application/sbml+xml', 'sbml'],\n ['application/scvp-cv-request', 'scq'],\n ['application/scvp-cv-response', 'scs'],\n ['application/scvp-vp-request', 'spq'],\n ['application/scvp-vp-response', 'spp'],\n ['application/sdp', 'sdp'],\n ['application/sea', 'sea'],\n ['application/set', 'set'],\n ['application/set-payment-initiation', 'setpay'],\n ['application/set-registration-initiation', 'setreg'],\n ['application/shf+xml', 'shf'],\n ['application/sla', 'stl'],\n ['application/smil', ['smi', 'smil']],\n ['application/smil+xml', 'smi'],\n ['application/solids', 'sol'],\n ['application/sounder', 'sdr'],\n ['application/sparql-query', 'rq'],\n ['application/sparql-results+xml', 'srx'],\n ['application/srgs', 'gram'],\n ['application/srgs+xml', 'grxml'],\n ['application/sru+xml', 'sru'],\n ['application/ssml+xml', 'ssml'],\n ['application/step', ['step', 'stp']],\n ['application/streamingmedia', 'ssm'],\n ['application/tei+xml', 'tei'],\n ['application/thraud+xml', 'tfi'],\n ['application/timestamped-data', 'tsd'],\n ['application/toolbook', 'tbk'],\n ['application/vda', 'vda'],\n ['application/vnd.3gpp.pic-bw-large', 'plb'],\n ['application/vnd.3gpp.pic-bw-small', 'psb'],\n ['application/vnd.3gpp.pic-bw-var', 'pvb'],\n ['application/vnd.3gpp2.tcap', 'tcap'],\n ['application/vnd.3m.post-it-notes', 'pwn'],\n ['application/vnd.accpac.simply.aso', 'aso'],\n ['application/vnd.accpac.simply.imp', 'imp'],\n ['application/vnd.acucobol', 'acu'],\n ['application/vnd.acucorp', 'atc'],\n ['application/vnd.adobe.air-application-installer-package+zip', 'air'],\n ['application/vnd.adobe.fxp', 'fxp'],\n ['application/vnd.adobe.xdp+xml', 'xdp'],\n ['application/vnd.adobe.xfdf', 'xfdf'],\n ['application/vnd.ahead.space', 'ahead'],\n ['application/vnd.airzip.filesecure.azf', 'azf'],\n ['application/vnd.airzip.filesecure.azs', 'azs'],\n ['application/vnd.amazon.ebook', 'azw'],\n ['application/vnd.americandynamics.acc', 'acc'],\n ['application/vnd.amiga.ami', 'ami'],\n ['application/vnd.android.package-archive', 'apk'],\n ['application/vnd.anser-web-certificate-issue-initiation', 'cii'],\n ['application/vnd.anser-web-funds-transfer-initiation', 'fti'],\n ['application/vnd.antix.game-component', 'atx'],\n ['application/vnd.apple.installer+xml', 'mpkg'],\n ['application/vnd.apple.mpegurl', 'm3u8'],\n ['application/vnd.aristanetworks.swi', 'swi'],\n ['application/vnd.audiograph', 'aep'],\n ['application/vnd.blueice.multipass', 'mpm'],\n ['application/vnd.bmi', 'bmi'],\n ['application/vnd.businessobjects', 'rep'],\n ['application/vnd.chemdraw+xml', 'cdxml'],\n ['application/vnd.chipnuts.karaoke-mmd', 'mmd'],\n ['application/vnd.cinderella', 'cdy'],\n ['application/vnd.claymore', 'cla'],\n ['application/vnd.cloanto.rp9', 'rp9'],\n ['application/vnd.clonk.c4group', 'c4g'],\n ['application/vnd.cluetrust.cartomobile-config', 'c11amc'],\n ['application/vnd.cluetrust.cartomobile-config-pkg', 'c11amz'],\n ['application/vnd.commonspace', 'csp'],\n ['application/vnd.contact.cmsg', 'cdbcmsg'],\n ['application/vnd.cosmocaller', 'cmc'],\n ['application/vnd.crick.clicker', 'clkx'],\n ['application/vnd.crick.clicker.keyboard', 'clkk'],\n ['application/vnd.crick.clicker.palette', 'clkp'],\n ['application/vnd.crick.clicker.template', 'clkt'],\n ['application/vnd.crick.clicker.wordbank', 'clkw'],\n ['application/vnd.criticaltools.wbs+xml', 'wbs'],\n ['application/vnd.ctc-posml', 'pml'],\n ['application/vnd.cups-ppd', 'ppd'],\n ['application/vnd.curl.car', 'car'],\n ['application/vnd.curl.pcurl', 'pcurl'],\n ['application/vnd.data-vision.rdz', 'rdz'],\n ['application/vnd.denovo.fcselayout-link', 'fe_launch'],\n ['application/vnd.dna', 'dna'],\n ['application/vnd.dolby.mlp', 'mlp'],\n ['application/vnd.dpgraph', 'dpg'],\n ['application/vnd.dreamfactory', 'dfac'],\n ['application/vnd.dvb.ait', 'ait'],\n ['application/vnd.dvb.service', 'svc'],\n ['application/vnd.dynageo', 'geo'],\n ['application/vnd.ecowin.chart', 'mag'],\n ['application/vnd.enliven', 'nml'],\n ['application/vnd.epson.esf', 'esf'],\n ['application/vnd.epson.msf', 'msf'],\n ['application/vnd.epson.quickanime', 'qam'],\n ['application/vnd.epson.salt', 'slt'],\n ['application/vnd.epson.ssf', 'ssf'],\n ['application/vnd.eszigno3+xml', 'es3'],\n ['application/vnd.ezpix-album', 'ez2'],\n ['application/vnd.ezpix-package', 'ez3'],\n ['application/vnd.fdf', 'fdf'],\n ['application/vnd.fdsn.seed', 'seed'],\n ['application/vnd.flographit', 'gph'],\n ['application/vnd.fluxtime.clip', 'ftc'],\n ['application/vnd.framemaker', 'fm'],\n ['application/vnd.frogans.fnc', 'fnc'],\n ['application/vnd.frogans.ltf', 'ltf'],\n ['application/vnd.fsc.weblaunch', 'fsc'],\n ['application/vnd.fujitsu.oasys', 'oas'],\n ['application/vnd.fujitsu.oasys2', 'oa2'],\n ['application/vnd.fujitsu.oasys3', 'oa3'],\n ['application/vnd.fujitsu.oasysgp', 'fg5'],\n ['application/vnd.fujitsu.oasysprs', 'bh2'],\n ['application/vnd.fujixerox.ddd', 'ddd'],\n ['application/vnd.fujixerox.docuworks', 'xdw'],\n ['application/vnd.fujixerox.docuworks.binder', 'xbd'],\n ['application/vnd.fuzzysheet', 'fzs'],\n ['application/vnd.genomatix.tuxedo', 'txd'],\n ['application/vnd.geogebra.file', 'ggb'],\n ['application/vnd.geogebra.tool', 'ggt'],\n ['application/vnd.geometry-explorer', 'gex'],\n ['application/vnd.geonext', 'gxt'],\n ['application/vnd.geoplan', 'g2w'],\n ['application/vnd.geospace', 'g3w'],\n ['application/vnd.gmx', 'gmx'],\n ['application/vnd.google-earth.kml+xml', 'kml'],\n ['application/vnd.google-earth.kmz', 'kmz'],\n ['application/vnd.grafeq', 'gqf'],\n ['application/vnd.groove-account', 'gac'],\n ['application/vnd.groove-help', 'ghf'],\n ['application/vnd.groove-identity-message', 'gim'],\n ['application/vnd.groove-injector', 'grv'],\n ['application/vnd.groove-tool-message', 'gtm'],\n ['application/vnd.groove-tool-template', 'tpl'],\n ['application/vnd.groove-vcard', 'vcg'],\n ['application/vnd.hal+xml', 'hal'],\n ['application/vnd.handheld-entertainment+xml', 'zmm'],\n ['application/vnd.hbci', 'hbci'],\n ['application/vnd.hhe.lesson-player', 'les'],\n ['application/vnd.hp-hpgl', ['hgl', 'hpg', 'hpgl']],\n ['application/vnd.hp-hpid', 'hpid'],\n ['application/vnd.hp-hps', 'hps'],\n ['application/vnd.hp-jlyt', 'jlt'],\n ['application/vnd.hp-pcl', 'pcl'],\n ['application/vnd.hp-pclxl', 'pclxl'],\n ['application/vnd.hydrostatix.sof-data', 'sfd-hdstx'],\n ['application/vnd.hzn-3d-crossword', 'x3d'],\n ['application/vnd.ibm.minipay', 'mpy'],\n ['application/vnd.ibm.modcap', 'afp'],\n ['application/vnd.ibm.rights-management', 'irm'],\n ['application/vnd.ibm.secure-container', 'sc'],\n ['application/vnd.iccprofile', 'icc'],\n ['application/vnd.igloader', 'igl'],\n ['application/vnd.immervision-ivp', 'ivp'],\n ['application/vnd.immervision-ivu', 'ivu'],\n ['application/vnd.insors.igm', 'igm'],\n ['application/vnd.intercon.formnet', 'xpw'],\n ['application/vnd.intergeo', 'i2g'],\n ['application/vnd.intu.qbo', 'qbo'],\n ['application/vnd.intu.qfx', 'qfx'],\n ['application/vnd.ipunplugged.rcprofile', 'rcprofile'],\n ['application/vnd.irepository.package+xml', 'irp'],\n ['application/vnd.is-xpr', 'xpr'],\n ['application/vnd.isac.fcs', 'fcs'],\n ['application/vnd.jam', 'jam'],\n ['application/vnd.jcp.javame.midlet-rms', 'rms'],\n ['application/vnd.jisp', 'jisp'],\n ['application/vnd.joost.joda-archive', 'joda'],\n ['application/vnd.kahootz', 'ktz'],\n ['application/vnd.kde.karbon', 'karbon'],\n ['application/vnd.kde.kchart', 'chrt'],\n ['application/vnd.kde.kformula', 'kfo'],\n ['application/vnd.kde.kivio', 'flw'],\n ['application/vnd.kde.kontour', 'kon'],\n ['application/vnd.kde.kpresenter', 'kpr'],\n ['application/vnd.kde.kspread', 'ksp'],\n ['application/vnd.kde.kword', 'kwd'],\n ['application/vnd.kenameaapp', 'htke'],\n ['application/vnd.kidspiration', 'kia'],\n ['application/vnd.kinar', 'kne'],\n ['application/vnd.koan', 'skp'],\n ['application/vnd.kodak-descriptor', 'sse'],\n ['application/vnd.las.las+xml', 'lasxml'],\n ['application/vnd.llamagraphics.life-balance.desktop', 'lbd'],\n ['application/vnd.llamagraphics.life-balance.exchange+xml', 'lbe'],\n ['application/vnd.lotus-1-2-3', '123'],\n ['application/vnd.lotus-approach', 'apr'],\n ['application/vnd.lotus-freelance', 'pre'],\n ['application/vnd.lotus-notes', 'nsf'],\n ['application/vnd.lotus-organizer', 'org'],\n ['application/vnd.lotus-screencam', 'scm'],\n ['application/vnd.lotus-wordpro', 'lwp'],\n ['application/vnd.macports.portpkg', 'portpkg'],\n ['application/vnd.mcd', 'mcd'],\n ['application/vnd.medcalcdata', 'mc1'],\n ['application/vnd.mediastation.cdkey', 'cdkey'],\n ['application/vnd.mfer', 'mwf'],\n ['application/vnd.mfmp', 'mfm'],\n ['application/vnd.micrografx.flo', 'flo'],\n ['application/vnd.micrografx.igx', 'igx'],\n ['application/vnd.mif', 'mif'],\n ['application/vnd.mobius.daf', 'daf'],\n ['application/vnd.mobius.dis', 'dis'],\n ['application/vnd.mobius.mbk', 'mbk'],\n ['application/vnd.mobius.mqy', 'mqy'],\n ['application/vnd.mobius.msl', 'msl'],\n ['application/vnd.mobius.plc', 'plc'],\n ['application/vnd.mobius.txf', 'txf'],\n ['application/vnd.mophun.application', 'mpn'],\n ['application/vnd.mophun.certificate', 'mpc'],\n ['application/vnd.mozilla.xul+xml', 'xul'],\n ['application/vnd.ms-artgalry', 'cil'],\n ['application/vnd.ms-cab-compressed', 'cab'],\n ['application/vnd.ms-excel', ['xls', 'xla', 'xlc', 'xlm', 'xlt', 'xlw', 'xlb', 'xll']],\n ['application/vnd.ms-excel.addin.macroenabled.12', 'xlam'],\n ['application/vnd.ms-excel.sheet.binary.macroenabled.12', 'xlsb'],\n ['application/vnd.ms-excel.sheet.macroenabled.12', 'xlsm'],\n ['application/vnd.ms-excel.template.macroenabled.12', 'xltm'],\n ['application/vnd.ms-fontobject', 'eot'],\n ['application/vnd.ms-htmlhelp', 'chm'],\n ['application/vnd.ms-ims', 'ims'],\n ['application/vnd.ms-lrm', 'lrm'],\n ['application/vnd.ms-officetheme', 'thmx'],\n ['application/vnd.ms-outlook', 'msg'],\n ['application/vnd.ms-pki.certstore', 'sst'],\n ['application/vnd.ms-pki.pko', 'pko'],\n ['application/vnd.ms-pki.seccat', 'cat'],\n ['application/vnd.ms-pki.stl', 'stl'],\n ['application/vnd.ms-pkicertstore', 'sst'],\n ['application/vnd.ms-pkiseccat', 'cat'],\n ['application/vnd.ms-pkistl', 'stl'],\n ['application/vnd.ms-powerpoint', ['ppt', 'pot', 'pps', 'ppa', 'pwz']],\n ['application/vnd.ms-powerpoint.addin.macroenabled.12', 'ppam'],\n ['application/vnd.ms-powerpoint.presentation.macroenabled.12', 'pptm'],\n ['application/vnd.ms-powerpoint.slide.macroenabled.12', 'sldm'],\n ['application/vnd.ms-powerpoint.slideshow.macroenabled.12', 'ppsm'],\n ['application/vnd.ms-powerpoint.template.macroenabled.12', 'potm'],\n ['application/vnd.ms-project', 'mpp'],\n ['application/vnd.ms-word.document.macroenabled.12', 'docm'],\n ['application/vnd.ms-word.template.macroenabled.12', 'dotm'],\n ['application/vnd.ms-works', ['wks', 'wcm', 'wdb', 'wps']],\n ['application/vnd.ms-wpl', 'wpl'],\n ['application/vnd.ms-xpsdocument', 'xps'],\n ['application/vnd.mseq', 'mseq'],\n ['application/vnd.musician', 'mus'],\n ['application/vnd.muvee.style', 'msty'],\n ['application/vnd.neurolanguage.nlu', 'nlu'],\n ['application/vnd.noblenet-directory', 'nnd'],\n ['application/vnd.noblenet-sealer', 'nns'],\n ['application/vnd.noblenet-web', 'nnw'],\n ['application/vnd.nokia.configuration-message', 'ncm'],\n ['application/vnd.nokia.n-gage.data', 'ngdat'],\n ['application/vnd.nokia.n-gage.symbian.install', 'n-gage'],\n ['application/vnd.nokia.radio-preset', 'rpst'],\n ['application/vnd.nokia.radio-presets', 'rpss'],\n ['application/vnd.nokia.ringing-tone', 'rng'],\n ['application/vnd.novadigm.edm', 'edm'],\n ['application/vnd.novadigm.edx', 'edx'],\n ['application/vnd.novadigm.ext', 'ext'],\n ['application/vnd.oasis.opendocument.chart', 'odc'],\n ['application/vnd.oasis.opendocument.chart-template', 'otc'],\n ['application/vnd.oasis.opendocument.database', 'odb'],\n ['application/vnd.oasis.opendocument.formula', 'odf'],\n ['application/vnd.oasis.opendocument.formula-template', 'odft'],\n ['application/vnd.oasis.opendocument.graphics', 'odg'],\n ['application/vnd.oasis.opendocument.graphics-template', 'otg'],\n ['application/vnd.oasis.opendocument.image', 'odi'],\n ['application/vnd.oasis.opendocument.image-template', 'oti'],\n ['application/vnd.oasis.opendocument.presentation', 'odp'],\n ['application/vnd.oasis.opendocument.presentation-template', 'otp'],\n ['application/vnd.oasis.opendocument.spreadsheet', 'ods'],\n ['application/vnd.oasis.opendocument.spreadsheet-template', 'ots'],\n ['application/vnd.oasis.opendocument.text', 'odt'],\n ['application/vnd.oasis.opendocument.text-master', 'odm'],\n ['application/vnd.oasis.opendocument.text-template', 'ott'],\n ['application/vnd.oasis.opendocument.text-web', 'oth'],\n ['application/vnd.olpc-sugar', 'xo'],\n ['application/vnd.oma.dd2+xml', 'dd2'],\n ['application/vnd.openofficeorg.extension', 'oxt'],\n ['application/vnd.openxmlformats-officedocument.presentationml.presentation', 'pptx'],\n ['application/vnd.openxmlformats-officedocument.presentationml.slide', 'sldx'],\n ['application/vnd.openxmlformats-officedocument.presentationml.slideshow', 'ppsx'],\n ['application/vnd.openxmlformats-officedocument.presentationml.template', 'potx'],\n ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'xlsx'],\n ['application/vnd.openxmlformats-officedocument.spreadsheetml.template', 'xltx'],\n ['application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'docx'],\n ['application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'dotx'],\n ['application/vnd.osgeo.mapguide.package', 'mgp'],\n ['application/vnd.osgi.dp', 'dp'],\n ['application/vnd.palm', 'pdb'],\n ['application/vnd.pawaafile', 'paw'],\n ['application/vnd.pg.format', 'str'],\n ['application/vnd.pg.osasli', 'ei6'],\n ['application/vnd.picsel', 'efif'],\n ['application/vnd.pmi.widget', 'wg'],\n ['application/vnd.pocketlearn', 'plf'],\n ['application/vnd.powerbuilder6', 'pbd'],\n ['application/vnd.previewsystems.box', 'box'],\n ['application/vnd.proteus.magazine', 'mgz'],\n ['application/vnd.publishare-delta-tree', 'qps'],\n ['application/vnd.pvi.ptid1', 'ptid'],\n ['application/vnd.quark.quarkxpress', 'qxd'],\n ['application/vnd.realvnc.bed', 'bed'],\n ['application/vnd.recordare.musicxml', 'mxl'],\n ['application/vnd.recordare.musicxml+xml', 'musicxml'],\n ['application/vnd.rig.cryptonote', 'cryptonote'],\n ['application/vnd.rim.cod', 'cod'],\n ['application/vnd.rn-realmedia', 'rm'],\n ['application/vnd.rn-realplayer', 'rnx'],\n ['application/vnd.route66.link66+xml', 'link66'],\n ['application/vnd.sailingtracker.track', 'st'],\n ['application/vnd.seemail', 'see'],\n ['application/vnd.sema', 'sema'],\n ['application/vnd.semd', 'semd'],\n ['application/vnd.semf', 'semf'],\n ['application/vnd.shana.informed.formdata', 'ifm'],\n ['application/vnd.shana.informed.formtemplate', 'itp'],\n ['application/vnd.shana.informed.interchange', 'iif'],\n ['application/vnd.shana.informed.package', 'ipk'],\n ['application/vnd.simtech-mindmapper', 'twd'],\n ['application/vnd.smaf', 'mmf'],\n ['application/vnd.smart.teacher', 'teacher'],\n ['application/vnd.solent.sdkm+xml', 'sdkm'],\n ['application/vnd.spotfire.dxp', 'dxp'],\n ['application/vnd.spotfire.sfs', 'sfs'],\n ['application/vnd.stardivision.calc', 'sdc'],\n ['application/vnd.stardivision.draw', 'sda'],\n ['application/vnd.stardivision.impress', 'sdd'],\n ['application/vnd.stardivision.math', 'smf'],\n ['application/vnd.stardivision.writer', 'sdw'],\n ['application/vnd.stardivision.writer-global', 'sgl'],\n ['application/vnd.stepmania.stepchart', 'sm'],\n ['application/vnd.sun.xml.calc', 'sxc'],\n ['application/vnd.sun.xml.calc.template', 'stc'],\n ['application/vnd.sun.xml.draw', 'sxd'],\n ['application/vnd.sun.xml.draw.template', 'std'],\n ['application/vnd.sun.xml.impress', 'sxi'],\n ['application/vnd.sun.xml.impress.template', 'sti'],\n ['application/vnd.sun.xml.math', 'sxm'],\n ['application/vnd.sun.xml.writer', 'sxw'],\n ['application/vnd.sun.xml.writer.global', 'sxg'],\n ['application/vnd.sun.xml.writer.template', 'stw'],\n ['application/vnd.sus-calendar', 'sus'],\n ['application/vnd.svd', 'svd'],\n ['application/vnd.symbian.install', 'sis'],\n ['application/vnd.syncml+xml', 'xsm'],\n ['application/vnd.syncml.dm+wbxml', 'bdm'],\n ['application/vnd.syncml.dm+xml', 'xdm'],\n ['application/vnd.tao.intent-module-archive', 'tao'],\n ['application/vnd.tmobile-livetv', 'tmo'],\n ['application/vnd.trid.tpt', 'tpt'],\n ['application/vnd.triscape.mxs', 'mxs'],\n ['application/vnd.trueapp', 'tra'],\n ['application/vnd.ufdl', 'ufd'],\n ['application/vnd.uiq.theme', 'utz'],\n ['application/vnd.umajin', 'umj'],\n ['application/vnd.unity', 'unityweb'],\n ['application/vnd.uoml+xml', 'uoml'],\n ['application/vnd.vcx', 'vcx'],\n ['application/vnd.visio', 'vsd'],\n ['application/vnd.visionary', 'vis'],\n ['application/vnd.vsf', 'vsf'],\n ['application/vnd.wap.wbxml', 'wbxml'],\n ['application/vnd.wap.wmlc', 'wmlc'],\n ['application/vnd.wap.wmlscriptc', 'wmlsc'],\n ['application/vnd.webturbo', 'wtb'],\n ['application/vnd.wolfram.player', 'nbp'],\n ['application/vnd.wordperfect', 'wpd'],\n ['application/vnd.wqd', 'wqd'],\n ['application/vnd.wt.stf', 'stf'],\n ['application/vnd.xara', ['web', 'xar']],\n ['application/vnd.xfdl', 'xfdl'],\n ['application/vnd.yamaha.hv-dic', 'hvd'],\n ['application/vnd.yamaha.hv-script', 'hvs'],\n ['application/vnd.yamaha.hv-voice', 'hvp'],\n ['application/vnd.yamaha.openscoreformat', 'osf'],\n ['application/vnd.yamaha.openscoreformat.osfpvg+xml', 'osfpvg'],\n ['application/vnd.yamaha.smaf-audio', 'saf'],\n ['application/vnd.yamaha.smaf-phrase', 'spf'],\n ['application/vnd.yellowriver-custom-menu', 'cmp'],\n ['application/vnd.zul', 'zir'],\n ['application/vnd.zzazz.deck+xml', 'zaz'],\n ['application/vocaltec-media-desc', 'vmd'],\n ['application/vocaltec-media-file', 'vmf'],\n ['application/voicexml+xml', 'vxml'],\n ['application/widget', 'wgt'],\n ['application/winhlp', 'hlp'],\n ['application/wordperfect', ['wp', 'wp5', 'wp6', 'wpd']],\n ['application/wordperfect6.0', ['w60', 'wp5']],\n ['application/wordperfect6.1', 'w61'],\n ['application/wsdl+xml', 'wsdl'],\n ['application/wspolicy+xml', 'wspolicy'],\n ['application/x-123', 'wk1'],\n ['application/x-7z-compressed', '7z'],\n ['application/x-abiword', 'abw'],\n ['application/x-ace-compressed', 'ace'],\n ['application/x-aim', 'aim'],\n ['application/x-authorware-bin', 'aab'],\n ['application/x-authorware-map', 'aam'],\n ['application/x-authorware-seg', 'aas'],\n ['application/x-bcpio', 'bcpio'],\n ['application/x-binary', 'bin'],\n ['application/x-binhex40', 'hqx'],\n ['application/x-bittorrent', 'torrent'],\n ['application/x-bsh', ['bsh', 'sh', 'shar']],\n ['application/x-bytecode.elisp', 'elc'],\n ['application/x-bytecode.python', 'pyc'],\n ['application/x-bzip', 'bz'],\n ['application/x-bzip2', ['boz', 'bz2']],\n ['application/x-cdf', 'cdf'],\n ['application/x-cdlink', 'vcd'],\n ['application/x-chat', ['cha', 'chat']],\n ['application/x-chess-pgn', 'pgn'],\n ['application/x-cmu-raster', 'ras'],\n ['application/x-cocoa', 'cco'],\n ['application/x-compactpro', 'cpt'],\n ['application/x-compress', 'z'],\n ['application/x-compressed', ['tgz', 'gz', 'z', 'zip']],\n ['application/x-conference', 'nsc'],\n ['application/x-cpio', 'cpio'],\n ['application/x-cpt', 'cpt'],\n ['application/x-csh', 'csh'],\n ['application/x-debian-package', 'deb'],\n ['application/x-deepv', 'deepv'],\n ['application/x-director', ['dir', 'dcr', 'dxr']],\n ['application/x-doom', 'wad'],\n ['application/x-dtbncx+xml', 'ncx'],\n ['application/x-dtbook+xml', 'dtb'],\n ['application/x-dtbresource+xml', 'res'],\n ['application/x-dvi', 'dvi'],\n ['application/x-elc', 'elc'],\n ['application/x-envoy', ['env', 'evy']],\n ['application/x-esrehber', 'es'],\n ['application/x-excel', ['xls', 'xla', 'xlb', 'xlc', 'xld', 'xlk', 'xll', 'xlm', 'xlt', 'xlv', 'xlw']],\n ['application/x-font-bdf', 'bdf'],\n ['application/x-font-ghostscript', 'gsf'],\n ['application/x-font-linux-psf', 'psf'],\n ['application/x-font-otf', 'otf'],\n ['application/x-font-pcf', 'pcf'],\n ['application/x-font-snf', 'snf'],\n ['application/x-font-ttf', 'ttf'],\n ['application/x-font-type1', 'pfa'],\n ['application/x-font-woff', 'woff'],\n ['application/x-frame', 'mif'],\n ['application/x-freelance', 'pre'],\n ['application/x-futuresplash', 'spl'],\n ['application/x-gnumeric', 'gnumeric'],\n ['application/x-gsp', 'gsp'],\n ['application/x-gss', 'gss'],\n ['application/x-gtar', 'gtar'],\n ['application/x-gzip', ['gz', 'gzip']],\n ['application/x-hdf', 'hdf'],\n ['application/x-helpfile', ['help', 'hlp']],\n ['application/x-httpd-imap', 'imap'],\n ['application/x-ima', 'ima'],\n ['application/x-internet-signup', ['ins', 'isp']],\n ['application/x-internett-signup', 'ins'],\n ['application/x-inventor', 'iv'],\n ['application/x-ip2', 'ip'],\n ['application/x-iphone', 'iii'],\n ['application/x-java-class', 'class'],\n ['application/x-java-commerce', 'jcm'],\n ['application/x-java-jnlp-file', 'jnlp'],\n ['application/x-javascript', 'js'],\n ['application/x-koan', ['skd', 'skm', 'skp', 'skt']],\n ['application/x-ksh', 'ksh'],\n ['application/x-latex', ['latex', 'ltx']],\n ['application/x-lha', 'lha'],\n ['application/x-lisp', 'lsp'],\n ['application/x-livescreen', 'ivy'],\n ['application/x-lotus', 'wq1'],\n ['application/x-lotusscreencam', 'scm'],\n ['application/x-lzh', 'lzh'],\n ['application/x-lzx', 'lzx'],\n ['application/x-mac-binhex40', 'hqx'],\n ['application/x-macbinary', 'bin'],\n ['application/x-magic-cap-package-1.0', 'mc$'],\n ['application/x-mathcad', 'mcd'],\n ['application/x-meme', 'mm'],\n ['application/x-midi', ['mid', 'midi']],\n ['application/x-mif', 'mif'],\n ['application/x-mix-transfer', 'nix'],\n ['application/x-mobipocket-ebook', 'prc'],\n ['application/x-mplayer2', 'asx'],\n ['application/x-ms-application', 'application'],\n ['application/x-ms-wmd', 'wmd'],\n ['application/x-ms-wmz', 'wmz'],\n ['application/x-ms-xbap', 'xbap'],\n ['application/x-msaccess', 'mdb'],\n ['application/x-msbinder', 'obd'],\n ['application/x-mscardfile', 'crd'],\n ['application/x-msclip', 'clp'],\n ['application/x-msdownload', ['exe', 'dll']],\n ['application/x-msexcel', ['xls', 'xla', 'xlw']],\n ['application/x-msmediaview', ['mvb', 'm13', 'm14']],\n ['application/x-msmetafile', 'wmf'],\n ['application/x-msmoney', 'mny'],\n ['application/x-mspowerpoint', 'ppt'],\n ['application/x-mspublisher', 'pub'],\n ['application/x-msschedule', 'scd'],\n ['application/x-msterminal', 'trm'],\n ['application/x-mswrite', 'wri'],\n ['application/x-navi-animation', 'ani'],\n ['application/x-navidoc', 'nvd'],\n ['application/x-navimap', 'map'],\n ['application/x-navistyle', 'stl'],\n ['application/x-netcdf', ['cdf', 'nc']],\n ['application/x-newton-compatible-pkg', 'pkg'],\n ['application/x-nokia-9000-communicator-add-on-software', 'aos'],\n ['application/x-omc', 'omc'],\n ['application/x-omcdatamaker', 'omcd'],\n ['application/x-omcregerator', 'omcr'],\n ['application/x-pagemaker', ['pm4', 'pm5']],\n ['application/x-pcl', 'pcl'],\n ['application/x-perfmon', ['pma', 'pmc', 'pml', 'pmr', 'pmw']],\n ['application/x-pixclscript', 'plx'],\n ['application/x-pkcs10', 'p10'],\n ['application/x-pkcs12', ['p12', 'pfx']],\n ['application/x-pkcs7-certificates', ['p7b', 'spc']],\n ['application/x-pkcs7-certreqresp', 'p7r'],\n ['application/x-pkcs7-mime', ['p7m', 'p7c']],\n ['application/x-pkcs7-signature', ['p7s', 'p7a']],\n ['application/x-pointplus', 'css'],\n ['application/x-portable-anymap', 'pnm'],\n ['application/x-project', ['mpc', 'mpt', 'mpv', 'mpx']],\n ['application/x-qpro', 'wb1'],\n ['application/x-rar-compressed', 'rar'],\n ['application/x-rtf', 'rtf'],\n ['application/x-sdp', 'sdp'],\n ['application/x-sea', 'sea'],\n ['application/x-seelogo', 'sl'],\n ['application/x-sh', 'sh'],\n ['application/x-shar', ['shar', 'sh']],\n ['application/x-shockwave-flash', 'swf'],\n ['application/x-silverlight-app', 'xap'],\n ['application/x-sit', 'sit'],\n ['application/x-sprite', ['spr', 'sprite']],\n ['application/x-stuffit', 'sit'],\n ['application/x-stuffitx', 'sitx'],\n ['application/x-sv4cpio', 'sv4cpio'],\n ['application/x-sv4crc', 'sv4crc'],\n ['application/x-tar', 'tar'],\n ['application/x-tbook', ['sbk', 'tbk']],\n ['application/x-tcl', 'tcl'],\n ['application/x-tex', 'tex'],\n ['application/x-tex-tfm', 'tfm'],\n ['application/x-texinfo', ['texi', 'texinfo']],\n ['application/x-troff', ['roff', 't', 'tr']],\n ['application/x-troff-man', 'man'],\n ['application/x-troff-me', 'me'],\n ['application/x-troff-ms', 'ms'],\n ['application/x-troff-msvideo', 'avi'],\n ['application/x-ustar', 'ustar'],\n ['application/x-visio', ['vsd', 'vst', 'vsw']],\n ['application/x-vnd.audioexplosion.mzz', 'mzz'],\n ['application/x-vnd.ls-xpix', 'xpix'],\n ['application/x-vrml', 'vrml'],\n ['application/x-wais-source', ['src', 'wsrc']],\n ['application/x-winhelp', 'hlp'],\n ['application/x-wintalk', 'wtk'],\n ['application/x-world', ['wrl', 'svr']],\n ['application/x-wpwin', 'wpd'],\n ['application/x-wri', 'wri'],\n ['application/x-x509-ca-cert', ['cer', 'crt', 'der']],\n ['application/x-x509-user-cert', 'crt'],\n ['application/x-xfig', 'fig'],\n ['application/x-xpinstall', 'xpi'],\n ['application/x-zip-compressed', 'zip'],\n ['application/xcap-diff+xml', 'xdf'],\n ['application/xenc+xml', 'xenc'],\n ['application/xhtml+xml', 'xhtml'],\n ['application/xml', 'xml'],\n ['application/xml-dtd', 'dtd'],\n ['application/xop+xml', 'xop'],\n ['application/xslt+xml', 'xslt'],\n ['application/xspf+xml', 'xspf'],\n ['application/xv+xml', 'mxml'],\n ['application/yang', 'yang'],\n ['application/yin+xml', 'yin'],\n ['application/ynd.ms-pkipko', 'pko'],\n ['application/zip', 'zip'],\n ['audio/adpcm', 'adp'],\n ['audio/aiff', ['aiff', 'aif', 'aifc']],\n ['audio/basic', ['snd', 'au']],\n ['audio/it', 'it'],\n ['audio/make', ['funk', 'my', 'pfunk']],\n ['audio/make.my.funk', 'pfunk'],\n ['audio/mid', ['mid', 'rmi']],\n ['audio/midi', ['midi', 'kar', 'mid']],\n ['audio/mod', 'mod'],\n ['audio/mp4', 'mp4a'],\n ['audio/mpeg', ['mpga', 'mp3', 'm2a', 'mp2', 'mpa', 'mpg']],\n ['audio/mpeg3', 'mp3'],\n ['audio/nspaudio', ['la', 'lma']],\n ['audio/ogg', 'oga'],\n ['audio/s3m', 's3m'],\n ['audio/tsp-audio', 'tsi'],\n ['audio/tsplayer', 'tsp'],\n ['audio/vnd.dece.audio', 'uva'],\n ['audio/vnd.digital-winds', 'eol'],\n ['audio/vnd.dra', 'dra'],\n ['audio/vnd.dts', 'dts'],\n ['audio/vnd.dts.hd', 'dtshd'],\n ['audio/vnd.lucent.voice', 'lvp'],\n ['audio/vnd.ms-playready.media.pya', 'pya'],\n ['audio/vnd.nuera.ecelp4800', 'ecelp4800'],\n ['audio/vnd.nuera.ecelp7470', 'ecelp7470'],\n ['audio/vnd.nuera.ecelp9600', 'ecelp9600'],\n ['audio/vnd.qcelp', 'qcp'],\n ['audio/vnd.rip', 'rip'],\n ['audio/voc', 'voc'],\n ['audio/voxware', 'vox'],\n ['audio/wav', 'wav'],\n ['audio/webm', 'weba'],\n ['audio/x-aac', 'aac'],\n ['audio/x-adpcm', 'snd'],\n ['audio/x-aiff', ['aiff', 'aif', 'aifc']],\n ['audio/x-au', 'au'],\n ['audio/x-gsm', ['gsd', 'gsm']],\n ['audio/x-jam', 'jam'],\n ['audio/x-liveaudio', 'lam'],\n ['audio/x-mid', ['mid', 'midi']],\n ['audio/x-midi', ['midi', 'mid']],\n ['audio/x-mod', 'mod'],\n ['audio/x-mpeg', 'mp2'],\n ['audio/x-mpeg-3', 'mp3'],\n ['audio/x-mpegurl', 'm3u'],\n ['audio/x-mpequrl', 'm3u'],\n ['audio/x-ms-wax', 'wax'],\n ['audio/x-ms-wma', 'wma'],\n ['audio/x-nspaudio', ['la', 'lma']],\n ['audio/x-pn-realaudio', ['ra', 'ram', 'rm', 'rmm', 'rmp']],\n ['audio/x-pn-realaudio-plugin', ['ra', 'rmp', 'rpm']],\n ['audio/x-psid', 'sid'],\n ['audio/x-realaudio', 'ra'],\n ['audio/x-twinvq', 'vqf'],\n ['audio/x-twinvq-plugin', ['vqe', 'vql']],\n ['audio/x-vnd.audioexplosion.mjuicemediafile', 'mjf'],\n ['audio/x-voc', 'voc'],\n ['audio/x-wav', 'wav'],\n ['audio/xm', 'xm'],\n ['chemical/x-cdx', 'cdx'],\n ['chemical/x-cif', 'cif'],\n ['chemical/x-cmdf', 'cmdf'],\n ['chemical/x-cml', 'cml'],\n ['chemical/x-csml', 'csml'],\n ['chemical/x-pdb', ['pdb', 'xyz']],\n ['chemical/x-xyz', 'xyz'],\n ['drawing/x-dwf', 'dwf'],\n ['i-world/i-vrml', 'ivr'],\n ['image/bmp', ['bmp', 'bm']],\n ['image/cgm', 'cgm'],\n ['image/cis-cod', 'cod'],\n ['image/cmu-raster', ['ras', 'rast']],\n ['image/fif', 'fif'],\n ['image/florian', ['flo', 'turbot']],\n ['image/g3fax', 'g3'],\n ['image/gif', 'gif'],\n ['image/ief', ['ief', 'iefs']],\n ['image/jpeg', ['jpeg', 'jpe', 'jpg', 'jfif', 'jfif-tbnl']],\n ['image/jutvision', 'jut'],\n ['image/ktx', 'ktx'],\n ['image/naplps', ['nap', 'naplps']],\n ['image/pict', ['pic', 'pict']],\n ['image/pipeg', 'jfif'],\n ['image/pjpeg', ['jfif', 'jpe', 'jpeg', 'jpg']],\n ['image/png', ['png', 'x-png']],\n ['image/prs.btif', 'btif'],\n ['image/svg+xml', 'svg'],\n ['image/tiff', ['tif', 'tiff']],\n ['image/vasa', 'mcf'],\n ['image/vnd.adobe.photoshop', 'psd'],\n ['image/vnd.dece.graphic', 'uvi'],\n ['image/vnd.djvu', 'djvu'],\n ['image/vnd.dvb.subtitle', 'sub'],\n ['image/vnd.dwg', ['dwg', 'dxf', 'svf']],\n ['image/vnd.dxf', 'dxf'],\n ['image/vnd.fastbidsheet', 'fbs'],\n ['image/vnd.fpx', 'fpx'],\n ['image/vnd.fst', 'fst'],\n ['image/vnd.fujixerox.edmics-mmr', 'mmr'],\n ['image/vnd.fujixerox.edmics-rlc', 'rlc'],\n ['image/vnd.ms-modi', 'mdi'],\n ['image/vnd.net-fpx', ['fpx', 'npx']],\n ['image/vnd.rn-realflash', 'rf'],\n ['image/vnd.rn-realpix', 'rp'],\n ['image/vnd.wap.wbmp', 'wbmp'],\n ['image/vnd.xiff', 'xif'],\n ['image/webp', 'webp'],\n ['image/x-cmu-raster', 'ras'],\n ['image/x-cmx', 'cmx'],\n ['image/x-dwg', ['dwg', 'dxf', 'svf']],\n ['image/x-freehand', 'fh'],\n ['image/x-icon', 'ico'],\n ['image/x-jg', 'art'],\n ['image/x-jps', 'jps'],\n ['image/x-niff', ['niff', 'nif']],\n ['image/x-pcx', 'pcx'],\n ['image/x-pict', ['pct', 'pic']],\n ['image/x-portable-anymap', 'pnm'],\n ['image/x-portable-bitmap', 'pbm'],\n ['image/x-portable-graymap', 'pgm'],\n ['image/x-portable-greymap', 'pgm'],\n ['image/x-portable-pixmap', 'ppm'],\n ['image/x-quicktime', ['qif', 'qti', 'qtif']],\n ['image/x-rgb', 'rgb'],\n ['image/x-tiff', ['tif', 'tiff']],\n ['image/x-windows-bmp', 'bmp'],\n ['image/x-xbitmap', 'xbm'],\n ['image/x-xbm', 'xbm'],\n ['image/x-xpixmap', ['xpm', 'pm']],\n ['image/x-xwd', 'xwd'],\n ['image/x-xwindowdump', 'xwd'],\n ['image/xbm', 'xbm'],\n ['image/xpm', 'xpm'],\n ['message/rfc822', ['eml', 'mht', 'mhtml', 'nws', 'mime']],\n ['model/iges', ['iges', 'igs']],\n ['model/mesh', 'msh'],\n ['model/vnd.collada+xml', 'dae'],\n ['model/vnd.dwf', 'dwf'],\n ['model/vnd.gdl', 'gdl'],\n ['model/vnd.gtw', 'gtw'],\n ['model/vnd.mts', 'mts'],\n ['model/vnd.vtu', 'vtu'],\n ['model/vrml', ['vrml', 'wrl', 'wrz']],\n ['model/x-pov', 'pov'],\n ['multipart/x-gzip', 'gzip'],\n ['multipart/x-ustar', 'ustar'],\n ['multipart/x-zip', 'zip'],\n ['music/crescendo', ['mid', 'midi']],\n ['music/x-karaoke', 'kar'],\n ['paleovu/x-pv', 'pvu'],\n ['text/asp', 'asp'],\n ['text/calendar', 'ics'],\n ['text/css', 'css'],\n ['text/csv', 'csv'],\n ['text/ecmascript', 'js'],\n ['text/h323', '323'],\n ['text/html', ['html', 'htm', 'stm', 'acgi', 'htmls', 'htx', 'shtml']],\n ['text/iuls', 'uls'],\n ['text/javascript', 'js'],\n ['text/mcf', 'mcf'],\n ['text/n3', 'n3'],\n ['text/pascal', 'pas'],\n [\n 'text/plain',\n [\n 'txt',\n 'bas',\n 'c',\n 'h',\n 'c++',\n 'cc',\n 'com',\n 'conf',\n 'cxx',\n 'def',\n 'f',\n 'f90',\n 'for',\n 'g',\n 'hh',\n 'idc',\n 'jav',\n 'java',\n 'list',\n 'log',\n 'lst',\n 'm',\n 'mar',\n 'pl',\n 'sdml',\n 'text'\n ]\n ],\n ['text/plain-bas', 'par'],\n ['text/prs.lines.tag', 'dsc'],\n ['text/richtext', ['rtx', 'rt', 'rtf']],\n ['text/scriplet', 'wsc'],\n ['text/scriptlet', 'sct'],\n ['text/sgml', ['sgm', 'sgml']],\n ['text/tab-separated-values', 'tsv'],\n ['text/troff', 't'],\n ['text/turtle', 'ttl'],\n ['text/uri-list', ['uni', 'unis', 'uri', 'uris']],\n ['text/vnd.abc', 'abc'],\n ['text/vnd.curl', 'curl'],\n ['text/vnd.curl.dcurl', 'dcurl'],\n ['text/vnd.curl.mcurl', 'mcurl'],\n ['text/vnd.curl.scurl', 'scurl'],\n ['text/vnd.fly', 'fly'],\n ['text/vnd.fmi.flexstor', 'flx'],\n ['text/vnd.graphviz', 'gv'],\n ['text/vnd.in3d.3dml', '3dml'],\n ['text/vnd.in3d.spot', 'spot'],\n ['text/vnd.rn-realtext', 'rt'],\n ['text/vnd.sun.j2me.app-descriptor', 'jad'],\n ['text/vnd.wap.wml', 'wml'],\n ['text/vnd.wap.wmlscript', 'wmls'],\n ['text/webviewhtml', 'htt'],\n ['text/x-asm', ['asm', 's']],\n ['text/x-audiosoft-intra', 'aip'],\n ['text/x-c', ['c', 'cc', 'cpp']],\n ['text/x-component', 'htc'],\n ['text/x-fortran', ['for', 'f', 'f77', 'f90']],\n ['text/x-h', ['h', 'hh']],\n ['text/x-java-source', ['java', 'jav']],\n ['text/x-java-source,java', 'java'],\n ['text/x-la-asf', 'lsx'],\n ['text/x-m', 'm'],\n ['text/x-pascal', 'p'],\n ['text/x-script', 'hlb'],\n ['text/x-script.csh', 'csh'],\n ['text/x-script.elisp', 'el'],\n ['text/x-script.guile', 'scm'],\n ['text/x-script.ksh', 'ksh'],\n ['text/x-script.lisp', 'lsp'],\n ['text/x-script.perl', 'pl'],\n ['text/x-script.perl-module', 'pm'],\n ['text/x-script.phyton', 'py'],\n ['text/x-script.rexx', 'rexx'],\n ['text/x-script.scheme', 'scm'],\n ['text/x-script.sh', 'sh'],\n ['text/x-script.tcl', 'tcl'],\n ['text/x-script.tcsh', 'tcsh'],\n ['text/x-script.zsh', 'zsh'],\n ['text/x-server-parsed-html', ['shtml', 'ssi']],\n ['text/x-setext', 'etx'],\n ['text/x-sgml', ['sgm', 'sgml']],\n ['text/x-speech', ['spc', 'talk']],\n ['text/x-uil', 'uil'],\n ['text/x-uuencode', ['uu', 'uue']],\n ['text/x-vcalendar', 'vcs'],\n ['text/x-vcard', 'vcf'],\n ['text/xml', 'xml'],\n ['video/3gpp', '3gp'],\n ['video/3gpp2', '3g2'],\n ['video/animaflex', 'afl'],\n ['video/avi', 'avi'],\n ['video/avs-video', 'avs'],\n ['video/dl', 'dl'],\n ['video/fli', 'fli'],\n ['video/gl', 'gl'],\n ['video/h261', 'h261'],\n ['video/h263', 'h263'],\n ['video/h264', 'h264'],\n ['video/jpeg', 'jpgv'],\n ['video/jpm', 'jpm'],\n ['video/mj2', 'mj2'],\n ['video/mp4', 'mp4'],\n ['video/mpeg', ['mpeg', 'mp2', 'mpa', 'mpe', 'mpg', 'mpv2', 'm1v', 'm2v', 'mp3']],\n ['video/msvideo', 'avi'],\n ['video/ogg', 'ogv'],\n ['video/quicktime', ['mov', 'qt', 'moov']],\n ['video/vdo', 'vdo'],\n ['video/vivo', ['viv', 'vivo']],\n ['video/vnd.dece.hd', 'uvh'],\n ['video/vnd.dece.mobile', 'uvm'],\n ['video/vnd.dece.pd', 'uvp'],\n ['video/vnd.dece.sd', 'uvs'],\n ['video/vnd.dece.video', 'uvv'],\n ['video/vnd.fvt', 'fvt'],\n ['video/vnd.mpegurl', 'mxu'],\n ['video/vnd.ms-playready.media.pyv', 'pyv'],\n ['video/vnd.rn-realvideo', 'rv'],\n ['video/vnd.uvvu.mp4', 'uvu'],\n ['video/vnd.vivo', ['viv', 'vivo']],\n ['video/vosaic', 'vos'],\n ['video/webm', 'webm'],\n ['video/x-amt-demorun', 'xdr'],\n ['video/x-amt-showrun', 'xsr'],\n ['video/x-atomic3d-feature', 'fmf'],\n ['video/x-dl', 'dl'],\n ['video/x-dv', ['dif', 'dv']],\n ['video/x-f4v', 'f4v'],\n ['video/x-fli', 'fli'],\n ['video/x-flv', 'flv'],\n ['video/x-gl', 'gl'],\n ['video/x-isvideo', 'isu'],\n ['video/x-la-asf', ['lsf', 'lsx']],\n ['video/x-m4v', 'm4v'],\n ['video/x-motion-jpeg', 'mjpg'],\n ['video/x-mpeg', ['mp3', 'mp2']],\n ['video/x-mpeq2a', 'mp2'],\n ['video/x-ms-asf', ['asf', 'asr', 'asx']],\n ['video/x-ms-asf-plugin', 'asx'],\n ['video/x-ms-wm', 'wm'],\n ['video/x-ms-wmv', 'wmv'],\n ['video/x-ms-wmx', 'wmx'],\n ['video/x-ms-wvx', 'wvx'],\n ['video/x-msvideo', 'avi'],\n ['video/x-qtc', 'qtc'],\n ['video/x-scm', 'scm'],\n ['video/x-sgi-movie', ['movie', 'mv']],\n ['windows/metafile', 'wmf'],\n ['www/mime', 'mime'],\n ['x-conference/x-cooltalk', 'ice'],\n ['x-music/x-midi', ['mid', 'midi']],\n ['x-world/x-3dmf', ['3dm', '3dmf', 'qd3', 'qd3d']],\n ['x-world/x-svr', 'svr'],\n ['x-world/x-vrml', ['flr', 'vrml', 'wrl', 'wrz', 'xaf', 'xof']],\n ['x-world/x-vrt', 'vrt'],\n ['xgl/drawing', 'xgz'],\n ['xgl/movie', 'xmz']\n]);\nconst extensions = new Map([\n ['123', 'application/vnd.lotus-1-2-3'],\n ['323', 'text/h323'],\n ['*', 'application/octet-stream'],\n ['3dm', 'x-world/x-3dmf'],\n ['3dmf', 'x-world/x-3dmf'],\n ['3dml', 'text/vnd.in3d.3dml'],\n ['3g2', 'video/3gpp2'],\n ['3gp', 'video/3gpp'],\n ['7z', 'application/x-7z-compressed'],\n ['a', 'application/octet-stream'],\n ['aab', 'application/x-authorware-bin'],\n ['aac', 'audio/x-aac'],\n ['aam', 'application/x-authorware-map'],\n ['aas', 'application/x-authorware-seg'],\n ['abc', 'text/vnd.abc'],\n ['abw', 'application/x-abiword'],\n ['ac', 'application/pkix-attr-cert'],\n ['acc', 'application/vnd.americandynamics.acc'],\n ['ace', 'application/x-ace-compressed'],\n ['acgi', 'text/html'],\n ['acu', 'application/vnd.acucobol'],\n ['acx', 'application/internet-property-stream'],\n ['adp', 'audio/adpcm'],\n ['aep', 'application/vnd.audiograph'],\n ['afl', 'video/animaflex'],\n ['afp', 'application/vnd.ibm.modcap'],\n ['ahead', 'application/vnd.ahead.space'],\n ['ai', 'application/postscript'],\n ['aif', ['audio/aiff', 'audio/x-aiff']],\n ['aifc', ['audio/aiff', 'audio/x-aiff']],\n ['aiff', ['audio/aiff', 'audio/x-aiff']],\n ['aim', 'application/x-aim'],\n ['aip', 'text/x-audiosoft-intra'],\n ['air', 'application/vnd.adobe.air-application-installer-package+zip'],\n ['ait', 'application/vnd.dvb.ait'],\n ['ami', 'application/vnd.amiga.ami'],\n ['ani', 'application/x-navi-animation'],\n ['aos', 'application/x-nokia-9000-communicator-add-on-software'],\n ['apk', 'application/vnd.android.package-archive'],\n ['application', 'application/x-ms-application'],\n ['apr', 'application/vnd.lotus-approach'],\n ['aps', 'application/mime'],\n ['arc', 'application/octet-stream'],\n ['arj', ['application/arj', 'application/octet-stream']],\n ['art', 'image/x-jg'],\n ['asf', 'video/x-ms-asf'],\n ['asm', 'text/x-asm'],\n ['aso', 'application/vnd.accpac.simply.aso'],\n ['asp', 'text/asp'],\n ['asr', 'video/x-ms-asf'],\n ['asx', ['video/x-ms-asf', 'application/x-mplayer2', 'video/x-ms-asf-plugin']],\n ['atc', 'application/vnd.acucorp'],\n ['atomcat', 'application/atomcat+xml'],\n ['atomsvc', 'application/atomsvc+xml'],\n ['atx', 'application/vnd.antix.game-component'],\n ['au', ['audio/basic', 'audio/x-au']],\n ['avi', ['video/avi', 'video/msvideo', 'application/x-troff-msvideo', 'video/x-msvideo']],\n ['avs', 'video/avs-video'],\n ['aw', 'application/applixware'],\n ['axs', 'application/olescript'],\n ['azf', 'application/vnd.airzip.filesecure.azf'],\n ['azs', 'application/vnd.airzip.filesecure.azs'],\n ['azw', 'application/vnd.amazon.ebook'],\n ['bas', 'text/plain'],\n ['bcpio', 'application/x-bcpio'],\n ['bdf', 'application/x-font-bdf'],\n ['bdm', 'application/vnd.syncml.dm+wbxml'],\n ['bed', 'application/vnd.realvnc.bed'],\n ['bh2', 'application/vnd.fujitsu.oasysprs'],\n [\n 'bin',\n ['application/octet-stream', 'application/mac-binary', 'application/macbinary', 'application/x-macbinary', 'application/x-binary']\n ],\n ['bm', 'image/bmp'],\n ['bmi', 'application/vnd.bmi'],\n ['bmp', ['image/bmp', 'image/x-windows-bmp']],\n ['boo', 'application/book'],\n ['book', 'application/book'],\n ['box', 'application/vnd.previewsystems.box'],\n ['boz', 'application/x-bzip2'],\n ['bsh', 'application/x-bsh'],\n ['btif', 'image/prs.btif'],\n ['bz', 'application/x-bzip'],\n ['bz2', 'application/x-bzip2'],\n ['c', ['text/plain', 'text/x-c']],\n ['c++', 'text/plain'],\n ['c11amc', 'application/vnd.cluetrust.cartomobile-config'],\n ['c11amz', 'application/vnd.cluetrust.cartomobile-config-pkg'],\n ['c4g', 'application/vnd.clonk.c4group'],\n ['cab', 'application/vnd.ms-cab-compressed'],\n ['car', 'application/vnd.curl.car'],\n ['cat', ['application/vnd.ms-pkiseccat', 'application/vnd.ms-pki.seccat']],\n ['cc', ['text/plain', 'text/x-c']],\n ['ccad', 'application/clariscad'],\n ['cco', 'application/x-cocoa'],\n ['ccxml', 'application/ccxml+xml,'],\n ['cdbcmsg', 'application/vnd.contact.cmsg'],\n ['cdf', ['application/cdf', 'application/x-cdf', 'application/x-netcdf']],\n ['cdkey', 'application/vnd.mediastation.cdkey'],\n ['cdmia', 'application/cdmi-capability'],\n ['cdmic', 'application/cdmi-container'],\n ['cdmid', 'application/cdmi-domain'],\n ['cdmio', 'application/cdmi-object'],\n ['cdmiq', 'application/cdmi-queue'],\n ['cdx', 'chemical/x-cdx'],\n ['cdxml', 'application/vnd.chemdraw+xml'],\n ['cdy', 'application/vnd.cinderella'],\n ['cer', ['application/pkix-cert', 'application/x-x509-ca-cert']],\n ['cgm', 'image/cgm'],\n ['cha', 'application/x-chat'],\n ['chat', 'application/x-chat'],\n ['chm', 'application/vnd.ms-htmlhelp'],\n ['chrt', 'application/vnd.kde.kchart'],\n ['cif', 'chemical/x-cif'],\n ['cii', 'application/vnd.anser-web-certificate-issue-initiation'],\n ['cil', 'application/vnd.ms-artgalry'],\n ['cla', 'application/vnd.claymore'],\n [\n 'class',\n ['application/octet-stream', 'application/java', 'application/java-byte-code', 'application/java-vm', 'application/x-java-class']\n ],\n ['clkk', 'application/vnd.crick.clicker.keyboard'],\n ['clkp', 'application/vnd.crick.clicker.palette'],\n ['clkt', 'application/vnd.crick.clicker.template'],\n ['clkw', 'application/vnd.crick.clicker.wordbank'],\n ['clkx', 'application/vnd.crick.clicker'],\n ['clp', 'application/x-msclip'],\n ['cmc', 'application/vnd.cosmocaller'],\n ['cmdf', 'chemical/x-cmdf'],\n ['cml', 'chemical/x-cml'],\n ['cmp', 'application/vnd.yellowriver-custom-menu'],\n ['cmx', 'image/x-cmx'],\n ['cod', ['image/cis-cod', 'application/vnd.rim.cod']],\n ['com', ['application/octet-stream', 'text/plain']],\n ['conf', 'text/plain'],\n ['cpio', 'application/x-cpio'],\n ['cpp', 'text/x-c'],\n ['cpt', ['application/mac-compactpro', 'application/x-compactpro', 'application/x-cpt']],\n ['crd', 'application/x-mscardfile'],\n ['crl', ['application/pkix-crl', 'application/pkcs-crl']],\n ['crt', ['application/pkix-cert', 'application/x-x509-user-cert', 'application/x-x509-ca-cert']],\n ['cryptonote', 'application/vnd.rig.cryptonote'],\n ['csh', ['text/x-script.csh', 'application/x-csh']],\n ['csml', 'chemical/x-csml'],\n ['csp', 'application/vnd.commonspace'],\n ['css', ['text/css', 'application/x-pointplus']],\n ['csv', 'text/csv'],\n ['cu', 'application/cu-seeme'],\n ['curl', 'text/vnd.curl'],\n ['cww', 'application/prs.cww'],\n ['cxx', 'text/plain'],\n ['dae', 'model/vnd.collada+xml'],\n ['daf', 'application/vnd.mobius.daf'],\n ['davmount', 'application/davmount+xml'],\n ['dcr', 'application/x-director'],\n ['dcurl', 'text/vnd.curl.dcurl'],\n ['dd2', 'application/vnd.oma.dd2+xml'],\n ['ddd', 'application/vnd.fujixerox.ddd'],\n ['deb', 'application/x-debian-package'],\n ['deepv', 'application/x-deepv'],\n ['def', 'text/plain'],\n ['der', 'application/x-x509-ca-cert'],\n ['dfac', 'application/vnd.dreamfactory'],\n ['dif', 'video/x-dv'],\n ['dir', 'application/x-director'],\n ['dis', 'application/vnd.mobius.dis'],\n ['djvu', 'image/vnd.djvu'],\n ['dl', ['video/dl', 'video/x-dl']],\n ['dll', 'application/x-msdownload'],\n ['dms', 'application/octet-stream'],\n ['dna', 'application/vnd.dna'],\n ['doc', 'application/msword'],\n ['docm', 'application/vnd.ms-word.document.macroenabled.12'],\n ['docx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n ['dot', 'application/msword'],\n ['dotm', 'application/vnd.ms-word.template.macroenabled.12'],\n ['dotx', 'application/vnd.openxmlformats-officedocument.wordprocessingml.template'],\n ['dp', ['application/commonground', 'application/vnd.osgi.dp']],\n ['dpg', 'application/vnd.dpgraph'],\n ['dra', 'audio/vnd.dra'],\n ['drw', 'application/drafting'],\n ['dsc', 'text/prs.lines.tag'],\n ['dssc', 'application/dssc+der'],\n ['dtb', 'application/x-dtbook+xml'],\n ['dtd', 'application/xml-dtd'],\n ['dts', 'audio/vnd.dts'],\n ['dtshd', 'audio/vnd.dts.hd'],\n ['dump', 'application/octet-stream'],\n ['dv', 'video/x-dv'],\n ['dvi', 'application/x-dvi'],\n ['dwf', ['model/vnd.dwf', 'drawing/x-dwf']],\n ['dwg', ['application/acad', 'image/vnd.dwg', 'image/x-dwg']],\n ['dxf', ['application/dxf', 'image/vnd.dwg', 'image/vnd.dxf', 'image/x-dwg']],\n ['dxp', 'application/vnd.spotfire.dxp'],\n ['dxr', 'application/x-director'],\n ['ecelp4800', 'audio/vnd.nuera.ecelp4800'],\n ['ecelp7470', 'audio/vnd.nuera.ecelp7470'],\n ['ecelp9600', 'audio/vnd.nuera.ecelp9600'],\n ['edm', 'application/vnd.novadigm.edm'],\n ['edx', 'application/vnd.novadigm.edx'],\n ['efif', 'application/vnd.picsel'],\n ['ei6', 'application/vnd.pg.osasli'],\n ['el', 'text/x-script.elisp'],\n ['elc', ['application/x-elc', 'application/x-bytecode.elisp']],\n ['eml', 'message/rfc822'],\n ['emma', 'application/emma+xml'],\n ['env', 'application/x-envoy'],\n ['eol', 'audio/vnd.digital-winds'],\n ['eot', 'application/vnd.ms-fontobject'],\n ['eps', 'application/postscript'],\n ['epub', 'application/epub+zip'],\n ['es', ['application/ecmascript', 'application/x-esrehber']],\n ['es3', 'application/vnd.eszigno3+xml'],\n ['esf', 'application/vnd.epson.esf'],\n ['etx', 'text/x-setext'],\n ['evy', ['application/envoy', 'application/x-envoy']],\n ['exe', ['application/octet-stream', 'application/x-msdownload']],\n ['exi', 'application/exi'],\n ['ext', 'application/vnd.novadigm.ext'],\n ['ez2', 'application/vnd.ezpix-album'],\n ['ez3', 'application/vnd.ezpix-package'],\n ['f', ['text/plain', 'text/x-fortran']],\n ['f4v', 'video/x-f4v'],\n ['f77', 'text/x-fortran'],\n ['f90', ['text/plain', 'text/x-fortran']],\n ['fbs', 'image/vnd.fastbidsheet'],\n ['fcs', 'application/vnd.isac.fcs'],\n ['fdf', 'application/vnd.fdf'],\n ['fe_launch', 'application/vnd.denovo.fcselayout-link'],\n ['fg5', 'application/vnd.fujitsu.oasysgp'],\n ['fh', 'image/x-freehand'],\n ['fif', ['application/fractals', 'image/fif']],\n ['fig', 'application/x-xfig'],\n ['fli', ['video/fli', 'video/x-fli']],\n ['flo', ['image/florian', 'application/vnd.micrografx.flo']],\n ['flr', 'x-world/x-vrml'],\n ['flv', 'video/x-flv'],\n ['flw', 'application/vnd.kde.kivio'],\n ['flx', 'text/vnd.fmi.flexstor'],\n ['fly', 'text/vnd.fly'],\n ['fm', 'application/vnd.framemaker'],\n ['fmf', 'video/x-atomic3d-feature'],\n ['fnc', 'application/vnd.frogans.fnc'],\n ['for', ['text/plain', 'text/x-fortran']],\n ['fpx', ['image/vnd.fpx', 'image/vnd.net-fpx']],\n ['frl', 'application/freeloader'],\n ['fsc', 'application/vnd.fsc.weblaunch'],\n ['fst', 'image/vnd.fst'],\n ['ftc', 'application/vnd.fluxtime.clip'],\n ['fti', 'application/vnd.anser-web-funds-transfer-initiation'],\n ['funk', 'audio/make'],\n ['fvt', 'video/vnd.fvt'],\n ['fxp', 'application/vnd.adobe.fxp'],\n ['fzs', 'application/vnd.fuzzysheet'],\n ['g', 'text/plain'],\n ['g2w', 'application/vnd.geoplan'],\n ['g3', 'image/g3fax'],\n ['g3w', 'application/vnd.geospace'],\n ['gac', 'application/vnd.groove-account'],\n ['gdl', 'model/vnd.gdl'],\n ['geo', 'application/vnd.dynageo'],\n ['geojson', 'application/geo+json'],\n ['gex', 'application/vnd.geometry-explorer'],\n ['ggb', 'application/vnd.geogebra.file'],\n ['ggt', 'application/vnd.geogebra.tool'],\n ['ghf', 'application/vnd.groove-help'],\n ['gif', 'image/gif'],\n ['gim', 'application/vnd.groove-identity-message'],\n ['gl', ['video/gl', 'video/x-gl']],\n ['gmx', 'application/vnd.gmx'],\n ['gnumeric', 'application/x-gnumeric'],\n ['gph', 'application/vnd.flographit'],\n ['gqf', 'application/vnd.grafeq'],\n ['gram', 'application/srgs'],\n ['grv', 'application/vnd.groove-injector'],\n ['grxml', 'application/srgs+xml'],\n ['gsd', 'audio/x-gsm'],\n ['gsf', 'application/x-font-ghostscript'],\n ['gsm', 'audio/x-gsm'],\n ['gsp', 'application/x-gsp'],\n ['gss', 'application/x-gss'],\n ['gtar', 'application/x-gtar'],\n ['gtm', 'application/vnd.groove-tool-message'],\n ['gtw', 'model/vnd.gtw'],\n ['gv', 'text/vnd.graphviz'],\n ['gxt', 'application/vnd.geonext'],\n ['gz', ['application/x-gzip', 'application/x-compressed']],\n ['gzip', ['multipart/x-gzip', 'application/x-gzip']],\n ['h', ['text/plain', 'text/x-h']],\n ['h261', 'video/h261'],\n ['h263', 'video/h263'],\n ['h264', 'video/h264'],\n ['hal', 'application/vnd.hal+xml'],\n ['hbci', 'application/vnd.hbci'],\n ['hdf', 'application/x-hdf'],\n ['help', 'application/x-helpfile'],\n ['hgl', 'application/vnd.hp-hpgl'],\n ['hh', ['text/plain', 'text/x-h']],\n ['hlb', 'text/x-script'],\n ['hlp', ['application/winhlp', 'application/hlp', 'application/x-helpfile', 'application/x-winhelp']],\n ['hpg', 'application/vnd.hp-hpgl'],\n ['hpgl', 'application/vnd.hp-hpgl'],\n ['hpid', 'application/vnd.hp-hpid'],\n ['hps', 'application/vnd.hp-hps'],\n [\n 'hqx',\n [\n 'application/mac-binhex40',\n 'application/binhex',\n 'application/binhex4',\n 'application/mac-binhex',\n 'application/x-binhex40',\n 'application/x-mac-binhex40'\n ]\n ],\n ['hta', 'application/hta'],\n ['htc', 'text/x-component'],\n ['htke', 'application/vnd.kenameaapp'],\n ['htm', 'text/html'],\n ['html', 'text/html'],\n ['htmls', 'text/html'],\n ['htt', 'text/webviewhtml'],\n ['htx', 'text/html'],\n ['hvd', 'application/vnd.yamaha.hv-dic'],\n ['hvp', 'application/vnd.yamaha.hv-voice'],\n ['hvs', 'application/vnd.yamaha.hv-script'],\n ['i2g', 'application/vnd.intergeo'],\n ['icc', 'application/vnd.iccprofile'],\n ['ice', 'x-conference/x-cooltalk'],\n ['ico', 'image/x-icon'],\n ['ics', 'text/calendar'],\n ['idc', 'text/plain'],\n ['ief', 'image/ief'],\n ['iefs', 'image/ief'],\n ['ifm', 'application/vnd.shana.informed.formdata'],\n ['iges', ['application/iges', 'model/iges']],\n ['igl', 'application/vnd.igloader'],\n ['igm', 'application/vnd.insors.igm'],\n ['igs', ['application/iges', 'model/iges']],\n ['igx', 'application/vnd.micrografx.igx'],\n ['iif', 'application/vnd.shana.informed.interchange'],\n ['iii', 'application/x-iphone'],\n ['ima', 'application/x-ima'],\n ['imap', 'application/x-httpd-imap'],\n ['imp', 'application/vnd.accpac.simply.imp'],\n ['ims', 'application/vnd.ms-ims'],\n ['inf', 'application/inf'],\n ['ins', ['application/x-internet-signup', 'application/x-internett-signup']],\n ['ip', 'application/x-ip2'],\n ['ipfix', 'application/ipfix'],\n ['ipk', 'application/vnd.shana.informed.package'],\n ['irm', 'application/vnd.ibm.rights-management'],\n ['irp', 'application/vnd.irepository.package+xml'],\n ['isp', 'application/x-internet-signup'],\n ['isu', 'video/x-isvideo'],\n ['it', 'audio/it'],\n ['itp', 'application/vnd.shana.informed.formtemplate'],\n ['iv', 'application/x-inventor'],\n ['ivp', 'application/vnd.immervision-ivp'],\n ['ivr', 'i-world/i-vrml'],\n ['ivu', 'application/vnd.immervision-ivu'],\n ['ivy', 'application/x-livescreen'],\n ['jad', 'text/vnd.sun.j2me.app-descriptor'],\n ['jam', ['application/vnd.jam', 'audio/x-jam']],\n ['jar', 'application/java-archive'],\n ['jav', ['text/plain', 'text/x-java-source']],\n ['java', ['text/plain', 'text/x-java-source,java', 'text/x-java-source']],\n ['jcm', 'application/x-java-commerce'],\n ['jfif', ['image/pipeg', 'image/jpeg', 'image/pjpeg']],\n ['jfif-tbnl', 'image/jpeg'],\n ['jisp', 'application/vnd.jisp'],\n ['jlt', 'application/vnd.hp-jlyt'],\n ['jnlp', 'application/x-java-jnlp-file'],\n ['joda', 'application/vnd.joost.joda-archive'],\n ['jpe', ['image/jpeg', 'image/pjpeg']],\n ['jpeg', ['image/jpeg', 'image/pjpeg']],\n ['jpg', ['image/jpeg', 'image/pjpeg']],\n ['jpgv', 'video/jpeg'],\n ['jpm', 'video/jpm'],\n ['jps', 'image/x-jps'],\n ['js', ['application/javascript', 'application/ecmascript', 'text/javascript', 'text/ecmascript', 'application/x-javascript']],\n ['json', 'application/json'],\n ['jut', 'image/jutvision'],\n ['kar', ['audio/midi', 'music/x-karaoke']],\n ['karbon', 'application/vnd.kde.karbon'],\n ['kfo', 'application/vnd.kde.kformula'],\n ['kia', 'application/vnd.kidspiration'],\n ['kml', 'application/vnd.google-earth.kml+xml'],\n ['kmz', 'application/vnd.google-earth.kmz'],\n ['kne', 'application/vnd.kinar'],\n ['kon', 'application/vnd.kde.kontour'],\n ['kpr', 'application/vnd.kde.kpresenter'],\n ['ksh', ['application/x-ksh', 'text/x-script.ksh']],\n ['ksp', 'application/vnd.kde.kspread'],\n ['ktx', 'image/ktx'],\n ['ktz', 'application/vnd.kahootz'],\n ['kwd', 'application/vnd.kde.kword'],\n ['la', ['audio/nspaudio', 'audio/x-nspaudio']],\n ['lam', 'audio/x-liveaudio'],\n ['lasxml', 'application/vnd.las.las+xml'],\n ['latex', 'application/x-latex'],\n ['lbd', 'application/vnd.llamagraphics.life-balance.desktop'],\n ['lbe', 'application/vnd.llamagraphics.life-balance.exchange+xml'],\n ['les', 'application/vnd.hhe.lesson-player'],\n ['lha', ['application/octet-stream', 'application/lha', 'application/x-lha']],\n ['lhx', 'application/octet-stream'],\n ['link66', 'application/vnd.route66.link66+xml'],\n ['list', 'text/plain'],\n ['lma', ['audio/nspaudio', 'audio/x-nspaudio']],\n ['log', 'text/plain'],\n ['lrm', 'application/vnd.ms-lrm'],\n ['lsf', 'video/x-la-asf'],\n ['lsp', ['application/x-lisp', 'text/x-script.lisp']],\n ['lst', 'text/plain'],\n ['lsx', ['video/x-la-asf', 'text/x-la-asf']],\n ['ltf', 'application/vnd.frogans.ltf'],\n ['ltx', 'application/x-latex'],\n ['lvp', 'audio/vnd.lucent.voice'],\n ['lwp', 'application/vnd.lotus-wordpro'],\n ['lzh', ['application/octet-stream', 'application/x-lzh']],\n ['lzx', ['application/lzx', 'application/octet-stream', 'application/x-lzx']],\n ['m', ['text/plain', 'text/x-m']],\n ['m13', 'application/x-msmediaview'],\n ['m14', 'application/x-msmediaview'],\n ['m1v', 'video/mpeg'],\n ['m21', 'application/mp21'],\n ['m2a', 'audio/mpeg'],\n ['m2v', 'video/mpeg'],\n ['m3u', ['audio/x-mpegurl', 'audio/x-mpequrl']],\n ['m3u8', 'application/vnd.apple.mpegurl'],\n ['m4v', 'video/x-m4v'],\n ['ma', 'application/mathematica'],\n ['mads', 'application/mads+xml'],\n ['mag', 'application/vnd.ecowin.chart'],\n ['man', 'application/x-troff-man'],\n ['map', 'application/x-navimap'],\n ['mar', 'text/plain'],\n ['mathml', 'application/mathml+xml'],\n ['mbd', 'application/mbedlet'],\n ['mbk', 'application/vnd.mobius.mbk'],\n ['mbox', 'application/mbox'],\n ['mc$', 'application/x-magic-cap-package-1.0'],\n ['mc1', 'application/vnd.medcalcdata'],\n ['mcd', ['application/mcad', 'application/vnd.mcd', 'application/x-mathcad']],\n ['mcf', ['image/vasa', 'text/mcf']],\n ['mcp', 'application/netmc'],\n ['mcurl', 'text/vnd.curl.mcurl'],\n ['mdb', 'application/x-msaccess'],\n ['mdi', 'image/vnd.ms-modi'],\n ['me', 'application/x-troff-me'],\n ['meta4', 'application/metalink4+xml'],\n ['mets', 'application/mets+xml'],\n ['mfm', 'application/vnd.mfmp'],\n ['mgp', 'application/vnd.osgeo.mapguide.package'],\n ['mgz', 'application/vnd.proteus.magazine'],\n ['mht', 'message/rfc822'],\n ['mhtml', 'message/rfc822'],\n ['mid', ['audio/mid', 'audio/midi', 'music/crescendo', 'x-music/x-midi', 'audio/x-midi', 'application/x-midi', 'audio/x-mid']],\n ['midi', ['audio/midi', 'music/crescendo', 'x-music/x-midi', 'audio/x-midi', 'application/x-midi', 'audio/x-mid']],\n ['mif', ['application/vnd.mif', 'application/x-mif', 'application/x-frame']],\n ['mime', ['message/rfc822', 'www/mime']],\n ['mj2', 'video/mj2'],\n ['mjf', 'audio/x-vnd.audioexplosion.mjuicemediafile'],\n ['mjpg', 'video/x-motion-jpeg'],\n ['mlp', 'application/vnd.dolby.mlp'],\n ['mm', ['application/base64', 'application/x-meme']],\n ['mmd', 'application/vnd.chipnuts.karaoke-mmd'],\n ['mme', 'application/base64'],\n ['mmf', 'application/vnd.smaf'],\n ['mmr', 'image/vnd.fujixerox.edmics-mmr'],\n ['mny', 'application/x-msmoney'],\n ['mod', ['audio/mod', 'audio/x-mod']],\n ['mods', 'application/mods+xml'],\n ['moov', 'video/quicktime'],\n ['mov', 'video/quicktime'],\n ['movie', 'video/x-sgi-movie'],\n ['mp2', ['video/mpeg', 'audio/mpeg', 'video/x-mpeg', 'audio/x-mpeg', 'video/x-mpeq2a']],\n ['mp3', ['audio/mpeg', 'audio/mpeg3', 'video/mpeg', 'audio/x-mpeg-3', 'video/x-mpeg']],\n ['mp4', ['video/mp4', 'application/mp4']],\n ['mp4a', 'audio/mp4'],\n ['mpa', ['video/mpeg', 'audio/mpeg']],\n ['mpc', ['application/vnd.mophun.certificate', 'application/x-project']],\n ['mpe', 'video/mpeg'],\n ['mpeg', 'video/mpeg'],\n ['mpg', ['video/mpeg', 'audio/mpeg']],\n ['mpga', 'audio/mpeg'],\n ['mpkg', 'application/vnd.apple.installer+xml'],\n ['mpm', 'application/vnd.blueice.multipass'],\n ['mpn', 'application/vnd.mophun.application'],\n ['mpp', 'application/vnd.ms-project'],\n ['mpt', 'application/x-project'],\n ['mpv', 'application/x-project'],\n ['mpv2', 'video/mpeg'],\n ['mpx', 'application/x-project'],\n ['mpy', 'application/vnd.ibm.minipay'],\n ['mqy', 'application/vnd.mobius.mqy'],\n ['mrc', 'application/marc'],\n ['mrcx', 'application/marcxml+xml'],\n ['ms', 'application/x-troff-ms'],\n ['mscml', 'application/mediaservercontrol+xml'],\n ['mseq', 'application/vnd.mseq'],\n ['msf', 'application/vnd.epson.msf'],\n ['msg', 'application/vnd.ms-outlook'],\n ['msh', 'model/mesh'],\n ['msl', 'application/vnd.mobius.msl'],\n ['msty', 'application/vnd.muvee.style'],\n ['mts', 'model/vnd.mts'],\n ['mus', 'application/vnd.musician'],\n ['musicxml', 'application/vnd.recordare.musicxml+xml'],\n ['mv', 'video/x-sgi-movie'],\n ['mvb', 'application/x-msmediaview'],\n ['mwf', 'application/vnd.mfer'],\n ['mxf', 'application/mxf'],\n ['mxl', 'application/vnd.recordare.musicxml'],\n ['mxml', 'application/xv+xml'],\n ['mxs', 'application/vnd.triscape.mxs'],\n ['mxu', 'video/vnd.mpegurl'],\n ['my', 'audio/make'],\n ['mzz', 'application/x-vnd.audioexplosion.mzz'],\n ['n-gage', 'application/vnd.nokia.n-gage.symbian.install'],\n ['n3', 'text/n3'],\n ['nap', 'image/naplps'],\n ['naplps', 'image/naplps'],\n ['nbp', 'application/vnd.wolfram.player'],\n ['nc', 'application/x-netcdf'],\n ['ncm', 'application/vnd.nokia.configuration-message'],\n ['ncx', 'application/x-dtbncx+xml'],\n ['ngdat', 'application/vnd.nokia.n-gage.data'],\n ['nif', 'image/x-niff'],\n ['niff', 'image/x-niff'],\n ['nix', 'application/x-mix-transfer'],\n ['nlu', 'application/vnd.neurolanguage.nlu'],\n ['nml', 'application/vnd.enliven'],\n ['nnd', 'application/vnd.noblenet-directory'],\n ['nns', 'application/vnd.noblenet-sealer'],\n ['nnw', 'application/vnd.noblenet-web'],\n ['npx', 'image/vnd.net-fpx'],\n ['nsc', 'application/x-conference'],\n ['nsf', 'application/vnd.lotus-notes'],\n ['nvd', 'application/x-navidoc'],\n ['nws', 'message/rfc822'],\n ['o', 'application/octet-stream'],\n ['oa2', 'application/vnd.fujitsu.oasys2'],\n ['oa3', 'application/vnd.fujitsu.oasys3'],\n ['oas', 'application/vnd.fujitsu.oasys'],\n ['obd', 'application/x-msbinder'],\n ['oda', 'application/oda'],\n ['odb', 'application/vnd.oasis.opendocument.database'],\n ['odc', 'application/vnd.oasis.opendocument.chart'],\n ['odf', 'application/vnd.oasis.opendocument.formula'],\n ['odft', 'application/vnd.oasis.opendocument.formula-template'],\n ['odg', 'application/vnd.oasis.opendocument.graphics'],\n ['odi', 'application/vnd.oasis.opendocument.image'],\n ['odm', 'application/vnd.oasis.opendocument.text-master'],\n ['odp', 'application/vnd.oasis.opendocument.presentation'],\n ['ods', 'application/vnd.oasis.opendocument.spreadsheet'],\n ['odt', 'application/vnd.oasis.opendocument.text'],\n ['oga', 'audio/ogg'],\n ['ogv', 'video/ogg'],\n ['ogx', 'application/ogg'],\n ['omc', 'application/x-omc'],\n ['omcd', 'application/x-omcdatamaker'],\n ['omcr', 'application/x-omcregerator'],\n ['onetoc', 'application/onenote'],\n ['opf', 'application/oebps-package+xml'],\n ['org', 'application/vnd.lotus-organizer'],\n ['osf', 'application/vnd.yamaha.openscoreformat'],\n ['osfpvg', 'application/vnd.yamaha.openscoreformat.osfpvg+xml'],\n ['otc', 'application/vnd.oasis.opendocument.chart-template'],\n ['otf', 'application/x-font-otf'],\n ['otg', 'application/vnd.oasis.opendocument.graphics-template'],\n ['oth', 'application/vnd.oasis.opendocument.text-web'],\n ['oti', 'application/vnd.oasis.opendocument.image-template'],\n ['otp', 'application/vnd.oasis.opendocument.presentation-template'],\n ['ots', 'application/vnd.oasis.opendocument.spreadsheet-template'],\n ['ott', 'application/vnd.oasis.opendocument.text-template'],\n ['oxt', 'application/vnd.openofficeorg.extension'],\n ['p', 'text/x-pascal'],\n ['p10', ['application/pkcs10', 'application/x-pkcs10']],\n ['p12', ['application/pkcs-12', 'application/x-pkcs12']],\n ['p7a', 'application/x-pkcs7-signature'],\n ['p7b', 'application/x-pkcs7-certificates'],\n ['p7c', ['application/pkcs7-mime', 'application/x-pkcs7-mime']],\n ['p7m', ['application/pkcs7-mime', 'application/x-pkcs7-mime']],\n ['p7r', 'application/x-pkcs7-certreqresp'],\n ['p7s', ['application/pkcs7-signature', 'application/x-pkcs7-signature']],\n ['p8', 'application/pkcs8'],\n ['par', 'text/plain-bas'],\n ['part', 'application/pro_eng'],\n ['pas', 'text/pascal'],\n ['paw', 'application/vnd.pawaafile'],\n ['pbd', 'application/vnd.powerbuilder6'],\n ['pbm', 'image/x-portable-bitmap'],\n ['pcf', 'application/x-font-pcf'],\n ['pcl', ['application/vnd.hp-pcl', 'application/x-pcl']],\n ['pclxl', 'application/vnd.hp-pclxl'],\n ['pct', 'image/x-pict'],\n ['pcurl', 'application/vnd.curl.pcurl'],\n ['pcx', 'image/x-pcx'],\n ['pdb', ['application/vnd.palm', 'chemical/x-pdb']],\n ['pdf', 'application/pdf'],\n ['pfa', 'application/x-font-type1'],\n ['pfr', 'application/font-tdpfr'],\n ['pfunk', ['audio/make', 'audio/make.my.funk']],\n ['pfx', 'application/x-pkcs12'],\n ['pgm', ['image/x-portable-graymap', 'image/x-portable-greymap']],\n ['pgn', 'application/x-chess-pgn'],\n ['pgp', 'application/pgp-signature'],\n ['pic', ['image/pict', 'image/x-pict']],\n ['pict', 'image/pict'],\n ['pkg', 'application/x-newton-compatible-pkg'],\n ['pki', 'application/pkixcmp'],\n ['pkipath', 'application/pkix-pkipath'],\n ['pko', ['application/ynd.ms-pkipko', 'application/vnd.ms-pki.pko']],\n ['pl', ['text/plain', 'text/x-script.perl']],\n ['plb', 'application/vnd.3gpp.pic-bw-large'],\n ['plc', 'application/vnd.mobius.plc'],\n ['plf', 'application/vnd.pocketlearn'],\n ['pls', 'application/pls+xml'],\n ['plx', 'application/x-pixclscript'],\n ['pm', ['text/x-script.perl-module', 'image/x-xpixmap']],\n ['pm4', 'application/x-pagemaker'],\n ['pm5', 'application/x-pagemaker'],\n ['pma', 'application/x-perfmon'],\n ['pmc', 'application/x-perfmon'],\n ['pml', ['application/vnd.ctc-posml', 'application/x-perfmon']],\n ['pmr', 'application/x-perfmon'],\n ['pmw', 'application/x-perfmon'],\n ['png', 'image/png'],\n ['pnm', ['application/x-portable-anymap', 'image/x-portable-anymap']],\n ['portpkg', 'application/vnd.macports.portpkg'],\n ['pot', ['application/vnd.ms-powerpoint', 'application/mspowerpoint']],\n ['potm', 'application/vnd.ms-powerpoint.template.macroenabled.12'],\n ['potx', 'application/vnd.openxmlformats-officedocument.presentationml.template'],\n ['pov', 'model/x-pov'],\n ['ppa', 'application/vnd.ms-powerpoint'],\n ['ppam', 'application/vnd.ms-powerpoint.addin.macroenabled.12'],\n ['ppd', 'application/vnd.cups-ppd'],\n ['ppm', 'image/x-portable-pixmap'],\n ['pps', ['application/vnd.ms-powerpoint', 'application/mspowerpoint']],\n ['ppsm', 'application/vnd.ms-powerpoint.slideshow.macroenabled.12'],\n ['ppsx', 'application/vnd.openxmlformats-officedocument.presentationml.slideshow'],\n ['ppt', ['application/vnd.ms-powerpoint', 'application/mspowerpoint', 'application/powerpoint', 'application/x-mspowerpoint']],\n ['pptm', 'application/vnd.ms-powerpoint.presentation.macroenabled.12'],\n ['pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'],\n ['ppz', 'application/mspowerpoint'],\n ['prc', 'application/x-mobipocket-ebook'],\n ['pre', ['application/vnd.lotus-freelance', 'application/x-freelance']],\n ['prf', 'application/pics-rules'],\n ['prt', 'application/pro_eng'],\n ['ps', 'application/postscript'],\n ['psb', 'application/vnd.3gpp.pic-bw-small'],\n ['psd', ['application/octet-stream', 'image/vnd.adobe.photoshop']],\n ['psf', 'application/x-font-linux-psf'],\n ['pskcxml', 'application/pskc+xml'],\n ['ptid', 'application/vnd.pvi.ptid1'],\n ['pub', 'application/x-mspublisher'],\n ['pvb', 'application/vnd.3gpp.pic-bw-var'],\n ['pvu', 'paleovu/x-pv'],\n ['pwn', 'application/vnd.3m.post-it-notes'],\n ['pwz', 'application/vnd.ms-powerpoint'],\n ['py', 'text/x-script.phyton'],\n ['pya', 'audio/vnd.ms-playready.media.pya'],\n ['pyc', 'application/x-bytecode.python'],\n ['pyv', 'video/vnd.ms-playready.media.pyv'],\n ['qam', 'application/vnd.epson.quickanime'],\n ['qbo', 'application/vnd.intu.qbo'],\n ['qcp', 'audio/vnd.qcelp'],\n ['qd3', 'x-world/x-3dmf'],\n ['qd3d', 'x-world/x-3dmf'],\n ['qfx', 'application/vnd.intu.qfx'],\n ['qif', 'image/x-quicktime'],\n ['qps', 'application/vnd.publishare-delta-tree'],\n ['qt', 'video/quicktime'],\n ['qtc', 'video/x-qtc'],\n ['qti', 'image/x-quicktime'],\n ['qtif', 'image/x-quicktime'],\n ['qxd', 'application/vnd.quark.quarkxpress'],\n ['ra', ['audio/x-realaudio', 'audio/x-pn-realaudio', 'audio/x-pn-realaudio-plugin']],\n ['ram', 'audio/x-pn-realaudio'],\n ['rar', 'application/x-rar-compressed'],\n ['ras', ['image/cmu-raster', 'application/x-cmu-raster', 'image/x-cmu-raster']],\n ['rast', 'image/cmu-raster'],\n ['rcprofile', 'application/vnd.ipunplugged.rcprofile'],\n ['rdf', 'application/rdf+xml'],\n ['rdz', 'application/vnd.data-vision.rdz'],\n ['rep', 'application/vnd.businessobjects'],\n ['res', 'application/x-dtbresource+xml'],\n ['rexx', 'text/x-script.rexx'],\n ['rf', 'image/vnd.rn-realflash'],\n ['rgb', 'image/x-rgb'],\n ['rif', 'application/reginfo+xml'],\n ['rip', 'audio/vnd.rip'],\n ['rl', 'application/resource-lists+xml'],\n ['rlc', 'image/vnd.fujixerox.edmics-rlc'],\n ['rld', 'application/resource-lists-diff+xml'],\n ['rm', ['application/vnd.rn-realmedia', 'audio/x-pn-realaudio']],\n ['rmi', 'audio/mid'],\n ['rmm', 'audio/x-pn-realaudio'],\n ['rmp', ['audio/x-pn-realaudio-plugin', 'audio/x-pn-realaudio']],\n ['rms', 'application/vnd.jcp.javame.midlet-rms'],\n ['rnc', 'application/relax-ng-compact-syntax'],\n ['rng', ['application/ringing-tones', 'application/vnd.nokia.ringing-tone']],\n ['rnx', 'application/vnd.rn-realplayer'],\n ['roff', 'application/x-troff'],\n ['rp', 'image/vnd.rn-realpix'],\n ['rp9', 'application/vnd.cloanto.rp9'],\n ['rpm', 'audio/x-pn-realaudio-plugin'],\n ['rpss', 'application/vnd.nokia.radio-presets'],\n ['rpst', 'application/vnd.nokia.radio-preset'],\n ['rq', 'application/sparql-query'],\n ['rs', 'application/rls-services+xml'],\n ['rsd', 'application/rsd+xml'],\n ['rt', ['text/richtext', 'text/vnd.rn-realtext']],\n ['rtf', ['application/rtf', 'text/richtext', 'application/x-rtf']],\n ['rtx', ['text/richtext', 'application/rtf']],\n ['rv', 'video/vnd.rn-realvideo'],\n ['s', 'text/x-asm'],\n ['s3m', 'audio/s3m'],\n ['saf', 'application/vnd.yamaha.smaf-audio'],\n ['saveme', 'application/octet-stream'],\n ['sbk', 'application/x-tbook'],\n ['sbml', 'application/sbml+xml'],\n ['sc', 'application/vnd.ibm.secure-container'],\n ['scd', 'application/x-msschedule'],\n [\n 'scm',\n ['application/vnd.lotus-screencam', 'video/x-scm', 'text/x-script.guile', 'application/x-lotusscreencam', 'text/x-script.scheme']\n ],\n ['scq', 'application/scvp-cv-request'],\n ['scs', 'application/scvp-cv-response'],\n ['sct', 'text/scriptlet'],\n ['scurl', 'text/vnd.curl.scurl'],\n ['sda', 'application/vnd.stardivision.draw'],\n ['sdc', 'application/vnd.stardivision.calc'],\n ['sdd', 'application/vnd.stardivision.impress'],\n ['sdkm', 'application/vnd.solent.sdkm+xml'],\n ['sdml', 'text/plain'],\n ['sdp', ['application/sdp', 'application/x-sdp']],\n ['sdr', 'application/sounder'],\n ['sdw', 'application/vnd.stardivision.writer'],\n ['sea', ['application/sea', 'application/x-sea']],\n ['see', 'application/vnd.seemail'],\n ['seed', 'application/vnd.fdsn.seed'],\n ['sema', 'application/vnd.sema'],\n ['semd', 'application/vnd.semd'],\n ['semf', 'application/vnd.semf'],\n ['ser', 'application/java-serialized-object'],\n ['set', 'application/set'],\n ['setpay', 'application/set-payment-initiation'],\n ['setreg', 'application/set-registration-initiation'],\n ['sfd-hdstx', 'application/vnd.hydrostatix.sof-data'],\n ['sfs', 'application/vnd.spotfire.sfs'],\n ['sgl', 'application/vnd.stardivision.writer-global'],\n ['sgm', ['text/sgml', 'text/x-sgml']],\n ['sgml', ['text/sgml', 'text/x-sgml']],\n ['sh', ['application/x-shar', 'application/x-bsh', 'application/x-sh', 'text/x-script.sh']],\n ['shar', ['application/x-bsh', 'application/x-shar']],\n ['shf', 'application/shf+xml'],\n ['shtml', ['text/html', 'text/x-server-parsed-html']],\n ['sid', 'audio/x-psid'],\n ['sis', 'application/vnd.symbian.install'],\n ['sit', ['application/x-stuffit', 'application/x-sit']],\n ['sitx', 'application/x-stuffitx'],\n ['skd', 'application/x-koan'],\n ['skm', 'application/x-koan'],\n ['skp', ['application/vnd.koan', 'application/x-koan']],\n ['skt', 'application/x-koan'],\n ['sl', 'application/x-seelogo'],\n ['sldm', 'application/vnd.ms-powerpoint.slide.macroenabled.12'],\n ['sldx', 'application/vnd.openxmlformats-officedocument.presentationml.slide'],\n ['slt', 'application/vnd.epson.salt'],\n ['sm', 'application/vnd.stepmania.stepchart'],\n ['smf', 'application/vnd.stardivision.math'],\n ['smi', ['application/smil', 'application/smil+xml']],\n ['smil', 'application/smil'],\n ['snd', ['audio/basic', 'audio/x-adpcm']],\n ['snf', 'application/x-font-snf'],\n ['sol', 'application/solids'],\n ['spc', ['text/x-speech', 'application/x-pkcs7-certificates']],\n ['spf', 'application/vnd.yamaha.smaf-phrase'],\n ['spl', ['application/futuresplash', 'application/x-futuresplash']],\n ['spot', 'text/vnd.in3d.spot'],\n ['spp', 'application/scvp-vp-response'],\n ['spq', 'application/scvp-vp-request'],\n ['spr', 'application/x-sprite'],\n ['sprite', 'application/x-sprite'],\n ['src', 'application/x-wais-source'],\n ['sru', 'application/sru+xml'],\n ['srx', 'application/sparql-results+xml'],\n ['sse', 'application/vnd.kodak-descriptor'],\n ['ssf', 'application/vnd.epson.ssf'],\n ['ssi', 'text/x-server-parsed-html'],\n ['ssm', 'application/streamingmedia'],\n ['ssml', 'application/ssml+xml'],\n ['sst', ['application/vnd.ms-pkicertstore', 'application/vnd.ms-pki.certstore']],\n ['st', 'application/vnd.sailingtracker.track'],\n ['stc', 'application/vnd.sun.xml.calc.template'],\n ['std', 'application/vnd.sun.xml.draw.template'],\n ['step', 'application/step'],\n ['stf', 'application/vnd.wt.stf'],\n ['sti', 'application/vnd.sun.xml.impress.template'],\n ['stk', 'application/hyperstudio'],\n ['stl', ['application/vnd.ms-pkistl', 'application/sla', 'application/vnd.ms-pki.stl', 'application/x-navistyle']],\n ['stm', 'text/html'],\n ['stp', 'application/step'],\n ['str', 'application/vnd.pg.format'],\n ['stw', 'application/vnd.sun.xml.writer.template'],\n ['sub', 'image/vnd.dvb.subtitle'],\n ['sus', 'application/vnd.sus-calendar'],\n ['sv4cpio', 'application/x-sv4cpio'],\n ['sv4crc', 'application/x-sv4crc'],\n ['svc', 'application/vnd.dvb.service'],\n ['svd', 'application/vnd.svd'],\n ['svf', ['image/vnd.dwg', 'image/x-dwg']],\n ['svg', 'image/svg+xml'],\n ['svr', ['x-world/x-svr', 'application/x-world']],\n ['swf', 'application/x-shockwave-flash'],\n ['swi', 'application/vnd.aristanetworks.swi'],\n ['sxc', 'application/vnd.sun.xml.calc'],\n ['sxd', 'application/vnd.sun.xml.draw'],\n ['sxg', 'application/vnd.sun.xml.writer.global'],\n ['sxi', 'application/vnd.sun.xml.impress'],\n ['sxm', 'application/vnd.sun.xml.math'],\n ['sxw', 'application/vnd.sun.xml.writer'],\n ['t', ['text/troff', 'application/x-troff']],\n ['talk', 'text/x-speech'],\n ['tao', 'application/vnd.tao.intent-module-archive'],\n ['tar', 'application/x-tar'],\n ['tbk', ['application/toolbook', 'application/x-tbook']],\n ['tcap', 'application/vnd.3gpp2.tcap'],\n ['tcl', ['text/x-script.tcl', 'application/x-tcl']],\n ['tcsh', 'text/x-script.tcsh'],\n ['teacher', 'application/vnd.smart.teacher'],\n ['tei', 'application/tei+xml'],\n ['tex', 'application/x-tex'],\n ['texi', 'application/x-texinfo'],\n ['texinfo', 'application/x-texinfo'],\n ['text', ['application/plain', 'text/plain']],\n ['tfi', 'application/thraud+xml'],\n ['tfm', 'application/x-tex-tfm'],\n ['tgz', ['application/gnutar', 'application/x-compressed']],\n ['thmx', 'application/vnd.ms-officetheme'],\n ['tif', ['image/tiff', 'image/x-tiff']],\n ['tiff', ['image/tiff', 'image/x-tiff']],\n ['tmo', 'application/vnd.tmobile-livetv'],\n ['torrent', 'application/x-bittorrent'],\n ['tpl', 'application/vnd.groove-tool-template'],\n ['tpt', 'application/vnd.trid.tpt'],\n ['tr', 'application/x-troff'],\n ['tra', 'application/vnd.trueapp'],\n ['trm', 'application/x-msterminal'],\n ['tsd', 'application/timestamped-data'],\n ['tsi', 'audio/tsp-audio'],\n ['tsp', ['application/dsptype', 'audio/tsplayer']],\n ['tsv', 'text/tab-separated-values'],\n ['ttf', 'application/x-font-ttf'],\n ['ttl', 'text/turtle'],\n ['turbot', 'image/florian'],\n ['twd', 'application/vnd.simtech-mindmapper'],\n ['txd', 'application/vnd.genomatix.tuxedo'],\n ['txf', 'application/vnd.mobius.txf'],\n ['txt', 'text/plain'],\n ['ufd', 'application/vnd.ufdl'],\n ['uil', 'text/x-uil'],\n ['uls', 'text/iuls'],\n ['umj', 'application/vnd.umajin'],\n ['uni', 'text/uri-list'],\n ['unis', 'text/uri-list'],\n ['unityweb', 'application/vnd.unity'],\n ['unv', 'application/i-deas'],\n ['uoml', 'application/vnd.uoml+xml'],\n ['uri', 'text/uri-list'],\n ['uris', 'text/uri-list'],\n ['ustar', ['application/x-ustar', 'multipart/x-ustar']],\n ['utz', 'application/vnd.uiq.theme'],\n ['uu', ['application/octet-stream', 'text/x-uuencode']],\n ['uue', 'text/x-uuencode'],\n ['uva', 'audio/vnd.dece.audio'],\n ['uvh', 'video/vnd.dece.hd'],\n ['uvi', 'image/vnd.dece.graphic'],\n ['uvm', 'video/vnd.dece.mobile'],\n ['uvp', 'video/vnd.dece.pd'],\n ['uvs', 'video/vnd.dece.sd'],\n ['uvu', 'video/vnd.uvvu.mp4'],\n ['uvv', 'video/vnd.dece.video'],\n ['vcd', 'application/x-cdlink'],\n ['vcf', 'text/x-vcard'],\n ['vcg', 'application/vnd.groove-vcard'],\n ['vcs', 'text/x-vcalendar'],\n ['vcx', 'application/vnd.vcx'],\n ['vda', 'application/vda'],\n ['vdo', 'video/vdo'],\n ['vew', 'application/groupwise'],\n ['vis', 'application/vnd.visionary'],\n ['viv', ['video/vivo', 'video/vnd.vivo']],\n ['vivo', ['video/vivo', 'video/vnd.vivo']],\n ['vmd', 'application/vocaltec-media-desc'],\n ['vmf', 'application/vocaltec-media-file'],\n ['voc', ['audio/voc', 'audio/x-voc']],\n ['vos', 'video/vosaic'],\n ['vox', 'audio/voxware'],\n ['vqe', 'audio/x-twinvq-plugin'],\n ['vqf', 'audio/x-twinvq'],\n ['vql', 'audio/x-twinvq-plugin'],\n ['vrml', ['model/vrml', 'x-world/x-vrml', 'application/x-vrml']],\n ['vrt', 'x-world/x-vrt'],\n ['vsd', ['application/vnd.visio', 'application/x-visio']],\n ['vsf', 'application/vnd.vsf'],\n ['vst', 'application/x-visio'],\n ['vsw', 'application/x-visio'],\n ['vtu', 'model/vnd.vtu'],\n ['vxml', 'application/voicexml+xml'],\n ['w60', 'application/wordperfect6.0'],\n ['w61', 'application/wordperfect6.1'],\n ['w6w', 'application/msword'],\n ['wad', 'application/x-doom'],\n ['wav', ['audio/wav', 'audio/x-wav']],\n ['wax', 'audio/x-ms-wax'],\n ['wb1', 'application/x-qpro'],\n ['wbmp', 'image/vnd.wap.wbmp'],\n ['wbs', 'application/vnd.criticaltools.wbs+xml'],\n ['wbxml', 'application/vnd.wap.wbxml'],\n ['wcm', 'application/vnd.ms-works'],\n ['wdb', 'application/vnd.ms-works'],\n ['web', 'application/vnd.xara'],\n ['weba', 'audio/webm'],\n ['webm', 'video/webm'],\n ['webp', 'image/webp'],\n ['wg', 'application/vnd.pmi.widget'],\n ['wgt', 'application/widget'],\n ['wiz', 'application/msword'],\n ['wk1', 'application/x-123'],\n ['wks', 'application/vnd.ms-works'],\n ['wm', 'video/x-ms-wm'],\n ['wma', 'audio/x-ms-wma'],\n ['wmd', 'application/x-ms-wmd'],\n ['wmf', ['windows/metafile', 'application/x-msmetafile']],\n ['wml', 'text/vnd.wap.wml'],\n ['wmlc', 'application/vnd.wap.wmlc'],\n ['wmls', 'text/vnd.wap.wmlscript'],\n ['wmlsc', 'application/vnd.wap.wmlscriptc'],\n ['wmv', 'video/x-ms-wmv'],\n ['wmx', 'video/x-ms-wmx'],\n ['wmz', 'application/x-ms-wmz'],\n ['woff', 'application/x-font-woff'],\n ['word', 'application/msword'],\n ['wp', 'application/wordperfect'],\n ['wp5', ['application/wordperfect', 'application/wordperfect6.0']],\n ['wp6', 'application/wordperfect'],\n ['wpd', ['application/wordperfect', 'application/vnd.wordperfect', 'application/x-wpwin']],\n ['wpl', 'application/vnd.ms-wpl'],\n ['wps', 'application/vnd.ms-works'],\n ['wq1', 'application/x-lotus'],\n ['wqd', 'application/vnd.wqd'],\n ['wri', ['application/mswrite', 'application/x-wri', 'application/x-mswrite']],\n ['wrl', ['model/vrml', 'x-world/x-vrml', 'application/x-world']],\n ['wrz', ['model/vrml', 'x-world/x-vrml']],\n ['wsc', 'text/scriplet'],\n ['wsdl', 'application/wsdl+xml'],\n ['wspolicy', 'application/wspolicy+xml'],\n ['wsrc', 'application/x-wais-source'],\n ['wtb', 'application/vnd.webturbo'],\n ['wtk', 'application/x-wintalk'],\n ['wvx', 'video/x-ms-wvx'],\n ['x-png', 'image/png'],\n ['x3d', 'application/vnd.hzn-3d-crossword'],\n ['xaf', 'x-world/x-vrml'],\n ['xap', 'application/x-silverlight-app'],\n ['xar', 'application/vnd.xara'],\n ['xbap', 'application/x-ms-xbap'],\n ['xbd', 'application/vnd.fujixerox.docuworks.binder'],\n ['xbm', ['image/xbm', 'image/x-xbm', 'image/x-xbitmap']],\n ['xdf', 'application/xcap-diff+xml'],\n ['xdm', 'application/vnd.syncml.dm+xml'],\n ['xdp', 'application/vnd.adobe.xdp+xml'],\n ['xdr', 'video/x-amt-demorun'],\n ['xdssc', 'application/dssc+xml'],\n ['xdw', 'application/vnd.fujixerox.docuworks'],\n ['xenc', 'application/xenc+xml'],\n ['xer', 'application/patch-ops-error+xml'],\n ['xfdf', 'application/vnd.adobe.xfdf'],\n ['xfdl', 'application/vnd.xfdl'],\n ['xgz', 'xgl/drawing'],\n ['xhtml', 'application/xhtml+xml'],\n ['xif', 'image/vnd.xiff'],\n ['xl', 'application/excel'],\n ['xla', ['application/vnd.ms-excel', 'application/excel', 'application/x-msexcel', 'application/x-excel']],\n ['xlam', 'application/vnd.ms-excel.addin.macroenabled.12'],\n ['xlb', ['application/excel', 'application/vnd.ms-excel', 'application/x-excel']],\n ['xlc', ['application/vnd.ms-excel', 'application/excel', 'application/x-excel']],\n ['xld', ['application/excel', 'application/x-excel']],\n ['xlk', ['application/excel', 'application/x-excel']],\n ['xll', ['application/excel', 'application/vnd.ms-excel', 'application/x-excel']],\n ['xlm', ['application/vnd.ms-excel', 'application/excel', 'application/x-excel']],\n ['xls', ['application/vnd.ms-excel', 'application/excel', 'application/x-msexcel', 'application/x-excel']],\n ['xlsb', 'application/vnd.ms-excel.sheet.binary.macroenabled.12'],\n ['xlsm', 'application/vnd.ms-excel.sheet.macroenabled.12'],\n ['xlsx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],\n ['xlt', ['application/vnd.ms-excel', 'application/excel', 'application/x-excel']],\n ['xltm', 'application/vnd.ms-excel.template.macroenabled.12'],\n ['xltx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.template'],\n ['xlv', ['application/excel', 'application/x-excel']],\n ['xlw', ['application/vnd.ms-excel', 'application/excel', 'application/x-msexcel', 'application/x-excel']],\n ['xm', 'audio/xm'],\n ['xml', ['application/xml', 'text/xml', 'application/atom+xml', 'application/rss+xml']],\n ['xmz', 'xgl/movie'],\n ['xo', 'application/vnd.olpc-sugar'],\n ['xof', 'x-world/x-vrml'],\n ['xop', 'application/xop+xml'],\n ['xpi', 'application/x-xpinstall'],\n ['xpix', 'application/x-vnd.ls-xpix'],\n ['xpm', ['image/xpm', 'image/x-xpixmap']],\n ['xpr', 'application/vnd.is-xpr'],\n ['xps', 'application/vnd.ms-xpsdocument'],\n ['xpw', 'application/vnd.intercon.formnet'],\n ['xslt', 'application/xslt+xml'],\n ['xsm', 'application/vnd.syncml+xml'],\n ['xspf', 'application/xspf+xml'],\n ['xsr', 'video/x-amt-showrun'],\n ['xul', 'application/vnd.mozilla.xul+xml'],\n ['xwd', ['image/x-xwd', 'image/x-xwindowdump']],\n ['xyz', ['chemical/x-xyz', 'chemical/x-pdb']],\n ['yang', 'application/yang'],\n ['yin', 'application/yin+xml'],\n ['z', ['application/x-compressed', 'application/x-compress']],\n ['zaz', 'application/vnd.zzazz.deck+xml'],\n ['zip', ['application/zip', 'multipart/x-zip', 'application/x-zip-compressed', 'application/x-compressed']],\n ['zir', 'application/vnd.zul'],\n ['zmm', 'application/vnd.handheld-entertainment+xml'],\n ['zoo', 'application/octet-stream'],\n ['zsh', 'text/x-script.zsh']\n]);\n\nmodule.exports = {\n detectMimeType(filename) {\n if (!filename) {\n return defaultMimeType;\n }\n\n const parsed = path.parse(filename);\n const extension = (parsed.ext.substr(1) || parsed.name || '').split('?').shift().trim().toLowerCase();\n const value = extensions.has(extension) ? extensions.get(extension) : defaultMimeType;\n\n if (Array.isArray(value)) {\n return value[0];\n }\n return value;\n },\n\n detectExtension(mimeType) {\n if (!mimeType) {\n return defaultExtension;\n }\n const parts = (mimeType || '').toLowerCase().trim().split('/');\n const rootType = parts.shift().trim();\n const subType = parts.join('/').trim();\n\n if (mimeTypes.has(rootType + '/' + subType)) {\n const value = mimeTypes.get(rootType + '/' + subType);\n if (Array.isArray(value)) {\n return value[0];\n }\n return value;\n }\n\n switch (rootType) {\n case 'text':\n return 'txt';\n default:\n return 'bin';\n }\n }\n};\n","/*\n\nCopied from https://github.com/mathiasbynens/punycode.js/blob/ef3505c8abb5143a00d53ce59077c9f7f4b2ac47/punycode.js\n\nCopyright Mathias Bynens <https://mathiasbynens.be/>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n*/\n/* eslint callback-return: 0, no-bitwise: 0, eqeqeq: 0, prefer-arrow-callback: 0, object-shorthand: 0 */\n\n'use strict';\n\n/** Highest positive signed 32-bit float value */\nconst maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\n/** Bootstring parameters */\nconst base = 36;\nconst tMin = 1;\nconst tMax = 26;\nconst skew = 38;\nconst damp = 700;\nconst initialBias = 72;\nconst initialN = 128; // 0x80\nconst delimiter = '-'; // '\\x2D'\n\n/** Regular expressions */\nconst regexPunycode = /^xn--/;\nconst regexNonASCII = /[^\\0-\\x7F]/; // Note: U+007F DEL is excluded too.\nconst regexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\n/** Error messages */\nconst errors = {\n overflow: 'Overflow: input needs wider integers to process',\n 'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n 'invalid-input': 'Invalid input'\n};\n\n/** Convenience shortcuts */\nconst baseMinusTMin = base - tMin;\nconst floor = Math.floor;\nconst stringFromCharCode = String.fromCharCode;\n\n/*--------------------------------------------------------------------------*/\n\n/**\n * A generic error utility function.\n * @private\n * @param {String} type The error type.\n * @returns {Error} Throws a `RangeError` with the applicable error message.\n */\nfunction error(type) {\n throw new RangeError(errors[type]);\n}\n\n/**\n * A generic `Array#map` utility function.\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} callback The function that gets called for every array\n * item.\n * @returns {Array} A new array of values returned by the callback function.\n */\nfunction map(array, callback) {\n const result = [];\n let length = array.length;\n while (length--) {\n result[length] = callback(array[length]);\n }\n return result;\n}\n\n/**\n * A simple `Array#map`-like wrapper to work with domain name strings or email\n * addresses.\n * @private\n * @param {String} domain The domain name or email address.\n * @param {Function} callback The function that gets called for every\n * character.\n * @returns {String} A new string of characters returned by the callback\n * function.\n */\nfunction mapDomain(domain, callback) {\n const parts = domain.split('@');\n let result = '';\n if (parts.length > 1) {\n // In email addresses, only the domain name should be punycoded. Leave\n // the local part (i.e. everything up to `@`) intact.\n result = parts[0] + '@';\n domain = parts[1];\n }\n // Avoid `split(regex)` for IE8 compatibility. See #17.\n domain = domain.replace(regexSeparators, '\\x2E');\n const labels = domain.split('.');\n const encoded = map(labels, callback).join('.');\n return result + encoded;\n}\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n * @see `punycode.ucs2.encode`\n * @see <https://mathiasbynens.be/notes/javascript-encoding>\n * @memberOf punycode.ucs2\n * @name decode\n * @param {String} string The Unicode input string (UCS-2).\n * @returns {Array} The new array of code points.\n */\nfunction ucs2decode(string) {\n const output = [];\n let counter = 0;\n const length = string.length;\n while (counter < length) {\n const value = string.charCodeAt(counter++);\n if (value >= 0xd800 && value <= 0xdbff && counter < length) {\n // It's a high surrogate, and there is a next character.\n const extra = string.charCodeAt(counter++);\n if ((extra & 0xfc00) == 0xdc00) {\n // Low surrogate.\n output.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n}\n\n/**\n * Creates a string based on an array of numeric code points.\n * @see `punycode.ucs2.decode`\n * @memberOf punycode.ucs2\n * @name encode\n * @param {Array} codePoints The array of numeric code points.\n * @returns {String} The new Unicode string (UCS-2).\n */\nconst ucs2encode = codePoints => String.fromCodePoint(...codePoints);\n\n/**\n * Converts a basic code point into a digit/integer.\n * @see `digitToBasic()`\n * @private\n * @param {Number} codePoint The basic numeric code point value.\n * @returns {Number} The numeric value of a basic code point (for use in\n * representing integers) in the range `0` to `base - 1`, or `base` if\n * the code point does not represent a value.\n */\nconst basicToDigit = function (codePoint) {\n if (codePoint >= 0x30 && codePoint < 0x3a) {\n return 26 + (codePoint - 0x30);\n }\n if (codePoint >= 0x41 && codePoint < 0x5b) {\n return codePoint - 0x41;\n }\n if (codePoint >= 0x61 && codePoint < 0x7b) {\n return codePoint - 0x61;\n }\n return base;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n * @see `basicToDigit()`\n * @private\n * @param {Number} digit The numeric value of a basic code point.\n * @returns {Number} The basic code point whose value (when used for\n * representing integers) is `digit`, which needs to be in the range\n * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n * used; else, the lowercase form is used. The behavior is undefined\n * if `flag` is non-zero and `digit` has no uppercase form.\n */\nconst digitToBasic = function (digit, flag) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n * @private\n */\nconst adapt = function (delta, numPoints, firstTime) {\n let k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n for (; /* no initialization */ delta > (baseMinusTMin * tMax) >> 1; k += base) {\n delta = floor(delta / baseMinusTMin);\n }\n return floor(k + ((baseMinusTMin + 1) * delta) / (delta + skew));\n};\n\n/**\n * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n * symbols.\n * @memberOf punycode\n * @param {String} input The Punycode string of ASCII-only symbols.\n * @returns {String} The resulting string of Unicode symbols.\n */\nconst decode = function (input) {\n // Don't use UCS-2.\n const output = [];\n const inputLength = input.length;\n let i = 0;\n let n = initialN;\n let bias = initialBias;\n\n // Handle the basic code points: let `basic` be the number of input code\n // points before the last delimiter, or `0` if there is none, then copy\n // the first basic code points to the output.\n\n let basic = input.lastIndexOf(delimiter);\n if (basic < 0) {\n basic = 0;\n }\n\n for (let j = 0; j < basic; ++j) {\n // if it's not a basic code point\n if (input.charCodeAt(j) >= 0x80) {\n error('not-basic');\n }\n output.push(input.charCodeAt(j));\n }\n\n // Main decoding loop: start just after the last delimiter if any basic code\n // points were copied; start at the beginning otherwise.\n\n for (let index = basic > 0 ? basic + 1 : 0; index < inputLength /* no final expression */; ) {\n // `index` is the index of the next character to be consumed.\n // Decode a generalized variable-length integer into `delta`,\n // which gets added to `i`. The overflow checking is easier\n // if we increase `i` as we go, then subtract off its starting\n // value at the end to obtain `delta`.\n const oldi = i;\n for (let w = 1, k = base /* no condition */; ; k += base) {\n if (index >= inputLength) {\n error('invalid-input');\n }\n\n const digit = basicToDigit(input.charCodeAt(index++));\n\n if (digit >= base) {\n error('invalid-input');\n }\n if (digit > floor((maxInt - i) / w)) {\n error('overflow');\n }\n\n i += digit * w;\n const t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n\n if (digit < t) {\n break;\n }\n\n const baseMinusT = base - t;\n if (w > floor(maxInt / baseMinusT)) {\n error('overflow');\n }\n\n w *= baseMinusT;\n }\n\n const out = output.length + 1;\n bias = adapt(i - oldi, out, oldi == 0);\n\n // `i` was supposed to wrap around from `out` to `0`,\n // incrementing `n` each time, so we'll fix that now:\n if (floor(i / out) > maxInt - n) {\n error('overflow');\n }\n\n n += floor(i / out);\n i %= out;\n\n // Insert `n` at position `i` of the output.\n output.splice(i++, 0, n);\n }\n\n return String.fromCodePoint(...output);\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n * @memberOf punycode\n * @param {String} input The string of Unicode symbols.\n * @returns {String} The resulting Punycode string of ASCII-only symbols.\n */\nconst encode = function (input) {\n const output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n const inputLength = input.length;\n\n // Initialize the state.\n let n = initialN;\n let delta = 0;\n let bias = initialBias;\n\n // Handle the basic code points.\n for (const currentValue of input) {\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n\n const basicLength = output.length;\n let handledCPCount = basicLength;\n\n // `handledCPCount` is the number of code points that have been handled;\n // `basicLength` is the number of basic code points.\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next\n // larger one:\n let m = maxInt;\n for (const currentValue of input) {\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n // but guard against overflow.\n const handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n error('overflow');\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (const currentValue of input) {\n if (currentValue < n && ++delta > maxInt) {\n error('overflow');\n }\n if (currentValue === n) {\n // Represent delta as a generalized variable-length integer.\n let q = delta;\n for (let k = base /* no condition */; ; k += base) {\n const t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;\n if (q < t) {\n break;\n }\n const qMinusT = q - t;\n const baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + (qMinusT % baseMinusT), 0)));\n q = floor(qMinusT / baseMinusT);\n }\n\n output.push(stringFromCharCode(digitToBasic(q, 0)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount === basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n\n ++delta;\n ++n;\n }\n return output.join('');\n};\n\n/**\n * Converts a Punycode string representing a domain name or an email address\n * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n * it doesn't matter if you call it on a string that has already been\n * converted to Unicode.\n * @memberOf punycode\n * @param {String} input The Punycoded domain name or email address to\n * convert to Unicode.\n * @returns {String} The Unicode representation of the given Punycode\n * string.\n */\nconst toUnicode = function (input) {\n return mapDomain(input, function (string) {\n return regexPunycode.test(string) ? decode(string.slice(4).toLowerCase()) : string;\n });\n};\n\n/**\n * Converts a Unicode string representing a domain name or an email address to\n * Punycode. Only the non-ASCII parts of the domain name will be converted,\n * i.e. it doesn't matter if you call it with a domain that's already in\n * ASCII.\n * @memberOf punycode\n * @param {String} input The domain name or email address to convert, as a\n * Unicode string.\n * @returns {String} The Punycode representation of the given domain name or\n * email address.\n */\nconst toASCII = function (input) {\n return mapDomain(input, function (string) {\n return regexNonASCII.test(string) ? 'xn--' + encode(string) : string;\n });\n};\n\n/*--------------------------------------------------------------------------*/\n\n/** Define the public API */\nconst punycode = {\n /**\n * A string representing the current Punycode.js version number.\n * @memberOf punycode\n * @type String\n */\n version: '2.3.1',\n /**\n * An object of methods to convert from JavaScript's internal character\n * representation (UCS-2) to Unicode code points, and back.\n * @see <https://mathiasbynens.be/notes/javascript-encoding>\n * @memberOf punycode\n * @type Object\n */\n ucs2: {\n decode: ucs2decode,\n encode: ucs2encode\n },\n decode: decode,\n encode: encode,\n toASCII: toASCII,\n toUnicode: toUnicode\n};\n\nmodule.exports = punycode;\n","'use strict';\n\nconst { Transform } = require('stream');\n\n/**\n * Encodes a Buffer into a base64 encoded string\n *\n * @param {Buffer} buffer Buffer to convert\n * @returns {String} base64 encoded string\n */\nfunction encode(buffer) {\n if (typeof buffer === 'string') {\n buffer = Buffer.from(buffer, 'utf-8');\n }\n\n return buffer.toString('base64');\n}\n\n/**\n * Adds soft line breaks to a base64 string\n *\n * @param {String} str base64 encoded string that might need line wrapping\n * @param {Number} [lineLength=76] Maximum allowed length for a line\n * @returns {String} Soft-wrapped base64 encoded string\n */\nfunction wrap(str, lineLength) {\n str = (str || '').toString();\n lineLength = lineLength || 76;\n\n if (str.length <= lineLength) {\n return str;\n }\n\n const result = [];\n let pos = 0;\n const chunkLength = lineLength * 1024;\n const wrapRegex = new RegExp('.{' + lineLength + '}', 'g');\n while (pos < str.length) {\n const wrappedLines = str.substr(pos, chunkLength).replace(wrapRegex, '$&\\r\\n').trim();\n result.push(wrappedLines);\n pos += chunkLength;\n }\n\n return result.join('\\r\\n').trim();\n}\n\n/**\n * Creates a transform stream for encoding data to base64 encoding\n *\n * @constructor\n * @param {Object} options Stream options\n * @param {Number} [options.lineLength=76] Maximum length for lines, set to false to disable wrapping\n */\nclass Encoder extends Transform {\n constructor(options) {\n super();\n this.options = options || {};\n\n if (this.options.lineLength !== false) {\n this.options.lineLength = this.options.lineLength || 76;\n }\n\n this._curLine = '';\n this._remainingBytes = false;\n\n this.inputBytes = 0;\n this.outputBytes = 0;\n }\n\n _transform(chunk, encoding, done) {\n if (encoding !== 'buffer') {\n chunk = Buffer.from(chunk, encoding);\n }\n\n if (!chunk || !chunk.length) {\n return setImmediate(done);\n }\n\n this.inputBytes += chunk.length;\n\n if (this._remainingBytes && this._remainingBytes.length) {\n chunk = Buffer.concat([this._remainingBytes, chunk], this._remainingBytes.length + chunk.length);\n this._remainingBytes = false;\n }\n\n if (chunk.length % 3) {\n this._remainingBytes = chunk.slice(chunk.length - (chunk.length % 3));\n chunk = chunk.slice(0, chunk.length - (chunk.length % 3));\n } else {\n this._remainingBytes = false;\n }\n\n let b64 = this._curLine + encode(chunk);\n\n if (this.options.lineLength) {\n b64 = wrap(b64, this.options.lineLength);\n\n // remove last line as it is still most probably incomplete\n const lastLF = b64.lastIndexOf('\\n');\n if (lastLF < 0) {\n this._curLine = b64;\n b64 = '';\n } else if (lastLF === b64.length - 1) {\n this._curLine = '';\n } else {\n this._curLine = b64.substring(lastLF + 1);\n b64 = b64.substring(0, lastLF + 1);\n }\n }\n\n if (b64) {\n this.outputBytes += b64.length;\n this.push(Buffer.from(b64, 'ascii'));\n }\n\n setImmediate(done);\n }\n\n _flush(done) {\n if (this._remainingBytes && this._remainingBytes.length) {\n this._curLine += encode(this._remainingBytes);\n }\n\n if (this._curLine) {\n this._curLine = wrap(this._curLine, this.options.lineLength);\n this.outputBytes += this._curLine.length;\n this.push(Buffer.from(this._curLine, 'ascii'));\n this._curLine = '';\n }\n done();\n }\n}\n\nmodule.exports = {\n encode,\n wrap,\n Encoder\n};\n","'use strict';\n\nconst { Transform } = require('stream');\n\n/**\n * Encodes a Buffer into a Quoted-Printable encoded string\n *\n * @param {Buffer} buffer Buffer to convert\n * @returns {String} Quoted-Printable encoded string\n */\n// usable characters that do not need encoding\n// https://tools.ietf.org/html/rfc2045#section-6.7\nconst QP_RANGES = [\n [0x09], // <TAB>\n [0x0a], // <LF>\n [0x0d], // <CR>\n [0x20, 0x3c], // <SP>!\"#$%&'()*+,-./0123456789:;\n [0x3e, 0x7e] // >?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}\n];\n\nfunction encode(buffer) {\n if (typeof buffer === 'string') {\n buffer = Buffer.from(buffer, 'utf-8');\n }\n\n let result = '';\n let ord;\n\n for (let i = 0, len = buffer.length; i < len; i++) {\n ord = buffer[i];\n // if the char is in allowed range, then keep as is, unless it is a WS in the end of a line\n if (\n checkRanges(ord, QP_RANGES) &&\n !((ord === 0x20 || ord === 0x09) && (i === len - 1 || buffer[i + 1] === 0x0a || buffer[i + 1] === 0x0d))\n ) {\n result += String.fromCharCode(ord);\n continue;\n }\n result += '=' + (ord < 0x10 ? '0' : '') + ord.toString(16).toUpperCase();\n }\n\n return result;\n}\n\n/**\n * Adds soft line breaks to a Quoted-Printable string\n *\n * @param {String} str Quoted-Printable encoded string that might need line wrapping\n * @param {Number} [lineLength=76] Maximum allowed length for a line\n * @returns {String} Soft-wrapped Quoted-Printable encoded string\n */\nfunction wrap(str, lineLength) {\n str = (str || '').toString();\n lineLength = lineLength || 76;\n\n if (str.length <= lineLength) {\n return str;\n }\n\n let pos = 0;\n const len = str.length;\n let match, code, line;\n const lineMargin = Math.floor(lineLength / 3);\n let result = '';\n\n // insert soft linebreaks where needed\n while (pos < len) {\n line = str.substr(pos, lineLength);\n if ((match = line.match(/\\r\\n/))) {\n line = line.substr(0, match.index + match[0].length);\n result += line;\n pos += line.length;\n continue;\n }\n\n if (line.substr(-1) === '\\n') {\n result += line;\n pos += line.length;\n continue;\n }\n\n if ((match = line.substr(-lineMargin).match(/\\n.*?$/))) {\n // truncate to nearest line break\n line = line.substr(0, line.length - (match[0].length - 1));\n result += line;\n pos += line.length;\n continue;\n }\n\n if (line.length > lineLength - lineMargin && (match = line.substr(-lineMargin).match(/[ \\t.,!?][^ \\t.,!?]*$/))) {\n // truncate to nearest space\n line = line.substr(0, line.length - (match[0].length - 1));\n } else if (line.match(/[=][\\da-f]{0,2}$/i)) {\n // push incomplete encoding sequences to the next line\n if ((match = line.match(/[=][\\da-f]{0,1}$/i))) {\n line = line.substr(0, line.length - match[0].length);\n }\n\n // ensure that utf-8 sequences are not split\n while (\n line.length > 3 &&\n line.length < len - pos &&\n !line.match(/^(?:=[\\da-f]{2}){1,4}$/i) &&\n (match = line.match(/[=][\\da-f]{2}$/gi))\n ) {\n code = parseInt(match[0].substr(1, 2), 16);\n if (code < 128) {\n break;\n }\n\n line = line.substr(0, line.length - 3);\n\n if (code >= 0xc0) {\n break;\n }\n }\n }\n\n if (pos + line.length < len && line.substr(-1) !== '\\n') {\n if (line.length === lineLength && line.match(/[=][\\da-f]{2}$/i)) {\n line = line.substr(0, line.length - 3);\n } else if (line.length === lineLength) {\n line = line.substr(0, line.length - 1);\n }\n pos += line.length;\n line += '=\\r\\n';\n } else {\n pos += line.length;\n }\n\n result += line;\n }\n\n return result;\n}\n\n/**\n * Helper function to check if a number is inside provided ranges\n *\n * @param {Number} nr Number to check for\n * @param {Array} ranges An Array of allowed values\n * @returns {Boolean} True if the value was found inside allowed ranges, false otherwise\n */\nfunction checkRanges(nr, ranges) {\n for (let i = ranges.length - 1; i >= 0; i--) {\n const range = ranges[i];\n if (!range.length) {\n continue;\n }\n if (range.length === 1 && nr === range[0]) {\n return true;\n }\n if (range.length === 2 && nr >= range[0] && nr <= range[1]) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Creates a transform stream for encoding data to Quoted-Printable encoding\n *\n * @constructor\n * @param {Object} options Stream options\n * @param {Number} [options.lineLength=76] Maximum length for lines, set to false to disable wrapping\n */\nclass Encoder extends Transform {\n constructor(options) {\n super();\n\n this.options = options || {};\n\n if (this.options.lineLength !== false) {\n this.options.lineLength = this.options.lineLength || 76;\n }\n\n this._curLine = '';\n\n this.inputBytes = 0;\n this.outputBytes = 0;\n }\n\n _transform(chunk, encoding, done) {\n let qp;\n\n if (encoding !== 'buffer') {\n chunk = Buffer.from(chunk, encoding);\n }\n\n if (!chunk || !chunk.length) {\n return done();\n }\n\n this.inputBytes += chunk.length;\n\n if (this.options.lineLength) {\n qp = this._curLine + encode(chunk);\n qp = wrap(qp, this.options.lineLength);\n qp = qp.replace(/(^|\\n)([^\\n]*)$/, (match, lineBreak, lastLine) => {\n this._curLine = lastLine;\n return lineBreak;\n });\n\n if (qp) {\n this.outputBytes += qp.length;\n this.push(qp);\n }\n } else {\n qp = encode(chunk);\n this.outputBytes += qp.length;\n this.push(qp, 'ascii');\n }\n\n done();\n }\n\n _flush(done) {\n if (this._curLine) {\n this.outputBytes += this._curLine.length;\n this.push(this._curLine, 'ascii');\n }\n done();\n }\n}\n\nmodule.exports = {\n encode,\n wrap,\n Encoder\n};\n","/* eslint no-control-regex:0 */\n\n'use strict';\n\nconst base64 = require('../base64');\nconst qp = require('../qp');\nconst mimeTypes = require('./mime-types');\n\nmodule.exports = {\n /**\n * Checks if a value is plaintext string (uses only printable 7bit chars)\n *\n * @param {String} value String to be tested\n * @returns {Boolean} true if it is a plaintext string\n */\n isPlainText(value, isParam) {\n const re = isParam ? /[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\"\\u0080-\\uFFFF]/ : /[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\u0080-\\uFFFF]/;\n return typeof value === 'string' && !re.test(value);\n },\n\n /**\n * Checks if a multi line string containes lines longer than the selected value.\n *\n * Useful when detecting if a mail message needs any processing at all –\n * if only plaintext characters are used and lines are short, then there is\n * no need to encode the values in any way. If the value is plaintext but has\n * longer lines then allowed, then use format=flowed\n *\n * @param {Number} lineLength Max line length to check for\n * @returns {Boolean} Returns true if there is at least one line longer than lineLength chars\n */\n hasLongerLines(str, lineLength) {\n if (str.length > 128 * 1024) {\n // do not test strings longer than 128kB\n return true;\n }\n return new RegExp('^.{' + (lineLength + 1) + ',}', 'm').test(str);\n },\n\n /**\n * Encodes a string or an Buffer to an UTF-8 MIME Word (rfc2047)\n *\n * @param {String|Buffer} data String to be encoded\n * @param {String} mimeWordEncoding='Q' Encoding for the mime word, either Q or B\n * @param {Number} [maxLength=0] If set, split mime words into several chunks if needed\n * @return {String} Single or several mime words joined together\n */\n encodeWord(data, mimeWordEncoding, maxLength) {\n mimeWordEncoding = (mimeWordEncoding || 'Q').toString().toUpperCase().trim().charAt(0);\n maxLength = maxLength || 0;\n\n let encodedStr;\n const toCharset = 'UTF-8';\n\n if (maxLength && maxLength > 7 + toCharset.length) {\n maxLength -= 7 + toCharset.length;\n }\n\n if (mimeWordEncoding === 'Q') {\n // https://tools.ietf.org/html/rfc2047#section-5 rule (3)\n encodedStr = qp.encode(data).replace(/[^a-z0-9!*+\\-/=]/gi, chr => {\n const ord = chr.charCodeAt(0).toString(16).toUpperCase();\n if (chr === ' ') {\n return '_';\n }\n return '=' + (ord.length === 1 ? '0' + ord : ord);\n });\n } else if (mimeWordEncoding === 'B') {\n encodedStr = typeof data === 'string' ? data : base64.encode(data);\n maxLength = maxLength ? Math.max(3, ((maxLength - (maxLength % 4)) / 4) * 3) : 0;\n }\n\n if (maxLength && (mimeWordEncoding !== 'B' ? encodedStr : base64.encode(data)).length > maxLength) {\n if (mimeWordEncoding === 'Q') {\n encodedStr = this.splitMimeEncodedString(encodedStr, maxLength).join('?= =?' + toCharset + '?' + mimeWordEncoding + '?');\n } else {\n // RFC2047 6.3 (2) states that encoded-word must include an integral number of characters, so no chopping unicode sequences\n const parts = [];\n let lpart = '';\n for (let i = 0, len = encodedStr.length; i < len; i++) {\n let chr = encodedStr.charAt(i);\n\n if (/[\\ud83c\\ud83d\\ud83e]/.test(chr) && i < len - 1) {\n // composite emoji byte, so add the next byte as well\n chr += encodedStr.charAt(++i);\n }\n\n // check if we can add this character to the existing string\n // without breaking byte length limit\n if (Buffer.byteLength(lpart + chr) <= maxLength || i === 0) {\n lpart += chr;\n } else {\n // we hit the length limit, so push the existing string and start over\n parts.push(base64.encode(lpart));\n lpart = chr;\n }\n }\n if (lpart) {\n parts.push(base64.encode(lpart));\n }\n\n if (parts.length > 1) {\n encodedStr = parts.join('?= =?' + toCharset + '?' + mimeWordEncoding + '?');\n } else {\n encodedStr = parts.join('');\n }\n }\n } else if (mimeWordEncoding === 'B') {\n encodedStr = base64.encode(data);\n }\n\n return '=?' + toCharset + '?' + mimeWordEncoding + '?' + encodedStr + (encodedStr.substr(-2) === '?=' ? '' : '?=');\n },\n\n /**\n * Finds word sequences with non ascii text and converts these to mime words\n *\n * @param {String} value String to be encoded\n * @param {String} mimeWordEncoding='Q' Encoding for the mime word, either Q or B\n * @param {Number} [maxLength=0] If set, split mime words into several chunks if needed\n * @param {Boolean} [encodeAll=false] If true and the value needs encoding then encodes entire string, not just the smallest match\n * @return {String} String with possible mime words\n */\n encodeWords(value, mimeWordEncoding, maxLength, encodeAll) {\n maxLength = maxLength || 0;\n\n // find first word with a non-printable ascii or special symbol in it\n const firstMatch = value.match(/(?:^|\\s)([^\\s]*[\"\\u0080-\\uFFFF])/);\n if (!firstMatch) {\n return value;\n }\n\n if (encodeAll) {\n // if it is requested to encode everything or the string contains something that resebles encoded word, then encode everything\n return this.encodeWord(value, mimeWordEncoding, maxLength);\n }\n\n // find the last word with a non-printable ascii in it\n const lastMatch = value.match(/([\"\\u0080-\\uFFFF][^\\s]*)[^\"\\u0080-\\uFFFF]*$/);\n if (!lastMatch) {\n // should not happen\n return value;\n }\n\n const startIndex =\n firstMatch.index +\n (\n firstMatch[0].match(/[^\\s]/) || {\n index: 0\n }\n ).index;\n const endIndex = lastMatch.index + (lastMatch[1] || '').length;\n\n return (\n (startIndex ? value.substr(0, startIndex) : '') +\n this.encodeWord(value.substring(startIndex, endIndex), mimeWordEncoding || 'Q', maxLength) +\n (endIndex < value.length ? value.substr(endIndex) : '')\n );\n },\n\n /**\n * Joins parsed header value together as 'value; param1=value1; param2=value2'\n * PS: We are following RFC 822 for the list of special characters that we need to keep in quotes.\n * Refer: https://www.w3.org/Protocols/rfc1341/4_Content-Type.html\n * @param {Object} structured Parsed header value\n * @return {String} joined header value\n */\n buildHeaderValue(structured) {\n const paramsArray = [];\n\n Object.keys(structured.params || {}).forEach(param => {\n // filename might include unicode characters so it is a special case\n // other values probably do not\n const value = structured.params[param];\n if (!this.isPlainText(value, true) || value.length >= 75) {\n this.buildHeaderParam(param, value, 50).forEach(encodedParam => {\n if (!/[\\s\"\\\\;:/=(),<>@[\\]?]|^[-']|'$/.test(encodedParam.value) || encodedParam.key.substr(-1) === '*') {\n paramsArray.push(encodedParam.key + '=' + encodedParam.value);\n } else {\n paramsArray.push(encodedParam.key + '=' + JSON.stringify(encodedParam.value));\n }\n });\n } else if (/[\\s'\"\\\\;:/=(),<>@[\\]?]|^-/.test(value)) {\n paramsArray.push(param + '=' + JSON.stringify(value));\n } else {\n paramsArray.push(param + '=' + value);\n }\n });\n\n return structured.value + (paramsArray.length ? '; ' + paramsArray.join('; ') : '');\n },\n\n /**\n * Encodes a string or an Buffer to an UTF-8 Parameter Value Continuation encoding (rfc2231)\n * Useful for splitting long parameter values.\n *\n * For example\n * title=\"unicode string\"\n * becomes\n * title*0*=utf-8''unicode\n * title*1*=%20string\n *\n * @param {String|Buffer} data String to be encoded\n * @param {Number} [maxLength=50] Max length for generated chunks\n * @param {String} [fromCharset='UTF-8'] Source sharacter set\n * @return {Array} A list of encoded keys and headers\n */\n buildHeaderParam(key, data, maxLength) {\n const list = [];\n let encodedStr = typeof data === 'string' ? data : (data || '').toString();\n let chr, ord;\n let line;\n let startPos = 0;\n let i, len;\n\n maxLength = maxLength || 50;\n\n // process ascii only text\n if (this.isPlainText(data, true)) {\n // check if conversion is even needed\n if (encodedStr.length <= maxLength) {\n return [\n {\n key,\n value: encodedStr\n }\n ];\n }\n\n encodedStr = encodedStr.replace(new RegExp('.{' + maxLength + '}', 'g'), str => {\n list.push({\n line: str\n });\n return '';\n });\n\n if (encodedStr) {\n list.push({\n line: encodedStr\n });\n }\n } else {\n if (/[\\uD800-\\uDBFF]/.test(encodedStr)) {\n // string containts surrogate pairs, so normalize it to an array of bytes\n const encodedStrArr = [];\n for (i = 0, len = encodedStr.length; i < len; i++) {\n chr = encodedStr.charAt(i);\n ord = chr.charCodeAt(0);\n if (ord >= 0xd800 && ord <= 0xdbff && i < len - 1) {\n chr += encodedStr.charAt(i + 1);\n encodedStrArr.push(chr);\n i++;\n } else {\n encodedStrArr.push(chr);\n }\n }\n encodedStr = encodedStrArr;\n }\n\n // first line includes the charset and language info and needs to be encoded\n // even if it does not contain any unicode characters\n line = \"utf-8''\";\n let encoded = true;\n startPos = 0;\n\n // process text with unicode or special chars\n for (i = 0, len = encodedStr.length; i < len; i++) {\n chr = encodedStr[i];\n\n if (encoded) {\n chr = this.safeEncodeURIComponent(chr);\n } else {\n // try to urlencode current char\n chr = chr === ' ' ? chr : this.safeEncodeURIComponent(chr);\n // By default it is not required to encode a line, the need\n // only appears when the string contains unicode or special chars\n // in this case we start processing the line over and encode all chars\n if (chr !== encodedStr[i]) {\n // Check if it is even possible to add the encoded char to the line\n // If not, there is no reason to use this line, just push it to the list\n // and start a new line with the char that needs encoding\n if ((this.safeEncodeURIComponent(line) + chr).length >= maxLength) {\n list.push({\n line,\n encoded\n });\n line = '';\n startPos = i - 1;\n } else {\n encoded = true;\n i = startPos;\n line = '';\n continue;\n }\n }\n }\n\n // if the line is already too long, push it to the list and start a new one\n if ((line + chr).length >= maxLength) {\n list.push({\n line,\n encoded\n });\n line = chr = encodedStr[i] === ' ' ? ' ' : this.safeEncodeURIComponent(encodedStr[i]);\n if (chr === encodedStr[i]) {\n encoded = false;\n startPos = i - 1;\n } else {\n encoded = true;\n }\n } else {\n line += chr;\n }\n }\n\n if (line) {\n list.push({\n line,\n encoded\n });\n }\n }\n\n return list.map((item, i) => ({\n // encoded lines: {name}*{part}*\n // unencoded lines: {name}*{part}\n // if any line needs to be encoded then the first line (part==0) is always encoded\n key: key + '*' + i + (item.encoded ? '*' : ''),\n value: item.line\n }));\n },\n\n /**\n * Parses a header value with key=value arguments into a structured\n * object.\n *\n * parseHeaderValue('content-type: text/plain; CHARSET='UTF-8'') ->\n * {\n * 'value': 'text/plain',\n * 'params': {\n * 'charset': 'UTF-8'\n * }\n * }\n *\n * @param {String} str Header value\n * @return {Object} Header value as a parsed structure\n */\n parseHeaderValue(str) {\n const response = {\n value: false,\n params: {}\n };\n let key = false;\n let value = '';\n let type = 'value';\n let quote = false;\n let escaped = false;\n let chr;\n\n for (let i = 0, len = str.length; i < len; i++) {\n chr = str.charAt(i);\n if (type === 'key') {\n if (chr === '=') {\n key = value.trim().toLowerCase();\n type = 'value';\n value = '';\n continue;\n }\n value += chr;\n } else {\n if (escaped) {\n value += chr;\n } else if (chr === '\\\\') {\n escaped = true;\n continue;\n } else if (quote && chr === quote) {\n quote = false;\n } else if (!quote && chr === '\"') {\n quote = chr;\n } else if (!quote && chr === ';') {\n if (key === false) {\n response.value = value.trim();\n } else {\n response.params[key] = value.trim();\n }\n type = 'key';\n value = '';\n } else {\n value += chr;\n }\n escaped = false;\n }\n }\n\n if (type === 'value') {\n if (key === false) {\n response.value = value.trim();\n } else {\n response.params[key] = value.trim();\n }\n } else if (value.trim()) {\n response.params[value.trim().toLowerCase()] = '';\n }\n\n // handle parameter value continuations\n // https://tools.ietf.org/html/rfc2231#section-3\n\n // preprocess values\n Object.keys(response.params).forEach(key => {\n let actualKey, nr, match, value;\n if ((match = key.match(/(\\*(\\d+)|\\*(\\d+)\\*|\\*)$/))) {\n actualKey = key.substr(0, match.index);\n nr = Number(match[2] || match[3]) || 0;\n\n if (!response.params[actualKey] || typeof response.params[actualKey] !== 'object') {\n response.params[actualKey] = {\n charset: false,\n values: []\n };\n }\n\n value = response.params[key];\n\n if (nr === 0 && match[0].substr(-1) === '*' && (match = value.match(/^([^']*)'[^']*'(.*)$/))) {\n response.params[actualKey].charset = match[1] || 'iso-8859-1';\n value = match[2];\n }\n\n response.params[actualKey].values[nr] = value;\n\n // remove the old reference\n delete response.params[key];\n }\n });\n\n // concatenate split rfc2231 strings and convert encoded strings to mime encoded words\n Object.keys(response.params).forEach(key => {\n let value;\n if (response.params[key] && Array.isArray(response.params[key].values)) {\n value = response.params[key].values.map(val => val || '').join('');\n\n if (response.params[key].charset) {\n // convert \"%AB\" to \"=?charset?Q?=AB?=\"\n response.params[key] =\n '=?' +\n response.params[key].charset +\n '?Q?' +\n value\n // fix invalidly encoded chars\n .replace(/[=?_\\s]/g, s => {\n const c = s.charCodeAt(0).toString(16);\n if (s === ' ') {\n return '_';\n }\n return '%' + (c.length < 2 ? '0' : '') + c;\n })\n // change from urlencoding to percent encoding\n .replace(/%/g, '=') +\n '?=';\n } else {\n response.params[key] = value;\n }\n }\n });\n\n return response;\n },\n\n /**\n * Returns file extension for a content type string. If no suitable extensions\n * are found, 'bin' is used as the default extension\n *\n * @param {String} mimeType Content type to be checked for\n * @return {String} File extension\n */\n detectExtension: mimeType => mimeTypes.detectExtension(mimeType),\n\n /**\n * Returns content type for a file extension. If no suitable content types\n * are found, 'application/octet-stream' is used as the default content type\n *\n * @param {String} extension Extension to be checked for\n * @return {String} File extension\n */\n detectMimeType: extension => mimeTypes.detectMimeType(extension),\n\n /**\n * Folds long lines, useful for folding header lines (afterSpace=false) and\n * flowed text (afterSpace=true)\n *\n * @param {String} str String to be folded\n * @param {Number} [lineLength=76] Maximum length of a line\n * @param {Boolean} afterSpace If true, leave a space in th end of a line\n * @return {String} String with folded lines\n */\n foldLines(str, lineLength, afterSpace) {\n str = (str || '').toString();\n lineLength = lineLength || 76;\n\n let pos = 0;\n const len = str.length;\n let result = '';\n let line, match;\n\n while (pos < len) {\n line = str.substr(pos, lineLength);\n if (line.length < lineLength) {\n result += line;\n break;\n }\n if ((match = line.match(/^[^\\n\\r]*(\\r?\\n|\\r)/))) {\n line = match[0];\n result += line;\n pos += line.length;\n continue;\n } else if ((match = line.match(/(\\s+)[^\\s]*$/)) && match[0].length - (afterSpace ? (match[1] || '').length : 0) < line.length) {\n line = line.substr(0, line.length - (match[0].length - (afterSpace ? (match[1] || '').length : 0)));\n } else if ((match = str.substr(pos + line.length).match(/^[^\\s]+(\\s*)/))) {\n line = line + match[0].substr(0, match[0].length - (!afterSpace ? (match[1] || '').length : 0));\n }\n\n result += line;\n pos += line.length;\n if (pos < len) {\n result += '\\r\\n';\n }\n }\n\n return result;\n },\n\n /**\n * Splits a mime encoded string. Needed for dividing mime words into smaller chunks\n *\n * @param {String} str Mime encoded string to be split up\n * @param {Number} maxlen Maximum length of characters for one part (minimum 12)\n * @return {Array} Split string\n */\n splitMimeEncodedString: (str, maxlen) => {\n const lines = [];\n let curLine, match, chr, done;\n\n // require at least 12 symbols to fit possible 4 octet UTF-8 sequences\n maxlen = Math.max(maxlen || 0, 12);\n\n while (str.length) {\n curLine = str.substr(0, maxlen);\n\n // move incomplete escaped char back to main\n if ((match = curLine.match(/[=][0-9A-F]?$/i))) {\n curLine = curLine.substr(0, match.index);\n }\n\n done = false;\n while (!done) {\n done = true;\n // check if not middle of a unicode char sequence\n if ((match = str.substr(curLine.length).match(/^[=]([0-9A-F]{2})/i))) {\n chr = parseInt(match[1], 16);\n // invalid sequence, move one char back anc recheck\n if (chr < 0xc2 && chr > 0x7f) {\n curLine = curLine.substr(0, curLine.length - 3);\n done = false;\n }\n }\n }\n\n if (curLine.length) {\n lines.push(curLine);\n }\n str = str.substr(curLine.length);\n }\n\n return lines;\n },\n\n encodeURICharComponent: chr => {\n let res = '';\n let ord = chr.charCodeAt(0).toString(16).toUpperCase();\n\n if (ord.length % 2) {\n ord = '0' + ord;\n }\n\n if (ord.length > 2) {\n for (let i = 0, len = ord.length / 2; i < len; i++) {\n res += '%' + ord.substr(i, 2);\n }\n } else {\n res += '%' + ord;\n }\n\n return res;\n },\n\n safeEncodeURIComponent(str) {\n str = (str || '').toString();\n\n try {\n // might throw if we try to encode invalid sequences, eg. partial emoji\n str = encodeURIComponent(str);\n } catch (_E) {\n // should never run\n return str.replace(/[^\\x00-\\x1F *'()<>@,;:\\\\\"[\\]?=\\u007F-\\uFFFF]+/g, '');\n }\n\n // ensure chars that are not handled by encodeURICompent are converted as well\n return str.replace(/[\\x00-\\x1F *'()<>@,;:\\\\\"[\\]?=\\u007F-\\uFFFF]/g, chr => this.encodeURICharComponent(chr));\n }\n};\n","'use strict';\n\n/**\n * Converts tokens for a single address into an address object\n *\n * @param {Array} tokens Tokens object\n * @param {Number} depth Current recursion depth for nested group protection\n * @return {Object} Address object\n */\nfunction _handleAddress(tokens, depth) {\n let isGroup = false;\n let state = 'text';\n const addresses = [];\n const data = {\n address: [],\n comment: [],\n group: [],\n text: [],\n textWasQuoted: []\n };\n let insideQuotes = false;\n\n // Filter out <addresses>, (comments) and regular text\n for (let i = 0, len = tokens.length; i < len; i++) {\n const token = tokens[i];\n const prevToken = i ? tokens[i - 1] : null;\n if (token.type === 'operator') {\n switch (token.value) {\n case '<':\n state = 'address';\n insideQuotes = false;\n break;\n case '(':\n state = 'comment';\n insideQuotes = false;\n break;\n case ':':\n state = 'group';\n isGroup = true;\n insideQuotes = false;\n break;\n case '\"':\n insideQuotes = !insideQuotes;\n state = 'text';\n break;\n default:\n state = 'text';\n insideQuotes = false;\n break;\n }\n } else if (token.value) {\n if (state === 'address') {\n // Handle unquoted name that includes a \"<\".\n // Apple Mail truncates everything between an unexpected < and an address.\n token.value = token.value.replace(/^[^<]*<\\s*/, '');\n }\n\n if (prevToken && prevToken.noBreak && data[state].length) {\n data[state][data[state].length - 1] += token.value;\n if (state === 'text' && insideQuotes) {\n data.textWasQuoted[data.textWasQuoted.length - 1] = true;\n }\n } else {\n data[state].push(token.value);\n if (state === 'text') {\n data.textWasQuoted.push(insideQuotes);\n }\n }\n }\n }\n\n // If there is no text but a comment, replace the two\n if (!data.text.length && data.comment.length) {\n data.text = data.comment;\n data.comment = [];\n }\n\n if (isGroup) {\n // http://tools.ietf.org/html/rfc2822#appendix-A.1.3\n data.text = data.text.join(' ');\n\n // Parse group members, but flatten any nested groups (RFC 5322 doesn't allow nesting)\n let groupMembers = [];\n if (data.group.length) {\n const parsedGroup = addressparser(data.group.join(','), { _depth: depth + 1 });\n parsedGroup.forEach(member => {\n if (member.group) {\n groupMembers = groupMembers.concat(member.group);\n } else {\n groupMembers.push(member);\n }\n });\n }\n\n addresses.push({\n name: data.text || '',\n group: groupMembers\n });\n } else {\n // If no address was found, try to detect one from regular text\n if (!data.address.length && data.text.length) {\n for (let i = data.text.length - 1; i >= 0; i--) {\n // Security: Do not extract email addresses from quoted strings.\n // RFC 5321 allows @ inside quoted local-parts like \"user@domain\"@example.com.\n // Extracting emails from quoted text leads to misrouting vulnerabilities.\n if (!data.textWasQuoted[i] && /^[^@\\s]+@[^@\\s]+$/.test(data.text[i])) {\n data.address = data.text.splice(i, 1);\n data.textWasQuoted.splice(i, 1);\n break;\n }\n }\n\n // Try a looser regex match if strict match found nothing\n if (!data.address.length) {\n let extracted = false;\n for (let i = data.text.length - 1; i >= 0; i--) {\n // Security: Do not extract email addresses from quoted strings\n if (!data.textWasQuoted[i]) {\n data.text[i] = data.text[i]\n .replace(/\\s*\\b[^@\\s]+@[^\\s]+\\b\\s*/, match => {\n if (!extracted) {\n data.address = [match.trim()];\n extracted = true;\n return ' ';\n }\n return match;\n })\n .trim();\n if (extracted) {\n break;\n }\n }\n }\n }\n }\n\n // If there's still no text but a comment exists, replace the two\n if (!data.text.length && data.comment.length) {\n data.text = data.comment;\n data.comment = [];\n }\n\n // Keep only the first address occurrence, push others to regular text\n if (data.address.length > 1) {\n data.text = data.text.concat(data.address.splice(1));\n }\n\n // Join values with spaces\n data.text = data.text.join(' ');\n data.address = data.address.join(' ');\n\n const address = {\n address: data.address || data.text || '',\n name: data.text || data.address || ''\n };\n\n if (address.address === address.name) {\n if (/@/.test(address.address || '')) {\n address.name = '';\n } else {\n address.address = '';\n }\n }\n\n addresses.push(address);\n }\n\n return addresses;\n}\n\n/**\n * Creates a Tokenizer object for tokenizing address field strings\n *\n * @constructor\n * @param {String} str Address field string\n */\nclass Tokenizer {\n constructor(str) {\n this.str = (str || '').toString();\n this.operatorCurrent = '';\n this.operatorExpecting = '';\n this.node = null;\n this.escaped = false;\n\n this.list = [];\n /**\n * Operator tokens and which tokens are expected to end the sequence\n */\n this.operators = {\n '\"': '\"',\n '(': ')',\n '<': '>',\n ',': '',\n ':': ';',\n // Semicolons are not a legal delimiter per the RFC2822 grammar other\n // than for terminating a group, but they are also not valid for any\n // other use in this context. Given that some mail clients have\n // historically allowed the semicolon as a delimiter equivalent to the\n // comma in their UI, it makes sense to treat them the same as a comma\n // when used outside of a group.\n ';': ''\n };\n }\n\n /**\n * Tokenizes the original input string\n *\n * @return {Array} An array of operator|text tokens\n */\n tokenize() {\n const list = [];\n\n for (let i = 0, len = this.str.length; i < len; i++) {\n const chr = this.str.charAt(i);\n const nextChr = i < len - 1 ? this.str.charAt(i + 1) : null;\n this.checkChar(chr, nextChr);\n }\n\n this.list.forEach(node => {\n node.value = (node.value || '').toString().trim();\n if (node.value) {\n list.push(node);\n }\n });\n\n return list;\n }\n\n /**\n * Checks if a character is an operator or text and acts accordingly\n *\n * @param {String} chr Character from the address field\n */\n checkChar(chr, nextChr) {\n if (this.escaped) {\n // ignore next condition blocks\n } else if (chr === this.operatorExpecting) {\n this.node = {\n type: 'operator',\n value: chr\n };\n\n if (nextChr && ![' ', '\\t', '\\r', '\\n', ',', ';'].includes(nextChr)) {\n this.node.noBreak = true;\n }\n\n this.list.push(this.node);\n this.node = null;\n this.operatorExpecting = '';\n this.escaped = false;\n\n return;\n } else if (!this.operatorExpecting && chr in this.operators) {\n this.node = {\n type: 'operator',\n value: chr\n };\n this.list.push(this.node);\n this.node = null;\n this.operatorExpecting = this.operators[chr];\n this.escaped = false;\n return;\n } else if (['\"', \"'\"].includes(this.operatorExpecting) && chr === '\\\\') {\n this.escaped = true;\n return;\n }\n\n if (!this.node) {\n this.node = {\n type: 'text',\n value: ''\n };\n this.list.push(this.node);\n }\n\n if (chr === '\\n') {\n // Convert newlines to spaces. Carriage return is ignored as \\r and \\n usually\n // go together anyway and there already is a WS for \\n. Lone \\r means something is fishy.\n chr = ' ';\n }\n\n if (chr.charCodeAt(0) >= 0x21 || [' ', '\\t'].includes(chr)) {\n // skip command bytes\n this.node.value += chr;\n }\n\n this.escaped = false;\n }\n}\n\n/**\n * Maximum recursion depth for parsing nested groups.\n * RFC 5322 doesn't allow nested groups, so this is a safeguard against\n * malicious input that could cause stack overflow.\n */\nconst MAX_NESTED_GROUP_DEPTH = 50;\n\n/**\n * Parses structured e-mail addresses from an address field\n *\n * Example:\n *\n * 'Name <address@domain>'\n *\n * will be converted to\n *\n * [{name: 'Name', address: 'address@domain'}]\n *\n * @param {String} str Address field\n * @param {Object} options Optional options object\n * @param {Number} options._depth Internal recursion depth counter (do not set manually)\n * @return {Array} An array of address objects\n */\nfunction addressparser(str, options) {\n options = options || {};\n const depth = options._depth || 0;\n\n // Prevent stack overflow from deeply nested groups (DoS protection)\n if (depth > MAX_NESTED_GROUP_DEPTH) {\n return [];\n }\n\n const tokenizer = new Tokenizer(str);\n const tokens = tokenizer.tokenize();\n\n const addresses = [];\n let address = [];\n let parsedAddresses = [];\n\n tokens.forEach(token => {\n if (token.type === 'operator' && (token.value === ',' || token.value === ';')) {\n if (address.length) {\n addresses.push(address);\n }\n address = [];\n } else {\n address.push(token);\n }\n });\n\n if (address.length) {\n addresses.push(address);\n }\n\n addresses.forEach(addr => {\n const handled = _handleAddress(addr, depth);\n if (handled.length) {\n parsedAddresses = parsedAddresses.concat(handled);\n }\n });\n\n // Merge fragments produced when unquoted display names contain commas.\n // \"Joe Foo, PhD <joe@example.com>\" is split on the comma into\n // [{name:\"Joe Foo\", address:\"\"}, {name:\"PhD\", address:\"joe@example.com\"}].\n // Recombine: a name-only entry followed by an entry with both name and address.\n for (let i = parsedAddresses.length - 2; i >= 0; i--) {\n const current = parsedAddresses[i];\n const next = parsedAddresses[i + 1];\n if (current.address === '' && current.name && !current.group && next.address && next.name) {\n next.name = current.name + ', ' + next.name;\n parsedAddresses.splice(i, 1);\n }\n }\n\n if (options.flatten) {\n const flatAddresses = [];\n const walkAddressList = list => {\n list.forEach(entry => {\n if (entry.group) {\n return walkAddressList(entry.group);\n }\n flatAddresses.push(entry);\n });\n };\n walkAddressList(parsedAddresses);\n return flatAddresses;\n }\n\n return parsedAddresses;\n}\n\nmodule.exports = addressparser;\n","'use strict';\n\nconst { Transform } = require('stream');\n\nclass LastNewline extends Transform {\n constructor() {\n super();\n this.lastByte = false;\n }\n\n _transform(chunk, encoding, done) {\n if (chunk.length) {\n this.lastByte = chunk[chunk.length - 1];\n }\n\n this.push(chunk);\n done();\n }\n\n _flush(done) {\n if (this.lastByte === 0x0a) {\n return done();\n }\n if (this.lastByte === 0x0d) {\n this.push(Buffer.from('\\n'));\n return done();\n }\n this.push(Buffer.from('\\r\\n'));\n return done();\n }\n}\n\nmodule.exports = LastNewline;\n","'use strict';\n\nconst { Transform } = require('stream');\n\n/**\n * Ensures that only <CR><LF> sequences are used for linebreaks\n *\n * @param {Object} options Stream options\n */\nclass LeWindows extends Transform {\n constructor(options) {\n super(options);\n this.lastByte = false;\n }\n\n /**\n * Escapes dots\n */\n _transform(chunk, encoding, done) {\n let buf;\n let lastPos = 0;\n\n for (let i = 0, len = chunk.length; i < len; i++) {\n if (chunk[i] === 0x0a) {\n // \\n\n if ((i && chunk[i - 1] !== 0x0d) || (!i && this.lastByte !== 0x0d)) {\n if (i > lastPos) {\n buf = chunk.slice(lastPos, i);\n this.push(buf);\n }\n this.push(Buffer.from('\\r\\n'));\n lastPos = i + 1;\n }\n }\n }\n\n if (lastPos && lastPos < chunk.length) {\n buf = chunk.slice(lastPos);\n this.push(buf);\n } else if (!lastPos) {\n this.push(chunk);\n }\n\n this.lastByte = chunk[chunk.length - 1];\n done();\n }\n}\n\nmodule.exports = LeWindows;\n","'use strict';\n\nconst { Transform } = require('stream');\n\n/**\n * Ensures that only <LF> is used for linebreaks\n *\n * @param {Object} options Stream options\n */\nclass LeUnix extends Transform {\n constructor(options) {\n super(options);\n }\n\n /**\n * Escapes dots\n */\n _transform(chunk, encoding, done) {\n let buf;\n let lastPos = 0;\n\n for (let i = 0, len = chunk.length; i < len; i++) {\n if (chunk[i] === 0x0d) {\n // \\r\n buf = chunk.slice(lastPos, i);\n lastPos = i + 1;\n this.push(buf);\n }\n }\n if (lastPos && lastPos < chunk.length) {\n buf = chunk.slice(lastPos);\n this.push(buf);\n } else if (!lastPos) {\n this.push(chunk);\n }\n done();\n }\n}\n\nmodule.exports = LeUnix;\n","/* eslint no-undefined: 0, prefer-spread: 0, no-control-regex: 0 */\n\n'use strict';\n\nconst crypto = require('crypto');\nconst fs = require('fs');\nconst punycode = require('../punycode');\nconst { PassThrough } = require('stream');\nconst shared = require('../shared');\n\nconst mimeFuncs = require('../mime-funcs');\nconst qp = require('../qp');\nconst base64 = require('../base64');\nconst addressparser = require('../addressparser');\nconst nmfetch = require('../fetch');\nconst errors = require('../errors');\nconst LastNewline = require('./last-newline');\n\nconst LeWindows = require('./le-windows');\nconst LeUnix = require('./le-unix');\n\nconst FORMATTED_HEADERS = ['From', 'Sender', 'To', 'Cc', 'Bcc', 'Reply-To', 'Date', 'References'];\n\n/**\n * Creates a new mime tree node. Assumes 'multipart/*' as the content type\n * if it is a branch, anything else counts as leaf. If rootNode is missing from\n * the options, assumes this is the root.\n *\n * @param {String} contentType Define the content type for the node. Can be left blank for attachments (derived from filename)\n * @param {Object} [options] optional options\n * @param {Object} [options.rootNode] root node for this tree\n * @param {Object} [options.parentNode] immediate parent for this node\n * @param {Object} [options.filename] filename for an attachment node\n * @param {String} [options.baseBoundary] shared part of the unique multipart boundary\n * @param {Boolean} [options.keepBcc] If true, do not exclude Bcc from the generated headers\n * @param {Function} [options.normalizeHeaderKey] method to normalize header keys for custom caseing\n * @param {String} [options.textEncoding] either 'Q' (the default) or 'B'\n */\nclass MimeNode {\n constructor(contentType, options) {\n this.nodeCounter = 0;\n\n options = options || {};\n\n /**\n * shared part of the unique multipart boundary\n */\n this.baseBoundary = options.baseBoundary || crypto.randomBytes(8).toString('hex');\n this.boundaryPrefix = options.boundaryPrefix || '--_NmP';\n\n this.disableFileAccess = !!options.disableFileAccess;\n this.disableUrlAccess = !!options.disableUrlAccess;\n\n this.normalizeHeaderKey = options.normalizeHeaderKey;\n\n /**\n * If date headers is missing and current node is the root, this value is used instead\n */\n this.date = options.parentNode ? null : new Date();\n\n /**\n * Root node for current mime tree\n */\n this.rootNode = options.rootNode || this;\n\n /**\n * If true include Bcc in generated headers (if available)\n */\n this.keepBcc = !!options.keepBcc;\n\n /**\n * If filename is specified but contentType is not (probably an attachment)\n * detect the content type from filename extension\n */\n if (options.filename) {\n /**\n * Filename for this node. Useful with attachments\n */\n this.filename = options.filename;\n if (!contentType) {\n contentType = mimeFuncs.detectMimeType(this.filename.split('.').pop());\n }\n }\n\n /**\n * Indicates which encoding should be used for header strings: \"Q\" or \"B\"\n */\n this.textEncoding = (options.textEncoding || '').toString().trim().charAt(0).toUpperCase();\n\n /**\n * Immediate parent for this node (or undefined if not set)\n */\n this.parentNode = options.parentNode;\n\n /**\n * Hostname for default message-id values\n */\n this.hostname = options.hostname;\n\n /**\n * If set to 'win' then uses \\r\\n, if 'linux' then \\n. If not set (or `raw` is used) then newlines are kept as is.\n */\n this.newline = options.newline;\n\n /**\n * An array for possible child nodes\n */\n this.childNodes = [];\n\n /**\n * Used for generating unique boundaries (prepended to the shared base)\n */\n this._nodeId = ++this.rootNode.nodeCounter;\n\n /**\n * A list of header values for this node in the form of [{key:'', value:''}]\n */\n this._headers = [];\n\n /**\n * True if the content only uses ASCII printable characters\n * @type {Boolean}\n */\n this._isPlainText = false;\n\n /**\n * True if the content is plain text but has longer lines than allowed\n * @type {Boolean}\n */\n this._hasLongLines = false;\n\n /**\n * If set, use instead this value for envelopes instead of generating one\n * @type {Boolean}\n */\n this._envelope = false;\n\n /**\n * If set then use this value as the stream content instead of building it\n * @type {String|Buffer|Stream}\n */\n this._raw = false;\n\n /**\n * Additional transform streams that the message will be piped before\n * exposing by createReadStream\n * @type {Array}\n */\n this._transforms = [];\n\n /**\n * Additional process functions that the message will be piped through before\n * exposing by createReadStream. These functions are run after transforms\n * @type {Array}\n */\n this._processFuncs = [];\n\n /**\n * If content type is set (or derived from the filename) add it to headers\n */\n if (contentType) {\n this.setHeader('Content-Type', contentType);\n }\n }\n\n /////// PUBLIC METHODS\n\n /**\n * Creates and appends a child node.Arguments provided are passed to MimeNode constructor\n *\n * @param {String} [contentType] Optional content type\n * @param {Object} [options] Optional options object\n * @return {Object} Created node object\n */\n createChild(contentType, options) {\n if (!options && typeof contentType === 'object') {\n options = contentType;\n contentType = undefined;\n }\n const node = new MimeNode(contentType, options);\n this.appendChild(node);\n return node;\n }\n\n /**\n * Appends an existing node to the mime tree. Removes the node from an existing\n * tree if needed\n *\n * @param {Object} childNode node to be appended\n * @return {Object} Appended node object\n */\n appendChild(childNode) {\n if (childNode.rootNode !== this.rootNode) {\n childNode.rootNode = this.rootNode;\n childNode._nodeId = ++this.rootNode.nodeCounter;\n }\n\n childNode.parentNode = this;\n\n this.childNodes.push(childNode);\n return childNode;\n }\n\n /**\n * Replaces current node with another node\n *\n * @param {Object} node Replacement node\n * @return {Object} Replacement node\n */\n replace(node) {\n if (node === this) {\n return this;\n }\n\n this.parentNode.childNodes.forEach((childNode, i) => {\n if (childNode === this) {\n node.rootNode = this.rootNode;\n node.parentNode = this.parentNode;\n node._nodeId = this._nodeId;\n\n this.rootNode = this;\n this.parentNode = undefined;\n\n node.parentNode.childNodes[i] = node;\n }\n });\n\n return node;\n }\n\n /**\n * Removes current node from the mime tree\n *\n * @return {Object} removed node\n */\n remove() {\n if (!this.parentNode) {\n return this;\n }\n\n for (let i = this.parentNode.childNodes.length - 1; i >= 0; i--) {\n if (this.parentNode.childNodes[i] === this) {\n this.parentNode.childNodes.splice(i, 1);\n this.parentNode = undefined;\n this.rootNode = this;\n return this;\n }\n }\n }\n\n /**\n * Sets a header value. If the value for selected key exists, it is overwritten.\n * You can set multiple values as well by using [{key:'', value:''}] or\n * {key: 'value'} as the first argument.\n *\n * @param {String|Array|Object} key Header key or a list of key value pairs\n * @param {String} value Header value\n * @return {Object} current node\n */\n setHeader(key, value) {\n let added = false;\n\n // Allow setting multiple headers at once\n if (!value && key && typeof key === 'object') {\n // allow {key:'content-type', value: 'text/plain'}\n if (key.key && 'value' in key) {\n this.setHeader(key.key, key.value);\n } else if (Array.isArray(key)) {\n // allow [{key:'content-type', value: 'text/plain'}]\n key.forEach(i => {\n this.setHeader(i.key, i.value);\n });\n } else {\n // allow {'content-type': 'text/plain'}\n Object.keys(key).forEach(i => {\n this.setHeader(i, key[i]);\n });\n }\n return this;\n }\n\n key = this._normalizeHeaderKey(key);\n\n const headerValue = {\n key,\n value\n };\n\n // Check if the value exists and overwrite\n for (let i = 0, len = this._headers.length; i < len; i++) {\n if (this._headers[i].key === key) {\n if (!added) {\n // replace the first match\n this._headers[i] = headerValue;\n added = true;\n } else {\n // remove following matches\n this._headers.splice(i, 1);\n i--;\n len--;\n }\n }\n }\n\n // match not found, append the value\n if (!added) {\n this._headers.push(headerValue);\n }\n\n return this;\n }\n\n /**\n * Adds a header value. If the value for selected key exists, the value is appended\n * as a new field and old one is not touched.\n * You can set multiple values as well by using [{key:'', value:''}] or\n * {key: 'value'} as the first argument.\n *\n * @param {String|Array|Object} key Header key or a list of key value pairs\n * @param {String} value Header value\n * @return {Object} current node\n */\n addHeader(key, value) {\n // Allow setting multiple headers at once\n if (!value && key && typeof key === 'object') {\n // allow {key:'content-type', value: 'text/plain'}\n if (key.key && key.value) {\n this.addHeader(key.key, key.value);\n } else if (Array.isArray(key)) {\n // allow [{key:'content-type', value: 'text/plain'}]\n key.forEach(i => {\n this.addHeader(i.key, i.value);\n });\n } else {\n // allow {'content-type': 'text/plain'}\n Object.keys(key).forEach(i => {\n this.addHeader(i, key[i]);\n });\n }\n return this;\n } else if (Array.isArray(value)) {\n value.forEach(val => {\n this.addHeader(key, val);\n });\n return this;\n }\n\n this._headers.push({\n key: this._normalizeHeaderKey(key),\n value\n });\n\n return this;\n }\n\n /**\n * Retrieves the first mathcing value of a selected key\n *\n * @param {String} key Key to search for\n * @retun {String} Value for the key\n */\n getHeader(key) {\n key = this._normalizeHeaderKey(key);\n for (let i = 0, len = this._headers.length; i < len; i++) {\n if (this._headers[i].key === key) {\n return this._headers[i].value;\n }\n }\n }\n\n /**\n * Sets body content for current node. If the value is a string, charset is added automatically\n * to Content-Type (if it is text/*). If the value is a Buffer, you need to specify\n * the charset yourself\n *\n * @param (String|Buffer) content Body content\n * @return {Object} current node\n */\n setContent(content) {\n this.content = content;\n if (typeof this.content.pipe === 'function') {\n // pre-stream handler. might be triggered if a stream is set as content\n // and 'error' fires before anything is done with this stream\n this._contentErrorHandler = err => {\n this.content.removeListener('error', this._contentErrorHandler);\n this.content = err;\n };\n this.content.once('error', this._contentErrorHandler);\n } else if (typeof this.content === 'string') {\n this._isPlainText = mimeFuncs.isPlainText(this.content);\n if (this._isPlainText && mimeFuncs.hasLongerLines(this.content, 76)) {\n // If there are lines longer than 76 symbols/bytes do not use 7bit\n this._hasLongLines = true;\n }\n }\n return this;\n }\n\n build(callback) {\n let promise;\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = shared.callbackPromise(resolve, reject);\n });\n }\n\n const stream = this.createReadStream();\n const buf = [];\n let buflen = 0;\n let returned = false;\n\n stream.on('readable', () => {\n let chunk;\n\n while ((chunk = stream.read()) !== null) {\n buf.push(chunk);\n buflen += chunk.length;\n }\n });\n\n stream.once('error', err => {\n if (returned) {\n return;\n }\n returned = true;\n\n return callback(err);\n });\n\n stream.once('end', chunk => {\n if (returned) {\n return;\n }\n returned = true;\n\n if (chunk && chunk.length) {\n buf.push(chunk);\n buflen += chunk.length;\n }\n return callback(null, Buffer.concat(buf, buflen));\n });\n\n return promise;\n }\n\n getTransferEncoding() {\n let transferEncoding = false;\n const contentType = (this.getHeader('Content-Type') || '').toString().toLowerCase().trim();\n\n if (this.content) {\n transferEncoding = (this.getHeader('Content-Transfer-Encoding') || '').toString().toLowerCase().trim();\n if (!transferEncoding || !['base64', 'quoted-printable'].includes(transferEncoding)) {\n if (/^text\\//i.test(contentType)) {\n // If there are no special symbols, no need to modify the text\n if (this._isPlainText && !this._hasLongLines) {\n transferEncoding = '7bit';\n } else if (typeof this.content === 'string' || this.content instanceof Buffer) {\n // detect preferred encoding for string value\n transferEncoding = this._getTextEncoding(this.content) === 'Q' ? 'quoted-printable' : 'base64';\n } else {\n // we can not check content for a stream, so either use preferred encoding or fallback to QP\n transferEncoding = this.textEncoding === 'B' ? 'base64' : 'quoted-printable';\n }\n } else if (!/^(multipart|message)\\//i.test(contentType)) {\n transferEncoding = transferEncoding || 'base64';\n }\n }\n }\n return transferEncoding;\n }\n\n /**\n * Builds the header block for the mime node. Append \\r\\n\\r\\n before writing the content\n *\n * @returns {String} Headers\n */\n buildHeaders() {\n const transferEncoding = this.getTransferEncoding();\n const headers = [];\n\n if (transferEncoding) {\n this.setHeader('Content-Transfer-Encoding', transferEncoding);\n }\n\n if (this.filename && !this.getHeader('Content-Disposition')) {\n this.setHeader('Content-Disposition', 'attachment');\n }\n\n // Ensure mandatory header fields\n if (this.rootNode === this) {\n if (!this.getHeader('Date')) {\n this.setHeader('Date', this.date.toUTCString().replace(/GMT/, '+0000'));\n }\n\n // ensure that Message-Id is present\n this.messageId();\n\n if (!this.getHeader('MIME-Version')) {\n this.setHeader('MIME-Version', '1.0');\n }\n\n // Ensure that Content-Type is the last header for the root node\n for (let i = this._headers.length - 2; i >= 0; i--) {\n const header = this._headers[i];\n if (header.key === 'Content-Type') {\n this._headers.splice(i, 1);\n this._headers.push(header);\n }\n }\n }\n\n this._headers.forEach(header => {\n let key = header.key;\n let value = header.value;\n let structured;\n let param;\n const options = {};\n const formattedHeaders = FORMATTED_HEADERS;\n\n if (value && typeof value === 'object' && !formattedHeaders.includes(key)) {\n Object.keys(value).forEach(key => {\n if (key !== 'value') {\n options[key] = value[key];\n }\n });\n value = (value.value || '').toString();\n if (!value.trim()) {\n return;\n }\n }\n\n if (options.prepared) {\n // header value is\n if (options.foldLines) {\n headers.push(mimeFuncs.foldLines(key + ': ' + value));\n } else {\n headers.push(key + ': ' + value);\n }\n return;\n }\n\n switch (header.key) {\n case 'Content-Disposition':\n structured = mimeFuncs.parseHeaderValue(value);\n if (this.filename) {\n structured.params.filename = this.filename;\n }\n value = mimeFuncs.buildHeaderValue(structured);\n break;\n\n case 'Content-Type':\n structured = mimeFuncs.parseHeaderValue(value);\n\n this._handleContentType(structured);\n\n if (\n structured.value.match(/^text\\/plain\\b/) &&\n typeof this.content === 'string' &&\n /[\\u0080-\\uFFFF]/.test(this.content)\n ) {\n structured.params.charset = 'utf-8';\n }\n\n value = mimeFuncs.buildHeaderValue(structured);\n\n if (this.filename) {\n // add support for non-compliant clients like QQ webmail\n // we can't build the value with buildHeaderValue as the value is non standard and\n // would be converted to parameter continuation encoding that we do not want\n param = this._encodeWords(this.filename);\n\n if (param !== this.filename || /[\\s'\"\\\\;:/=(),<>@[\\]?]|^-/.test(param)) {\n // include value in quotes if needed\n param = '\"' + param + '\"';\n }\n value += '; name=' + param;\n }\n break;\n\n case 'Bcc':\n if (!this.keepBcc) {\n // skip BCC values\n return;\n }\n break;\n }\n\n value = this._encodeHeaderValue(key, value);\n\n // skip empty lines\n if (!(value || '').toString().trim()) {\n return;\n }\n\n if (typeof this.normalizeHeaderKey === 'function') {\n const normalized = this.normalizeHeaderKey(key, value);\n if (normalized && typeof normalized === 'string' && normalized.length) {\n key = normalized;\n }\n }\n\n headers.push(mimeFuncs.foldLines(key + ': ' + value, 76));\n });\n\n return headers.join('\\r\\n');\n }\n\n /**\n * Streams the rfc2822 message from the current node. If this is a root node,\n * mandatory header fields are set if missing (Date, Message-Id, MIME-Version)\n *\n * @return {String} Compiled message\n */\n createReadStream(options) {\n options = options || {};\n\n const stream = new PassThrough(options);\n let outputStream = stream;\n let transform;\n\n this.stream(stream, options, err => {\n if (err) {\n outputStream.emit('error', err);\n return;\n }\n stream.end();\n });\n\n for (let i = 0, len = this._transforms.length; i < len; i++) {\n transform = typeof this._transforms[i] === 'function' ? this._transforms[i]() : this._transforms[i];\n outputStream.once('error', err => {\n transform.emit('error', err);\n });\n outputStream = outputStream.pipe(transform);\n }\n\n // ensure terminating newline after possible user transforms\n transform = new LastNewline();\n outputStream.once('error', err => {\n transform.emit('error', err);\n });\n outputStream = outputStream.pipe(transform);\n\n // dkim and stuff\n for (let i = 0, len = this._processFuncs.length; i < len; i++) {\n transform = this._processFuncs[i];\n outputStream = transform(outputStream);\n }\n\n if (this.newline) {\n const winbreak = ['win', 'windows', 'dos', '\\r\\n'].includes(this.newline.toString().toLowerCase());\n const newlineTransform = winbreak ? new LeWindows() : new LeUnix();\n\n const stream = outputStream.pipe(newlineTransform);\n outputStream.on('error', err => stream.emit('error', err));\n return stream;\n }\n\n return outputStream;\n }\n\n /**\n * Appends a transform stream object to the transforms list. Final output\n * is passed through this stream before exposing\n *\n * @param {Object} transform Read-Write stream\n */\n transform(transform) {\n this._transforms.push(transform);\n }\n\n /**\n * Appends a post process function. The functon is run after transforms and\n * uses the following syntax\n *\n * processFunc(input) -> outputStream\n *\n * @param {Object} processFunc Read-Write stream\n */\n processFunc(processFunc) {\n this._processFuncs.push(processFunc);\n }\n\n stream(outputStream, options, done) {\n const transferEncoding = this.getTransferEncoding();\n let contentStream;\n let localStream;\n\n // protect actual callback against multiple triggering\n let returned = false;\n const callback = err => {\n if (returned) {\n return;\n }\n returned = true;\n done(err);\n };\n\n // for multipart nodes, push child nodes\n // for content nodes end the stream\n const finalize = () => {\n let childId = 0;\n const processChildNode = () => {\n if (childId >= this.childNodes.length) {\n outputStream.write('\\r\\n--' + this.boundary + '--\\r\\n');\n return callback();\n }\n const child = this.childNodes[childId++];\n outputStream.write((childId > 1 ? '\\r\\n' : '') + '--' + this.boundary + '\\r\\n');\n child.stream(outputStream, options, err => {\n if (err) {\n return callback(err);\n }\n setImmediate(processChildNode);\n });\n };\n\n if (this.multipart) {\n setImmediate(processChildNode);\n } else {\n return callback();\n }\n };\n\n // pushes node content\n const sendContent = () => {\n if (this.content) {\n if (Object.prototype.toString.call(this.content) === '[object Error]') {\n // content is already errored\n return callback(this.content);\n }\n\n if (typeof this.content.pipe === 'function') {\n this.content.removeListener('error', this._contentErrorHandler);\n this._contentErrorHandler = err => callback(err);\n this.content.once('error', this._contentErrorHandler);\n }\n\n const createStream = () => {\n if (['quoted-printable', 'base64'].includes(transferEncoding)) {\n contentStream = new (transferEncoding === 'base64' ? base64 : qp).Encoder(options);\n\n contentStream.pipe(outputStream, {\n end: false\n });\n contentStream.once('end', finalize);\n contentStream.once('error', err => callback(err));\n\n localStream = this._getStream(this.content);\n localStream.pipe(contentStream);\n } else {\n // anything that is not QP or Base54 passes as-is\n localStream = this._getStream(this.content);\n localStream.pipe(outputStream, {\n end: false\n });\n localStream.once('end', finalize);\n }\n\n localStream.once('error', err => callback(err));\n };\n\n if (this.content._resolve) {\n const chunks = [];\n let chunklen = 0;\n let returned = false;\n const sourceStream = this._getStream(this.content);\n sourceStream.on('error', err => {\n if (returned) {\n return;\n }\n returned = true;\n callback(err);\n });\n sourceStream.on('readable', () => {\n let chunk;\n while ((chunk = sourceStream.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n sourceStream.on('end', () => {\n if (returned) {\n return;\n }\n returned = true;\n this.content._resolve = false;\n this.content._resolvedValue = Buffer.concat(chunks, chunklen);\n setImmediate(createStream);\n });\n } else {\n setImmediate(createStream);\n }\n return;\n }\n return setImmediate(finalize);\n };\n\n if (this._raw) {\n setImmediate(() => {\n if (Object.prototype.toString.call(this._raw) === '[object Error]') {\n // content is already errored\n return callback(this._raw);\n }\n\n // remove default error handler (if set)\n if (typeof this._raw.pipe === 'function') {\n this._raw.removeListener('error', this._contentErrorHandler);\n }\n\n const raw = this._getStream(this._raw);\n raw.pipe(outputStream, {\n end: false\n });\n raw.on('error', err => outputStream.emit('error', err));\n raw.on('end', finalize);\n });\n } else {\n outputStream.write(this.buildHeaders() + '\\r\\n\\r\\n');\n setImmediate(sendContent);\n }\n }\n\n /**\n * Sets envelope to be used instead of the generated one\n *\n * @return {Object} SMTP envelope in the form of {from: 'from@example.com', to: ['to@example.com']}\n */\n setEnvelope(envelope) {\n let list;\n\n this._envelope = {\n from: false,\n to: []\n };\n\n if (envelope.from) {\n list = [];\n this._convertAddresses(this._parseAddresses(envelope.from), list);\n list = list.filter(address => address && address.address);\n if (list.length && list[0]) {\n this._envelope.from = list[0].address;\n }\n }\n ['to', 'cc', 'bcc'].forEach(key => {\n if (envelope[key]) {\n this._convertAddresses(this._parseAddresses(envelope[key]), this._envelope.to);\n }\n });\n\n this._envelope.to = this._envelope.to.map(to => to.address).filter(address => address);\n\n const standardFields = ['to', 'cc', 'bcc', 'from'];\n Object.keys(envelope).forEach(key => {\n if (!standardFields.includes(key)) {\n this._envelope[key] = envelope[key];\n }\n });\n\n return this;\n }\n\n /**\n * Generates and returns an object with parsed address fields\n *\n * @return {Object} Address object\n */\n getAddresses() {\n const addresses = {};\n\n this._headers.forEach(header => {\n const key = header.key.toLowerCase();\n if (['from', 'sender', 'reply-to', 'to', 'cc', 'bcc'].includes(key)) {\n if (!Array.isArray(addresses[key])) {\n addresses[key] = [];\n }\n\n this._convertAddresses(this._parseAddresses(header.value), addresses[key]);\n }\n });\n\n return addresses;\n }\n\n /**\n * Generates and returns SMTP envelope with the sender address and a list of recipients addresses\n *\n * @return {Object} SMTP envelope in the form of {from: 'from@example.com', to: ['to@example.com']}\n */\n getEnvelope() {\n if (this._envelope) {\n return this._envelope;\n }\n\n const envelope = {\n from: false,\n to: []\n };\n this._headers.forEach(header => {\n const list = [];\n if (header.key === 'From' || (!envelope.from && ['Reply-To', 'Sender'].includes(header.key))) {\n this._convertAddresses(this._parseAddresses(header.value), list);\n if (list.length && list[0]) {\n envelope.from = list[0].address;\n }\n } else if (['To', 'Cc', 'Bcc'].includes(header.key)) {\n this._convertAddresses(this._parseAddresses(header.value), envelope.to);\n }\n });\n\n envelope.to = envelope.to.map(to => to.address);\n\n return envelope;\n }\n\n /**\n * Returns Message-Id value. If it does not exist, then creates one\n *\n * @return {String} Message-Id value\n */\n messageId() {\n let messageId = this.getHeader('Message-ID');\n // You really should define your own Message-Id field!\n if (!messageId) {\n messageId = this._generateMessageId();\n this.setHeader('Message-ID', messageId);\n }\n return messageId;\n }\n\n /**\n * Sets pregenerated content that will be used as the output of this node\n *\n * @param {String|Buffer|Stream} Raw MIME contents\n */\n setRaw(raw) {\n this._raw = raw;\n\n if (this._raw && typeof this._raw.pipe === 'function') {\n // pre-stream handler. might be triggered if a stream is set as content\n // and 'error' fires before anything is done with this stream\n this._contentErrorHandler = err => {\n this._raw.removeListener('error', this._contentErrorHandler);\n this._raw = err;\n };\n this._raw.once('error', this._contentErrorHandler);\n }\n\n return this;\n }\n\n /////// PRIVATE METHODS\n\n /**\n * Detects and returns handle to a stream related with the content.\n *\n * @param {Mixed} content Node content\n * @returns {Object} Stream object\n */\n _getStream(content) {\n let contentStream;\n\n if (content._resolvedValue) {\n // pass string or buffer content as a stream\n contentStream = new PassThrough();\n\n setImmediate(() => {\n try {\n contentStream.end(content._resolvedValue);\n } catch (_err) {\n contentStream.emit('error', _err);\n }\n });\n\n return contentStream;\n }\n\n if (typeof content.pipe === 'function') {\n // assume as stream\n return content;\n }\n\n if (content && typeof content.path === 'string' && !content.href) {\n if (this.disableFileAccess) {\n contentStream = new PassThrough();\n setImmediate(() => {\n const err = new Error('File access rejected for ' + content.path);\n err.code = errors.EFILEACCESS;\n contentStream.emit('error', err);\n });\n return contentStream;\n }\n // read file\n return fs.createReadStream(content.path);\n }\n\n if (content && typeof content.href === 'string') {\n if (this.disableUrlAccess) {\n contentStream = new PassThrough();\n setImmediate(() => {\n const err = new Error('Url access rejected for ' + content.href);\n err.code = errors.EURLACCESS;\n contentStream.emit('error', err);\n });\n return contentStream;\n }\n // fetch URL\n return nmfetch(content.href, { headers: content.httpHeaders });\n }\n\n // pass string or buffer content as a stream\n contentStream = new PassThrough();\n\n setImmediate(() => {\n try {\n contentStream.end(content || '');\n } catch (_err) {\n contentStream.emit('error', _err);\n }\n });\n return contentStream;\n }\n\n /**\n * Parses addresses. Takes in a single address or an array or an\n * array of address arrays (eg. To: [[first group], [second group],...])\n *\n * @param {Mixed} addresses Addresses to be parsed\n * @return {Array} An array of address objects\n */\n _parseAddresses(addresses) {\n return [].concat.apply(\n [],\n [].concat(addresses).map(address => {\n if (address && address.address) {\n address.address = this._normalizeAddress(address.address);\n address.name = address.name || '';\n return [address];\n }\n return addressparser(address);\n })\n );\n }\n\n /**\n * Normalizes a header key, uses Camel-Case form, except for uppercase MIME-\n *\n * @param {String} key Key to be normalized\n * @return {String} key in Camel-Case form\n */\n _normalizeHeaderKey(key) {\n key = (key || '')\n .toString()\n // no newlines in keys\n .replace(/\\r?\\n|\\r/g, ' ')\n .trim()\n .toLowerCase()\n // use uppercase words, except MIME\n .replace(/^X-SMTPAPI$|^(MIME|DKIM|ARC|BIMI)\\b|^[a-z]|-(SPF|FBL|ID|MD5)$|-[a-z]/gi, c => c.toUpperCase())\n // special case\n .replace(/^Content-Features$/i, 'Content-features');\n\n return key;\n }\n\n /**\n * Checks if the content type is multipart and defines boundary if needed.\n * Doesn't return anything, modifies object argument instead.\n *\n * @param {Object} structured Parsed header value for 'Content-Type' key\n */\n _handleContentType(structured) {\n this.contentType = structured.value.trim().toLowerCase();\n\n this.multipart = /^multipart\\//i.test(this.contentType) ? this.contentType.substr(this.contentType.indexOf('/') + 1) : false;\n\n if (this.multipart) {\n this.boundary = structured.params.boundary = structured.params.boundary || this.boundary || this._generateBoundary();\n } else {\n this.boundary = false;\n }\n }\n\n /**\n * Generates a multipart boundary value\n *\n * @return {String} boundary value\n */\n _generateBoundary() {\n return this.rootNode.boundaryPrefix + '-' + this.rootNode.baseBoundary + '-Part_' + this._nodeId;\n }\n\n /**\n * Encodes a header value for use in the generated rfc2822 email.\n *\n * @param {String} key Header key\n * @param {String} value Header value\n */\n _encodeHeaderValue(key, value) {\n key = this._normalizeHeaderKey(key);\n\n switch (key) {\n // Structured headers\n case 'From':\n case 'Sender':\n case 'To':\n case 'Cc':\n case 'Bcc':\n case 'Reply-To':\n return this._convertAddresses(this._parseAddresses(value));\n\n // values enclosed in <>\n case 'Message-ID':\n case 'In-Reply-To':\n case 'Content-Id':\n value = (value || '').toString().replace(/\\r?\\n|\\r/g, ' ');\n\n if (value.charAt(0) !== '<') {\n value = '<' + value;\n }\n\n if (value.charAt(value.length - 1) !== '>') {\n value = value + '>';\n }\n return value;\n\n // space separated list of values enclosed in <>\n case 'References':\n value = [].concat\n .apply(\n [],\n [].concat(value || '').map(elm => {\n elm = (elm || '')\n .toString()\n .replace(/\\r?\\n|\\r/g, ' ')\n .trim();\n return elm.replace(/<[^>]*>/g, str => str.replace(/\\s/g, '')).split(/\\s+/);\n })\n )\n .map(elm => {\n if (elm.charAt(0) !== '<') {\n elm = '<' + elm;\n }\n if (elm.charAt(elm.length - 1) !== '>') {\n elm = elm + '>';\n }\n return elm;\n });\n\n return value.join(' ').trim();\n\n case 'Date':\n if (Object.prototype.toString.call(value) === '[object Date]') {\n return value.toUTCString().replace(/GMT/, '+0000');\n }\n\n value = (value || '').toString().replace(/\\r?\\n|\\r/g, ' ');\n return this._encodeWords(value);\n\n case 'Content-Type':\n case 'Content-Disposition':\n // if it includes a filename then it is already encoded\n return (value || '').toString().replace(/\\r?\\n|\\r/g, ' ');\n\n default:\n value = (value || '').toString().replace(/\\r?\\n|\\r/g, ' ');\n // encodeWords only encodes if needed, otherwise the original string is returned\n return this._encodeWords(value);\n }\n }\n\n /**\n * Rebuilds address object using punycode and other adjustments\n *\n * @param {Array} addresses An array of address objects\n * @param {Array} [uniqueList] An array to be populated with addresses\n * @return {String} address string\n */\n _convertAddresses(addresses, uniqueList) {\n const values = [];\n\n uniqueList = uniqueList || [];\n\n [].concat(addresses || []).forEach(address => {\n if (address.address) {\n address.address = this._normalizeAddress(address.address);\n\n if (!address.name) {\n values.push(address.address.indexOf(' ') >= 0 ? `<${address.address}>` : `${address.address}`);\n } else {\n values.push(`${this._encodeAddressName(address.name)} <${address.address}>`);\n }\n\n if (!uniqueList.some(a => a.address === address.address)) {\n uniqueList.push(address);\n }\n } else if (address.group) {\n const groupListAddresses = (address.group.length ? this._convertAddresses(address.group, uniqueList) : '').trim();\n values.push(`${this._encodeAddressName(address.name)}:${groupListAddresses};`);\n }\n });\n\n return values.join(', ');\n }\n\n /**\n * Normalizes an email address\n *\n * @param {Array} address An array of address objects\n * @return {String} address string\n */\n _normalizeAddress(address) {\n address = (address || '')\n .toString()\n .replace(/[\\x00-\\x1F<>]+/g, ' ') // remove unallowed characters\n .trim();\n\n const lastAt = address.lastIndexOf('@');\n if (lastAt < 0) {\n // Bare username\n return address;\n }\n\n let user = address.substr(0, lastAt);\n const domain = address.substr(lastAt + 1);\n\n // Usernames are not touched and are kept as is even if these include unicode.\n // Domains are punycoded when the local part is ASCII ('safe@jõgeva.ee' -> 'safe@xn--jgeva-dua.ee').\n // When the local part contains non-ASCII bytes the address already requires SMTPUTF8,\n // so the domain is kept (or decoded back) as UTF-8 for symmetry on both sides of '@'.\n\n let encodedDomain = domain;\n\n try {\n if (/[\\x80-\\uFFFF]/.test(user)) {\n encodedDomain = punycode.toUnicode(domain.toLowerCase());\n } else {\n encodedDomain = punycode.toASCII(domain.toLowerCase());\n }\n } catch (_err) {\n // keep domain as supplied\n }\n\n if (user.indexOf(' ') >= 0) {\n if (user.charAt(0) !== '\"') {\n user = '\"' + user;\n }\n if (user.substr(-1) !== '\"') {\n user = user + '\"';\n }\n }\n\n return `${user}@${encodedDomain}`;\n }\n\n /**\n * If needed, mime encodes the name part\n *\n * @param {String} name Name part of an address\n * @returns {String} Mime word encoded string if needed\n */\n _encodeAddressName(name) {\n if (!/^[\\w ]*$/.test(name)) {\n if (/^[\\x20-\\x7e]*$/.test(name)) {\n return '\"' + name.replace(/([\\\\\"])/g, '\\\\$1') + '\"';\n } else {\n return mimeFuncs.encodeWord(name, this._getTextEncoding(name), 52);\n }\n }\n return name;\n }\n\n /**\n * If needed, mime encodes the name part\n *\n * @param {String} name Name part of an address\n * @returns {String} Mime word encoded string if needed\n */\n _encodeWords(value) {\n // set encodeAll parameter to true even though it is against the recommendation of RFC2047,\n // by default only words that include non-ascii should be converted into encoded words\n // but some clients (eg. Zimbra) do not handle it properly and remove surrounding whitespace\n return mimeFuncs.encodeWords(value, this._getTextEncoding(value), 52, true);\n }\n\n /**\n * Detects best mime encoding for a text value\n *\n * @param {String} value Value to check for\n * @return {String} either 'Q' or 'B'\n */\n _getTextEncoding(value) {\n value = (value || '').toString();\n\n if (this.textEncoding) {\n return this.textEncoding;\n }\n\n // count latin alphabet symbols and 8-bit range symbols + control symbols\n // if there are more latin characters, then use quoted-printable\n // encoding, otherwise use base64\n let nonLatinLen = 0;\n let latinLen = 0;\n for (let i = 0, len = value.length; i < len; i++) {\n const code = value.charCodeAt(i);\n if ((code >= 0x00 && code <= 0x08) || code === 0x0b || code === 0x0c || (code >= 0x0e && code <= 0x1f) || code >= 0x80) {\n nonLatinLen++;\n } else if ((code >= 0x41 && code <= 0x5a) || (code >= 0x61 && code <= 0x7a)) {\n latinLen++;\n }\n }\n // if there are more latin symbols than binary/unicode, then prefer Q, otherwise B\n return nonLatinLen < latinLen ? 'Q' : 'B';\n }\n\n /**\n * Generates a message id\n *\n * @return {String} Random Message-ID value\n */\n _generateMessageId() {\n return (\n '<' +\n [2, 2, 2, 6].reduce(\n // crux to generate UUID-like random strings\n (prev, len) => prev + '-' + crypto.randomBytes(len).toString('hex'),\n crypto.randomBytes(4).toString('hex')\n ) +\n '@' +\n // try to use the domain of the FROM address or fallback to server hostname\n (this.getEnvelope().from || this.hostname || 'localhost').split('@').pop() +\n '>'\n );\n }\n}\n\nmodule.exports = MimeNode;\n","/* eslint no-undefined: 0 */\n\n'use strict';\n\nconst MimeNode = require('../mime-node');\nconst mimeFuncs = require('../mime-funcs');\nconst { parseDataURI } = require('../shared');\n\n/**\n * Creates the object for composing a MimeNode instance out from the mail options\n *\n * @constructor\n * @param {Object} mail Mail options\n */\nclass MailComposer {\n constructor(mail) {\n this.mail = mail || {};\n this.message = false;\n }\n\n /**\n * Builds MimeNode instance\n */\n compile() {\n this._alternatives = this.getAlternatives();\n this._htmlNode = this._alternatives.filter(alternative => /^text\\/html\\b/i.test(alternative.contentType)).pop();\n this._attachments = this.getAttachments(!!this._htmlNode);\n\n this._useRelated = !!(this._htmlNode && this._attachments.related.length);\n this._useAlternative = this._alternatives.length > 1;\n this._useMixed = this._attachments.attached.length > 1 || (this._alternatives.length && this._attachments.attached.length === 1);\n\n // Compose MIME tree\n if (this.mail.raw) {\n this.message = new MimeNode('message/rfc822', { newline: this.mail.newline }).setRaw(this.mail.raw);\n } else if (this._useMixed) {\n this.message = this._createMixed();\n } else if (this._useAlternative) {\n this.message = this._createAlternative();\n } else if (this._useRelated) {\n this.message = this._createRelated();\n } else {\n this.message = this._createContentNode(\n false,\n []\n .concat(this._alternatives || [])\n .concat(this._attachments.attached || [])\n .shift() || {\n contentType: 'text/plain',\n content: ''\n }\n );\n }\n\n // Add custom headers\n if (this.mail.headers) {\n this.message.addHeader(this.mail.headers);\n }\n\n // Add headers to the root node, always overrides custom headers\n ['from', 'sender', 'to', 'cc', 'bcc', 'reply-to', 'in-reply-to', 'references', 'subject', 'message-id', 'date'].forEach(header => {\n const key = header.replace(/-(\\w)/g, (o, c) => c.toUpperCase());\n if (this.mail[key]) {\n this.message.setHeader(header, this.mail[key]);\n }\n });\n\n // Sets custom envelope\n if (this.mail.envelope) {\n this.message.setEnvelope(this.mail.envelope);\n }\n\n // ensure Message-Id value\n this.message.messageId();\n\n return this.message;\n }\n\n /**\n * List all attachments. Resulting attachment objects can be used as input for MimeNode nodes\n *\n * @param {Boolean} findRelated If true separate related attachments from attached ones\n * @returns {Object} An object of arrays (`related` and `attached`)\n */\n getAttachments(findRelated) {\n let icalEvent, eventObject;\n const attachments = [].concat(this.mail.attachments || []).map((attachment, i) => {\n if (/^data:/i.test(attachment.path || attachment.href)) {\n attachment = this._processDataUrl(attachment);\n }\n\n const contentType =\n attachment.contentType || mimeFuncs.detectMimeType(attachment.filename || attachment.path || attachment.href || 'bin');\n\n const isImage = /^image\\//i.test(contentType);\n const isMessageNode = /^message\\//i.test(contentType);\n\n const contentDisposition =\n attachment.contentDisposition || (isMessageNode || (isImage && attachment.cid) ? 'inline' : 'attachment');\n\n let contentTransferEncoding;\n if ('contentTransferEncoding' in attachment) {\n // also contains `false`, to set\n contentTransferEncoding = attachment.contentTransferEncoding;\n } else if (isMessageNode) {\n // the content might include non-ASCII bytes but at this point we do not know it yet\n contentTransferEncoding = '8bit';\n } else {\n contentTransferEncoding = 'base64'; // the default\n }\n\n const data = {\n contentType,\n contentDisposition,\n contentTransferEncoding\n };\n\n if (attachment.filename) {\n data.filename = attachment.filename;\n } else if (!isMessageNode && attachment.filename !== false) {\n data.filename = (attachment.path || attachment.href || '').split('/').pop().split('?').shift() || 'attachment-' + (i + 1);\n if (data.filename.indexOf('.') < 0) {\n data.filename += '.' + mimeFuncs.detectExtension(data.contentType);\n }\n }\n\n if (/^https?:\\/\\//i.test(attachment.path)) {\n attachment.href = attachment.path;\n attachment.path = undefined;\n }\n\n if (attachment.cid) {\n data.cid = attachment.cid;\n }\n\n if (attachment.raw) {\n data.raw = attachment.raw;\n } else if (attachment.path) {\n data.content = {\n path: attachment.path\n };\n } else if (attachment.href) {\n data.content = {\n href: attachment.href,\n httpHeaders: attachment.httpHeaders\n };\n } else {\n data.content = attachment.content || '';\n }\n\n if (attachment.encoding) {\n data.encoding = attachment.encoding;\n }\n\n if (attachment.headers) {\n data.headers = attachment.headers;\n }\n\n return data;\n });\n\n if (this.mail.icalEvent) {\n if (\n typeof this.mail.icalEvent === 'object' &&\n (this.mail.icalEvent.content || this.mail.icalEvent.path || this.mail.icalEvent.href || this.mail.icalEvent.raw)\n ) {\n icalEvent = this.mail.icalEvent;\n } else {\n icalEvent = {\n content: this.mail.icalEvent\n };\n }\n\n eventObject = Object.assign({}, icalEvent);\n\n eventObject.contentType = 'application/ics';\n if (!eventObject.headers) {\n eventObject.headers = {};\n }\n eventObject.filename = eventObject.filename || 'invite.ics';\n eventObject.headers['Content-Disposition'] = 'attachment';\n eventObject.headers['Content-Transfer-Encoding'] = 'base64';\n }\n\n if (!findRelated) {\n return {\n attached: attachments.concat(eventObject || []),\n related: []\n };\n }\n\n return {\n attached: attachments.filter(attachment => !attachment.cid).concat(eventObject || []),\n related: attachments.filter(attachment => !!attachment.cid)\n };\n }\n\n /**\n * List alternatives. Resulting objects can be used as input for MimeNode nodes\n *\n * @returns {Array} An array of alternative elements. Includes the `text` and `html` values as well\n */\n getAlternatives() {\n const alternatives = [];\n let text, html, watchHtml, amp, icalEvent, eventObject;\n\n if (this.mail.text) {\n if (\n typeof this.mail.text === 'object' &&\n (this.mail.text.content || this.mail.text.path || this.mail.text.href || this.mail.text.raw)\n ) {\n text = this.mail.text;\n } else {\n text = {\n content: this.mail.text\n };\n }\n text.contentType = 'text/plain; charset=utf-8';\n }\n\n if (this.mail.watchHtml) {\n if (\n typeof this.mail.watchHtml === 'object' &&\n (this.mail.watchHtml.content || this.mail.watchHtml.path || this.mail.watchHtml.href || this.mail.watchHtml.raw)\n ) {\n watchHtml = this.mail.watchHtml;\n } else {\n watchHtml = {\n content: this.mail.watchHtml\n };\n }\n watchHtml.contentType = 'text/watch-html; charset=utf-8';\n }\n\n if (this.mail.amp) {\n if (\n typeof this.mail.amp === 'object' &&\n (this.mail.amp.content || this.mail.amp.path || this.mail.amp.href || this.mail.amp.raw)\n ) {\n amp = this.mail.amp;\n } else {\n amp = {\n content: this.mail.amp\n };\n }\n amp.contentType = 'text/x-amp-html; charset=utf-8';\n }\n\n // NB! when including attachments with a calendar alternative you might end up in a blank screen on some clients\n if (this.mail.icalEvent) {\n if (\n typeof this.mail.icalEvent === 'object' &&\n (this.mail.icalEvent.content || this.mail.icalEvent.path || this.mail.icalEvent.href || this.mail.icalEvent.raw)\n ) {\n icalEvent = this.mail.icalEvent;\n } else {\n icalEvent = {\n content: this.mail.icalEvent\n };\n }\n\n eventObject = Object.assign({}, icalEvent);\n\n if (eventObject.content && typeof eventObject.content === 'object') {\n // we are going to have the same attachment twice, so mark this to be\n // resolved just once\n eventObject.content._resolve = true;\n }\n\n eventObject.filename = false;\n eventObject.contentType =\n 'text/calendar; charset=utf-8; method=' + (eventObject.method || 'PUBLISH').toString().trim().toUpperCase();\n if (!eventObject.headers) {\n eventObject.headers = {};\n }\n }\n\n if (this.mail.html) {\n if (\n typeof this.mail.html === 'object' &&\n (this.mail.html.content || this.mail.html.path || this.mail.html.href || this.mail.html.raw)\n ) {\n html = this.mail.html;\n } else {\n html = {\n content: this.mail.html\n };\n }\n html.contentType = 'text/html; charset=utf-8';\n }\n\n []\n .concat(text || [])\n .concat(watchHtml || [])\n .concat(amp || [])\n .concat(html || [])\n .concat(eventObject || [])\n .concat(this.mail.alternatives || [])\n .forEach(alternative => {\n if (/^data:/i.test(alternative.path || alternative.href)) {\n alternative = this._processDataUrl(alternative);\n }\n\n const data = {\n contentType:\n alternative.contentType ||\n mimeFuncs.detectMimeType(alternative.filename || alternative.path || alternative.href || 'txt'),\n contentTransferEncoding: alternative.contentTransferEncoding\n };\n\n if (alternative.filename) {\n data.filename = alternative.filename;\n }\n\n if (/^https?:\\/\\//i.test(alternative.path)) {\n alternative.href = alternative.path;\n alternative.path = undefined;\n }\n\n if (alternative.raw) {\n data.raw = alternative.raw;\n } else if (alternative.path) {\n data.content = {\n path: alternative.path\n };\n } else if (alternative.href) {\n data.content = {\n href: alternative.href\n };\n } else {\n data.content = alternative.content || '';\n }\n\n if (alternative.encoding) {\n data.encoding = alternative.encoding;\n }\n\n if (alternative.headers) {\n data.headers = alternative.headers;\n }\n\n alternatives.push(data);\n });\n\n return alternatives;\n }\n\n /**\n * Builds multipart/mixed node. It should always contain different type of elements on the same level\n * eg. text + attachments\n *\n * @param {Object} parentNode Parent for this note. If it does not exist, a root node is created\n * @returns {Object} MimeNode node element\n */\n _createMixed(parentNode) {\n const node = parentNode\n ? parentNode.createChild('multipart/mixed', {\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n })\n : new MimeNode('multipart/mixed', {\n baseBoundary: this.mail.baseBoundary,\n textEncoding: this.mail.textEncoding,\n boundaryPrefix: this.mail.boundaryPrefix,\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n });\n\n if (this._useAlternative) {\n this._createAlternative(node);\n } else if (this._useRelated) {\n this._createRelated(node);\n }\n\n []\n .concat((!this._useAlternative && this._alternatives) || [])\n .concat(this._attachments.attached || [])\n .forEach(element => {\n // if the element is a html node from related subpart then ignore it\n if (!this._useRelated || element !== this._htmlNode) {\n this._createContentNode(node, element);\n }\n });\n\n return node;\n }\n\n /**\n * Builds multipart/alternative node. It should always contain same type of elements on the same level\n * eg. text + html view of the same data\n *\n * @param {Object} parentNode Parent for this note. If it does not exist, a root node is created\n * @returns {Object} MimeNode node element\n */\n _createAlternative(parentNode) {\n const node = parentNode\n ? parentNode.createChild('multipart/alternative', {\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n })\n : new MimeNode('multipart/alternative', {\n baseBoundary: this.mail.baseBoundary,\n textEncoding: this.mail.textEncoding,\n boundaryPrefix: this.mail.boundaryPrefix,\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n });\n\n this._alternatives.forEach(alternative => {\n if (this._useRelated && this._htmlNode === alternative) {\n this._createRelated(node);\n } else {\n this._createContentNode(node, alternative);\n }\n });\n\n return node;\n }\n\n /**\n * Builds multipart/related node. It should always contain html node with related attachments\n *\n * @param {Object} parentNode Parent for this note. If it does not exist, a root node is created\n * @returns {Object} MimeNode node element\n */\n _createRelated(parentNode) {\n const node = parentNode\n ? parentNode.createChild('multipart/related; type=\"text/html\"', {\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n })\n : new MimeNode('multipart/related; type=\"text/html\"', {\n baseBoundary: this.mail.baseBoundary,\n textEncoding: this.mail.textEncoding,\n boundaryPrefix: this.mail.boundaryPrefix,\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n });\n\n this._createContentNode(node, this._htmlNode);\n\n this._attachments.related.forEach(alternative => this._createContentNode(node, alternative));\n\n return node;\n }\n\n /**\n * Creates a regular node with contents\n *\n * @param {Object} parentNode Parent for this note. If it does not exist, a root node is created\n * @param {Object} element Node data\n * @returns {Object} MimeNode node element\n */\n _createContentNode(parentNode, element) {\n element = element || {};\n element.content = element.content || '';\n\n const encoding = (element.encoding || 'utf8')\n .toString()\n .toLowerCase()\n .replace(/[-_\\s]/g, '');\n\n const node = parentNode\n ? parentNode.createChild(element.contentType, {\n filename: element.filename,\n textEncoding: this.mail.textEncoding,\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n })\n : new MimeNode(element.contentType, {\n filename: element.filename,\n baseBoundary: this.mail.baseBoundary,\n textEncoding: this.mail.textEncoding,\n boundaryPrefix: this.mail.boundaryPrefix,\n disableUrlAccess: this.mail.disableUrlAccess,\n disableFileAccess: this.mail.disableFileAccess,\n normalizeHeaderKey: this.mail.normalizeHeaderKey,\n newline: this.mail.newline\n });\n\n // add custom headers\n if (element.headers) {\n node.addHeader(element.headers);\n }\n\n if (element.cid) {\n node.setHeader('Content-Id', '<' + element.cid.replace(/[<>]/g, '') + '>');\n }\n\n if (element.contentTransferEncoding) {\n node.setHeader('Content-Transfer-Encoding', element.contentTransferEncoding);\n } else if (this.mail.encoding && /^text\\//i.test(element.contentType)) {\n node.setHeader('Content-Transfer-Encoding', this.mail.encoding);\n }\n\n if (!/^text\\//i.test(element.contentType) || element.contentDisposition) {\n node.setHeader(\n 'Content-Disposition',\n element.contentDisposition || (element.cid && /^image\\//i.test(element.contentType) ? 'inline' : 'attachment')\n );\n }\n\n if (typeof element.content === 'string' && !['utf8', 'usascii', 'ascii'].includes(encoding)) {\n element.content = Buffer.from(element.content, encoding);\n }\n\n // prefer pregenerated raw content\n if (element.raw) {\n node.setRaw(element.raw);\n } else {\n node.setContent(element.content);\n }\n\n return node;\n }\n\n /**\n * Parses data uri and converts it to a Buffer\n *\n * @param {Object} element Content element\n * @return {Object} Parsed element\n */\n _processDataUrl(element) {\n const dataUrl = element.path || element.href;\n\n // Early validation to prevent ReDoS\n if (!dataUrl || typeof dataUrl !== 'string') {\n return element;\n }\n\n if (!dataUrl.startsWith('data:')) {\n return element;\n }\n\n if (dataUrl.length > 52428800) {\n // 52428800 chars = 50MB limit for data URL string (~37.5MB decoded image)\n // Extract content type before rejecting to preserve MIME type\n let detectedType = 'application/octet-stream';\n const commaPos = dataUrl.indexOf(',');\n\n if (commaPos > 0 && commaPos < 200) {\n // Parse header safely with size limit\n const header = dataUrl.substring(5, commaPos); // skip 'data:'\n const parts = header.split(';');\n if (parts[0] && parts[0].includes('/')) {\n detectedType = parts[0].trim();\n }\n }\n\n // Return empty content for excessively long data URLs\n return Object.assign({}, element, {\n path: false,\n href: false,\n content: Buffer.alloc(0),\n contentType: element.contentType || detectedType\n });\n }\n\n let parsedDataUri;\n try {\n parsedDataUri = parseDataURI(dataUrl);\n } catch (_err) {\n return element;\n }\n\n if (!parsedDataUri) {\n return element;\n }\n\n element.content = parsedDataUri.data;\n element.contentType = element.contentType || parsedDataUri.contentType;\n\n if ('path' in element) {\n element.path = false;\n }\n\n if ('href' in element) {\n element.href = false;\n }\n\n return element;\n }\n}\n\nmodule.exports = MailComposer;\n","'use strict';\n\nconst { Transform } = require('stream');\n\n/**\n * MessageParser instance is a transform stream that separates message headers\n * from the rest of the body. Headers are emitted with the 'headers' event. Message\n * body is passed on as the resulting stream.\n */\nclass MessageParser extends Transform {\n constructor(options) {\n super(options);\n this.lastBytes = Buffer.alloc(4);\n this.headersParsed = false;\n this.headerBytes = 0;\n this.headerChunks = [];\n this.rawHeaders = false;\n this.bodySize = 0;\n }\n\n /**\n * Keeps count of the last 4 bytes in order to detect line breaks on chunk boundaries\n *\n * @param {Buffer} data Next data chunk from the stream\n */\n updateLastBytes(data) {\n const lblen = this.lastBytes.length;\n const nblen = Math.min(data.length, lblen);\n\n // shift existing bytes\n for (let i = 0, len = lblen - nblen; i < len; i++) {\n this.lastBytes[i] = this.lastBytes[i + nblen];\n }\n\n // add new bytes\n for (let i = 1; i <= nblen; i++) {\n this.lastBytes[lblen - i] = data[data.length - i];\n }\n }\n\n /**\n * Finds and removes message headers from the remaining body. We want to keep\n * headers separated until final delivery to be able to modify these\n *\n * @param {Buffer} data Next chunk of data\n * @return {Boolean} Returns true if headers are already found or false otherwise\n */\n checkHeaders(data) {\n if (this.headersParsed) {\n return true;\n }\n\n const lblen = this.lastBytes.length;\n let headerPos = 0;\n for (let i = 0, len = this.lastBytes.length + data.length; i < len; i++) {\n let chr;\n if (i < lblen) {\n chr = this.lastBytes[i];\n } else {\n chr = data[i - lblen];\n }\n if (chr === 0x0a && i) {\n const pr1 = i - 1 < lblen ? this.lastBytes[i - 1] : data[i - 1 - lblen];\n const pr2 = i > 1 ? (i - 2 < lblen ? this.lastBytes[i - 2] : data[i - 2 - lblen]) : false;\n if (pr1 === 0x0a) {\n this.headersParsed = true;\n headerPos = i - lblen + 1;\n this.headerBytes += headerPos;\n break;\n } else if (pr1 === 0x0d && pr2 === 0x0a) {\n this.headersParsed = true;\n headerPos = i - lblen + 1;\n this.headerBytes += headerPos;\n break;\n }\n }\n }\n\n if (this.headersParsed) {\n this.headerChunks.push(data.slice(0, headerPos));\n this.rawHeaders = Buffer.concat(this.headerChunks, this.headerBytes);\n this.headerChunks = null;\n this.emit('headers', this.parseHeaders());\n if (data.length - 1 > headerPos) {\n const chunk = data.slice(headerPos);\n this.bodySize += chunk.length;\n // this would be the first chunk of data sent downstream\n setImmediate(() => this.push(chunk));\n }\n return false;\n }\n\n this.headerBytes += data.length;\n this.headerChunks.push(data);\n\n // store last 4 bytes to catch header break\n this.updateLastBytes(data);\n\n return false;\n }\n\n _transform(chunk, encoding, callback) {\n if (!chunk || !chunk.length) {\n return callback();\n }\n\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding);\n }\n\n let headersFound;\n\n try {\n headersFound = this.checkHeaders(chunk);\n } catch (E) {\n return callback(E);\n }\n\n if (headersFound) {\n this.bodySize += chunk.length;\n this.push(chunk);\n }\n\n setImmediate(callback);\n }\n\n _flush(callback) {\n if (this.headerChunks) {\n const chunk = Buffer.concat(this.headerChunks, this.headerBytes);\n this.bodySize += chunk.length;\n this.push(chunk);\n this.headerChunks = null;\n }\n callback();\n }\n\n parseHeaders() {\n const lines = (this.rawHeaders || '').toString().split(/\\r?\\n/);\n for (let i = lines.length - 1; i > 0; i--) {\n if (/^\\s/.test(lines[i])) {\n lines[i - 1] += '\\n' + lines[i];\n lines.splice(i, 1);\n }\n }\n return lines\n .filter(line => line.trim())\n .map(line => ({\n key: line.substr(0, line.indexOf(':')).trim().toLowerCase(),\n line\n }));\n }\n}\n\nmodule.exports = MessageParser;\n","'use strict';\n\n// streams through a message body and calculates relaxed body hash\n\nconst { Transform } = require('stream');\nconst crypto = require('crypto');\n\nclass RelaxedBody extends Transform {\n constructor(options) {\n super();\n options = options || {};\n this.chunkBuffer = [];\n this.chunkBufferLen = 0;\n this.bodyHash = crypto.createHash(options.hashAlgo || 'sha1');\n this.remainder = '';\n this.byteLength = 0;\n\n this.debug = options.debug;\n this._debugBody = options.debug ? [] : false;\n }\n\n updateHash(chunk) {\n let bodyStr;\n\n // find next remainder\n let nextRemainder = '';\n\n // This crux finds and removes the spaces from the last line and the newline characters after the last non-empty line\n // If we get another chunk that does not match this description then we can restore the previously processed data\n let state = 'file';\n for (let i = chunk.length - 1; i >= 0; i--) {\n const c = chunk[i];\n\n if (state === 'file' && (c === 0x0a || c === 0x0d)) {\n // do nothing, found \\n or \\r at the end of chunk, stil end of file\n } else if (state === 'file' && (c === 0x09 || c === 0x20)) {\n // switch to line ending mode, this is the last non-empty line\n state = 'line';\n } else if (state === 'line' && (c === 0x09 || c === 0x20)) {\n // do nothing, found ' ' or \\t at the end of line, keep processing the last non-empty line\n } else if (state === 'file' || state === 'line') {\n // non line/file ending character found, switch to body mode\n state = 'body';\n if (i === chunk.length - 1) {\n // final char is not part of line end or file end, so do nothing\n break;\n }\n }\n\n if (i === 0) {\n // reached to the beginning of the chunk, check if it is still about the ending\n // and if the remainder also matches\n if (\n (state === 'file' && (!this.remainder || /[\\r\\n]$/.test(this.remainder))) ||\n (state === 'line' && (!this.remainder || /[ \\t]$/.test(this.remainder)))\n ) {\n // keep everything\n this.remainder += chunk.toString('binary');\n return;\n } else if (state === 'line' || state === 'file') {\n // process existing remainder as normal line but store the current chunk\n nextRemainder = chunk.toString('binary');\n chunk = false;\n break;\n }\n }\n\n if (state !== 'body') {\n continue;\n }\n\n // reached first non ending byte\n nextRemainder = chunk.slice(i + 1).toString('binary');\n chunk = chunk.slice(0, i + 1);\n break;\n }\n\n let needsFixing = !!this.remainder;\n if (chunk && !needsFixing) {\n // check if we even need to change anything\n for (let i = 0, len = chunk.length; i < len; i++) {\n if (i && chunk[i] === 0x0a && chunk[i - 1] !== 0x0d) {\n // missing \\r before \\n\n needsFixing = true;\n break;\n } else if (i && chunk[i] === 0x0d && chunk[i - 1] === 0x20) {\n // trailing WSP found\n needsFixing = true;\n break;\n } else if (i && chunk[i] === 0x20 && chunk[i - 1] === 0x20) {\n // multiple spaces found, needs to be replaced with just one\n needsFixing = true;\n break;\n } else if (chunk[i] === 0x09) {\n // TAB found, needs to be replaced with a space\n needsFixing = true;\n break;\n }\n }\n }\n\n if (needsFixing) {\n bodyStr = this.remainder + (chunk ? chunk.toString('binary') : '');\n this.remainder = nextRemainder;\n bodyStr = bodyStr\n .replace(/\\r?\\n/g, '\\n') // use js line endings\n .replace(/[ \\t]*$/gm, '') // remove line endings, rtrim\n .replace(/[ \\t]+/gm, ' ') // single spaces\n .replace(/\\n/g, '\\r\\n'); // restore rfc822 line endings\n chunk = Buffer.from(bodyStr, 'binary');\n } else if (nextRemainder) {\n this.remainder = nextRemainder;\n }\n\n if (this.debug) {\n this._debugBody.push(chunk);\n }\n this.bodyHash.update(chunk);\n }\n\n _transform(chunk, encoding, callback) {\n if (!chunk || !chunk.length) {\n return callback();\n }\n\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk, encoding);\n }\n\n this.updateHash(chunk);\n\n this.byteLength += chunk.length;\n this.push(chunk);\n callback();\n }\n\n _flush(callback) {\n // generate final hash and emit it\n if (/[\\r\\n]$/.test(this.remainder) && this.byteLength > 2) {\n // add terminating line end\n this.bodyHash.update(Buffer.from('\\r\\n'));\n }\n if (!this.byteLength) {\n // emit empty line buffer to keep the stream flowing\n this.push(Buffer.from('\\r\\n'));\n // this.bodyHash.update(Buffer.from('\\r\\n'));\n }\n\n this.emit('hash', this.bodyHash.digest('base64'), this.debug ? Buffer.concat(this._debugBody) : false);\n callback();\n }\n}\n\nmodule.exports = RelaxedBody;\n","'use strict';\n\nconst punycode = require('../punycode');\nconst mimeFuncs = require('../mime-funcs');\nconst crypto = require('crypto');\n\n/**\n * Returns DKIM signature header line\n *\n * @param {Object} headers Parsed headers object from MessageParser\n * @param {String} bodyHash Base64 encoded hash of the message\n * @param {Object} options DKIM options\n * @param {String} options.domainName Domain name to be signed for\n * @param {String} options.keySelector DKIM key selector to use\n * @param {String} options.privateKey DKIM private key to use\n * @return {String} Complete header line\n */\n\nmodule.exports = (headers, hashAlgo, bodyHash, options) => {\n options = options || {};\n\n // all listed fields from RFC4871 #5.5\n const defaultFieldNames =\n 'From:Sender:Reply-To:Subject:Date:Message-ID:To:' +\n 'Cc:MIME-Version:Content-Type:Content-Transfer-Encoding:Content-ID:' +\n 'Content-Description:Resent-Date:Resent-From:Resent-Sender:' +\n 'Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:' +\n 'List-Id:List-Help:List-Unsubscribe:List-Subscribe:List-Post:' +\n 'List-Owner:List-Archive';\n\n const fieldNames = options.headerFieldNames || defaultFieldNames;\n\n const canonicalizedHeaderData = relaxedHeaders(headers, fieldNames, options.skipFields);\n const dkimHeader = generateDKIMHeader(options.domainName, options.keySelector, canonicalizedHeaderData.fieldNames, hashAlgo, bodyHash);\n\n canonicalizedHeaderData.headers += 'dkim-signature:' + relaxedHeaderLine(dkimHeader);\n\n const signer = crypto.createSign(('rsa-' + hashAlgo).toUpperCase());\n signer.update(canonicalizedHeaderData.headers);\n let signature;\n try {\n signature = signer.sign(options.privateKey, 'base64');\n } catch (_E) {\n return false;\n }\n\n return dkimHeader + signature.replace(/(^.{73}|.{75}(?!\\r?\\n|\\r))/g, '$&\\r\\n ').trim();\n};\n\nmodule.exports.relaxedHeaders = relaxedHeaders;\n\nfunction generateDKIMHeader(domainName, keySelector, fieldNames, hashAlgo, bodyHash) {\n const dkim = [\n 'v=1',\n 'a=rsa-' + hashAlgo,\n 'c=relaxed/relaxed',\n 'd=' + punycode.toASCII(domainName),\n 'q=dns/txt',\n 's=' + keySelector,\n 'bh=' + bodyHash,\n 'h=' + fieldNames\n ].join('; ');\n\n return mimeFuncs.foldLines('DKIM-Signature: ' + dkim, 76) + ';\\r\\n b=';\n}\n\nfunction relaxedHeaders(headers, fieldNames, skipFields) {\n const includedFields = new Set();\n const skip = new Set();\n const headerFields = new Map();\n\n (skipFields || '')\n .toLowerCase()\n .split(':')\n .forEach(field => {\n skip.add(field.trim());\n });\n\n (fieldNames || '')\n .toLowerCase()\n .split(':')\n .filter(field => !skip.has(field.trim()))\n .forEach(field => {\n includedFields.add(field.trim());\n });\n\n for (let i = headers.length - 1; i >= 0; i--) {\n const line = headers[i];\n // only include the first value from bottom to top\n if (includedFields.has(line.key) && !headerFields.has(line.key)) {\n headerFields.set(line.key, relaxedHeaderLine(line.line));\n }\n }\n\n const headersList = [];\n const fields = [];\n includedFields.forEach(field => {\n if (headerFields.has(field)) {\n fields.push(field);\n headersList.push(field + ':' + headerFields.get(field));\n }\n });\n\n return {\n headers: headersList.join('\\r\\n') + '\\r\\n',\n fieldNames: fields.join(':')\n };\n}\n\nfunction relaxedHeaderLine(line) {\n return line\n .substr(line.indexOf(':') + 1)\n .replace(/\\r?\\n/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n","'use strict';\n\n// FIXME:\n// replace this Transform mess with a method that pipes input argument to output argument\n\nconst MessageParser = require('./message-parser');\nconst RelaxedBody = require('./relaxed-body');\nconst sign = require('./sign');\nconst { PassThrough } = require('stream');\nconst fs = require('fs');\nconst path = require('path');\nconst crypto = require('crypto');\n\nconst DKIM_ALGO = 'sha256';\nconst MAX_MESSAGE_SIZE = 2 * 1024 * 1024; // buffer messages larger than this to disk\n\n/*\n// Usage:\n\nlet dkim = new DKIM({\n domainName: 'example.com',\n keySelector: 'key-selector',\n privateKey,\n cacheDir: '/tmp'\n});\ndkim.sign(input).pipe(process.stdout);\n\n// Where inputStream is a rfc822 message (either a stream, string or Buffer)\n// and outputStream is a DKIM signed rfc822 message\n*/\n\nclass DKIMSigner {\n constructor(options, keys, input, output) {\n this.options = options || {};\n this.keys = keys;\n\n this.cacheTreshold = Number(this.options.cacheTreshold) || MAX_MESSAGE_SIZE;\n this.hashAlgo = this.options.hashAlgo || DKIM_ALGO;\n\n this.cacheDir = this.options.cacheDir || false;\n\n this.chunks = [];\n this.chunklen = 0;\n this.readPos = 0;\n this.cachePath = this.cacheDir\n ? path.join(this.cacheDir, 'message.' + Date.now() + '-' + crypto.randomBytes(14).toString('hex'))\n : false;\n this.cache = false;\n\n this.headers = false;\n this.bodyHash = false;\n this.parser = false;\n this.relaxedBody = false;\n\n this.input = input;\n this.output = output;\n this.output.usingCache = false;\n\n this.hasErrored = false;\n\n this.input.on('error', err => {\n this.hasErrored = true;\n this.cleanup();\n output.emit('error', err);\n });\n }\n\n cleanup() {\n if (!this.cache || !this.cachePath) {\n return;\n }\n fs.unlink(this.cachePath, () => false);\n }\n\n createReadCache() {\n // pipe remainings to cache file\n this.cache = fs.createReadStream(this.cachePath);\n this.cache.once('error', err => {\n this.cleanup();\n this.output.emit('error', err);\n });\n this.cache.once('close', () => {\n this.cleanup();\n });\n this.cache.pipe(this.output);\n }\n\n sendNextChunk() {\n if (this.hasErrored) {\n return;\n }\n\n if (this.readPos >= this.chunks.length) {\n if (!this.cache) {\n return this.output.end();\n }\n return this.createReadCache();\n }\n const chunk = this.chunks[this.readPos++];\n if (this.output.write(chunk) === false) {\n return this.output.once('drain', () => {\n this.sendNextChunk();\n });\n }\n setImmediate(() => this.sendNextChunk());\n }\n\n sendSignedOutput() {\n let keyPos = 0;\n const signNextKey = () => {\n if (keyPos >= this.keys.length) {\n this.output.write(this.parser.rawHeaders);\n return setImmediate(() => this.sendNextChunk());\n }\n const key = this.keys[keyPos++];\n const dkimField = sign(this.headers, this.hashAlgo, this.bodyHash, {\n domainName: key.domainName,\n keySelector: key.keySelector,\n privateKey: key.privateKey,\n headerFieldNames: this.options.headerFieldNames,\n skipFields: this.options.skipFields\n });\n if (dkimField) {\n this.output.write(Buffer.from(dkimField + '\\r\\n'));\n }\n return setImmediate(signNextKey);\n };\n\n if (this.bodyHash && this.headers) {\n return signNextKey();\n }\n\n this.output.write(this.parser.rawHeaders);\n this.sendNextChunk();\n }\n\n createWriteCache() {\n this.output.usingCache = true;\n // pipe remainings to cache file\n this.cache = fs.createWriteStream(this.cachePath);\n this.cache.once('error', err => {\n this.cleanup();\n // drain input\n this.relaxedBody.unpipe(this.cache);\n this.relaxedBody.on('readable', () => {\n while (this.relaxedBody.read() !== null) {\n // do nothing\n }\n });\n this.hasErrored = true;\n // emit error\n this.output.emit('error', err);\n });\n this.cache.once('close', () => {\n this.sendSignedOutput();\n });\n this.relaxedBody.removeAllListeners('readable');\n this.relaxedBody.pipe(this.cache);\n }\n\n signStream() {\n this.parser = new MessageParser();\n this.relaxedBody = new RelaxedBody({\n hashAlgo: this.hashAlgo\n });\n\n this.parser.on('headers', value => {\n this.headers = value;\n });\n\n this.relaxedBody.on('hash', value => {\n this.bodyHash = value;\n });\n\n this.relaxedBody.on('readable', () => {\n let chunk;\n if (this.cache) {\n return;\n }\n while ((chunk = this.relaxedBody.read()) !== null) {\n this.chunks.push(chunk);\n this.chunklen += chunk.length;\n if (this.chunklen >= this.cacheTreshold && this.cachePath) {\n return this.createWriteCache();\n }\n }\n });\n\n this.relaxedBody.on('end', () => {\n if (this.cache) {\n return;\n }\n this.sendSignedOutput();\n });\n\n this.parser.pipe(this.relaxedBody);\n setImmediate(() => this.input.pipe(this.parser));\n }\n}\n\nclass DKIM {\n constructor(options) {\n this.options = options || {};\n this.keys = [].concat(\n this.options.keys || {\n domainName: options.domainName,\n keySelector: options.keySelector,\n privateKey: options.privateKey\n }\n );\n }\n\n sign(input, extraOptions) {\n const output = new PassThrough();\n let inputStream = input;\n let writeValue = false;\n\n if (Buffer.isBuffer(input)) {\n writeValue = input;\n inputStream = new PassThrough();\n } else if (typeof input === 'string') {\n writeValue = Buffer.from(input);\n inputStream = new PassThrough();\n }\n\n let options = this.options;\n if (extraOptions && Object.keys(extraOptions).length) {\n options = Object.assign({}, extraOptions, this.options);\n }\n\n const signer = new DKIMSigner(options, this.keys, inputStream, output);\n setImmediate(() => {\n signer.signStream();\n if (writeValue) {\n setImmediate(() => {\n inputStream.end(writeValue);\n });\n }\n });\n\n return output;\n }\n}\n\nmodule.exports = DKIM;\n","'use strict';\n\n/**\n * Minimal HTTP/S proxy client\n */\n\nconst net = require('net');\nconst tls = require('tls');\nconst urllib = require('url');\nconst errors = require('../errors');\n\n/**\n * Establishes proxied connection to destinationPort\n *\n * httpProxyClient(\"http://localhost:3128/\", 80, \"google.com\", function(err, socket){\n * socket.write(\"GET / HTTP/1.0\\r\\n\\r\\n\");\n * });\n *\n * @param {String} proxyUrl proxy configuration, etg \"http://proxy.host:3128/\"\n * @param {Number} destinationPort Port to open in destination host\n * @param {String} destinationHost Destination hostname\n * @param {Function} callback Callback to run with the rocket object once connection is established\n */\nfunction httpProxyClient(proxyUrl, destinationPort, destinationHost, callback) {\n const proxy = urllib.parse(proxyUrl);\n\n const options = {\n host: proxy.hostname,\n port: Number(proxy.port) ? Number(proxy.port) : proxy.protocol === 'https:' ? 443 : 80\n };\n\n let connect;\n if (proxy.protocol === 'https:') {\n // we can use untrusted proxies as long as we verify actual SMTP certificates\n options.rejectUnauthorized = false;\n connect = tls.connect.bind(tls);\n } else {\n connect = net.connect.bind(net);\n }\n\n let socket;\n\n // Error harness for initial connection. Once connection is established, the responsibility\n // to handle errors is passed to whoever uses this socket\n let finished = false;\n const tempSocketErr = err => {\n if (finished) {\n return;\n }\n finished = true;\n try {\n socket.destroy();\n } catch (_E) {\n // ignore\n }\n callback(err);\n };\n\n const timeoutErr = () => {\n const err = new Error('Proxy socket timed out');\n err.code = 'ETIMEDOUT';\n tempSocketErr(err);\n };\n\n socket = connect(options, () => {\n if (finished) {\n return;\n }\n\n const reqHeaders = {\n Host: destinationHost + ':' + destinationPort,\n Connection: 'close'\n };\n if (proxy.auth) {\n reqHeaders['Proxy-Authorization'] = 'Basic ' + Buffer.from(proxy.auth).toString('base64');\n }\n\n socket.write(\n // HTTP method\n 'CONNECT ' +\n destinationHost +\n ':' +\n destinationPort +\n ' HTTP/1.1\\r\\n' +\n // HTTP request headers\n Object.keys(reqHeaders)\n .map(key => key + ': ' + reqHeaders[key])\n .join('\\r\\n') +\n // End request\n '\\r\\n\\r\\n'\n );\n\n let headers = '';\n const onSocketData = chunk => {\n let match;\n let remainder;\n\n if (finished) {\n return;\n }\n\n headers += chunk.toString('binary');\n if ((match = headers.match(/\\r\\n\\r\\n/))) {\n socket.removeListener('data', onSocketData);\n\n remainder = headers.substr(match.index + match[0].length);\n headers = headers.substr(0, match.index);\n if (remainder) {\n socket.unshift(Buffer.from(remainder, 'binary'));\n }\n\n // proxy connection is now established\n finished = true;\n\n // check response code\n match = headers.match(/^HTTP\\/\\d+\\.\\d+ (\\d+)/i);\n if (!match || (match[1] || '').charAt(0) !== '2') {\n try {\n socket.destroy();\n } catch (_E) {\n // ignore\n }\n const err = new Error('Invalid response from proxy' + ((match && ': ' + match[1]) || ''));\n err.code = errors.EPROXY;\n return callback(err);\n }\n\n socket.removeListener('error', tempSocketErr);\n socket.removeListener('timeout', timeoutErr);\n socket.setTimeout(0);\n\n return callback(null, socket);\n }\n };\n socket.on('data', onSocketData);\n });\n\n socket.setTimeout(httpProxyClient.timeout || 30 * 1000);\n socket.on('timeout', timeoutErr);\n\n socket.once('error', tempSocketErr);\n}\n\nmodule.exports = httpProxyClient;\n","'use strict';\n\nconst shared = require('../shared');\nconst MimeNode = require('../mime-node');\nconst mimeFuncs = require('../mime-funcs');\n\nclass MailMessage {\n constructor(mailer, data) {\n this.mailer = mailer;\n this.data = {};\n this.message = null;\n\n data = data || {};\n const options = mailer.options || {};\n const defaults = mailer._defaults || {};\n\n Object.assign(this.data, data);\n\n this.data.headers = this.data.headers || {};\n\n // apply defaults\n Object.keys(defaults).forEach(key => {\n if (!(key in this.data)) {\n this.data[key] = defaults[key];\n } else if (key === 'headers') {\n // headers is a special case. Allow setting individual default headers\n Object.keys(defaults.headers).forEach(key => {\n if (!(key in this.data.headers)) {\n this.data.headers[key] = defaults.headers[key];\n }\n });\n }\n });\n\n // force specific keys from transporter options\n ['disableFileAccess', 'disableUrlAccess', 'normalizeHeaderKey'].forEach(key => {\n if (key in options) {\n this.data[key] = options[key];\n }\n });\n }\n\n resolveContent(...args) {\n return shared.resolveContent(...args);\n }\n\n resolveAll(callback) {\n const keys = [\n [this.data, 'html'],\n [this.data, 'text'],\n [this.data, 'watchHtml'],\n [this.data, 'amp'],\n [this.data, 'icalEvent']\n ];\n\n if (this.data.alternatives && this.data.alternatives.length) {\n this.data.alternatives.forEach((alternative, i) => {\n keys.push([this.data.alternatives, i]);\n });\n }\n\n if (this.data.attachments && this.data.attachments.length) {\n this.data.attachments.forEach((attachment, i) => {\n if (!attachment.filename) {\n attachment.filename =\n (attachment.path || attachment.href || '').split('/').pop().split('?').shift() || 'attachment-' + (i + 1);\n if (attachment.filename.indexOf('.') < 0) {\n attachment.filename += '.' + mimeFuncs.detectExtension(attachment.contentType);\n }\n }\n\n if (!attachment.contentType) {\n attachment.contentType = mimeFuncs.detectMimeType(attachment.filename || attachment.path || attachment.href || 'bin');\n }\n\n keys.push([this.data.attachments, i]);\n });\n }\n\n const mimeNode = new MimeNode();\n\n const addressKeys = ['from', 'to', 'cc', 'bcc', 'sender', 'replyTo'];\n\n addressKeys.forEach(address => {\n let value;\n if (this.message) {\n value = [].concat(mimeNode._parseAddresses(this.message.getHeader(address === 'replyTo' ? 'reply-to' : address)) || []);\n } else if (this.data[address]) {\n value = [].concat(mimeNode._parseAddresses(this.data[address]) || []);\n }\n if (value && value.length) {\n this.data[address] = value;\n } else if (address in this.data) {\n this.data[address] = null;\n }\n });\n\n const singleKeys = ['from', 'sender'];\n singleKeys.forEach(address => {\n if (this.data[address]) {\n this.data[address] = this.data[address].shift();\n }\n });\n\n let pos = 0;\n const resolveNext = () => {\n if (pos >= keys.length) {\n return callback(null, this.data);\n }\n const args = keys[pos++];\n if (!args[0] || !args[0][args[1]]) {\n return resolveNext();\n }\n shared.resolveContent(\n ...args,\n { disableFileAccess: this.data.disableFileAccess, disableUrlAccess: this.data.disableUrlAccess },\n (err, value) => {\n if (err) {\n return callback(err);\n }\n\n const node = {\n content: value\n };\n if (args[0][args[1]] && typeof args[0][args[1]] === 'object' && !Buffer.isBuffer(args[0][args[1]])) {\n Object.keys(args[0][args[1]]).forEach(key => {\n if (!(key in node) && !['content', 'path', 'href', 'raw'].includes(key)) {\n node[key] = args[0][args[1]][key];\n }\n });\n }\n\n args[0][args[1]] = node;\n resolveNext();\n }\n );\n };\n\n setImmediate(() => resolveNext());\n }\n\n normalize(callback) {\n const envelope = this.data.envelope || this.message.getEnvelope();\n const messageId = this.message.messageId();\n\n this.resolveAll((err, data) => {\n if (err) {\n return callback(err);\n }\n\n data.envelope = envelope;\n data.messageId = messageId;\n\n ['html', 'text', 'watchHtml', 'amp'].forEach(key => {\n if (data[key] && data[key].content) {\n if (typeof data[key].content === 'string') {\n data[key] = data[key].content;\n } else if (Buffer.isBuffer(data[key].content)) {\n data[key] = data[key].content.toString();\n }\n }\n });\n\n if (data.icalEvent && Buffer.isBuffer(data.icalEvent.content)) {\n data.icalEvent.content = data.icalEvent.content.toString('base64');\n data.icalEvent.encoding = 'base64';\n }\n\n if (data.alternatives && data.alternatives.length) {\n data.alternatives.forEach(alternative => {\n if (alternative && alternative.content && Buffer.isBuffer(alternative.content)) {\n alternative.content = alternative.content.toString('base64');\n alternative.encoding = 'base64';\n }\n });\n }\n\n if (data.attachments && data.attachments.length) {\n data.attachments.forEach(attachment => {\n if (attachment && attachment.content && Buffer.isBuffer(attachment.content)) {\n attachment.content = attachment.content.toString('base64');\n attachment.encoding = 'base64';\n }\n });\n }\n\n data.normalizedHeaders = {};\n Object.keys(data.headers || {}).forEach(key => {\n let value = [].concat(data.headers[key] || []).shift();\n value = (value && value.value) || value;\n if (value) {\n if (['references', 'in-reply-to', 'message-id', 'content-id'].includes(key)) {\n value = this.message._encodeHeaderValue(key, value);\n }\n data.normalizedHeaders[key] = value;\n }\n });\n\n if (data.list && typeof data.list === 'object') {\n const listHeaders = this._getListHeaders(data.list);\n listHeaders.forEach(entry => {\n data.normalizedHeaders[entry.key] = entry.value.map(val => (val && val.value) || val).join(', ');\n });\n }\n\n if (data.references) {\n data.normalizedHeaders.references = this.message._encodeHeaderValue('references', data.references);\n }\n\n if (data.inReplyTo) {\n data.normalizedHeaders['in-reply-to'] = this.message._encodeHeaderValue('in-reply-to', data.inReplyTo);\n }\n\n return callback(null, data);\n });\n }\n\n setMailerHeader() {\n if (!this.message || !this.data.xMailer) {\n return;\n }\n this.message.setHeader('X-Mailer', this.data.xMailer);\n }\n\n setPriorityHeaders() {\n if (!this.message || !this.data.priority) {\n return;\n }\n switch ((this.data.priority || '').toString().toLowerCase()) {\n case 'high':\n this.message.setHeader('X-Priority', '1 (Highest)');\n this.message.setHeader('X-MSMail-Priority', 'High');\n this.message.setHeader('Importance', 'High');\n break;\n case 'low':\n this.message.setHeader('X-Priority', '5 (Lowest)');\n this.message.setHeader('X-MSMail-Priority', 'Low');\n this.message.setHeader('Importance', 'Low');\n break;\n default:\n // do not add anything, since all messages are 'Normal' by default\n }\n }\n\n setListHeaders() {\n if (!this.message || !this.data.list || typeof this.data.list !== 'object') {\n return;\n }\n // add optional List-* headers\n this._getListHeaders(this.data.list).forEach(listHeader => {\n listHeader.value.forEach(value => {\n this.message.addHeader(listHeader.key, value);\n });\n });\n }\n\n _getListHeaders(listData) {\n // make sure an url looks like <protocol:url>\n return Object.keys(listData).map(key => ({\n key: 'list-' + key.toLowerCase().trim(),\n value: [].concat(listData[key] || []).map(value => ({\n prepared: true,\n foldLines: true,\n value: []\n .concat(value || [])\n .map(value => {\n if (typeof value === 'string') {\n value = {\n url: value\n };\n }\n\n if (value && value.url) {\n if (key.toLowerCase().trim() === 'id') {\n // List-ID: \"comment\" <domain>\n // strip CR/LF so a comment can't inject extra header lines\n let comment = (value.comment || '').toString().replace(/\\r?\\n|\\r/g, ' ');\n if (mimeFuncs.isPlainText(comment)) {\n comment = '\"' + comment + '\"';\n } else {\n comment = mimeFuncs.encodeWord(comment);\n }\n\n return (value.comment ? comment + ' ' : '') + this._formatListUrl(value.url).replace(/^<[^:]+\\/{,2}/, '');\n }\n\n // List-*: <http://domain> (comment)\n // strip CR/LF so a comment can't inject extra header lines\n let comment = (value.comment || '').toString().replace(/\\r?\\n|\\r/g, ' ');\n if (!mimeFuncs.isPlainText(comment)) {\n comment = mimeFuncs.encodeWord(comment);\n }\n\n return this._formatListUrl(value.url) + (value.comment ? ' (' + comment + ')' : '');\n }\n\n return '';\n })\n .filter(value => value)\n .join(', ')\n }))\n }));\n }\n\n _formatListUrl(url) {\n url = url.replace(/[\\s<]+|[\\s>]+/g, '');\n if (/^(https?|mailto|ftp):/.test(url)) {\n return '<' + url + '>';\n }\n if (/^[^@]+@[^@]+$/.test(url)) {\n return '<mailto:' + url + '>';\n }\n\n return '<http://' + url + '>';\n }\n}\n\nmodule.exports = MailMessage;\n","'use strict';\n\nconst EventEmitter = require('events');\nconst shared = require('../shared');\nconst mimeTypes = require('../mime-funcs/mime-types');\nconst MailComposer = require('../mail-composer');\nconst DKIM = require('../dkim');\nconst httpProxyClient = require('../smtp-connection/http-proxy-client');\nconst errors = require('../errors');\nconst util = require('util');\nconst urllib = require('url');\nconst packageData = require('../../package.json');\nconst MailMessage = require('./mail-message');\nconst net = require('net');\nconst dns = require('dns');\nconst crypto = require('crypto');\n\n/**\n * Creates an object for exposing the Mail API\n *\n * @constructor\n * @param {Object} transporter Transport object instance to pass the mails to\n */\nclass Mail extends EventEmitter {\n constructor(transporter, options, defaults) {\n super();\n\n this.options = options || {};\n this._defaults = defaults || {};\n\n this._defaultPlugins = {\n compile: [(...args) => this._convertDataImages(...args)],\n stream: []\n };\n\n this._userPlugins = {\n compile: [],\n stream: []\n };\n\n this.meta = new Map();\n\n this.dkim = this.options.dkim ? new DKIM(this.options.dkim) : false;\n\n this.transporter = transporter;\n this.transporter.mailer = this;\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'mail'\n });\n\n this.logger.debug(\n {\n tnx: 'create'\n },\n 'Creating transport: %s',\n this.getVersionString()\n );\n\n // setup emit handlers for the transporter\n if (typeof this.transporter.on === 'function') {\n // deprecated log interface\n this.transporter.on('log', log => {\n this.logger.debug(\n {\n tnx: 'transport'\n },\n '%s: %s',\n log.type,\n log.message\n );\n });\n\n // transporter errors\n this.transporter.on('error', err => {\n this.logger.error(\n {\n err,\n tnx: 'transport'\n },\n 'Transport Error: %s',\n err.message\n );\n this.emit('error', err);\n });\n\n // indicates if the sender has became idle\n this.transporter.on('idle', (...args) => {\n this.emit('idle', ...args);\n });\n\n // indicates if the sender has became idle and all connections are terminated\n this.transporter.on('clear', (...args) => {\n this.emit('clear', ...args);\n });\n }\n\n /**\n * Optional methods passed to the underlying transport object\n */\n ['close', 'isIdle', 'verify'].forEach(method => {\n this[method] = (...args) => {\n if (typeof this.transporter[method] === 'function') {\n if (method === 'verify' && typeof this.getSocket === 'function') {\n this.transporter.getSocket = this.getSocket;\n this.getSocket = false;\n }\n return this.transporter[method](...args);\n }\n\n this.logger.warn(\n {\n tnx: 'transport',\n methodName: method\n },\n 'Non existing method %s called for transport',\n method\n );\n return false;\n };\n });\n\n // setup proxy handling\n if (this.options.proxy && typeof this.options.proxy === 'string') {\n this.setupProxy(this.options.proxy);\n }\n }\n\n use(step, plugin) {\n step = (step || '').toString();\n if (!this._userPlugins.hasOwnProperty(step)) {\n this._userPlugins[step] = [plugin];\n } else {\n this._userPlugins[step].push(plugin);\n }\n\n return this;\n }\n\n /**\n * Sends an email using the preselected transport object\n *\n * @param {Object} data E-data description\n * @param {Function?} callback Callback to run once the sending succeeded or failed\n */\n sendMail(data, callback = null) {\n let promise;\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = shared.callbackPromise(resolve, reject);\n });\n }\n\n if (typeof this.getSocket === 'function') {\n this.transporter.getSocket = this.getSocket;\n this.getSocket = false;\n }\n\n const mail = new MailMessage(this, data);\n\n this.logger.debug(\n {\n tnx: 'transport',\n name: this.transporter.name,\n version: this.transporter.version,\n action: 'send'\n },\n 'Sending mail using %s/%s',\n this.transporter.name,\n this.transporter.version\n );\n\n this._processPlugins('compile', mail, err => {\n if (err) {\n this.logger.error(\n {\n err,\n tnx: 'plugin',\n action: 'compile'\n },\n 'PluginCompile Error: %s',\n err.message\n );\n return callback(err);\n }\n\n mail.message = new MailComposer(mail.data).compile();\n\n mail.setMailerHeader();\n mail.setPriorityHeaders();\n mail.setListHeaders();\n\n this._processPlugins('stream', mail, err => {\n if (err) {\n this.logger.error(\n {\n err,\n tnx: 'plugin',\n action: 'stream'\n },\n 'PluginStream Error: %s',\n err.message\n );\n return callback(err);\n }\n\n if (mail.data.dkim || this.dkim) {\n mail.message.processFunc(input => {\n const dkim = mail.data.dkim ? new DKIM(mail.data.dkim) : this.dkim;\n this.logger.debug(\n {\n tnx: 'DKIM',\n messageId: mail.message.messageId(),\n dkimDomains: dkim.keys.map(key => key.keySelector + '.' + key.domainName).join(', ')\n },\n 'Signing outgoing message with %s keys',\n dkim.keys.length\n );\n return dkim.sign(input, mail.data._dkim);\n });\n }\n\n this.transporter.send(mail, (...args) => {\n if (args[0]) {\n this.logger.error(\n {\n err: args[0],\n tnx: 'transport',\n action: 'send'\n },\n 'Send Error: %s',\n args[0].message\n );\n }\n callback(...args);\n });\n });\n });\n\n return promise;\n }\n\n getVersionString() {\n return util.format(\n '%s (%s; +%s; %s/%s)',\n packageData.name,\n packageData.version,\n packageData.homepage,\n this.transporter.name,\n this.transporter.version\n );\n }\n\n _processPlugins(step, mail, callback) {\n step = (step || '').toString();\n\n if (!this._userPlugins.hasOwnProperty(step)) {\n return callback();\n }\n\n const userPlugins = this._userPlugins[step] || [];\n const defaultPlugins = this._defaultPlugins[step] || [];\n\n if (userPlugins.length) {\n this.logger.debug(\n {\n tnx: 'transaction',\n pluginCount: userPlugins.length,\n step\n },\n 'Using %s plugins for %s',\n userPlugins.length,\n step\n );\n }\n\n if (userPlugins.length + defaultPlugins.length === 0) {\n return callback();\n }\n\n let pos = 0;\n let block = 'default';\n const processPlugins = () => {\n let curplugins = block === 'default' ? defaultPlugins : userPlugins;\n if (pos >= curplugins.length) {\n if (block === 'default' && userPlugins.length) {\n block = 'user';\n pos = 0;\n curplugins = userPlugins;\n } else {\n return callback();\n }\n }\n const plugin = curplugins[pos++];\n plugin(mail, err => {\n if (err) {\n return callback(err);\n }\n processPlugins();\n });\n };\n\n processPlugins();\n }\n\n /**\n * Sets up proxy handler for a Nodemailer object\n *\n * @param {String} proxyUrl Proxy configuration url\n */\n setupProxy(proxyUrl) {\n const proxy = urllib.parse(proxyUrl);\n\n // setup socket handler for the mailer object\n this.getSocket = (options, callback) => {\n const protocol = proxy.protocol.replace(/:$/, '').toLowerCase();\n\n if (this.meta.has('proxy_handler_' + protocol)) {\n return this.meta.get('proxy_handler_' + protocol)(proxy, options, callback);\n }\n\n switch (protocol) {\n // Connect using a HTTP CONNECT method\n case 'http':\n case 'https':\n httpProxyClient(proxy.href, options.port, options.host, (err, socket) => {\n if (err) {\n return callback(err);\n }\n return callback(null, {\n connection: socket\n });\n });\n return;\n case 'socks':\n case 'socks5':\n case 'socks4':\n case 'socks4a': {\n if (!this.meta.has('proxy_socks_module')) {\n let err = new Error('Socks module not loaded');\n err.code = errors.EPROXY;\n return callback(err);\n }\n const connect = ipaddress => {\n const proxyV2 = !!this.meta.get('proxy_socks_module').SocksClient;\n const socksClient = proxyV2 ? this.meta.get('proxy_socks_module').SocksClient : this.meta.get('proxy_socks_module');\n const proxyType = Number(proxy.protocol.replace(/\\D/g, '')) || 5;\n const connectionOpts = {\n proxy: {\n ipaddress,\n port: Number(proxy.port),\n type: proxyType\n },\n [proxyV2 ? 'destination' : 'target']: {\n host: options.host,\n port: options.port\n },\n command: 'connect'\n };\n\n if (proxy.auth) {\n const username = decodeURIComponent(proxy.auth.split(':').shift());\n const password = decodeURIComponent(proxy.auth.split(':').pop());\n if (proxyV2) {\n connectionOpts.proxy.userId = username;\n connectionOpts.proxy.password = password;\n } else if (proxyType === 4) {\n connectionOpts.userid = username;\n } else {\n connectionOpts.authentication = {\n username,\n password\n };\n }\n }\n\n socksClient.createConnection(connectionOpts, (err, info) => {\n if (err) {\n return callback(err);\n }\n return callback(null, {\n connection: info.socket || info\n });\n });\n };\n\n if (net.isIP(proxy.hostname)) {\n return connect(proxy.hostname);\n }\n\n return dns.resolve(proxy.hostname, (err, address) => {\n if (err) {\n return callback(err);\n }\n connect(Array.isArray(address) ? address[0] : address);\n });\n }\n }\n let err = new Error('Unknown proxy configuration');\n err.code = errors.EPROXY;\n callback(err);\n };\n }\n\n _convertDataImages(mail, callback) {\n if ((!this.options.attachDataUrls && !mail.data.attachDataUrls) || !mail.data.html) {\n return callback();\n }\n mail.resolveContent(\n mail.data,\n 'html',\n { disableFileAccess: mail.data.disableFileAccess, disableUrlAccess: mail.data.disableUrlAccess },\n (err, html) => {\n if (err) {\n return callback(err);\n }\n let cidCounter = 0;\n html = (html || '')\n .toString()\n .replace(\n /(<img\\b[^<>]{0,1024} src\\s{0,20}=[\\s\"']{0,20})(data:([^;]+);[^\"'>\\s]+)/gi,\n (match, prefix, dataUri, mimeType) => {\n const cid = crypto.randomBytes(10).toString('hex') + '@localhost';\n if (!mail.data.attachments) {\n mail.data.attachments = [];\n }\n if (!Array.isArray(mail.data.attachments)) {\n mail.data.attachments = [].concat(mail.data.attachments || []);\n }\n mail.data.attachments.push({\n path: dataUri,\n cid,\n filename: 'image-' + ++cidCounter + '.' + mimeTypes.detectExtension(mimeType)\n });\n return prefix + 'cid:' + cid;\n }\n );\n mail.data.html = html;\n callback();\n }\n );\n }\n\n set(key, value) {\n return this.meta.set(key, value);\n }\n\n get(key) {\n return this.meta.get(key);\n }\n}\n\nmodule.exports = Mail;\n","'use strict';\n\nconst { Transform } = require('stream');\n\n/**\n * Escapes dots in the beginning of lines. Ends the stream with <CR><LF>.<CR><LF>\n * Also makes sure that only <CR><LF> sequences are used for linebreaks\n *\n * @param {Object} options Stream options\n */\nclass DataStream extends Transform {\n constructor(options) {\n super(options);\n this.options = options || {};\n\n this.inByteCount = 0;\n this.outByteCount = 0;\n this.lastByte = false;\n }\n\n /**\n * Escapes dots\n */\n _transform(chunk, encoding, done) {\n const chunks = [];\n let chunklen = 0;\n let i,\n len,\n lastPos = 0;\n let buf;\n\n if (!chunk || !chunk.length) {\n return done();\n }\n\n if (typeof chunk === 'string') {\n chunk = Buffer.from(chunk);\n }\n\n this.inByteCount += chunk.length;\n\n for (i = 0, len = chunk.length; i < len; i++) {\n if (chunk[i] === 0x2e) {\n // .\n if ((i && chunk[i - 1] === 0x0a) || (!i && (!this.lastByte || this.lastByte === 0x0a))) {\n buf = chunk.slice(lastPos, i + 1);\n chunks.push(buf);\n chunks.push(Buffer.from('.'));\n chunklen += buf.length + 1;\n lastPos = i + 1;\n }\n } else if (chunk[i] === 0x0a) {\n // \\n\n if ((i && chunk[i - 1] !== 0x0d) || (!i && this.lastByte !== 0x0d)) {\n if (i > lastPos) {\n buf = chunk.slice(lastPos, i);\n chunks.push(buf);\n chunklen += buf.length + 2;\n } else {\n chunklen += 2;\n }\n chunks.push(Buffer.from('\\r\\n'));\n lastPos = i + 1;\n }\n }\n }\n\n if (chunklen) {\n // add last piece\n if (lastPos < chunk.length) {\n buf = chunk.slice(lastPos);\n chunks.push(buf);\n chunklen += buf.length;\n }\n\n this.outByteCount += chunklen;\n this.push(Buffer.concat(chunks, chunklen));\n } else {\n this.outByteCount += chunk.length;\n this.push(chunk);\n }\n\n this.lastByte = chunk[chunk.length - 1];\n done();\n }\n\n /**\n * Finalizes the stream with a dot on a single line\n */\n _flush(done) {\n let buf;\n if (this.lastByte === 0x0a) {\n buf = Buffer.from('.\\r\\n');\n } else if (this.lastByte === 0x0d) {\n buf = Buffer.from('\\n.\\r\\n');\n } else {\n buf = Buffer.from('\\r\\n.\\r\\n');\n }\n this.outByteCount += buf.length;\n this.push(buf);\n done();\n }\n}\n\nmodule.exports = DataStream;\n","'use strict';\n\nconst packageInfo = require('../../package.json');\nconst { EventEmitter } = require('events');\nconst net = require('net');\nconst tls = require('tls');\nconst os = require('os');\nconst crypto = require('crypto');\nconst DataStream = require('./data-stream');\nconst { PassThrough } = require('stream');\nconst shared = require('../shared');\n\n// default timeout values in ms\nconst CONNECTION_TIMEOUT = 2 * 60 * 1000; // how much to wait for the connection to be established\nconst SOCKET_TIMEOUT = 10 * 60 * 1000; // how much to wait for socket inactivity before disconnecting the client\nconst GREETING_TIMEOUT = 30 * 1000; // how much to wait after connection is established but SMTP greeting is not receieved\nconst DNS_TIMEOUT = 30 * 1000; // how much to wait for resolveHostname\nconst TEARDOWN_NOOP = () => {}; // reusable no-op handler for absorbing errors during socket teardown\n\n/**\n * Re-interpret a server response stored in fake 8-bit byte-container form\n * (the result of chunk.toString('binary') in _onData) as UTF-8.\n *\n * Server reply text has no formally defined charset (RFC 5321 §4.2.1), but\n * modern MTAs commonly use UTF-8. The byte-container plumbing in _onData is\n * required to reassemble multi-byte sequences split across socket chunks;\n * this helper performs the actual decode at the line boundary, falling back\n * to the byte-container form when the bytes are not valid UTF-8 so that\n * legacy 8-bit replies are still recoverable byte-for-byte.\n */\nfunction decodeServerResponse(str) {\n if (!str) {\n return str;\n }\n const utf8 = Buffer.from(str, 'binary').toString('utf8');\n // The input is a byte container (each char is in U+0000..U+00FF) so it can never\n // already contain U+FFFD; any \\uFFFD in the result was inserted by Node's UTF-8\n // decoder for invalid bytes, which means we should return the original bytes intact.\n return utf8.includes('\\uFFFD') ? str : utf8;\n}\n\n/**\n * Generates a SMTP connection object\n *\n * Optional options object takes the following possible properties:\n *\n * * **port** - is the port to connect to (defaults to 587 or 465)\n * * **host** - is the hostname or IP address to connect to (defaults to 'localhost')\n * * **secure** - use SSL\n * * **ignoreTLS** - ignore server support for STARTTLS\n * * **requireTLS** - forces the client to use STARTTLS\n * * **name** - the name of the client server\n * * **localAddress** - outbound address to bind to (see: http://nodejs.org/api/net.html#net_net_connect_options_connectionlistener)\n * * **greetingTimeout** - Time to wait in ms until greeting message is received from the server (defaults to 10000)\n * * **connectionTimeout** - how many milliseconds to wait for the connection to establish\n * * **socketTimeout** - Time of inactivity until the connection is closed (defaults to 1 hour)\n * * **dnsTimeout** - Time to wait in ms for the DNS requests to be resolved (defaults to 30 seconds)\n * * **lmtp** - if true, uses LMTP instead of SMTP protocol\n * * **logger** - bunyan compatible logger interface\n * * **debug** - if true pass SMTP traffic to the logger\n * * **tls** - options for createCredentials\n * * **socket** - existing socket to use instead of creating a new one (see: http://nodejs.org/api/net.html#net_class_net_socket)\n * * **secured** - boolean indicates that the provided socket has already been upgraded to tls\n *\n * @constructor\n * @namespace SMTP Client module\n * @param {Object} [options] Option properties\n */\nclass SMTPConnection extends EventEmitter {\n constructor(options) {\n super(options);\n\n this.id = crypto.randomBytes(8).toString('base64').replace(/\\W/g, '');\n this.stage = 'init';\n\n this.options = options || {};\n\n this.secureConnection = !!this.options.secure;\n this.alreadySecured = !!this.options.secured;\n\n this.port = Number(this.options.port) || (this.secureConnection ? 465 : 587);\n this.host = this.options.host || 'localhost';\n\n this.servername = this.options.servername ? this.options.servername : !net.isIP(this.host) ? this.host : false;\n\n this.allowInternalNetworkInterfaces = this.options.allowInternalNetworkInterfaces || false;\n\n if (typeof this.options.secure === 'undefined' && this.port === 465) {\n // if secure option is not set but port is 465, then default to secure\n this.secureConnection = true;\n }\n\n this.name = (this.options.name || this._getHostname()).toString().replace(/[\\r\\n]+/g, '');\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'smtp-connection',\n sid: this.id\n });\n\n this.customAuth = new Map();\n for (const key of Object.keys(this.options.customAuth || {})) {\n const mapKey = (key || '').toString().trim().toUpperCase();\n if (mapKey) {\n this.customAuth.set(mapKey, this.options.customAuth[key]);\n }\n }\n\n /**\n * Expose version nr, just for the reference\n * @type {String}\n */\n this.version = packageInfo.version;\n\n /**\n * If true, then the user is authenticated\n * @type {Boolean}\n */\n this.authenticated = false;\n\n /**\n * If set to true, this instance is no longer active\n * @private\n */\n this.destroyed = false;\n\n /**\n * Defines if the current connection is secure or not. If not,\n * STARTTLS can be used if available\n * @private\n */\n this.secure = !!this.secureConnection;\n\n /**\n * Store incomplete messages coming from the server\n * @private\n */\n this._remainder = '';\n\n /**\n * Unprocessed responses from the server\n * @type {Array}\n */\n this._responseQueue = [];\n\n this.lastServerResponse = false;\n\n /**\n * The socket connecting to the server\n * @public\n */\n this._socket = false;\n\n /**\n * Lists supported auth mechanisms\n * @private\n */\n this._supportedAuth = [];\n\n /**\n * Set to true, if EHLO response includes \"AUTH\".\n * If false then authentication is not tried\n */\n this.allowsAuth = false;\n\n /**\n * Includes current envelope (from, to)\n * @private\n */\n this._envelope = false;\n\n /**\n * Lists supported extensions\n * @private\n */\n this._supportedExtensions = [];\n\n /**\n * Defines the maximum allowed size for a single message\n * @private\n */\n this._maxAllowedSize = 0;\n\n /**\n * Function queue to run if a data chunk comes from the server\n * @private\n */\n this._responseActions = [];\n this._recipientQueue = [];\n\n /**\n * Timeout variable for waiting the greeting\n * @private\n */\n this._greetingTimeout = false;\n\n /**\n * Timeout variable for waiting the connection to start\n * @private\n */\n this._connectionTimeout = false;\n\n /**\n * If the socket is deemed already closed\n * @private\n */\n this._destroyed = false;\n\n /**\n * If the socket is already being closed\n * @private\n */\n this._closing = false;\n\n /**\n * Message DATA stream currently piped to the socket, if any. Tracked so\n * close() can unpipe it before tearing the socket down.\n * @private\n */\n this._currentDataStream = false;\n\n /**\n * Callbacks for socket's listeners\n */\n this._onSocketData = chunk => this._onData(chunk);\n this._onSocketError = error => this._onError(error, 'ESOCKET', false, 'CONN');\n this._onSocketClose = () => this._onClose();\n this._onSocketEnd = () => this._onEnd();\n this._onSocketTimeout = () => this._onTimeout();\n\n /**\n * Connection-phase error handler (supports fallback to alternative addresses)\n */\n this._onConnectionSocketError = err => this._onConnectionError(err, 'ESOCKET');\n\n /**\n * Connection attempt counter for fallback race condition protection\n * @private\n */\n this._connectionAttemptId = 0;\n }\n\n /**\n * Creates a connection to a SMTP server and sets up connection\n * listener\n */\n connect(connectCallback) {\n if (typeof connectCallback === 'function') {\n this.once('connect', () => {\n this.logger.debug(\n {\n tnx: 'smtp'\n },\n 'SMTP handshake finished'\n );\n connectCallback();\n });\n\n const isDestroyedMessage = this._isDestroyedMessage('connect');\n if (isDestroyedMessage) {\n return connectCallback(this._formatError(isDestroyedMessage, 'ECONNECTION', false, 'CONN'));\n }\n }\n\n let opts = {\n port: this.port,\n host: this.host,\n allowInternalNetworkInterfaces: this.allowInternalNetworkInterfaces,\n timeout: this.options.dnsTimeout || DNS_TIMEOUT\n };\n\n if (this.options.localAddress) {\n opts.localAddress = this.options.localAddress;\n }\n\n if (this.options.connection) {\n // connection is already opened\n this._socket = this.options.connection;\n this._setupConnectionHandlers();\n\n if (this.secureConnection && !this.alreadySecured) {\n setImmediate(() =>\n this._upgradeConnection(err => {\n if (err) {\n this._onError(new Error('Error initiating TLS - ' + (err.message || err)), 'ETLS', false, 'CONN');\n return;\n }\n this._onConnect();\n })\n );\n } else {\n setImmediate(() => this._onConnect());\n }\n return;\n } else if (this.options.socket) {\n // socket object is set up but not yet connected\n this._socket = this.options.socket;\n return this._resolveAndConnect(opts, _resolved => {\n try {\n this._socket.connect(this.port, this.host, () => {\n this._socket.setKeepAlive(true);\n this._onConnect();\n });\n this._setupConnectionHandlers();\n } catch (E) {\n return setImmediate(() => this._onError(E, 'ECONNECTION', false, 'CONN'));\n }\n });\n } else {\n if (this.secureConnection) {\n Object.assign(opts, this.options.tls || {});\n\n // ensure servername for SNI\n if (this.servername && !opts.servername) {\n opts.servername = this.servername;\n }\n }\n\n return this._resolveAndConnect(opts, resolved => {\n // Store fallback addresses for retry on connection failure\n this._fallbackAddresses = (resolved._addresses || []).filter(addr => addr !== opts.host);\n this._connectOpts = Object.assign({}, opts);\n\n this._connectToHost(opts, this.secureConnection);\n });\n }\n }\n\n /**\n * Resolves the hostname and applies resolved values to opts,\n * then calls the provided callback with the resolved data\n *\n * @param {Object} opts Connection options (modified in place)\n * @param {Function} callback Called with resolved data on success\n */\n _resolveAndConnect(opts, callback) {\n return shared.resolveHostname(opts, (err, resolved) => {\n if (err) {\n return setImmediate(() => this._onError(err, 'EDNS', false, 'CONN'));\n }\n this.logger.debug(\n {\n tnx: 'dns',\n source: opts.host,\n resolved: resolved.host,\n cached: !!resolved.cached\n },\n 'Resolved %s as %s [cache %s]',\n opts.host,\n resolved.host,\n resolved.cached ? 'hit' : 'miss'\n );\n for (const key of Object.keys(resolved)) {\n if (key.charAt(0) !== '_' && resolved[key]) {\n opts[key] = resolved[key];\n }\n }\n callback(resolved);\n });\n }\n\n /**\n * Attempts to connect to the specified host address\n *\n * @param {Object} opts Connection options\n * @param {Boolean} secure Whether to use TLS\n */\n _connectToHost(opts, secure) {\n this._connectionAttemptId++;\n const currentAttemptId = this._connectionAttemptId;\n\n const connectFn = secure ? tls.connect : net.connect;\n try {\n this._socket = connectFn(opts, () => {\n // Ignore callback if this is a stale connection attempt\n if (this._connectionAttemptId !== currentAttemptId) {\n return;\n }\n this._socket.setKeepAlive(true);\n this._onConnect();\n });\n this._setupConnectionHandlers();\n } catch (E) {\n return setImmediate(() => this._onError(E, 'ECONNECTION', false, 'CONN'));\n }\n }\n\n /**\n * Sets up connection timeout and error handlers\n */\n _setupConnectionHandlers() {\n this._connectionTimeout = setTimeout(() => {\n this._onConnectionError('Connection timeout', 'ETIMEDOUT');\n }, this.options.connectionTimeout || CONNECTION_TIMEOUT);\n\n this._socket.on('error', this._onConnectionSocketError);\n }\n\n /**\n * Handles connection errors with fallback to alternative addresses\n *\n * @param {Error|String} err Error object or message\n * @param {String} code Error code\n */\n _onConnectionError(err, code) {\n clearTimeout(this._connectionTimeout);\n\n // Check if we have fallback addresses to try\n const canFallback = this._fallbackAddresses && this._fallbackAddresses.length && this.stage === 'init' && !this._destroyed;\n\n if (!canFallback) {\n // No more fallback addresses, report the error\n this._onError(err, code, false, 'CONN');\n return;\n }\n\n const nextHost = this._fallbackAddresses.shift();\n\n this.logger.info(\n {\n tnx: 'network',\n failedHost: this._connectOpts.host,\n nextHost,\n error: err.message || err\n },\n 'Connection to %s failed, trying %s',\n this._connectOpts.host,\n nextHost\n );\n\n // Clean up current socket\n if (this._socket) {\n try {\n this._socket.removeListener('error', this._onConnectionSocketError);\n this._socket.destroy();\n } catch (_E) {\n // ignore\n }\n this._socket = null;\n }\n\n // Update host and retry\n this._connectOpts.host = nextHost;\n this._connectToHost(this._connectOpts, this.secureConnection);\n }\n\n /**\n * Sends QUIT\n */\n quit() {\n this._sendCommand('QUIT');\n this._responseActions.push(this.close);\n }\n\n /**\n * Closes the connection to the server\n */\n close() {\n clearTimeout(this._connectionTimeout);\n clearTimeout(this._greetingTimeout);\n this._responseActions = [];\n\n // allow to run this function only once\n if (this._closing) {\n return;\n }\n this._closing = true;\n\n const closeMethod = this.stage === 'init' ? 'destroy' : 'end';\n\n this.logger.debug(\n {\n tnx: 'smtp'\n },\n 'Closing connection to the server using \"%s\"',\n closeMethod\n );\n\n const socket = (this._socket && this._socket.socket) || this._socket;\n\n // Detach any in-flight DATA stream from the socket so the source stream\n // can be garbage-collected once the socket is gone.\n if (this._currentDataStream) {\n try {\n this._currentDataStream.unpipe(this._socket);\n } catch (_E) {\n // ignore\n }\n this._currentDataStream = false;\n }\n\n if (socket && !socket.destroyed) {\n try {\n // Clear socket timeout to prevent timer leaks\n socket.setTimeout(0);\n // Remove all listeners to allow proper garbage collection\n socket.removeListener('data', this._onSocketData);\n socket.removeListener('timeout', this._onSocketTimeout);\n socket.removeListener('close', this._onSocketClose);\n socket.removeListener('end', this._onSocketEnd);\n socket.removeListener('error', this._onSocketError);\n socket.removeListener('error', this._onConnectionSocketError);\n // Absorb errors that may fire during socket teardown (e.g. server\n // sending cleartext after TLS shutdown triggers ERR_SSL_BAD_RECORD_TYPE)\n socket.on('error', TEARDOWN_NOOP);\n socket[closeMethod]();\n } catch (_E) {\n // just ignore\n }\n }\n\n this._destroy();\n }\n\n /**\n * Authenticate user\n */\n login(authData, callback) {\n const isDestroyedMessage = this._isDestroyedMessage('login');\n if (isDestroyedMessage) {\n return callback(this._formatError(isDestroyedMessage, 'ECONNECTION', false, 'API'));\n }\n\n this._auth = authData || {};\n // Select SASL authentication method\n this._authMethod = (this._auth.method || '').toString().trim().toUpperCase() || false;\n\n if (!this._authMethod && this._auth.oauth2 && !this._auth.credentials) {\n this._authMethod = 'XOAUTH2';\n } else if (!this._authMethod || (this._authMethod === 'XOAUTH2' && !this._auth.oauth2)) {\n // use first supported\n this._authMethod = (this._supportedAuth[0] || 'PLAIN').toUpperCase().trim();\n }\n\n if (this._authMethod !== 'XOAUTH2' && (!this._auth.credentials || !this._auth.credentials.user || !this._auth.credentials.pass)) {\n if ((this._auth.user && this._auth.pass) || this.customAuth.has(this._authMethod)) {\n this._auth.credentials = {\n user: this._auth.user,\n pass: this._auth.pass,\n options: this._auth.options\n };\n } else {\n return callback(this._formatError('Missing credentials for \"' + this._authMethod + '\"', 'EAUTH', false, 'API'));\n }\n }\n\n if (this.customAuth.has(this._authMethod)) {\n const handler = this.customAuth.get(this._authMethod);\n let lastResponse;\n let returned = false;\n\n const resolve = () => {\n if (returned) {\n return;\n }\n returned = true;\n this.logger.info(\n {\n tnx: 'smtp',\n username: this._auth.user,\n action: 'authenticated',\n method: this._authMethod\n },\n 'User %s authenticated',\n JSON.stringify(this._auth.user)\n );\n this.authenticated = true;\n callback(null, true);\n };\n\n const reject = err => {\n if (returned) {\n return;\n }\n returned = true;\n callback(this._formatError(err, 'EAUTH', lastResponse, 'AUTH ' + this._authMethod));\n };\n\n const handlerResponse = handler({\n auth: this._auth,\n method: this._authMethod,\n\n extensions: [].concat(this._supportedExtensions),\n authMethods: [].concat(this._supportedAuth),\n maxAllowedSize: this._maxAllowedSize || false,\n\n sendCommand: (cmd, done) => {\n let promise;\n\n if (!done) {\n promise = new Promise((resolve, reject) => {\n done = shared.callbackPromise(resolve, reject);\n });\n }\n\n this._responseActions.push(str => {\n lastResponse = str;\n\n let codes = str.match(/^(\\d+)(?:\\s(\\d+\\.\\d+\\.\\d+))?\\s/);\n let data = {\n command: cmd,\n response: str\n };\n if (codes) {\n data.status = Number(codes[1]) || 0;\n if (codes[2]) {\n data.code = codes[2];\n }\n data.text = str.substr(codes[0].length);\n } else {\n data.text = str;\n data.status = 0; // just in case we need to perform numeric comparisons\n }\n done(null, data);\n });\n setImmediate(() => this._sendCommand(cmd));\n\n return promise;\n },\n\n resolve,\n reject\n });\n\n if (handlerResponse && typeof handlerResponse.catch === 'function') {\n // a promise was returned\n handlerResponse.then(resolve).catch(reject);\n }\n\n return;\n }\n\n switch (this._authMethod) {\n case 'XOAUTH2':\n this._handleXOauth2Token(false, callback);\n return;\n case 'LOGIN':\n this._responseActions.push(str => {\n this._actionAUTH_LOGIN_USER(str, callback);\n });\n this._sendCommand('AUTH LOGIN');\n return;\n case 'PLAIN':\n this._responseActions.push(str => {\n this._actionAUTHComplete(str, callback);\n });\n this._sendCommand(\n 'AUTH PLAIN ' +\n Buffer.from(\n //this._auth.user+'\\u0000'+\n '\\u0000' + // skip authorization identity as it causes problems with some servers\n this._auth.credentials.user +\n '\\u0000' +\n this._auth.credentials.pass,\n 'utf-8'\n ).toString('base64'),\n // log entry without passwords\n 'AUTH PLAIN ' +\n Buffer.from(\n //this._auth.user+'\\u0000'+\n '\\u0000' + // skip authorization identity as it causes problems with some servers\n this._auth.credentials.user +\n '\\u0000' +\n '/* secret */',\n 'utf-8'\n ).toString('base64')\n );\n return;\n case 'CRAM-MD5':\n this._responseActions.push(str => {\n this._actionAUTH_CRAM_MD5(str, callback);\n });\n this._sendCommand('AUTH CRAM-MD5');\n return;\n }\n\n return callback(this._formatError('Unknown authentication method \"' + this._authMethod + '\"', 'EAUTH', false, 'API'));\n }\n\n /**\n * Sends a message\n *\n * @param {Object} envelope Envelope object, {from: addr, to: [addr]}\n * @param {Object} message String, Buffer or a Stream\n * @param {Function} callback Callback to return once sending is completed\n */\n send(envelope, message, done) {\n if (!message) {\n return done(this._formatError('Empty message', 'EMESSAGE', false, 'API'));\n }\n\n const isDestroyedMessage = this._isDestroyedMessage('send message');\n if (isDestroyedMessage) {\n return done(this._formatError(isDestroyedMessage, 'ECONNECTION', false, 'API'));\n }\n\n // reject larger messages than allowed\n if (this._maxAllowedSize && envelope.size > this._maxAllowedSize) {\n return setImmediate(() => {\n done(this._formatError('Message size larger than allowed ' + this._maxAllowedSize, 'EMESSAGE', false, 'MAIL FROM'));\n });\n }\n\n // ensure that callback is only called once\n let returned = false;\n const callback = function () {\n if (returned) {\n return;\n }\n returned = true;\n\n done(...arguments);\n };\n\n if (typeof message.on === 'function') {\n message.on('error', err => callback(this._formatError(err, 'ESTREAM', false, 'API')));\n }\n\n const startTime = Date.now();\n this._setEnvelope(envelope, (err, info) => {\n if (err) {\n // create passthrough stream to consume to prevent OOM\n const stream = new PassThrough();\n if (typeof message.pipe === 'function') {\n message.pipe(stream);\n } else {\n stream.write(message);\n stream.end();\n }\n\n return callback(err);\n }\n const envelopeTime = Date.now();\n const stream = this._createSendStream((err, str) => {\n if (err) {\n return callback(err);\n }\n\n info.envelopeTime = envelopeTime - startTime;\n info.messageTime = Date.now() - envelopeTime;\n info.messageSize = stream.outByteCount;\n info.response = str;\n\n return callback(null, info);\n });\n if (typeof message.pipe === 'function') {\n message.pipe(stream);\n } else {\n stream.write(message);\n stream.end();\n }\n });\n }\n\n /**\n * Resets connection state\n *\n * @param {Function} callback Callback to return once connection is reset\n */\n reset(callback) {\n this._sendCommand('RSET');\n this._responseActions.push(str => {\n if (str.charAt(0) !== '2') {\n return callback(this._formatError('Could not reset session state. response=' + str, 'EPROTOCOL', str, 'RSET'));\n }\n this._envelope = false;\n return callback(null, true);\n });\n }\n\n /**\n * Connection listener that is run when the connection to\n * the server is opened\n *\n * @event\n */\n _onConnect() {\n clearTimeout(this._connectionTimeout);\n\n this.logger.info(\n {\n tnx: 'network',\n localAddress: this._socket.localAddress,\n localPort: this._socket.localPort,\n remoteAddress: this._socket.remoteAddress,\n remotePort: this._socket.remotePort\n },\n '%s established to %s:%s',\n this.secure ? 'Secure connection' : 'Connection',\n this._socket.remoteAddress,\n this._socket.remotePort\n );\n\n if (this._destroyed) {\n // Connection was established after we already had canceled it\n this.close();\n return;\n }\n\n this.stage = 'connected';\n\n // clear existing listeners for the socket\n this._socket.removeListener('data', this._onSocketData);\n this._socket.removeListener('timeout', this._onSocketTimeout);\n this._socket.removeListener('close', this._onSocketClose);\n this._socket.removeListener('end', this._onSocketEnd);\n // Switch from connection-phase error handler to normal error handler\n this._socket.removeListener('error', this._onConnectionSocketError);\n\n this._socket.on('error', this._onSocketError);\n this._socket.on('data', this._onSocketData);\n this._socket.once('close', this._onSocketClose);\n this._socket.once('end', this._onSocketEnd);\n\n this._socket.setTimeout(this.options.socketTimeout || SOCKET_TIMEOUT);\n this._socket.on('timeout', this._onSocketTimeout);\n\n this._greetingTimeout = setTimeout(() => {\n // if still waiting for greeting, give up\n if (this._socket && !this._destroyed && this._responseActions[0] === this._actionGreeting) {\n this._onError('Greeting never received', 'ETIMEDOUT', false, 'CONN');\n }\n }, this.options.greetingTimeout || GREETING_TIMEOUT);\n\n this._responseActions.push(this._actionGreeting);\n\n // we have a 'data' listener set up so resume socket if it was paused\n this._socket.resume();\n }\n\n /**\n * 'data' listener for data coming from the server\n *\n * @event\n * @param {Buffer} chunk Data chunk coming from the server\n */\n _onData(chunk) {\n if (this._destroyed || !chunk || !chunk.length) {\n return;\n }\n\n let data = (chunk || '').toString('binary');\n let lines = (this._remainder + data).split(/\\r?\\n/);\n let lastline;\n\n this._remainder = lines.pop();\n\n for (let i = 0, len = lines.length; i < len; i++) {\n if (this._responseQueue.length) {\n lastline = this._responseQueue[this._responseQueue.length - 1];\n if (/^\\d+-/.test(lastline.split('\\n').pop())) {\n this._responseQueue[this._responseQueue.length - 1] += '\\n' + lines[i];\n continue;\n }\n }\n this._responseQueue.push(lines[i]);\n }\n\n if (this._responseQueue.length) {\n lastline = this._responseQueue[this._responseQueue.length - 1];\n if (/^\\d+-/.test(lastline.split('\\n').pop())) {\n return;\n }\n }\n\n this._processResponse();\n }\n\n /**\n * 'error' listener for the socket\n *\n * @event\n * @param {Error} err Error object\n * @param {String} type Error name\n */\n _onError(err, type, data, command) {\n clearTimeout(this._connectionTimeout);\n clearTimeout(this._greetingTimeout);\n\n if (this._destroyed) {\n // just ignore, already closed\n // this might happen when a socket is canceled because of reached timeout\n // but the socket timeout error itself receives only after\n return;\n }\n\n err = this._formatError(err, type, data, command);\n\n const transientCodes = ['ETIMEDOUT', 'ESOCKET', 'ECONNECTION'];\n if (transientCodes.includes(err.code)) {\n this.logger.warn(data, err.message);\n } else {\n this.logger.error(data, err.message);\n }\n\n this.emit('error', err);\n this.close();\n }\n\n _formatError(message, type, response, command) {\n let err;\n\n if (/Error\\]$/i.test(Object.prototype.toString.call(message))) {\n err = message;\n } else {\n err = new Error(message);\n }\n\n if (type && type !== 'Error') {\n err.code = type;\n }\n\n if (response) {\n err.response = response;\n err.message += ': ' + response;\n }\n\n const responseCode = (typeof response === 'string' && Number((response.match(/^\\d+/) || [])[0])) || false;\n if (responseCode) {\n err.responseCode = responseCode;\n }\n\n if (command) {\n err.command = command;\n }\n\n return err;\n }\n\n /**\n * 'close' listener for the socket\n *\n * @event\n */\n _onClose() {\n let serverResponse = false;\n\n if (this._remainder && this._remainder.trim()) {\n this.lastServerResponse = serverResponse = decodeServerResponse(this._remainder.trim());\n if (this.options.debug || this.options.transactionLog) {\n this.logger.debug(\n {\n tnx: 'server'\n },\n serverResponse\n );\n }\n }\n\n this.logger.info(\n {\n tnx: 'network'\n },\n 'Connection closed'\n );\n\n if (this.upgrading && !this._destroyed) {\n return this._onError(new Error('Connection closed unexpectedly'), 'ETLS', serverResponse, 'CONN');\n } else if (![this._actionGreeting, this.close].includes(this._responseActions[0]) && !this._destroyed) {\n return this._onError(new Error('Connection closed unexpectedly'), 'ECONNECTION', serverResponse, 'CONN');\n } else if (/^[45]\\d{2}\\b/.test(serverResponse)) {\n return this._onError(new Error('Connection closed unexpectedly'), 'ECONNECTION', serverResponse, 'CONN');\n }\n\n this._destroy();\n }\n\n /**\n * 'end' listener for the socket\n *\n * @event\n */\n _onEnd() {\n if (this._socket && !this._socket.destroyed) {\n // Peer sent FIN — finish our half of the close gracefully rather\n // than destroying. 'close' fires after the OS finalizes teardown.\n this._socket.end();\n }\n }\n\n /**\n * 'timeout' listener for the socket\n *\n * @event\n */\n _onTimeout() {\n return this._onError(new Error('Timeout'), 'ETIMEDOUT', false, 'CONN');\n }\n\n /**\n * Destroys the client, emits 'end'\n */\n _destroy() {\n if (this._destroyed) {\n return;\n }\n this._destroyed = true;\n this.emit('end');\n }\n\n /**\n * Upgrades the connection to TLS\n *\n * @param {Function} callback Callback function to run when the connection\n * has been secured\n */\n _upgradeConnection(callback) {\n // do not remove all listeners or it breaks node v0.10 as there's\n // apparently a 'finish' event set that would be cleared as well\n\n // we can safely keep 'error', 'end', 'close' etc. events\n this._socket.removeListener('data', this._onSocketData); // incoming data is going to be gibberish from this point onwards\n this._socket.removeListener('timeout', this._onSocketTimeout); // timeout will be re-set for the new socket object\n\n const socketPlain = this._socket;\n const opts = Object.assign(\n {\n socket: this._socket,\n host: this.host\n },\n this.options.tls || {}\n );\n\n // ensure servername for SNI\n if (this.servername && !opts.servername) {\n opts.servername = this.servername;\n }\n\n // Remove all listeners from the plain socket to allow proper garbage\n // collection. Used on both the TLS-success path and the synchronous\n // tls.connect() throw path; either way the plain socket is done.\n const removePlainSocketListeners = () => {\n socketPlain.removeListener('close', this._onSocketClose);\n socketPlain.removeListener('end', this._onSocketEnd);\n socketPlain.removeListener('error', this._onSocketError);\n };\n\n this.upgrading = true;\n // tls.connect is not an asynchronous function however it may still throw errors and requires to be wrapped with try/catch\n try {\n this._socket = tls.connect(opts, () => {\n this.secure = true;\n this.upgrading = false;\n this._socket.on('data', this._onSocketData);\n\n removePlainSocketListeners();\n\n return callback(null, true);\n });\n } catch (err) {\n removePlainSocketListeners();\n return callback(err);\n }\n\n this._socket.on('error', this._onSocketError);\n this._socket.once('close', this._onSocketClose);\n this._socket.once('end', this._onSocketEnd);\n\n this._socket.setTimeout(this.options.socketTimeout || SOCKET_TIMEOUT); // 10 min.\n this._socket.on('timeout', this._onSocketTimeout);\n\n // resume in case the socket was paused\n socketPlain.resume();\n }\n\n /**\n * Processes queued responses from the server\n *\n * @param {Boolean} force If true, ignores _processing flag\n */\n _processResponse() {\n if (!this._responseQueue.length) {\n return false;\n }\n\n let str = (this.lastServerResponse = decodeServerResponse((this._responseQueue.shift() || '').toString()));\n\n if (/^\\d+-/.test(str.split('\\n').pop())) {\n // keep waiting for the final part of multiline response\n return;\n }\n\n if (this.options.debug || this.options.transactionLog) {\n this.logger.debug(\n {\n tnx: 'server'\n },\n str.replace(/\\r?\\n$/, '')\n );\n }\n\n if (!str.trim()) {\n // skip unexpected empty lines\n setImmediate(() => this._processResponse());\n }\n\n const action = this._responseActions.shift();\n\n if (typeof action === 'function') {\n action.call(this, str);\n setImmediate(() => this._processResponse());\n } else {\n return this._onError(new Error('Unexpected Response'), 'EPROTOCOL', str, 'CONN');\n }\n }\n\n /**\n * Send a command to the server, append \\r\\n\n *\n * @param {String} str String to be sent to the server\n * @param {String} logStr Optional string to be used for logging instead of the actual string\n */\n _sendCommand(str, logStr) {\n if (this._destroyed) {\n // Connection already closed, can't send any more data\n return;\n }\n\n if (this._socket.destroyed) {\n return this.close();\n }\n\n if (this.options.debug || this.options.transactionLog) {\n this.logger.debug(\n {\n tnx: 'client'\n },\n (logStr || str || '').toString().replace(/\\r?\\n$/, '')\n );\n }\n\n this._socket.write(Buffer.from(str + '\\r\\n', 'utf-8'));\n }\n\n /**\n * Initiates a new message by submitting envelope data, starting with\n * MAIL FROM: command\n *\n * @param {Object} envelope Envelope object in the form of\n * {from:'...', to:['...']}\n * or\n * {from:{address:'...',name:'...'}, to:[address:'...',name:'...']}\n */\n _setEnvelope(envelope, callback) {\n const args = [];\n let useSmtpUtf8 = false;\n\n this._envelope = envelope || {};\n this._envelope.from = ((this._envelope.from && this._envelope.from.address) || this._envelope.from || '').toString().trim();\n\n this._envelope.to = [].concat(this._envelope.to || []).map(to => ((to && to.address) || to || '').toString().trim());\n\n if (!this._envelope.to.length) {\n return callback(this._formatError('No recipients defined', 'EENVELOPE', false, 'API'));\n }\n\n if (this._envelope.from && /[\\r\\n<>]/.test(this._envelope.from)) {\n return callback(this._formatError('Invalid sender ' + JSON.stringify(this._envelope.from), 'EENVELOPE', false, 'API'));\n }\n\n // check if the sender address uses only ASCII characters,\n // otherwise require usage of SMTPUTF8 extension\n if (/[\\x80-\\uFFFF]/.test(this._envelope.from)) {\n useSmtpUtf8 = true;\n }\n\n for (let i = 0, len = this._envelope.to.length; i < len; i++) {\n if (!this._envelope.to[i] || /[\\r\\n<>]/.test(this._envelope.to[i])) {\n return callback(this._formatError('Invalid recipient ' + JSON.stringify(this._envelope.to[i]), 'EENVELOPE', false, 'API'));\n }\n\n // check if the recipients addresses use only ASCII characters,\n // otherwise require usage of SMTPUTF8 extension\n if (/[\\x80-\\uFFFF]/.test(this._envelope.to[i])) {\n useSmtpUtf8 = true;\n }\n }\n\n // clone the recipients array for latter manipulation\n this._envelope.rcptQueue = [].concat(this._envelope.to || []);\n this._envelope.rejected = [];\n this._envelope.rejectedErrors = [];\n this._envelope.accepted = [];\n\n if (this._envelope.dsn) {\n try {\n this._envelope.dsn = this._setDsnEnvelope(this._envelope.dsn);\n } catch (err) {\n return callback(this._formatError('Invalid DSN ' + err.message, 'EENVELOPE', false, 'API'));\n }\n }\n\n this._responseActions.push(str => {\n this._actionMAIL(str, callback);\n });\n\n // If the server supports SMTPUTF8 and the envelope includes an internationalized\n // email address then append SMTPUTF8 keyword to the MAIL FROM command\n if (useSmtpUtf8 && this._supportedExtensions.includes('SMTPUTF8')) {\n args.push('SMTPUTF8');\n this._usingSmtpUtf8 = true;\n }\n\n // If the server supports 8BITMIME and the message might contain non-ascii bytes\n // then append the 8BITMIME keyword to the MAIL FROM command\n if (this._envelope.use8BitMime && this._supportedExtensions.includes('8BITMIME')) {\n args.push('BODY=8BITMIME');\n this._using8BitMime = true;\n }\n\n if (this._envelope.size && this._supportedExtensions.includes('SIZE')) {\n const sizeValue = Number(this._envelope.size) || 0;\n if (sizeValue > 0) {\n args.push('SIZE=' + sizeValue);\n }\n }\n\n // If the server supports DSN and the envelope includes an DSN prop\n // then append DSN params to the MAIL FROM command\n if (this._envelope.dsn && this._supportedExtensions.includes('DSN')) {\n if (this._envelope.dsn.ret) {\n args.push('RET=' + shared.encodeXText(this._envelope.dsn.ret));\n }\n if (this._envelope.dsn.envid) {\n args.push('ENVID=' + shared.encodeXText(this._envelope.dsn.envid));\n }\n }\n\n // RFC 8689: If the envelope requests REQUIRETLS extension\n // then append REQUIRETLS keyword to the MAIL FROM command\n // Note: REQUIRETLS can only be used over TLS connections and requires server support\n if (this._envelope.requireTLSExtensionEnabled) {\n if (!this.secure) {\n return callback(\n this._formatError('REQUIRETLS can only be used over TLS connections (RFC 8689)', 'EREQUIRETLS', false, 'MAIL FROM')\n );\n }\n if (!this._supportedExtensions.includes('REQUIRETLS')) {\n return callback(\n this._formatError('Server does not support REQUIRETLS extension (RFC 8689)', 'EREQUIRETLS', false, 'MAIL FROM')\n );\n }\n args.push('REQUIRETLS');\n }\n\n this._sendCommand('MAIL FROM:<' + this._envelope.from + '>' + (args.length ? ' ' + args.join(' ') : ''));\n }\n\n _setDsnEnvelope(params) {\n let ret = (params.ret || params.return || '').toString().toUpperCase() || null;\n if (ret) {\n switch (ret) {\n case 'HDRS':\n case 'HEADERS':\n ret = 'HDRS';\n break;\n case 'FULL':\n case 'BODY':\n ret = 'FULL';\n break;\n }\n }\n\n if (ret && !['FULL', 'HDRS'].includes(ret)) {\n throw new Error('ret: ' + JSON.stringify(ret));\n }\n\n const envid = (params.envid || params.id || '').toString() || null;\n\n let notify = params.notify || null;\n if (notify) {\n if (typeof notify === 'string') {\n notify = notify.split(',');\n }\n notify = notify.map(n => n.trim().toUpperCase());\n const validNotify = ['NEVER', 'SUCCESS', 'FAILURE', 'DELAY'];\n const invalidNotify = notify.filter(n => !validNotify.includes(n));\n if (invalidNotify.length || (notify.length > 1 && notify.includes('NEVER'))) {\n throw new Error('notify: ' + JSON.stringify(notify.join(',')));\n }\n notify = notify.join(',');\n }\n\n let orcpt = (params.recipient || params.orcpt || '').toString() || null;\n if (orcpt && orcpt.indexOf(';') < 0) {\n orcpt = 'rfc822;' + orcpt;\n }\n\n return {\n ret,\n envid,\n notify,\n orcpt\n };\n }\n\n _getDsnRcptToArgs() {\n const args = [];\n // If the server supports DSN and the envelope includes an DSN prop\n // then append DSN params to the RCPT TO command\n if (this._envelope.dsn && this._supportedExtensions.includes('DSN')) {\n if (this._envelope.dsn.notify) {\n args.push('NOTIFY=' + shared.encodeXText(this._envelope.dsn.notify));\n }\n if (this._envelope.dsn.orcpt) {\n args.push('ORCPT=' + shared.encodeXText(this._envelope.dsn.orcpt));\n }\n }\n return args.length ? ' ' + args.join(' ') : '';\n }\n\n _createSendStream(callback) {\n const dataStream = new DataStream();\n\n if (this.options.lmtp) {\n this._envelope.accepted.forEach((recipient, i) => {\n const final = i === this._envelope.accepted.length - 1;\n this._responseActions.push(str => {\n this._actionLMTPStream(recipient, final, str, callback);\n });\n });\n } else {\n this._responseActions.push(str => {\n this._actionSMTPStream(str, callback);\n });\n }\n\n this._currentDataStream = dataStream;\n dataStream.pipe(this._socket, {\n end: false\n });\n\n if (this.options.debug) {\n const logStream = new PassThrough();\n logStream.on('readable', () => {\n let chunk;\n while ((chunk = logStream.read())) {\n this.logger.debug(\n {\n tnx: 'message'\n },\n chunk.toString('binary').replace(/\\r?\\n$/, '')\n );\n }\n });\n dataStream.pipe(logStream);\n }\n\n dataStream.once('end', () => {\n if (this._currentDataStream === dataStream) {\n this._currentDataStream = false;\n }\n this.logger.info(\n {\n tnx: 'message',\n inByteCount: dataStream.inByteCount,\n outByteCount: dataStream.outByteCount\n },\n '<%s bytes encoded mime message (source size %s bytes)>',\n dataStream.outByteCount,\n dataStream.inByteCount\n );\n });\n\n return dataStream;\n }\n\n /** ACTIONS **/\n\n /**\n * Will be run after the connection is created and the server sends\n * a greeting. If the incoming message starts with 220 initiate\n * SMTP session by sending EHLO command\n *\n * @param {String} str Message from the server\n */\n _actionGreeting(str) {\n clearTimeout(this._greetingTimeout);\n\n if (str.substr(0, 3) !== '220') {\n this._onError(new Error('Invalid greeting. response=' + str), 'EPROTOCOL', str, 'CONN');\n return;\n }\n\n if (this.options.lmtp) {\n this._responseActions.push(this._actionLHLO);\n this._sendCommand('LHLO ' + this.name);\n } else {\n this._responseActions.push(this._actionEHLO);\n this._sendCommand('EHLO ' + this.name);\n }\n }\n\n /**\n * Handles server response for LHLO command. If it yielded in\n * error, emit 'error', otherwise treat this as an EHLO response\n *\n * @param {String} str Message from the server\n */\n _actionLHLO(str) {\n if (str.charAt(0) !== '2') {\n this._onError(new Error('Invalid LHLO. response=' + str), 'EPROTOCOL', str, 'LHLO');\n return;\n }\n\n this._actionEHLO(str);\n }\n\n /**\n * Handles server response for EHLO command. If it yielded in\n * error, try HELO instead, otherwise initiate TLS negotiation\n * if STARTTLS is supported by the server or move into the\n * authentication phase.\n *\n * @param {String} str Message from the server\n */\n _actionEHLO(str) {\n let match;\n\n if (str.substr(0, 3) === '421') {\n this._onError(new Error('Server terminates connection. response=' + str), 'ECONNECTION', str, 'EHLO');\n return;\n }\n\n if (str.charAt(0) !== '2') {\n if (this.options.requireTLS) {\n this._onError(\n new Error('EHLO failed but HELO does not support required STARTTLS. response=' + str),\n 'ECONNECTION',\n str,\n 'EHLO'\n );\n return;\n }\n\n // Try HELO instead\n this._responseActions.push(this._actionHELO);\n this._sendCommand('HELO ' + this.name);\n return;\n }\n\n this._ehloLines = str\n .split(/\\r?\\n/)\n .map(line => line.replace(/^\\d+[ -]/, '').trim())\n .filter(line => line)\n .slice(1);\n\n // Detect if the server supports STARTTLS\n if (!this.secure && !this.options.ignoreTLS && (/[ -]STARTTLS\\b/im.test(str) || this.options.requireTLS)) {\n this._sendCommand('STARTTLS');\n this._responseActions.push(this._actionSTARTTLS);\n return;\n }\n\n // Detect if the server supports SMTPUTF8\n if (/[ -]SMTPUTF8\\b/im.test(str)) {\n this._supportedExtensions.push('SMTPUTF8');\n }\n\n // Detect if the server supports DSN\n if (/[ -]DSN\\b/im.test(str)) {\n this._supportedExtensions.push('DSN');\n }\n\n // Detect if the server supports 8BITMIME\n if (/[ -]8BITMIME\\b/im.test(str)) {\n this._supportedExtensions.push('8BITMIME');\n }\n\n // Detect if the server supports REQUIRETLS (RFC 8689)\n if (/[ -]REQUIRETLS\\b/im.test(str)) {\n this._supportedExtensions.push('REQUIRETLS');\n }\n\n // Detect if the server supports PIPELINING\n if (/[ -]PIPELINING\\b/im.test(str)) {\n this._supportedExtensions.push('PIPELINING');\n }\n\n // Detect if the server supports AUTH\n if (/[ -]AUTH\\b/i.test(str)) {\n this.allowsAuth = true;\n }\n\n // Detect if the server supports PLAIN auth\n if (/[ -]AUTH(?:(\\s+|=)[^\\n]*\\s+|\\s+|=)PLAIN/i.test(str)) {\n this._supportedAuth.push('PLAIN');\n }\n\n // Detect if the server supports LOGIN auth\n if (/[ -]AUTH(?:(\\s+|=)[^\\n]*\\s+|\\s+|=)LOGIN/i.test(str)) {\n this._supportedAuth.push('LOGIN');\n }\n\n // Detect if the server supports CRAM-MD5 auth\n if (/[ -]AUTH(?:(\\s+|=)[^\\n]*\\s+|\\s+|=)CRAM-MD5/i.test(str)) {\n this._supportedAuth.push('CRAM-MD5');\n }\n\n // Detect if the server supports XOAUTH2 auth\n if (/[ -]AUTH(?:(\\s+|=)[^\\n]*\\s+|\\s+|=)XOAUTH2/i.test(str)) {\n this._supportedAuth.push('XOAUTH2');\n }\n\n // Detect if the server supports SIZE extensions (and the max allowed size)\n if ((match = str.match(/[ -]SIZE(?:[ \\t]+(\\d+))?/im))) {\n this._supportedExtensions.push('SIZE');\n this._maxAllowedSize = Number(match[1]) || 0;\n }\n\n this.emit('connect');\n }\n\n /**\n * Handles server response for HELO command. If it yielded in\n * error, emit 'error', otherwise move into the authentication phase.\n *\n * @param {String} str Message from the server\n */\n _actionHELO(str) {\n if (str.charAt(0) !== '2') {\n this._onError(new Error('Invalid HELO. response=' + str), 'EPROTOCOL', str, 'HELO');\n return;\n }\n\n // assume that authentication is enabled (most probably is not though)\n this.allowsAuth = true;\n\n this.emit('connect');\n }\n\n /**\n * Handles server response for STARTTLS command. If there's an error\n * try HELO instead, otherwise initiate TLS upgrade. If the upgrade\n * succeedes restart the EHLO\n *\n * @param {String} str Message from the server\n */\n _actionSTARTTLS(str) {\n if (str.charAt(0) !== '2') {\n if (this.options.opportunisticTLS) {\n this.logger.info(\n {\n tnx: 'smtp'\n },\n 'Failed STARTTLS upgrade, continuing unencrypted'\n );\n return this.emit('connect');\n }\n this._onError(new Error('Error upgrading connection with STARTTLS'), 'ETLS', str, 'STARTTLS');\n return;\n }\n\n this._upgradeConnection((err, secured) => {\n if (err) {\n this._onError(new Error('Error initiating TLS - ' + (err.message || err)), 'ETLS', false, 'STARTTLS');\n return;\n }\n\n this.logger.info(\n {\n tnx: 'smtp'\n },\n 'Connection upgraded with STARTTLS'\n );\n\n if (secured) {\n // restart session\n if (this.options.lmtp) {\n this._responseActions.push(this._actionLHLO);\n this._sendCommand('LHLO ' + this.name);\n } else {\n this._responseActions.push(this._actionEHLO);\n this._sendCommand('EHLO ' + this.name);\n }\n } else {\n this.emit('connect');\n }\n });\n }\n\n /**\n * Handle the response for AUTH LOGIN command. We are expecting\n * '334 VXNlcm5hbWU6' (base64 for 'Username:'). Data to be sent as\n * response needs to be base64 encoded username. We do not need\n * exact match but settle with 334 response in general as some\n * hosts invalidly use a longer message than VXNlcm5hbWU6\n *\n * @param {String} str Message from the server\n */\n _actionAUTH_LOGIN_USER(str, callback) {\n if (!/^334[ -]/.test(str)) {\n // expecting '334 VXNlcm5hbWU6'\n callback(this._formatError('Invalid login sequence while waiting for \"334 VXNlcm5hbWU6\"', 'EAUTH', str, 'AUTH LOGIN'));\n return;\n }\n\n this._responseActions.push(str => {\n this._actionAUTH_LOGIN_PASS(str, callback);\n });\n\n this._sendCommand(Buffer.from(this._auth.credentials.user + '', 'utf-8').toString('base64'));\n }\n\n /**\n * Handle the response for AUTH CRAM-MD5 command. We are expecting\n * '334 <challenge string>'. Data to be sent as response needs to be\n * base64 decoded challenge string, MD5 hashed using the password as\n * a HMAC key, prefixed by the username and a space, and finally all\n * base64 encoded again.\n *\n * @param {String} str Message from the server\n */\n _actionAUTH_CRAM_MD5(str, callback) {\n const challengeMatch = str.match(/^334\\s+(.+)$/);\n\n if (!challengeMatch) {\n return callback(\n this._formatError('Invalid login sequence while waiting for server challenge string', 'EAUTH', str, 'AUTH CRAM-MD5')\n );\n }\n\n // Decode from base64\n const base64decoded = Buffer.from(challengeMatch[1], 'base64').toString('ascii');\n const hmacMD5 = crypto.createHmac('md5', this._auth.credentials.pass);\n\n hmacMD5.update(base64decoded);\n\n const prepended = this._auth.credentials.user + ' ' + hmacMD5.digest('hex');\n\n this._responseActions.push(str => {\n this._actionAUTH_CRAM_MD5_PASS(str, callback);\n });\n\n this._sendCommand(\n Buffer.from(prepended).toString('base64'),\n // hidden hash for logs\n Buffer.from(this._auth.credentials.user + ' /* secret */').toString('base64')\n );\n }\n\n /**\n * Handles the response to CRAM-MD5 authentication, if there's no error,\n * the user can be considered logged in. Start waiting for a message to send\n *\n * @param {String} str Message from the server\n */\n _actionAUTH_CRAM_MD5_PASS(str, callback) {\n if (!str.match(/^235\\s+/)) {\n return callback(this._formatError('Invalid login sequence while waiting for \"235\"', 'EAUTH', str, 'AUTH CRAM-MD5'));\n }\n\n this.logger.info(\n {\n tnx: 'smtp',\n username: this._auth.user,\n action: 'authenticated',\n method: this._authMethod\n },\n 'User %s authenticated',\n JSON.stringify(this._auth.user)\n );\n this.authenticated = true;\n callback(null, true);\n }\n\n /**\n * Handle the response for AUTH LOGIN command. We are expecting\n * '334 UGFzc3dvcmQ6' (base64 for 'Password:'). Data to be sent as\n * response needs to be base64 encoded password.\n *\n * @param {String} str Message from the server\n */\n _actionAUTH_LOGIN_PASS(str, callback) {\n if (!/^334[ -]/.test(str)) {\n // expecting '334 UGFzc3dvcmQ6'\n return callback(this._formatError('Invalid login sequence while waiting for \"334 UGFzc3dvcmQ6\"', 'EAUTH', str, 'AUTH LOGIN'));\n }\n\n this._responseActions.push(str => {\n this._actionAUTHComplete(str, callback);\n });\n\n this._sendCommand(\n Buffer.from((this._auth.credentials.pass || '').toString(), 'utf-8').toString('base64'),\n // Hidden pass for logs\n Buffer.from('/* secret */', 'utf-8').toString('base64')\n );\n }\n\n /**\n * Handles the response for authentication, if there's no error,\n * the user can be considered logged in. Start waiting for a message to send\n *\n * @param {String} str Message from the server\n */\n _actionAUTHComplete(str, isRetry, callback) {\n if (!callback && typeof isRetry === 'function') {\n callback = isRetry;\n isRetry = false;\n }\n\n if (str.substr(0, 3) === '334') {\n this._responseActions.push(str => {\n if (isRetry || this._authMethod !== 'XOAUTH2') {\n this._actionAUTHComplete(str, true, callback);\n } else {\n // fetch a new OAuth2 access token\n setImmediate(() => this._handleXOauth2Token(true, callback));\n }\n });\n this._sendCommand('');\n return;\n }\n\n if (str.charAt(0) !== '2') {\n this.logger.info(\n {\n tnx: 'smtp',\n username: this._auth.user,\n action: 'authfail',\n method: this._authMethod\n },\n 'User %s failed to authenticate',\n JSON.stringify(this._auth.user)\n );\n return callback(this._formatError('Invalid login', 'EAUTH', str, 'AUTH ' + this._authMethod));\n }\n\n this.logger.info(\n {\n tnx: 'smtp',\n username: this._auth.user,\n action: 'authenticated',\n method: this._authMethod\n },\n 'User %s authenticated',\n JSON.stringify(this._auth.user)\n );\n this.authenticated = true;\n callback(null, true);\n }\n\n /**\n * Handle response for a MAIL FROM: command\n *\n * @param {String} str Message from the server\n */\n _actionMAIL(str, callback) {\n if (Number(str.charAt(0)) !== 2) {\n const message =\n this._usingSmtpUtf8 && /^550 /.test(str) && /[\\x80-\\uFFFF]/.test(this._envelope.from)\n ? 'Internationalized mailbox name not allowed'\n : 'Mail command failed';\n return callback(this._formatError(message, 'EENVELOPE', str, 'MAIL FROM'));\n }\n\n if (!this._envelope.rcptQueue.length) {\n return callback(this._formatError(\"Can't send mail - no recipients defined\", 'EENVELOPE', false, 'API'));\n }\n\n this._recipientQueue = [];\n const usePipelining = this._supportedExtensions.includes('PIPELINING');\n\n do {\n const curRecipient = this._envelope.rcptQueue.shift();\n this._recipientQueue.push(curRecipient);\n this._responseActions.push(str => {\n this._actionRCPT(str, callback);\n });\n this._sendCommand('RCPT TO:<' + curRecipient + '>' + this._getDsnRcptToArgs());\n } while (usePipelining && this._envelope.rcptQueue.length);\n }\n\n /**\n * Handle response for a RCPT TO: command\n *\n * @param {String} str Message from the server\n */\n _actionRCPT(str, callback) {\n let err;\n const curRecipient = this._recipientQueue.shift();\n if (Number(str.charAt(0)) !== 2) {\n // this is a soft error\n const message =\n this._usingSmtpUtf8 && /^553 /.test(str) && /[\\x80-\\uFFFF]/.test(curRecipient)\n ? 'Internationalized mailbox name not allowed'\n : 'Recipient command failed';\n this._envelope.rejected.push(curRecipient);\n // store error for the failed recipient\n err = this._formatError(message, 'EENVELOPE', str, 'RCPT TO');\n err.recipient = curRecipient;\n this._envelope.rejectedErrors.push(err);\n } else {\n this._envelope.accepted.push(curRecipient);\n }\n\n if (!this._envelope.rcptQueue.length && !this._recipientQueue.length) {\n if (this._envelope.rejected.length < this._envelope.to.length) {\n this._responseActions.push(str => {\n this._actionDATA(str, callback);\n });\n this._sendCommand('DATA');\n } else {\n err = this._formatError(\"Can't send mail - all recipients were rejected\", 'EENVELOPE', str, 'RCPT TO');\n err.rejected = this._envelope.rejected;\n err.rejectedErrors = this._envelope.rejectedErrors;\n return callback(err);\n }\n } else if (this._envelope.rcptQueue.length) {\n const nextRecipient = this._envelope.rcptQueue.shift();\n this._recipientQueue.push(nextRecipient);\n this._responseActions.push(str => {\n this._actionRCPT(str, callback);\n });\n this._sendCommand('RCPT TO:<' + nextRecipient + '>' + this._getDsnRcptToArgs());\n }\n }\n\n /**\n * Handle response for a DATA command\n *\n * @param {String} str Message from the server\n */\n _actionDATA(str, callback) {\n // response should be 354 but according to this issue https://github.com/eleith/emailjs/issues/24\n // some servers might use 250 instead, so lets check for 2 or 3 as the first digit\n if (!/^[23]/.test(str)) {\n return callback(this._formatError('Data command failed', 'EENVELOPE', str, 'DATA'));\n }\n\n const response = {\n accepted: this._envelope.accepted,\n rejected: this._envelope.rejected\n };\n\n if (this._ehloLines && this._ehloLines.length) {\n response.ehlo = this._ehloLines;\n }\n\n if (this._envelope.rejectedErrors.length) {\n response.rejectedErrors = this._envelope.rejectedErrors;\n }\n\n callback(null, response);\n }\n\n /**\n * Handle response for a DATA stream when using SMTP\n * We expect a single response that defines if the sending succeeded or failed\n *\n * @param {String} str Message from the server\n */\n _actionSMTPStream(str, callback) {\n if (Number(str.charAt(0)) !== 2) {\n return callback(this._formatError('Message failed', 'EMESSAGE', str, 'DATA'));\n }\n return callback(null, str);\n }\n\n /**\n * Handle response for a DATA stream\n * We expect a separate response for every recipient. All recipients can either\n * succeed or fail separately\n *\n * @param {String} recipient The recipient this response applies to\n * @param {Boolean} final Is this the final recipient?\n * @param {String} str Message from the server\n */\n _actionLMTPStream(recipient, final, str, callback) {\n let err;\n if (Number(str.charAt(0)) !== 2) {\n // Message failed\n err = this._formatError('Message failed for recipient ' + recipient, 'EMESSAGE', str, 'DATA');\n err.recipient = recipient;\n this._envelope.rejected.push(recipient);\n this._envelope.rejectedErrors.push(err);\n for (let i = 0, len = this._envelope.accepted.length; i < len; i++) {\n if (this._envelope.accepted[i] === recipient) {\n this._envelope.accepted.splice(i, 1);\n }\n }\n }\n if (final) {\n return callback(null, str);\n }\n }\n\n _handleXOauth2Token(isRetry, callback) {\n this._auth.oauth2.getToken(isRetry, (err, accessToken) => {\n if (err) {\n this.logger.info(\n {\n tnx: 'smtp',\n username: this._auth.user,\n action: 'authfail',\n method: this._authMethod\n },\n 'User %s failed to authenticate',\n JSON.stringify(this._auth.user)\n );\n return callback(this._formatError(err, 'EAUTH', false, 'AUTH XOAUTH2'));\n }\n this._responseActions.push(str => {\n this._actionAUTHComplete(str, isRetry, callback);\n });\n this._sendCommand(\n 'AUTH XOAUTH2 ' + this._auth.oauth2.buildXOAuth2Token(accessToken),\n // Hidden for logs\n 'AUTH XOAUTH2 ' + this._auth.oauth2.buildXOAuth2Token('/* secret */')\n );\n });\n }\n\n /**\n *\n * @param {string} command\n * @private\n */\n _isDestroyedMessage(command) {\n if (this._destroyed) {\n return 'Cannot ' + command + ' - smtp connection is already destroyed.';\n }\n\n if (this._socket) {\n if (this._socket.destroyed) {\n return 'Cannot ' + command + ' - smtp connection socket is already destroyed.';\n }\n\n if (!this._socket.writable) {\n return 'Cannot ' + command + ' - smtp connection socket is already half-closed.';\n }\n }\n }\n\n _getHostname() {\n // defaul hostname is machine hostname or [IP]\n let defaultHostname;\n try {\n defaultHostname = os.hostname() || '';\n } catch (_err) {\n // fails on windows 7\n defaultHostname = 'localhost';\n }\n\n // ignore if not FQDN\n if (!defaultHostname || defaultHostname.indexOf('.') < 0) {\n defaultHostname = '[127.0.0.1]';\n }\n\n // IP should be enclosed in []\n if (defaultHostname.match(/^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/)) {\n defaultHostname = '[' + defaultHostname + ']';\n }\n\n return defaultHostname;\n }\n}\n\nmodule.exports = SMTPConnection;\n","'use strict';\n\nconst { Stream } = require('stream');\nconst nmfetch = require('../fetch');\nconst crypto = require('crypto');\nconst shared = require('../shared');\nconst errors = require('../errors');\n\n/**\n * XOAUTH2 access_token generator for Gmail.\n * Create client ID for web applications in Google API console to use it.\n * See Offline Access for receiving the needed refreshToken for an user\n * https://developers.google.com/accounts/docs/OAuth2WebServer#offline\n *\n * Usage for generating access tokens with a custom method using provisionCallback:\n * provisionCallback(user, renew, callback)\n * * user is the username to get the token for\n * * renew is a boolean that if true indicates that existing token failed and needs to be renewed\n * * callback is the callback to run with (error, accessToken [, expires])\n * * accessToken is a string\n * * expires is an optional expire time in milliseconds\n * If provisionCallback is used, then Nodemailer does not try to attempt generating the token by itself\n *\n * @constructor\n * @param {Object} options Client information for token generation\n * @param {String} options.user User e-mail address\n * @param {String} options.clientId Client ID value\n * @param {String} options.clientSecret Client secret value\n * @param {String} options.refreshToken Refresh token for an user\n * @param {String} options.accessUrl Endpoint for token generation, defaults to 'https://accounts.google.com/o/oauth2/token'\n * @param {String} options.accessToken An existing valid accessToken\n * @param {String} options.privateKey Private key for JSW\n * @param {Number} options.expires Optional Access Token expire time in ms\n * @param {Number} options.timeout Optional TTL for Access Token in seconds\n * @param {Function} options.provisionCallback Function to run when a new access token is required\n * @param {Object} options.tls Optional TLS options forwarded to the HTTPS token request. Defaults to strict cert validation; supply { rejectUnauthorized: false } only for self-hosted OAuth providers on private CAs.\n */\nclass XOAuth2 extends Stream {\n constructor(options, logger) {\n super();\n\n this.options = options || {};\n\n if (options && options.serviceClient) {\n if (!options.privateKey || !options.user) {\n const err = new Error('Options \"privateKey\" and \"user\" are required for service account!');\n err.code = errors.EOAUTH2;\n setImmediate(() => this.emit('error', err));\n return;\n }\n\n const serviceRequestTimeout = Math.min(Math.max(Number(this.options.serviceRequestTimeout) || 0, 0), 3600);\n this.options.serviceRequestTimeout = serviceRequestTimeout || 5 * 60;\n }\n\n this.logger = shared.getLogger(\n {\n logger\n },\n {\n component: this.options.component || 'OAuth2'\n }\n );\n\n this.provisionCallback = typeof this.options.provisionCallback === 'function' ? this.options.provisionCallback : false;\n\n this.options.accessUrl = this.options.accessUrl || 'https://accounts.google.com/o/oauth2/token';\n this.options.customHeaders = this.options.customHeaders || {};\n this.options.customParams = this.options.customParams || {};\n\n this.accessToken = this.options.accessToken || false;\n\n if (this.options.expires && Number(this.options.expires)) {\n this.expires = this.options.expires;\n } else {\n const timeout = Math.max(Number(this.options.timeout) || 0, 0);\n this.expires = (timeout && Date.now() + timeout * 1000) || 0;\n }\n\n this.renewing = false; // Track if renewal is in progress\n this.renewalQueue = []; // Queue for pending requests during renewal\n }\n\n /**\n * Returns or generates (if previous has expired) a XOAuth2 token\n *\n * @param {Boolean} renew If false then use cached access token (if available)\n * @param {Function} callback Callback function with error object and token string\n */\n getToken(renew, callback) {\n if (!renew && this.accessToken && (!this.expires || this.expires > Date.now())) {\n this.logger.debug(\n {\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'reuse'\n },\n 'Reusing existing access token for %s',\n this.options.user\n );\n return callback(null, this.accessToken);\n }\n\n // check if it is possible to renew, if not, return the current token or error\n if (!this.provisionCallback && !this.options.refreshToken && !this.options.serviceClient) {\n if (this.accessToken) {\n this.logger.debug(\n {\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'reuse'\n },\n 'Reusing existing access token (no refresh capability) for %s',\n this.options.user\n );\n return callback(null, this.accessToken);\n }\n this.logger.error(\n {\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'renew'\n },\n 'Cannot renew access token for %s: No refresh mechanism available',\n this.options.user\n );\n const err = new Error(\"Can't create new access token for user\");\n err.code = errors.EOAUTH2;\n return callback(err);\n }\n\n // If renewal already in progress, queue this request instead of starting another\n if (this.renewing) {\n return this.renewalQueue.push({ renew, callback });\n }\n\n this.renewing = true;\n\n // Handles token renewal completion - processes queued requests and cleans up\n const generateCallback = (err, accessToken) => {\n this.renewalQueue.forEach(item => item.callback(err, accessToken));\n this.renewalQueue = [];\n this.renewing = false;\n\n if (err) {\n this.logger.error(\n {\n err,\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'renew'\n },\n 'Failed generating new Access Token for %s',\n this.options.user\n );\n } else {\n this.logger.info(\n {\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'renew'\n },\n 'Generated new Access Token for %s',\n this.options.user\n );\n }\n // Complete original request\n callback(err, accessToken);\n };\n\n if (this.provisionCallback) {\n this.provisionCallback(this.options.user, !!renew, (err, accessToken, expires) => {\n if (!err && accessToken) {\n this.accessToken = accessToken;\n this.expires = expires || 0;\n }\n generateCallback(err, accessToken);\n });\n } else {\n this.generateToken(generateCallback);\n }\n }\n\n /**\n * Updates token values\n *\n * @param {String} accessToken New access token\n * @param {Number} timeout Access token lifetime in seconds\n *\n * Emits 'token': { user: User email-address, accessToken: the new accessToken, timeout: TTL in seconds}\n */\n updateToken(accessToken, timeout) {\n this.accessToken = accessToken;\n timeout = Math.max(Number(timeout) || 0, 0);\n this.expires = (timeout && Date.now() + timeout * 1000) || 0;\n\n this.emit('token', {\n user: this.options.user,\n accessToken: accessToken || '',\n expires: this.expires\n });\n }\n\n /**\n * Generates a new XOAuth2 token with the credentials provided at initialization\n *\n * @param {Function} callback Callback function with error object and token string\n */\n generateToken(callback) {\n let urlOptions;\n let loggedUrlOptions;\n if (this.options.serviceClient) {\n // service account - https://developers.google.com/identity/protocols/OAuth2ServiceAccount\n const iat = Math.floor(Date.now() / 1000); // unix time\n const tokenData = {\n iss: this.options.serviceClient,\n scope: this.options.scope || 'https://mail.google.com/',\n sub: this.options.user,\n aud: this.options.accessUrl,\n iat,\n exp: iat + this.options.serviceRequestTimeout\n };\n let token;\n try {\n token = this.jwtSignRS256(tokenData);\n } catch (_err) {\n const err = new Error(\"Can't generate token. Check your auth options\");\n err.code = errors.EOAUTH2;\n return callback(err);\n }\n\n urlOptions = {\n grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',\n assertion: token\n };\n\n loggedUrlOptions = {\n grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',\n assertion: tokenData\n };\n } else {\n if (!this.options.refreshToken) {\n const err = new Error(\"Can't create new access token for user\");\n err.code = errors.EOAUTH2;\n return callback(err);\n }\n\n // web app - https://developers.google.com/identity/protocols/OAuth2WebServer\n urlOptions = {\n client_id: this.options.clientId || '',\n client_secret: this.options.clientSecret || '',\n refresh_token: this.options.refreshToken,\n grant_type: 'refresh_token'\n };\n\n loggedUrlOptions = {\n client_id: this.options.clientId || '',\n client_secret: (this.options.clientSecret || '').substr(0, 6) + '...',\n refresh_token: (this.options.refreshToken || '').substr(0, 6) + '...',\n grant_type: 'refresh_token'\n };\n }\n\n Object.assign(urlOptions, this.options.customParams);\n Object.assign(loggedUrlOptions, this.options.customParams);\n\n this.logger.debug(\n {\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'generate'\n },\n 'Requesting token using: %s',\n JSON.stringify(loggedUrlOptions)\n );\n\n this.postRequest(this.options.accessUrl, urlOptions, this.options, (error, body) => {\n let data;\n\n if (error) {\n return callback(error);\n }\n\n try {\n data = JSON.parse(body.toString());\n } catch (E) {\n return callback(E);\n }\n\n if (!data || typeof data !== 'object') {\n this.logger.debug(\n {\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'post'\n },\n 'Response: %s',\n (body || '').toString()\n );\n const err = new Error('Invalid authentication response');\n err.code = errors.EOAUTH2;\n return callback(err);\n }\n\n const logData = Object.assign({}, data);\n if (logData.access_token) {\n logData.access_token = (logData.access_token || '').toString().substr(0, 6) + '...';\n }\n\n this.logger.debug(\n {\n tnx: 'OAUTH2',\n user: this.options.user,\n action: 'post'\n },\n 'Response: %s',\n JSON.stringify(logData)\n );\n\n if (data.error) {\n // Error Response : https://tools.ietf.org/html/rfc6749#section-5.2\n let errorMessage = data.error;\n if (data.error_description) {\n errorMessage += ': ' + data.error_description;\n }\n if (data.error_uri) {\n errorMessage += ' (' + data.error_uri + ')';\n }\n const err = new Error(errorMessage);\n err.code = errors.EOAUTH2;\n return callback(err);\n }\n\n if (data.access_token) {\n this.updateToken(data.access_token, data.expires_in);\n return callback(null, this.accessToken);\n }\n\n const err = new Error('No access token');\n err.code = errors.EOAUTH2;\n return callback(err);\n });\n }\n\n /**\n * Converts an access_token and user id into a base64 encoded XOAuth2 token\n *\n * @param {String} [accessToken] Access token string\n * @return {String} Base64 encoded token for IMAP or SMTP login\n */\n buildXOAuth2Token(accessToken) {\n const authData = ['user=' + (this.options.user || ''), 'auth=Bearer ' + (accessToken || this.accessToken), '', ''];\n return Buffer.from(authData.join('\\x01'), 'utf-8').toString('base64');\n }\n\n /**\n * Custom POST request handler.\n * This is only needed to keep paths short in Windows – usually this module\n * is a dependency of a dependency and if it tries to require something\n * like the request module the paths get way too long to handle for Windows.\n * As we do only a simple POST request we do not actually require complicated\n * logic support (no redirects, no nothing) anyway.\n *\n * @param {String} url Url to POST to\n * @param {String|Buffer} payload Payload to POST\n * @param {Function} callback Callback function with (err, buff)\n */\n postRequest(url, payload, params, callback) {\n let returned = false;\n\n const chunks = [];\n let chunklen = 0;\n\n const fetchOptions = {\n method: 'post',\n headers: params.customHeaders,\n body: payload,\n allowErrorResponse: true\n };\n\n // OAuth2 token endpoints are credential-bearing. lib/fetch defaults to\n // rejectUnauthorized:false (intentional for self-signed attachment\n // hosts), so opt back in to strict cert validation here when the\n // access URL is HTTPS. params.tls (the user's options.tls) is layered\n // on top so callers with a self-hosted provider on a private CA can\n // still override.\n if (/^https:/i.test(url)) {\n fetchOptions.tls = Object.assign({ rejectUnauthorized: true }, params.tls || {});\n }\n\n const req = nmfetch(url, fetchOptions);\n\n req.on('readable', () => {\n let chunk;\n while ((chunk = req.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n\n req.once('error', err => {\n if (returned) {\n return;\n }\n returned = true;\n return callback(err);\n });\n\n req.once('end', () => {\n if (returned) {\n return;\n }\n returned = true;\n return callback(null, Buffer.concat(chunks, chunklen));\n });\n }\n\n /**\n * Encodes a buffer or a string into Base64url format\n *\n * @param {Buffer|String} data The data to convert\n * @return {String} The encoded string\n */\n toBase64URL(data) {\n if (typeof data === 'string') {\n data = Buffer.from(data);\n }\n\n return data\n .toString('base64')\n .replace(/[=]+/g, '') // remove '='s\n .replace(/\\+/g, '-') // '+' → '-'\n .replace(/\\//g, '_'); // '/' → '_'\n }\n\n /**\n * Creates a JSON Web Token signed with RS256 (SHA256 + RSA)\n *\n * @param {Object} payload The payload to include in the generated token\n * @return {String} The generated and signed token\n */\n jwtSignRS256(payload) {\n payload = ['{\"alg\":\"RS256\",\"typ\":\"JWT\"}', JSON.stringify(payload)].map(val => this.toBase64URL(val)).join('.');\n const signature = crypto.createSign('RSA-SHA256').update(payload).sign(this.options.privateKey);\n return payload + '.' + this.toBase64URL(signature);\n }\n}\n\nmodule.exports = XOAuth2;\n","'use strict';\n\nconst SMTPConnection = require('../smtp-connection');\nconst assign = require('../shared').assign;\nconst XOAuth2 = require('../xoauth2');\nconst errors = require('../errors');\nconst EventEmitter = require('events');\n\n/**\n * Creates an element for the pool\n *\n * @constructor\n * @param {Object} options SMTPPool instance\n */\nclass PoolResource extends EventEmitter {\n constructor(pool) {\n super();\n\n this.pool = pool;\n this.options = pool.options;\n this.logger = this.pool.logger;\n\n if (this.options.auth) {\n switch ((this.options.auth.type || '').toString().toUpperCase()) {\n case 'OAUTH2': {\n const oauth2 = new XOAuth2(this.options.auth, this.logger);\n oauth2.provisionCallback =\n (this.pool.mailer && this.pool.mailer.get('oauth2_provision_cb')) || oauth2.provisionCallback;\n this.auth = {\n type: 'OAUTH2',\n user: this.options.auth.user,\n oauth2,\n method: 'XOAUTH2'\n };\n oauth2.on('token', token => this.pool.mailer.emit('token', token));\n oauth2.on('error', err => this.emit('error', err));\n break;\n }\n default:\n if (!this.options.auth.user && !this.options.auth.pass) {\n break;\n }\n this.auth = {\n type: (this.options.auth.type || '').toString().toUpperCase() || 'LOGIN',\n user: this.options.auth.user,\n credentials: {\n user: this.options.auth.user || '',\n pass: this.options.auth.pass,\n options: this.options.auth.options\n },\n method: (this.options.auth.method || '').trim().toUpperCase() || this.options.authMethod || false\n };\n }\n }\n\n this._connection = false;\n this._connected = false;\n\n this.messages = 0;\n this.available = true;\n }\n\n /**\n * Initiates a connection to the SMTP server\n *\n * @param {Function} callback Callback function to run once the connection is established or failed\n */\n connect(callback) {\n this.pool.getSocket(this.options, (err, socketOptions) => {\n if (err) {\n return callback(err);\n }\n\n let returned = false;\n let options = this.options;\n if (socketOptions && socketOptions.connection) {\n this.logger.info(\n {\n tnx: 'proxy',\n remoteAddress: socketOptions.connection.remoteAddress,\n remotePort: socketOptions.connection.remotePort,\n destHost: options.host || '',\n destPort: options.port || '',\n action: 'connected'\n },\n 'Using proxied socket from %s:%s to %s:%s',\n socketOptions.connection.remoteAddress,\n socketOptions.connection.remotePort,\n options.host || '',\n options.port || ''\n );\n\n options = Object.assign(assign(false, options), socketOptions);\n }\n\n this.connection = new SMTPConnection(options);\n\n this.connection.once('error', err => {\n this.emit('error', err);\n if (returned) {\n return;\n }\n returned = true;\n return callback(err);\n });\n\n this.connection.once('end', () => {\n this.close();\n if (returned) {\n return;\n }\n returned = true;\n\n const timer = setTimeout(() => {\n if (returned) {\n return;\n }\n // still have not returned, this means we have an unexpected connection close\n const err = new Error('Unexpected socket close');\n if (this.connection && this.connection._socket && this.connection._socket.upgrading) {\n // starttls connection errors\n err.code = errors.ETLS;\n }\n callback(err);\n }, 1000);\n\n try {\n timer.unref();\n } catch (_E) {\n // Ignore. Happens on envs with non-node timer implementation\n }\n });\n\n this.connection.connect(() => {\n if (returned) {\n return;\n }\n\n if (this.auth && (this.connection.allowsAuth || options.forceAuth)) {\n this.connection.login(this.auth, err => {\n if (returned) {\n return;\n }\n returned = true;\n\n if (err) {\n this.connection.close();\n this.emit('error', err);\n return callback(err);\n }\n\n this._connected = true;\n callback(null, true);\n });\n } else {\n returned = true;\n this._connected = true;\n return callback(null, true);\n }\n });\n });\n }\n\n /**\n * Sends an e-mail to be sent using the selected settings\n *\n * @param {Object} mail Mail object\n * @param {Function} callback Callback function\n */\n send(mail, callback) {\n if (!this._connected) {\n return this.connect(err => {\n if (err) {\n return callback(err);\n }\n return this.send(mail, callback);\n });\n }\n\n const envelope = mail.message.getEnvelope();\n const messageId = mail.message.messageId();\n\n const recipients = [].concat(envelope.to || []);\n if (recipients.length > 3) {\n recipients.push('...and ' + recipients.splice(2).length + ' more');\n }\n this.logger.info(\n {\n tnx: 'send',\n messageId,\n cid: this.id\n },\n 'Sending message %s using #%s to <%s>',\n messageId,\n this.id,\n recipients.join(', ')\n );\n\n if (mail.data.dsn) {\n envelope.dsn = mail.data.dsn;\n }\n\n // RFC 8689: Pass requireTLSExtensionEnabled to envelope for MAIL FROM parameter\n if (mail.data.requireTLSExtensionEnabled) {\n envelope.requireTLSExtensionEnabled = mail.data.requireTLSExtensionEnabled;\n }\n\n this.connection.send(envelope, mail.message.createReadStream(), (err, info) => {\n this.messages++;\n\n if (err) {\n this.connection.close();\n this.emit('error', err);\n return callback(err);\n }\n\n info.envelope = {\n from: envelope.from,\n to: envelope.to\n };\n info.messageId = messageId;\n\n setImmediate(() => {\n if (this.messages >= this.options.maxMessages) {\n const err = new Error('Resource exhausted');\n err.code = errors.EMAXLIMIT;\n this.connection.close();\n this.emit('error', err);\n } else {\n this.pool._checkRateLimit(() => {\n this.available = true;\n this.emit('available');\n });\n }\n });\n\n callback(null, info);\n });\n }\n\n /**\n * Closes the connection\n */\n close() {\n this._connected = false;\n if (this.auth && this.auth.oauth2) {\n this.auth.oauth2.removeAllListeners();\n }\n if (this.connection) {\n this.connection.close();\n }\n this.emit('close');\n }\n}\n\nmodule.exports = PoolResource;\n","","'use strict';\n\nconst services = require('./services.json');\nconst normalized = {};\n\nObject.keys(services).forEach(key => {\n const service = services[key];\n const normalizedService = normalizeService(service);\n\n normalized[normalizeKey(key)] = normalizedService;\n\n [].concat(service.aliases || []).forEach(alias => {\n normalized[normalizeKey(alias)] = normalizedService;\n });\n\n [].concat(service.domains || []).forEach(domain => {\n normalized[normalizeKey(domain)] = normalizedService;\n });\n});\n\nfunction normalizeKey(key) {\n return key.replace(/[^a-zA-Z0-9.-]/g, '').toLowerCase();\n}\n\nfunction normalizeService(service) {\n const response = {};\n\n Object.keys(service).forEach(key => {\n if (!['domains', 'aliases'].includes(key)) {\n response[key] = service[key];\n }\n });\n\n return response;\n}\n\n/**\n * Resolves SMTP config for given key. Key can be a name (like 'Gmail'), alias (like 'Google Mail') or\n * an email address (like 'test@googlemail.com').\n *\n * @param {String} key [description]\n * @returns {Object} SMTP config or false if not found\n */\nmodule.exports = function (key) {\n key = normalizeKey(key.split('@').pop());\n return normalized[key] || false;\n};\n","'use strict';\n\nconst EventEmitter = require('events');\nconst PoolResource = require('./pool-resource');\nconst SMTPConnection = require('../smtp-connection');\nconst wellKnown = require('../well-known');\nconst shared = require('../shared');\nconst errors = require('../errors');\nconst packageData = require('../../package.json');\n\n/**\n * Creates a SMTP pool transport object for Nodemailer\n *\n * @constructor\n * @param {Object} options SMTP Connection options\n */\nclass SMTPPool extends EventEmitter {\n constructor(options) {\n super();\n\n options = options || {};\n if (typeof options === 'string') {\n options = {\n url: options\n };\n }\n\n let urlData;\n let service = options.service;\n\n if (typeof options.getSocket === 'function') {\n this.getSocket = options.getSocket;\n }\n\n if (options.url) {\n urlData = shared.parseConnectionUrl(options.url);\n service = service || urlData.service;\n }\n\n this.options = shared.assign(\n false, // create new object\n options, // regular options\n urlData, // url options\n service && wellKnown(service) // wellknown options\n );\n\n this.options.maxConnections = this.options.maxConnections || 5;\n this.options.maxMessages = this.options.maxMessages || 100;\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'smtp-pool'\n });\n\n this.name = 'SMTP (pool)';\n this.version = packageData.version + '[client:' + packageData.version + ']';\n\n this._rateLimit = {\n counter: 0,\n timeout: null,\n waiting: [],\n checkpoint: false,\n delta: Number(this.options.rateDelta) || 1000,\n limit: Number(this.options.rateLimit) || 0\n };\n this._closed = false;\n this._queue = [];\n this._connections = [];\n this._connectionCounter = 0;\n\n this.idling = true;\n\n setImmediate(() => {\n if (this.idling) {\n this.emit('idle');\n }\n });\n }\n\n /**\n * Placeholder function for creating proxy sockets. This method immediatelly returns\n * without a socket\n *\n * @param {Object} options Connection options\n * @param {Function} callback Callback function to run with the socket keys\n */\n getSocket(options, callback) {\n // return immediatelly\n return setImmediate(() => callback(null, false));\n }\n\n /**\n * Queues an e-mail to be sent using the selected settings\n *\n * @param {Object} mail Mail object\n * @param {Function} callback Callback function\n */\n send(mail, callback) {\n if (this._closed) {\n return false;\n }\n\n this._queue.push({\n mail,\n requeueAttempts: 0,\n callback\n });\n\n if (this.idling && this._queue.length >= this.options.maxConnections) {\n this.idling = false;\n }\n\n setImmediate(() => this._processMessages());\n\n return true;\n }\n\n /**\n * Closes all connections in the pool. If there is a message being sent, the connection\n * is closed later\n */\n close() {\n let connection;\n const len = this._connections.length;\n this._closed = true;\n\n // clear rate limit timer if it exists\n clearTimeout(this._rateLimit.timeout);\n\n if (!len && !this._queue.length) {\n return;\n }\n\n // remove all available connections\n for (let i = len - 1; i >= 0; i--) {\n if (this._connections[i] && this._connections[i].available) {\n connection = this._connections[i];\n connection.close();\n this.logger.info(\n {\n tnx: 'connection',\n cid: connection.id,\n action: 'removed'\n },\n 'Connection #%s removed',\n connection.id\n );\n }\n }\n\n if (len && !this._connections.length) {\n this.logger.debug(\n {\n tnx: 'connection'\n },\n 'All connections removed'\n );\n }\n\n if (!this._queue.length) {\n return;\n }\n\n // make sure that entire queue would be cleaned\n const invokeCallbacks = () => {\n if (!this._queue.length) {\n this.logger.debug(\n {\n tnx: 'connection'\n },\n 'Pending queue entries cleared'\n );\n return;\n }\n const entry = this._queue.shift();\n if (entry && typeof entry.callback === 'function') {\n try {\n entry.callback(new Error('Connection pool was closed'));\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'callback',\n cid: connection.id\n },\n 'Callback error for #%s: %s',\n connection.id,\n E.message\n );\n }\n }\n setImmediate(invokeCallbacks);\n };\n setImmediate(invokeCallbacks);\n }\n\n /**\n * Check the queue and available connections. If there is a message to be sent and there is\n * an available connection, then use this connection to send the mail\n */\n _processMessages() {\n // do nothing if already closed\n if (this._closed) {\n return;\n }\n\n // do nothing if queue is empty\n if (!this._queue.length) {\n if (!this.idling) {\n // no pending jobs\n this.idling = true;\n this.emit('idle');\n }\n return;\n }\n\n // find first available connection\n let connection = this._connections.find(c => c.available);\n\n if (!connection && this._connections.length < this.options.maxConnections) {\n connection = this._createConnection();\n }\n\n if (!connection) {\n // no more free connection slots available\n this.idling = false;\n return;\n }\n\n // check if there is free space in the processing queue\n if (!this.idling && this._queue.length < this.options.maxConnections) {\n this.idling = true;\n this.emit('idle');\n }\n\n const entry = (connection.queueEntry = this._queue.shift());\n entry.messageId = (connection.queueEntry.mail.message.getHeader('message-id') || '').replace(/[<>\\s]/g, '');\n\n connection.available = false;\n\n this.logger.debug(\n {\n tnx: 'pool',\n cid: connection.id,\n messageId: entry.messageId,\n action: 'assign'\n },\n 'Assigned message <%s> to #%s (%s)',\n entry.messageId,\n connection.id,\n connection.messages + 1\n );\n\n if (this._rateLimit.limit) {\n this._rateLimit.counter++;\n if (!this._rateLimit.checkpoint) {\n this._rateLimit.checkpoint = Date.now();\n }\n }\n\n connection.send(entry.mail, (err, info) => {\n // only process callback if current handler is not changed\n if (entry === connection.queueEntry) {\n try {\n entry.callback(err, info);\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'callback',\n cid: connection.id\n },\n 'Callback error for #%s: %s',\n connection.id,\n E.message\n );\n }\n connection.queueEntry = false;\n }\n });\n }\n\n /**\n * Creates a new pool resource\n */\n _createConnection() {\n const connection = new PoolResource(this);\n\n connection.id = ++this._connectionCounter;\n\n this.logger.info(\n {\n tnx: 'pool',\n cid: connection.id,\n action: 'conection'\n },\n 'Created new pool resource #%s',\n connection.id\n );\n\n // resource comes available\n connection.on('available', () => {\n this.logger.debug(\n {\n tnx: 'connection',\n cid: connection.id,\n action: 'available'\n },\n 'Connection #%s became available',\n connection.id\n );\n\n if (this._closed) {\n // if already closed run close() that will remove this connections from connections list\n this.close();\n } else {\n // check if there's anything else to send\n this._processMessages();\n }\n });\n\n // resource is terminated with an error\n connection.once('error', err => {\n if (err.code !== errors.EMAXLIMIT) {\n this.logger.warn(\n {\n err,\n tnx: 'pool',\n cid: connection.id\n },\n 'Pool Error for #%s: %s',\n connection.id,\n err.message\n );\n } else {\n this.logger.debug(\n {\n tnx: 'pool',\n cid: connection.id,\n action: 'maxlimit'\n },\n 'Max messages limit exchausted for #%s',\n connection.id\n );\n }\n\n if (connection.queueEntry) {\n try {\n connection.queueEntry.callback(err);\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'callback',\n cid: connection.id\n },\n 'Callback error for #%s: %s',\n connection.id,\n E.message\n );\n }\n connection.queueEntry = false;\n }\n\n // remove the erroneus connection from connections list\n this._removeConnection(connection);\n\n this._continueProcessing();\n });\n\n connection.once('close', () => {\n this.logger.info(\n {\n tnx: 'connection',\n cid: connection.id,\n action: 'closed'\n },\n 'Connection #%s was closed',\n connection.id\n );\n\n this._removeConnection(connection);\n\n if (connection.queueEntry) {\n // If the connection closed when sending, add the message to the queue again\n // if max number of requeues is not reached yet\n // Note that we must wait a bit.. because the callback of the 'error' handler might be called\n // in the next event loop\n setTimeout(() => {\n if (connection.queueEntry) {\n if (this._shouldRequeuOnConnectionClose(connection.queueEntry)) {\n this._requeueEntryOnConnectionClose(connection);\n } else {\n this._failDeliveryOnConnectionClose(connection);\n }\n }\n this._continueProcessing();\n }, 50);\n } else {\n if (!this._closed && this.idling && !this._connections.length) {\n this.emit('clear');\n }\n\n this._continueProcessing();\n }\n });\n\n this._connections.push(connection);\n\n return connection;\n }\n\n _shouldRequeuOnConnectionClose(queueEntry) {\n if (this.options.maxRequeues === undefined || this.options.maxRequeues < 0) {\n return true;\n }\n\n return queueEntry.requeueAttempts < this.options.maxRequeues;\n }\n\n _failDeliveryOnConnectionClose(connection) {\n if (connection.queueEntry && connection.queueEntry.callback) {\n try {\n connection.queueEntry.callback(new Error('Reached maximum number of retries after connection was closed'));\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'callback',\n messageId: connection.queueEntry.messageId,\n cid: connection.id\n },\n 'Callback error for #%s: %s',\n connection.id,\n E.message\n );\n }\n connection.queueEntry = false;\n }\n }\n\n _requeueEntryOnConnectionClose(connection) {\n connection.queueEntry.requeueAttempts += 1;\n this.logger.debug(\n {\n tnx: 'pool',\n cid: connection.id,\n messageId: connection.queueEntry.messageId,\n action: 'requeue'\n },\n 'Re-queued message <%s> for #%s. Attempt: #%s',\n connection.queueEntry.messageId,\n connection.id,\n connection.queueEntry.requeueAttempts\n );\n this._queue.unshift(connection.queueEntry);\n connection.queueEntry = false;\n }\n\n /**\n * Continue to process message if the pool hasn't closed\n */\n _continueProcessing() {\n if (this._closed) {\n this.close();\n } else {\n setTimeout(() => this._processMessages(), 100);\n }\n }\n\n /**\n * Remove resource from pool\n *\n * @param {Object} connection The PoolResource to remove\n */\n _removeConnection(connection) {\n const index = this._connections.indexOf(connection);\n\n if (index !== -1) {\n this._connections.splice(index, 1);\n }\n }\n\n /**\n * Checks if connections have hit current rate limit and if so, queues the availability callback\n *\n * @param {Function} callback Callback function to run once rate limiter has been cleared\n */\n _checkRateLimit(callback) {\n if (!this._rateLimit.limit) {\n return callback();\n }\n\n const now = Date.now();\n\n if (this._rateLimit.counter < this._rateLimit.limit) {\n return callback();\n }\n\n this._rateLimit.waiting.push(callback);\n\n if (this._rateLimit.checkpoint <= now - this._rateLimit.delta) {\n return this._clearRateLimit();\n }\n\n if (!this._rateLimit.timeout) {\n this._rateLimit.timeout = setTimeout(() => this._clearRateLimit(), this._rateLimit.delta - (now - this._rateLimit.checkpoint));\n this._rateLimit.checkpoint = now;\n }\n }\n\n /**\n * Clears current rate limit limitation and runs paused callback\n */\n _clearRateLimit() {\n clearTimeout(this._rateLimit.timeout);\n this._rateLimit.timeout = null;\n this._rateLimit.counter = 0;\n this._rateLimit.checkpoint = false;\n\n // resume all paused connections\n while (this._rateLimit.waiting.length) {\n const cb = this._rateLimit.waiting.shift();\n setImmediate(cb);\n }\n }\n\n /**\n * Returns true if there are free slots in the queue\n */\n isIdle() {\n return this.idling;\n }\n\n /**\n * Verifies SMTP configuration\n *\n * @param {Function} callback Callback function\n */\n verify(callback) {\n let promise;\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = shared.callbackPromise(resolve, reject);\n });\n }\n\n const auth = new PoolResource(this).auth;\n\n this.getSocket(this.options, (err, socketOptions) => {\n if (err) {\n return callback(err);\n }\n\n let options = this.options;\n if (socketOptions && socketOptions.connection) {\n this.logger.info(\n {\n tnx: 'proxy',\n remoteAddress: socketOptions.connection.remoteAddress,\n remotePort: socketOptions.connection.remotePort,\n destHost: options.host || '',\n destPort: options.port || '',\n action: 'connected'\n },\n 'Using proxied socket from %s:%s to %s:%s',\n socketOptions.connection.remoteAddress,\n socketOptions.connection.remotePort,\n options.host || '',\n options.port || ''\n );\n options = Object.assign(shared.assign(false, options), socketOptions);\n }\n\n const connection = new SMTPConnection(options);\n let returned = false;\n\n connection.once('error', err => {\n if (returned) {\n return;\n }\n returned = true;\n connection.close();\n return callback(err);\n });\n\n connection.once('end', () => {\n if (returned) {\n return;\n }\n returned = true;\n return callback(new Error('Connection closed'));\n });\n\n const finalize = () => {\n if (returned) {\n return;\n }\n returned = true;\n connection.quit();\n return callback(null, true);\n };\n\n connection.connect(() => {\n if (returned) {\n return;\n }\n\n if (auth && (connection.allowsAuth || options.forceAuth)) {\n connection.login(auth, err => {\n if (returned) {\n return;\n }\n\n if (err) {\n returned = true;\n connection.close();\n return callback(err);\n }\n\n finalize();\n });\n } else if (!auth && connection.allowsAuth && options.forceAuth) {\n const err = new Error('Authentication info was not provided');\n err.code = errors.ENOAUTH;\n\n returned = true;\n connection.close();\n return callback(err);\n } else {\n finalize();\n }\n });\n });\n\n return promise;\n }\n}\n\n// expose to the world\nmodule.exports = SMTPPool;\n","'use strict';\n\nconst EventEmitter = require('events');\nconst SMTPConnection = require('../smtp-connection');\nconst wellKnown = require('../well-known');\nconst shared = require('../shared');\nconst XOAuth2 = require('../xoauth2');\nconst errors = require('../errors');\nconst packageData = require('../../package.json');\n\n/**\n * Creates a SMTP transport object for Nodemailer\n *\n * @constructor\n * @param {Object} options Connection options\n */\nclass SMTPTransport extends EventEmitter {\n constructor(options) {\n super();\n\n options = options || {};\n\n if (typeof options === 'string') {\n options = {\n url: options\n };\n }\n\n let urlData;\n let service = options.service;\n\n if (typeof options.getSocket === 'function') {\n this.getSocket = options.getSocket;\n }\n\n if (options.url) {\n urlData = shared.parseConnectionUrl(options.url);\n service = service || urlData.service;\n }\n\n this.options = shared.assign(\n false, // create new object\n options, // regular options\n urlData, // url options\n service && wellKnown(service) // wellknown options\n );\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'smtp-transport'\n });\n\n this.name = 'SMTP';\n this.version = packageData.version + '[client:' + packageData.version + ']';\n\n if (this.options.auth) {\n this.auth = this.getAuth({});\n }\n }\n\n /**\n * Placeholder function for creating proxy sockets. This method immediatelly returns\n * without a socket\n *\n * @param {Object} options Connection options\n * @param {Function} callback Callback function to run with the socket keys\n */\n getSocket(options, callback) {\n // return immediatelly\n return setImmediate(() => callback(null, false));\n }\n\n getAuth(authOpts) {\n if (!authOpts) {\n return this.auth;\n }\n\n const authData = Object.assign(\n {},\n this.options.auth && typeof this.options.auth === 'object' ? this.options.auth : {},\n authOpts && typeof authOpts === 'object' ? authOpts : {}\n );\n\n if (Object.keys(authData).length === 0) {\n return false;\n }\n\n switch ((authData.type || '').toString().toUpperCase()) {\n case 'OAUTH2': {\n if (!authData.service && !authData.user) {\n return false;\n }\n const oauth2 = new XOAuth2(authData, this.logger);\n oauth2.provisionCallback = (this.mailer && this.mailer.get('oauth2_provision_cb')) || oauth2.provisionCallback;\n oauth2.on('token', token => this.mailer.emit('token', token));\n oauth2.on('error', err => this.emit('error', err));\n return {\n type: 'OAUTH2',\n user: authData.user,\n oauth2,\n method: 'XOAUTH2'\n };\n }\n default:\n return {\n type: (authData.type || '').toString().toUpperCase() || 'LOGIN',\n user: authData.user,\n credentials: {\n user: authData.user || '',\n pass: authData.pass,\n options: authData.options\n },\n method: (authData.method || '').trim().toUpperCase() || this.options.authMethod || false\n };\n }\n }\n\n /**\n * Sends an e-mail using the selected settings\n *\n * @param {Object} mail Mail object\n * @param {Function} callback Callback function\n */\n send(mail, callback) {\n this.getSocket(this.options, (err, socketOptions) => {\n if (err) {\n return callback(err);\n }\n\n let returned = false;\n let options = this.options;\n if (socketOptions && socketOptions.connection) {\n this.logger.info(\n {\n tnx: 'proxy',\n remoteAddress: socketOptions.connection.remoteAddress,\n remotePort: socketOptions.connection.remotePort,\n destHost: options.host || '',\n destPort: options.port || '',\n action: 'connected'\n },\n 'Using proxied socket from %s:%s to %s:%s',\n socketOptions.connection.remoteAddress,\n socketOptions.connection.remotePort,\n options.host || '',\n options.port || ''\n );\n\n // only copy options if we need to modify it\n options = Object.assign(shared.assign(false, options), socketOptions);\n }\n\n const connection = new SMTPConnection(options);\n\n let perCallAuth;\n const cleanupPerCallAuth = () => {\n if (perCallAuth && perCallAuth !== this.auth && perCallAuth.oauth2) {\n perCallAuth.oauth2.removeAllListeners();\n }\n perCallAuth = null;\n };\n\n connection.once('error', err => {\n if (returned) {\n return;\n }\n returned = true;\n cleanupPerCallAuth();\n connection.close();\n return callback(err);\n });\n\n connection.once('end', () => {\n if (returned) {\n return;\n }\n\n const timer = setTimeout(() => {\n if (returned) {\n return;\n }\n returned = true;\n cleanupPerCallAuth();\n // still have not returned, this means we have an unexpected connection close\n const err = new Error('Unexpected socket close');\n if (connection && connection._socket && connection._socket.upgrading) {\n // starttls connection errors\n err.code = errors.ETLS;\n }\n callback(err);\n }, 1000);\n\n try {\n timer.unref();\n } catch (_E) {\n // Ignore. Happens on envs with non-node timer implementation\n }\n });\n\n const sendMessage = () => {\n const envelope = mail.message.getEnvelope();\n const messageId = mail.message.messageId();\n\n const recipients = [].concat(envelope.to || []);\n if (recipients.length > 3) {\n recipients.push('...and ' + recipients.splice(2).length + ' more');\n }\n\n if (mail.data.dsn) {\n envelope.dsn = mail.data.dsn;\n }\n\n // RFC 8689: Pass requireTLSExtensionEnabled to envelope for MAIL FROM parameter\n if (mail.data.requireTLSExtensionEnabled) {\n envelope.requireTLSExtensionEnabled = mail.data.requireTLSExtensionEnabled;\n }\n\n this.logger.info(\n {\n tnx: 'send',\n messageId\n },\n 'Sending message %s to <%s>',\n messageId,\n recipients.join(', ')\n );\n\n connection.send(envelope, mail.message.createReadStream(), (err, info) => {\n returned = true;\n cleanupPerCallAuth();\n connection.close();\n if (err) {\n this.logger.error(\n {\n err,\n tnx: 'send'\n },\n 'Send error for %s: %s',\n messageId,\n err.message\n );\n return callback(err);\n }\n info.envelope = {\n from: envelope.from,\n to: envelope.to\n };\n info.messageId = messageId;\n try {\n return callback(null, info);\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'callback'\n },\n 'Callback error for %s: %s',\n messageId,\n E.message\n );\n }\n });\n };\n\n connection.connect(() => {\n if (returned) {\n return;\n }\n\n perCallAuth = this.getAuth(mail.data.auth);\n\n if (perCallAuth && (connection.allowsAuth || options.forceAuth)) {\n connection.login(perCallAuth, err => {\n cleanupPerCallAuth();\n if (returned) {\n return;\n }\n\n if (err) {\n returned = true;\n connection.close();\n return callback(err);\n }\n\n sendMessage();\n });\n } else {\n sendMessage();\n }\n });\n });\n }\n\n /**\n * Verifies SMTP configuration\n *\n * @param {Function} callback Callback function\n */\n verify(callback) {\n let promise;\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = shared.callbackPromise(resolve, reject);\n });\n }\n\n this.getSocket(this.options, (err, socketOptions) => {\n if (err) {\n return callback(err);\n }\n\n let options = this.options;\n if (socketOptions && socketOptions.connection) {\n this.logger.info(\n {\n tnx: 'proxy',\n remoteAddress: socketOptions.connection.remoteAddress,\n remotePort: socketOptions.connection.remotePort,\n destHost: options.host || '',\n destPort: options.port || '',\n action: 'connected'\n },\n 'Using proxied socket from %s:%s to %s:%s',\n socketOptions.connection.remoteAddress,\n socketOptions.connection.remotePort,\n options.host || '',\n options.port || ''\n );\n\n options = Object.assign(shared.assign(false, options), socketOptions);\n }\n\n const connection = new SMTPConnection(options);\n let returned = false;\n let perCallAuth;\n const cleanupPerCallAuth = () => {\n if (perCallAuth && perCallAuth !== this.auth && perCallAuth.oauth2) {\n perCallAuth.oauth2.removeAllListeners();\n }\n perCallAuth = null;\n };\n\n connection.once('error', err => {\n if (returned) {\n return;\n }\n returned = true;\n cleanupPerCallAuth();\n connection.close();\n return callback(err);\n });\n\n connection.once('end', () => {\n if (returned) {\n return;\n }\n returned = true;\n cleanupPerCallAuth();\n return callback(new Error('Connection closed'));\n });\n\n const finalize = () => {\n if (returned) {\n return;\n }\n returned = true;\n cleanupPerCallAuth();\n connection.quit();\n return callback(null, true);\n };\n\n connection.connect(() => {\n if (returned) {\n return;\n }\n\n perCallAuth = this.getAuth({});\n\n if (perCallAuth && (connection.allowsAuth || options.forceAuth)) {\n connection.login(perCallAuth, err => {\n cleanupPerCallAuth();\n if (returned) {\n return;\n }\n\n if (err) {\n returned = true;\n connection.close();\n return callback(err);\n }\n\n finalize();\n });\n } else if (!perCallAuth && connection.allowsAuth && options.forceAuth) {\n const err = new Error('Authentication info was not provided');\n err.code = errors.ENOAUTH;\n\n returned = true;\n cleanupPerCallAuth();\n connection.close();\n return callback(err);\n } else {\n finalize();\n }\n });\n });\n\n return promise;\n }\n\n /**\n * Releases resources\n */\n close() {\n if (this.auth && this.auth.oauth2) {\n this.auth.oauth2.removeAllListeners();\n }\n this.emit('close');\n }\n}\n\n// expose to the world\nmodule.exports = SMTPTransport;\n","'use strict';\n\nconst { spawn } = require('child_process');\nconst packageData = require('../../package.json');\nconst shared = require('../shared');\nconst errors = require('../errors');\n\n/**\n * Generates a Transport object for Sendmail\n *\n * Possible options can be the following:\n *\n * * **path** optional path to sendmail binary\n * * **newline** either 'windows' or 'unix'\n * * **args** an array of arguments for the sendmail binary\n *\n * @constructor\n * @param {Object} optional config parameter for Sendmail\n */\nclass SendmailTransport {\n constructor(options) {\n options = options || {};\n\n // use a reference to spawn for mocking purposes\n this._spawn = spawn;\n\n this.options = options;\n\n this.name = 'Sendmail';\n this.version = packageData.version;\n\n this.path = 'sendmail';\n this.args = false;\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'sendmail'\n });\n\n if (typeof options === 'string') {\n this.path = options;\n } else if (typeof options === 'object') {\n if (options.path) {\n this.path = options.path;\n }\n if (Array.isArray(options.args)) {\n this.args = options.args;\n }\n }\n }\n\n /**\n * <p>Compiles a mailcomposer message and forwards it to handler that sends it.</p>\n *\n * @param {Object} emailMessage MailComposer object\n * @param {Function} callback Callback function to run when the sending is completed\n */\n send(mail, done) {\n // Sendmail strips this header line by itself\n mail.message.keepBcc = true;\n\n const envelope = mail.data.envelope || mail.message.getEnvelope();\n const messageId = mail.message.messageId();\n let returned;\n\n const hasInvalidAddresses = []\n .concat(envelope.from || [])\n .concat(envelope.to || [])\n .some(addr => /^-/.test(addr));\n if (hasInvalidAddresses) {\n const err = new Error('Can not send mail. Invalid envelope addresses.');\n err.code = errors.ESENDMAIL;\n return done(err);\n }\n\n // force -i to keep single dots\n const args = this.args\n ? ['-i'].concat(this.args).concat(envelope.to)\n : ['-i'].concat(envelope.from ? ['-f', envelope.from] : []).concat(envelope.to);\n\n const callback = err => {\n if (returned) {\n // ignore any additional responses, already done\n return;\n }\n returned = true;\n if (typeof done === 'function') {\n if (err) {\n return done(err);\n }\n return done(null, {\n envelope,\n messageId,\n response: 'Messages queued for delivery'\n });\n }\n };\n\n let sendmail;\n try {\n sendmail = this._spawn(this.path, args);\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'spawn',\n messageId\n },\n 'Error occurred while spawning sendmail. %s',\n E.message\n );\n return callback(E);\n }\n\n if (sendmail) {\n sendmail.on('error', err => {\n this.logger.error(\n {\n err,\n tnx: 'spawn',\n messageId\n },\n 'Error occurred when sending message %s. %s',\n messageId,\n err.message\n );\n callback(err);\n });\n\n sendmail.once('exit', code => {\n if (!code) {\n return callback();\n }\n const err = new Error(\n code === 127 ? 'Sendmail command not found, process exited with code ' + code : 'Sendmail exited with code ' + code\n );\n err.code = errors.ESENDMAIL;\n\n this.logger.error(\n {\n err,\n tnx: 'stdin',\n messageId\n },\n 'Error sending message %s to sendmail. %s',\n messageId,\n err.message\n );\n callback(err);\n });\n sendmail.once('close', callback);\n\n sendmail.stdin.on('error', err => {\n this.logger.error(\n {\n err,\n tnx: 'stdin',\n messageId\n },\n 'Error occurred when piping message %s to sendmail. %s',\n messageId,\n err.message\n );\n callback(err);\n });\n\n const recipients = [].concat(envelope.to || []);\n if (recipients.length > 3) {\n recipients.push('...and ' + recipients.splice(2).length + ' more');\n }\n this.logger.info(\n {\n tnx: 'send',\n messageId\n },\n 'Sending message %s to <%s>',\n messageId,\n recipients.join(', ')\n );\n\n const sourceStream = mail.message.createReadStream();\n sourceStream.once('error', err => {\n this.logger.error(\n {\n err,\n tnx: 'stdin',\n messageId\n },\n 'Error occurred when generating message %s. %s',\n messageId,\n err.message\n );\n sendmail.kill('SIGINT'); // do not deliver the message\n callback(err);\n });\n\n sourceStream.pipe(sendmail.stdin);\n } else {\n const err = new Error('sendmail was not found');\n err.code = errors.ESENDMAIL;\n return callback(err);\n }\n }\n}\n\nmodule.exports = SendmailTransport;\n","'use strict';\n\nconst packageData = require('../../package.json');\nconst shared = require('../shared');\n\n/**\n * Generates a Transport object for streaming\n *\n * Possible options can be the following:\n *\n * * **buffer** if true, then returns the message as a Buffer object instead of a stream\n * * **newline** either 'windows' or 'unix'\n *\n * @constructor\n * @param {Object} optional config parameter\n */\nclass StreamTransport {\n constructor(options) {\n options = options || {};\n\n this.options = options;\n\n this.name = 'StreamTransport';\n this.version = packageData.version;\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'stream-transport'\n });\n\n this.winbreak = ['win', 'windows', 'dos', '\\r\\n'].includes((options.newline || '').toString().toLowerCase());\n }\n\n /**\n * Compiles a mailcomposer message and forwards it to handler that sends it\n *\n * @param {Object} emailMessage MailComposer object\n * @param {Function} callback Callback function to run when the sending is completed\n */\n send(mail, done) {\n // We probably need this in the output\n mail.message.keepBcc = true;\n\n const envelope = mail.data.envelope || mail.message.getEnvelope();\n const messageId = mail.message.messageId();\n\n const recipients = [].concat(envelope.to || []);\n if (recipients.length > 3) {\n recipients.push('...and ' + recipients.splice(2).length + ' more');\n }\n this.logger.info(\n {\n tnx: 'send',\n messageId\n },\n 'Sending message %s to <%s> using %s line breaks',\n messageId,\n recipients.join(', '),\n this.winbreak ? '<CR><LF>' : '<LF>'\n );\n\n setImmediate(() => {\n let stream;\n\n try {\n stream = mail.message.createReadStream();\n } catch (E) {\n this.logger.error(\n {\n err: E,\n tnx: 'send',\n messageId\n },\n 'Creating send stream failed for %s. %s',\n messageId,\n E.message\n );\n return done(E);\n }\n\n if (!this.options.buffer) {\n stream.once('error', err => {\n this.logger.error(\n {\n err,\n tnx: 'send',\n messageId\n },\n 'Failed creating message for %s. %s',\n messageId,\n err.message\n );\n });\n return done(null, {\n envelope,\n messageId,\n message: stream\n });\n }\n\n const chunks = [];\n let chunklen = 0;\n stream.on('readable', () => {\n let chunk;\n while ((chunk = stream.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n\n stream.once('error', err => {\n this.logger.error(\n {\n err,\n tnx: 'send',\n messageId\n },\n 'Failed creating message for %s. %s',\n messageId,\n err.message\n );\n return done(err);\n });\n\n stream.on('end', () =>\n done(null, {\n envelope,\n messageId,\n message: Buffer.concat(chunks, chunklen)\n })\n );\n });\n }\n}\n\nmodule.exports = StreamTransport;\n","'use strict';\n\nconst packageData = require('../../package.json');\nconst shared = require('../shared');\n\n/**\n * Generates a Transport object to generate JSON output\n *\n * @constructor\n * @param {Object} optional config parameter\n */\nclass JSONTransport {\n constructor(options) {\n options = options || {};\n\n this.options = options;\n\n this.name = 'JSONTransport';\n this.version = packageData.version;\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'json-transport'\n });\n }\n\n /**\n * <p>Compiles a mailcomposer message and forwards it to handler that sends it.</p>\n *\n * @param {Object} emailMessage MailComposer object\n * @param {Function} callback Callback function to run when the sending is completed\n */\n send(mail, done) {\n // Sendmail strips this header line by itself\n mail.message.keepBcc = true;\n\n const envelope = mail.data.envelope || mail.message.getEnvelope();\n const messageId = mail.message.messageId();\n\n const recipients = [].concat(envelope.to || []);\n if (recipients.length > 3) {\n recipients.push('...and ' + recipients.splice(2).length + ' more');\n }\n this.logger.info(\n {\n tnx: 'send',\n messageId\n },\n 'Composing JSON structure of %s to <%s>',\n messageId,\n recipients.join(', ')\n );\n\n setImmediate(() => {\n mail.normalize((err, data) => {\n if (err) {\n this.logger.error(\n {\n err,\n tnx: 'send',\n messageId\n },\n 'Failed building JSON structure for %s. %s',\n messageId,\n err.message\n );\n return done(err);\n }\n\n delete data.envelope;\n delete data.normalizedHeaders;\n\n return done(null, {\n envelope,\n messageId,\n message: this.options.skipEncoding ? data : JSON.stringify(data)\n });\n });\n });\n }\n}\n\nmodule.exports = JSONTransport;\n","'use strict';\n\nconst EventEmitter = require('events');\nconst packageData = require('../../package.json');\nconst shared = require('../shared');\nconst LeWindows = require('../mime-node/le-windows');\nconst MimeNode = require('../mime-node');\n\n/**\n * Generates a Transport object for AWS SES\n *\n * @constructor\n * @param {Object} optional config parameter\n */\nclass SESTransport extends EventEmitter {\n constructor(options) {\n super();\n options = options || {};\n\n this.options = options;\n this.ses = this.options.SES;\n\n this.name = 'SESTransport';\n this.version = packageData.version;\n\n this.logger = shared.getLogger(this.options, {\n component: this.options.component || 'ses-transport'\n });\n }\n\n getRegion(cb) {\n if (this.ses.sesClient.config && typeof this.ses.sesClient.config.region === 'function') {\n // promise\n return this.ses.sesClient.config\n .region()\n .then(region => cb(null, region))\n .catch(err => cb(err));\n }\n return cb(null, false);\n }\n\n /**\n * Compiles a mailcomposer message and forwards it to SES\n *\n * @param {Object} emailMessage MailComposer object\n * @param {Function} callback Callback function to run when the sending is completed\n */\n send(mail, callback) {\n let fromHeader = mail.message._headers.find(header => /^from$/i.test(header.key));\n if (fromHeader) {\n const mimeNode = new MimeNode('text/plain');\n fromHeader = mimeNode._convertAddresses(mimeNode._parseAddresses(fromHeader.value));\n }\n\n const envelope = mail.data.envelope || mail.message.getEnvelope();\n const messageId = mail.message.messageId();\n\n const recipients = [].concat(envelope.to || []);\n if (recipients.length > 3) {\n recipients.push('...and ' + recipients.splice(2).length + ' more');\n }\n this.logger.info(\n {\n tnx: 'send',\n messageId\n },\n 'Sending message %s to <%s>',\n messageId,\n recipients.join(', ')\n );\n\n const getRawMessage = next => {\n // do not use Message-ID and Date in DKIM signature\n if (!mail.data._dkim) {\n mail.data._dkim = {};\n }\n if (mail.data._dkim.skipFields && typeof mail.data._dkim.skipFields === 'string') {\n mail.data._dkim.skipFields += ':date:message-id';\n } else {\n mail.data._dkim.skipFields = 'date:message-id';\n }\n\n const sourceStream = mail.message.createReadStream();\n const stream = sourceStream.pipe(new LeWindows());\n const chunks = [];\n let chunklen = 0;\n\n stream.on('readable', () => {\n let chunk;\n while ((chunk = stream.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n\n sourceStream.once('error', err => stream.emit('error', err));\n\n stream.once('error', err => next(err));\n\n stream.once('end', () => next(null, Buffer.concat(chunks, chunklen)));\n };\n\n setImmediate(() =>\n getRawMessage((err, raw) => {\n if (err) {\n this.logger.error(\n {\n err,\n tnx: 'send',\n messageId\n },\n 'Failed creating message for %s. %s',\n messageId,\n err.message\n );\n return callback(err);\n }\n\n const sesMessage = Object.assign(\n {\n Content: {\n Raw: {\n // required\n Data: raw // required\n }\n },\n FromEmailAddress: fromHeader || envelope.from,\n Destination: {\n ToAddresses: envelope.to\n }\n },\n mail.data.ses || {}\n );\n\n this.getRegion((err, region) => {\n if (err || !region) {\n region = 'us-east-1';\n }\n\n const command = new this.ses.SendEmailCommand(sesMessage);\n const sendPromise = this.ses.sesClient.send(command);\n\n sendPromise\n .then(data => {\n if (region === 'us-east-1') {\n region = 'email';\n }\n\n callback(null, {\n envelope: {\n from: envelope.from,\n to: envelope.to\n },\n messageId: '<' + data.MessageId + (!/@/.test(data.MessageId) ? '@' + region + '.amazonses.com' : '') + '>',\n response: data.MessageId,\n raw\n });\n })\n .catch(err => {\n this.logger.error(\n {\n err,\n tnx: 'send'\n },\n 'Send error for %s: %s',\n messageId,\n err.message\n );\n callback(err);\n });\n });\n })\n );\n }\n\n /**\n * Verifies SES configuration\n *\n * @param {Function} callback Callback function\n */\n verify(callback) {\n let promise;\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = shared.callbackPromise(resolve, reject);\n });\n }\n\n const cb = err => {\n if (err && !['InvalidParameterValue', 'MessageRejected'].includes(err.code || err.Code || err.name)) {\n return callback(err);\n }\n return callback(null, true);\n };\n\n const sesMessage = {\n Content: {\n Raw: {\n Data: Buffer.from('From: <invalid@invalid>\\r\\nTo: <invalid@invalid>\\r\\n Subject: Invalid\\r\\n\\r\\nInvalid')\n }\n },\n FromEmailAddress: 'invalid@invalid',\n Destination: {\n ToAddresses: ['invalid@invalid']\n }\n };\n\n this.getRegion((err, region) => {\n if (err || !region) {\n region = 'us-east-1';\n }\n\n const command = new this.ses.SendEmailCommand(sesMessage);\n const sendPromise = this.ses.sesClient.send(command);\n\n sendPromise.then(data => cb(null, data)).catch(err => cb(err));\n });\n\n return promise;\n }\n}\n\nmodule.exports = SESTransport;\n","'use strict';\n\nconst Mailer = require('./mailer');\nconst shared = require('./shared');\nconst SMTPPool = require('./smtp-pool');\nconst SMTPTransport = require('./smtp-transport');\nconst SendmailTransport = require('./sendmail-transport');\nconst StreamTransport = require('./stream-transport');\nconst JSONTransport = require('./json-transport');\nconst SESTransport = require('./ses-transport');\nconst errors = require('./errors');\nconst nmfetch = require('./fetch');\nconst packageData = require('../package.json');\n\nconst ETHEREAL_API = (process.env.ETHEREAL_API || 'https://api.nodemailer.com').replace(/\\/+$/, '');\nconst ETHEREAL_WEB = (process.env.ETHEREAL_WEB || 'https://ethereal.email').replace(/\\/+$/, '');\nconst ETHEREAL_API_KEY = (process.env.ETHEREAL_API_KEY || '').replace(/\\s*/g, '') || null;\nconst ETHEREAL_CACHE = ['true', 'yes', 'y', '1'].includes((process.env.ETHEREAL_CACHE || 'yes').toString().trim().toLowerCase());\n\nlet testAccount = false;\n\nmodule.exports.createTransport = function (transporter, defaults) {\n let options;\n\n if (\n // provided transporter is a configuration object, not transporter plugin\n (typeof transporter === 'object' && typeof transporter.send !== 'function') ||\n // provided transporter looks like a connection url\n (typeof transporter === 'string' && /^(smtps?|direct):/i.test(transporter))\n ) {\n const urlConfig = typeof transporter === 'string' ? transporter : transporter.url;\n if (urlConfig) {\n // parse a configuration URL into configuration options\n options = shared.parseConnectionUrl(urlConfig);\n } else {\n options = transporter;\n }\n\n if (options.pool) {\n transporter = new SMTPPool(options);\n } else if (options.sendmail) {\n transporter = new SendmailTransport(options);\n } else if (options.streamTransport) {\n transporter = new StreamTransport(options);\n } else if (options.jsonTransport) {\n transporter = new JSONTransport(options);\n } else if (options.SES) {\n if (options.SES.ses && options.SES.aws) {\n const error = new Error(\n 'Using legacy SES configuration, expecting @aws-sdk/client-sesv2, see https://nodemailer.com/transports/ses/'\n );\n error.code = errors.ECONFIG;\n throw error;\n }\n transporter = new SESTransport(options);\n } else {\n transporter = new SMTPTransport(options);\n }\n }\n\n return new Mailer(transporter, options, defaults);\n};\n\nmodule.exports.createTestAccount = function (apiUrl, callback) {\n let promise;\n\n if (!callback && typeof apiUrl === 'function') {\n callback = apiUrl;\n apiUrl = false;\n }\n\n if (!callback) {\n promise = new Promise((resolve, reject) => {\n callback = shared.callbackPromise(resolve, reject);\n });\n }\n\n if (ETHEREAL_CACHE && testAccount) {\n setImmediate(() => callback(null, testAccount));\n return promise;\n }\n\n apiUrl = apiUrl || ETHEREAL_API;\n\n const chunks = [];\n let chunklen = 0;\n\n const requestHeaders = {};\n const requestBody = {\n requestor: packageData.name,\n version: packageData.version\n };\n\n if (ETHEREAL_API_KEY) {\n requestHeaders.Authorization = 'Bearer ' + ETHEREAL_API_KEY;\n }\n\n const fetchOptions = {\n contentType: 'application/json',\n method: 'POST',\n headers: requestHeaders,\n body: Buffer.from(JSON.stringify(requestBody))\n };\n\n // Credential-bearing request — opt back into strict cert validation when\n // the API URL is HTTPS. lib/fetch defaults to rejectUnauthorized:false\n // for attachment hosts that may be self-signed; the Ethereal API has a\n // real cert, so the lax default was a free attack surface.\n if (/^https:/i.test(apiUrl)) {\n fetchOptions.tls = { rejectUnauthorized: true };\n }\n\n const req = nmfetch(apiUrl + '/user', fetchOptions);\n\n req.on('readable', () => {\n let chunk;\n while ((chunk = req.read()) !== null) {\n chunks.push(chunk);\n chunklen += chunk.length;\n }\n });\n\n req.once('error', err => callback(err));\n\n req.once('end', () => {\n const res = Buffer.concat(chunks, chunklen);\n let data;\n try {\n data = JSON.parse(res.toString());\n } catch (E) {\n return callback(E);\n }\n if (data.status !== 'success' || data.error) {\n return callback(new Error(data.error || 'Request failed'));\n }\n delete data.status;\n testAccount = data;\n callback(null, testAccount);\n });\n\n return promise;\n};\n\nmodule.exports.getTestMessageUrl = function (info) {\n if (!info || !info.response) {\n return false;\n }\n\n const infoProps = new Map();\n info.response.replace(/\\[([^\\]]+)\\]$/, (m, props) => {\n props.replace(/\\b([A-Z0-9]+)=([^\\s]+)/g, (m, key, value) => {\n infoProps.set(key, value);\n });\n });\n\n if (infoProps.has('STATUS') && infoProps.has('MSGID')) {\n return (testAccount.web || ETHEREAL_WEB) + '/message/' + infoProps.get('MSGID');\n }\n\n return false;\n};\n","import { $atom, $env, $hook, $state, type Static, t } from \"alepha\";\nimport {\n EmailError,\n type EmailProvider,\n type EmailSendOptions,\n} from \"alepha/email\";\nimport { $logger } from \"alepha/logger\";\nimport type { Transporter } from \"nodemailer\";\nimport nodemailer from \"nodemailer\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Environment variables for nodemailer configuration\n */\nconst envSchema = t.object({\n EMAIL_HOST: t.optional(\n t.text({\n description: \"SMTP server host\",\n }),\n ),\n EMAIL_PORT: t.number({\n default: 587,\n description: \"SMTP server port\",\n }),\n EMAIL_USER: t.optional(\n t.text({\n description: \"SMTP authentication username\",\n }),\n ),\n EMAIL_PASS: t.optional(\n t.text({\n description: \"SMTP authentication password\",\n }),\n ),\n EMAIL_FROM: t.optional(\n t.text({\n description: \"Default from email address\",\n }),\n ),\n EMAIL_SECURE: t.boolean({\n default: false,\n description: \"Use secure connection (TLS)\",\n }),\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Nodemailer connection pooling and rate limiting options\n */\nexport const nodemailerEmailOptions = $atom({\n name: \"alepha.email.nodemailer.options\",\n schema: t.object({\n pool: t.optional(\n t.boolean({\n description: \"Enable connection pooling\",\n }),\n ),\n maxConnections: t.optional(\n t.number({\n description: \"Maximum number of connections in pool\",\n }),\n ),\n maxMessages: t.optional(\n t.number({\n description: \"Maximum messages per connection\",\n }),\n ),\n rateDelta: t.optional(\n t.number({\n description: \"Time in milliseconds between message sends\",\n }),\n ),\n rateLimit: t.optional(\n t.number({\n description: \"Maximum number of messages per rateDelta\",\n }),\n ),\n }),\n default: {},\n});\n\nexport type NodemailerEmailProviderOptions = Static<\n typeof nodemailerEmailOptions.schema\n>;\n\ndeclare module \"alepha\" {\n interface State {\n [nodemailerEmailOptions.key]: NodemailerEmailProviderOptions;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Email provider using Nodemailer for SMTP transport.\n *\n * Configuration is provided via environment variables:\n * - EMAIL_HOST: SMTP server host\n * - EMAIL_PORT: SMTP server port (default: 587)\n * - EMAIL_USER: SMTP authentication username\n * - EMAIL_PASS: SMTP authentication password\n * - EMAIL_FROM: Default from email address\n * - EMAIL_SECURE: Use secure connection (default: false)\n *\n * Advanced pooling/rate limiting options can be configured via atom:\n * @see {@link nodemailerEmailOptions}\n *\n * @example\n * ```typescript\n * // Configure via environment variables\n * // EMAIL_HOST=smtp.example.com\n * // EMAIL_PORT=587\n * // EMAIL_USER=user@example.com\n * // EMAIL_PASS=secret\n * // EMAIL_FROM=noreply@example.com\n *\n * // Optionally configure pooling via atom\n * alepha.state.set(nodemailerEmailOptions.key, {\n * pool: true,\n * maxConnections: 5,\n * rateLimit: 10,\n * });\n * ```\n */\nexport class NodemailerEmailProvider implements EmailProvider {\n protected readonly env = $env(envSchema);\n protected readonly log = $logger();\n protected readonly options = $state(nodemailerEmailOptions);\n protected transporter: Transporter | null = null;\n\n protected get host(): string {\n const host = this.env.EMAIL_HOST;\n if (!host) {\n throw new EmailError(\n \"Email host not configured. Set EMAIL_HOST env var.\",\n );\n }\n return host;\n }\n\n protected get port(): number {\n return this.env.EMAIL_PORT;\n }\n\n protected get secure(): boolean {\n return this.env.EMAIL_SECURE;\n }\n\n protected get user(): string | undefined {\n return this.env.EMAIL_USER;\n }\n\n protected get pass(): string | undefined {\n return this.env.EMAIL_PASS;\n }\n\n protected get fromAddress(): string {\n const from = this.env.EMAIL_FROM;\n if (!from) {\n throw new EmailError(\n \"Email from address not configured. Set EMAIL_FROM env var.\",\n );\n }\n return from;\n }\n\n protected getTransporter(): Transporter {\n if (!this.transporter) {\n this.transporter = this.createTransporter();\n }\n return this.transporter;\n }\n\n public async send(options: EmailSendOptions): Promise<void> {\n const { to, subject, body } = options;\n this.log.debug(\"Sending email via Nodemailer\", { to, subject });\n\n try {\n const result = await this.getTransporter().sendMail({\n from: this.fromAddress,\n to,\n subject,\n html: body,\n });\n\n this.log.info(\"Email sent successfully\", {\n to,\n subject,\n messageId: result.messageId,\n response: result.response,\n });\n } catch (error) {\n const message = `Failed to send email via Nodemailer: ${error instanceof Error ? error.message : String(error)}`;\n this.log.error(message, { to, subject });\n throw new EmailError(message, error instanceof Error ? error : undefined);\n }\n }\n\n protected createTransporter(): Transporter {\n const transporterConfig = {\n host: this.host,\n port: this.port,\n secure: this.secure,\n auth:\n this.user && this.pass\n ? {\n user: this.user,\n pass: this.pass,\n }\n : undefined,\n pool: this.options.pool,\n maxConnections: this.options.maxConnections,\n maxMessages: this.options.maxMessages,\n rateDelta: this.options.rateDelta,\n rateLimit: this.options.rateLimit,\n };\n\n this.log.debug(\"Creating Nodemailer transporter\", {\n host: transporterConfig.host,\n port: transporterConfig.port,\n secure: transporterConfig.secure,\n user: transporterConfig.auth?.user,\n pool: transporterConfig.pool,\n });\n\n return nodemailer.createTransport(transporterConfig);\n }\n\n /**\n * Verify the connection to the email server.\n */\n public async verify(): Promise<boolean> {\n try {\n await this.getTransporter().verify();\n this.log.info(\"Email server connection verified\");\n return true;\n } catch (error) {\n this.log.error(\"Email server connection failed\", { error });\n return false;\n }\n }\n\n /**\n * Close the transporter connection.\n */\n public close(): void {\n if (this.transporter) {\n this.transporter.close();\n this.transporter = null;\n }\n }\n\n protected readonly onStart = $hook({\n on: \"start\",\n handler: () => this.verify(),\n });\n\n protected readonly onStop = $hook({\n on: \"stop\",\n handler: () => this.close(),\n });\n}\n","import { $module, type Alepha } from \"alepha\";\nimport { AlephaEmail, EmailProvider } from \"alepha/email\";\nimport { NodemailerEmailProvider } from \"./providers/NodemailerEmailProvider.ts\";\n\n// Exports\nexport * from \"./providers/NodemailerEmailProvider.ts\";\n\n/**\n * Plugin for Alepha Email that provides SMTP capabilities via Nodemailer.\n *\n * @see {@link NodemailerEmailProvider}\n * @module alepha.email.smtp\n */\nexport const AlephaEmailSmtp = $module({\n name: \"alepha.email.smtp\",\n services: [NodemailerEmailProvider],\n imports: [AlephaEmail],\n register: (alepha: Alepha) =>\n alepha.with({\n optional: true,\n provide: EmailProvider,\n use: NodemailerEmailProvider,\n }),\n});\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],"mappings":"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"}
|