wip
This commit is contained in:
		| @@ -8,16 +8,14 @@ import * as nodemailer from 'nodemailer'; | ||||
| import juice from 'juice'; | ||||
| import { Inject, Injectable } from '@nestjs/common'; | ||||
| import { validate as validateEmail } from 'deep-email-validator'; | ||||
| import { MetaService } from '@/core/MetaService.js'; | ||||
| import { UtilityService } from '@/core/UtilityService.js'; | ||||
| import { DI } from '@/di-symbols.js'; | ||||
| import type { Config } from '@/config.js'; | ||||
| import type Logger from '@/logger.js'; | ||||
| import type { UserProfilesRepository } from '@/models/_.js'; | ||||
| import type { MiMeta, UserProfilesRepository } from '@/models/_.js'; | ||||
| import { LoggerService } from '@/core/LoggerService.js'; | ||||
| import { bindThis } from '@/decorators.js'; | ||||
| import { HttpRequestService } from '@/core/HttpRequestService.js'; | ||||
| import { QueueService } from '@/core/QueueService.js'; | ||||
|  | ||||
| @Injectable() | ||||
| export class EmailService { | ||||
| @@ -27,38 +25,37 @@ export class EmailService { | ||||
| 		@Inject(DI.config) | ||||
| 		private config: Config, | ||||
|  | ||||
| 		@Inject(DI.meta) | ||||
| 		private meta: MiMeta, | ||||
|  | ||||
| 		@Inject(DI.userProfilesRepository) | ||||
| 		private userProfilesRepository: UserProfilesRepository, | ||||
|  | ||||
| 		private metaService: MetaService, | ||||
| 		private loggerService: LoggerService, | ||||
| 		private utilityService: UtilityService, | ||||
| 		private httpRequestService: HttpRequestService, | ||||
| 		private queueService: QueueService, | ||||
| 	) { | ||||
| 		this.logger = this.loggerService.getLogger('email'); | ||||
| 	} | ||||
|  | ||||
| 	@bindThis | ||||
| 	public async sendEmail(to: string, subject: string, html: string, text: string) { | ||||
| 		const meta = await this.metaService.fetch(true); | ||||
|  | ||||
| 		if (!meta.enableEmail) return; | ||||
| 		if (!this.meta.enableEmail) return; | ||||
|  | ||||
| 		const iconUrl = `${this.config.url}/static-assets/mi-white.png`; | ||||
| 		const emailSettingUrl = `${this.config.url}/settings/email`; | ||||
|  | ||||
| 		const enableAuth = meta.smtpUser != null && meta.smtpUser !== ''; | ||||
| 		const enableAuth = this.meta.smtpUser != null && this.meta.smtpUser !== ''; | ||||
|  | ||||
| 		const transporter = nodemailer.createTransport({ | ||||
| 			host: meta.smtpHost, | ||||
| 			port: meta.smtpPort, | ||||
| 			secure: meta.smtpSecure, | ||||
| 			host: this.meta.smtpHost, | ||||
| 			port: this.meta.smtpPort, | ||||
| 			secure: this.meta.smtpSecure, | ||||
| 			ignoreTLS: !enableAuth, | ||||
| 			proxy: this.config.proxySmtp, | ||||
| 			auth: enableAuth ? { | ||||
| 				user: meta.smtpUser, | ||||
| 				pass: meta.smtpPass, | ||||
| 				user: this.meta.smtpUser, | ||||
| 				pass: this.meta.smtpPass, | ||||
| 			} : undefined, | ||||
| 		} as any); | ||||
|  | ||||
| @@ -127,7 +124,7 @@ export class EmailService { | ||||
| 	<body> | ||||
| 		<main> | ||||
| 			<header> | ||||
| 				<img src="${ meta.logoImageUrl ?? meta.iconUrl ?? iconUrl }"/> | ||||
| 				<img src="${ this.meta.logoImageUrl ?? this.meta.iconUrl ?? iconUrl }"/> | ||||
| 			</header> | ||||
| 			<article> | ||||
| 				<h1>${ subject }</h1> | ||||
| @@ -148,7 +145,7 @@ export class EmailService { | ||||
| 		try { | ||||
| 			// TODO: htmlサニタイズ | ||||
| 			const info = await transporter.sendMail({ | ||||
| 				from: meta.email!, | ||||
| 				from: this.meta.email!, | ||||
| 				to: to, | ||||
| 				subject: subject, | ||||
| 				text: text, | ||||
| @@ -167,8 +164,6 @@ export class EmailService { | ||||
| 		available: boolean; | ||||
| 		reason: null | 'used' | 'format' | 'disposable' | 'mx' | 'smtp' | 'banned' | 'network' | 'blacklist'; | ||||
| 	}> { | ||||
| 		const meta = await this.metaService.fetch(); | ||||
|  | ||||
| 		const exist = await this.userProfilesRepository.countBy({ | ||||
| 			emailVerified: true, | ||||
| 			email: emailAddress, | ||||
| @@ -186,11 +181,11 @@ export class EmailService { | ||||
| 			reason?: string | null, | ||||
| 		} = { valid: true, reason: null }; | ||||
|  | ||||
| 		if (meta.enableActiveEmailValidation) { | ||||
| 			if (meta.enableVerifymailApi && meta.verifymailAuthKey != null) { | ||||
| 				validated = await this.verifyMail(emailAddress, meta.verifymailAuthKey); | ||||
| 			} else if (meta.enableTruemailApi && meta.truemailInstance && meta.truemailAuthKey != null) { | ||||
| 				validated = await this.trueMail(meta.truemailInstance, emailAddress, meta.truemailAuthKey); | ||||
| 		if (this.meta.enableActiveEmailValidation) { | ||||
| 			if (this.meta.enableVerifymailApi && this.meta.verifymailAuthKey != null) { | ||||
| 				validated = await this.verifyMail(emailAddress, this.meta.verifymailAuthKey); | ||||
| 			} else if (this.meta.enableTruemailApi && this.meta.truemailInstance && this.meta.truemailAuthKey != null) { | ||||
| 				validated = await this.trueMail(this.meta.truemailInstance, emailAddress, this.meta.truemailAuthKey); | ||||
| 			} else { | ||||
| 				validated = await validateEmail({ | ||||
| 					email: emailAddress, | ||||
| @@ -220,7 +215,7 @@ export class EmailService { | ||||
| 		} | ||||
|  | ||||
| 		const emailDomain: string = emailAddress.split('@')[1]; | ||||
| 		const isBanned = this.utilityService.isBlockedHost(meta.bannedEmailDomains, emailDomain); | ||||
| 		const isBanned = this.utilityService.isBlockedHost(this.meta.bannedEmailDomains, emailDomain); | ||||
|  | ||||
| 		if (isBanned) { | ||||
| 			return { | ||||
|   | ||||
| @@ -10,8 +10,7 @@ import { DI } from '@/di-symbols.js'; | ||||
| import type { Config } from '@/config.js'; | ||||
| import type { Packed } from '@/misc/json-schema.js'; | ||||
| import { getNoteSummary } from '@/misc/get-note-summary.js'; | ||||
| import type { MiSwSubscription, SwSubscriptionsRepository } from '@/models/_.js'; | ||||
| import { MetaService } from '@/core/MetaService.js'; | ||||
| import type { MiMeta, MiSwSubscription, SwSubscriptionsRepository } from '@/models/_.js'; | ||||
| import { bindThis } from '@/decorators.js'; | ||||
| import { RedisKVCache } from '@/misc/cache.js'; | ||||
|  | ||||
| @@ -54,13 +53,14 @@ export class PushNotificationService implements OnApplicationShutdown { | ||||
| 		@Inject(DI.config) | ||||
| 		private config: Config, | ||||
|  | ||||
| 		@Inject(DI.meta) | ||||
| 		private meta: MiMeta, | ||||
|  | ||||
| 		@Inject(DI.redis) | ||||
| 		private redisClient: Redis.Redis, | ||||
|  | ||||
| 		@Inject(DI.swSubscriptionsRepository) | ||||
| 		private swSubscriptionsRepository: SwSubscriptionsRepository, | ||||
|  | ||||
| 		private metaService: MetaService, | ||||
| 	) { | ||||
| 		this.subscriptionsCache = new RedisKVCache<MiSwSubscription[]>(this.redisClient, 'userSwSubscriptions', { | ||||
| 			lifetime: 1000 * 60 * 60 * 1, // 1h | ||||
| @@ -73,14 +73,12 @@ export class PushNotificationService implements OnApplicationShutdown { | ||||
|  | ||||
| 	@bindThis | ||||
| 	public async pushNotification<T extends keyof PushNotificationsTypes>(userId: string, type: T, body: PushNotificationsTypes[T]) { | ||||
| 		const meta = await this.metaService.fetch(); | ||||
|  | ||||
| 		if (!meta.enableServiceWorker || meta.swPublicKey == null || meta.swPrivateKey == null) return; | ||||
| 		if (!this.meta.enableServiceWorker || this.meta.swPublicKey == null || this.meta.swPrivateKey == null) return; | ||||
|  | ||||
| 		// アプリケーションの連絡先と、サーバーサイドの鍵ペアの情報を登録 | ||||
| 		push.setVapidDetails(this.config.url, | ||||
| 			meta.swPublicKey, | ||||
| 			meta.swPrivateKey); | ||||
| 			this.meta.swPublicKey, | ||||
| 			this.meta.swPrivateKey); | ||||
|  | ||||
| 		const subscriptions = await this.subscriptionsCache.fetch(userId); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 syuilo
					syuilo